windows-nt/Source/XPSP1/NT/base/fs/dfs/dfsm/server/custring.hxx
2020-09-26 16:20:57 +08:00

156 lines
4.2 KiB
C++

//+-------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: custring.hxx
//
// Contents: This has declarations for some functions used in String class.
//
// Classes:
//
// Functions:
//
// History: 04-Feb-93 SudK Created
//
//--------------------------------------------------------------------------
#ifndef __CUSTRING_CLASS_INCLUDED
#define __CUSTRING_CLASS_INCLUDED
void SRtlDuplicateString(PUNICODE_STRING pDest, PUNICODE_STRING pSrc);
void SRtlNewString( PUNICODE_STRING pDest, PWCHAR pSrc);
void SRtlFreeString( PUNICODE_STRING pString);
//+-------------------------------------------------------------------------
//
// Name: CUnicodeString
//
// Synopsis: Wrapper for a UNICODE_STRING.
//
// Methods: ~CUnicodeString()
// CUnicodeString()
// CUnicodeString(WCHAR)
// CUnicodeString(CHAR)
// CUnicodeString(CUnicodeString&)
// CUnicodeString(UNICODE_STRING&)
// implicit conversions to PWCHAR, PUNICODE_STRING, UNICODE_STRING
// assignment operator from PWCHAR, UNICODE_STRING&, CUnicodeString&
// CUnicodeStrCat(CUnicodeString&)
// CUnicodeStrCat(PWCHAR)
//
// Notes: This class is not cheap on memory. Each of the constructors (
// including the assignment operators) allocate new storage for
// the string. The destructor frees the storage.
//
// This class will implicity convert to either a UNICODE_STRING or
// to a PUNICODE_STRING. This means if you have a function:
// Foo1 ( UNICODE_STRING ss, PUNICODE_STRING pss );
// and two CUnicodeStrings, cuStr1, cuStr2, you call it foo like:
// Foo1 ( cuStr1, cuStr2 );
// (ie. you don't use "&cuStr2" like you do for a UNICODE_STRING.)
//
//--------------------------------------------------------------------------
class CUnicodeString {
private:
UNICODE_STRING _ss;
public:
//
// Destructor
//
~CUnicodeString()
{ SRtlFreeString( &_ss ); };
//
// Constructors
//
CUnicodeString()
{
_ss.Length = _ss.MaximumLength = 0;
_ss.Buffer = 0;
};
CUnicodeString( WCHAR *pwc)
{ SRtlNewString( &_ss, pwc ); };
CUnicodeString( CUnicodeString& css )
{ SRtlDuplicateString( &_ss, &css._ss ); };
CUnicodeString( UNICODE_STRING& ss )
{ SRtlDuplicateString( &_ss, &ss ); };
//
// Some useful conversions
//
operator PWCHAR ()
{ return(_ss.Buffer); };
operator UNICODE_STRING ()
{ return(_ss); }
operator PUNICODE_STRING ()
{ return(&_ss); }
VOID Transfer(PUNICODE_STRING pustr)
{ *pustr = _ss; _ss.Length = _ss.MaximumLength = 0; _ss.Buffer = NULL; }
//
// Access to elements
//
USHORT GetLength()
{ return(_ss.Length); };
USHORT GetMaximumLength()
{ return(_ss.MaximumLength); };
WCHAR * GetBuffer()
{ return(_ss.Buffer); };
//
// Finally, some operators
//
VOID Copy( PWCHAR r)
{
ASSERT((_ss.MaximumLength == 0)&&(_ss.Buffer == NULL));
SRtlNewString( &_ss, r);
return;
};
// =
CUnicodeString& operator=( PWCHAR r )
{
ASSERT((_ss.MaximumLength == 0)&&(_ss.Buffer == NULL));
SRtlNewString( &_ss, r );
return(*this);
};
CUnicodeString& operator=( CUnicodeString& r )
{
ASSERT((_ss.MaximumLength == 0)&&(_ss.Buffer == NULL));
SRtlDuplicateString( &_ss, &r._ss );
return(*this);
};
CUnicodeString& operator=( UNICODE_STRING r )
{
ASSERT((_ss.MaximumLength == 0)&&(_ss.Buffer == NULL));
SRtlDuplicateString( &_ss, &r );
return(*this);
};
CUnicodeString& operator=( STRING r )
{
ASSERT((_ss.MaximumLength == 0)&&(_ss.Buffer == NULL));
SRtlDuplicateString( &_ss, (PUNICODE_STRING) &r );
return(*this);
};
};
#endif // __CUSTRING_CLASS_INCLUDED