windows-nt/Source/XPSP1/NT/inetsrv/iis/inc/mlszau.hxx
2020-09-26 16:20:57 +08:00

240 lines
5.5 KiB
C++

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1994 **/
/**********************************************************************/
/*
string.hxx
This module contains a light weight string class
FILE HISTORY:
michth 11-Apr-1997 Created
*/
#ifndef _MLSZAU_HXX_
#define _MLSZAU_HXX_
# include <buffer.hxx>
class dllexp MLSZAU;
/*
Class STRAU
String Ascii-Unicode
This class transparently converts multisz between ANSI and Unicode.
All members can take/return string in either ANSI or Unicode.
For members which have a parameter of bUnicode, the actual string
type must match the flag, even though it gets passed in as the
declared type.
Strings are sync'd on an as needed basis. If a string is set in
ANSI, then a UNICODE version will only be created if a get for
UNICODE is done, or if a UNICODE string is appended.
All conversions are done using Latin-1. This is because the intended
use of this class is for converting HTML pages, which are defined to
be Latin-1.
*/
class dllexp MLSZAU
{
public:
MLSZAU()
: m_bufAnsi (0),
m_bufUnicode(0),
m_cchUnicodeLen ( 0),
m_cbMultiByteLen ( 0),
m_bInSync (TRUE),
m_bUnicode (FALSE),
m_bIsValid (TRUE)
{}
MLSZAU( const LPSTR pchInit,
DWORD cbLen = 0 )
: m_bufAnsi (0),
m_bufUnicode(0),
m_cchUnicodeLen ( 0),
m_cbMultiByteLen ( 0),
m_bInSync (TRUE),
m_bUnicode (FALSE),
m_bIsValid (TRUE)
{ AuxInit(pchInit, cbLen); }
MLSZAU( const LPSTR pchInit,
BOOL bUnicode,
DWORD cchLen = 0 )
: m_bufAnsi (0),
m_bufUnicode(0),
m_cchUnicodeLen ( 0),
m_cbMultiByteLen ( 0),
m_bInSync (TRUE),
m_bUnicode (FALSE),
m_bIsValid (TRUE)
{
if (bUnicode) {
AuxInit((LPWSTR)pchInit, cchLen);
}
else {
AuxInit((LPSTR)pchInit, cchLen);
}
}
MLSZAU( const LPWSTR pchInit,
DWORD cchLen = 0 )
: m_bufAnsi (0),
m_bufUnicode(0),
m_cchUnicodeLen ( 0),
m_cbMultiByteLen ( 0),
m_bInSync (TRUE),
m_bUnicode (FALSE),
m_bIsValid (TRUE)
{ AuxInit(pchInit, cchLen); }
MLSZAU( MLSZAU & mlsz )
: m_bufAnsi(0),
m_bufUnicode(0),
m_cchUnicodeLen ( 0),
m_cbMultiByteLen ( 0),
m_bInSync (TRUE),
m_bUnicode (FALSE),
m_bIsValid (TRUE)
{
if (mlsz.IsCurrentUnicode()) {
AuxInit((const LPWSTR)mlsz.QueryStr(TRUE), mlsz.QueryCCH());
}
else {
AuxInit((const LPSTR)mlsz.QueryStr(FALSE), mlsz.QueryCBA());
}
}
BOOL IsValid(VOID) { return m_bIsValid; }
// Resets the internal string to be NULL string. Buffer remains cached.
VOID Reset( VOID)
{
DBG_ASSERT( m_bufAnsi.QueryPtr() != NULL);
DBG_ASSERT( m_bufUnicode.QueryPtr() != NULL);
*QueryStrA() = '\0';
/* INTRINSA suppress = null_pointers */
*QueryStrW() = (WCHAR)'\0';
*(QueryStrA() + 1) = '\0';
*(QueryStrW() + 1) = (WCHAR)'\0';
m_bUnicode = FALSE;
m_bInSync = TRUE;
m_cchUnicodeLen = 2;
m_cbMultiByteLen = 2;
}
//
// Returns the number of bytes in the string including the terminating
// NULLs
//
#ifdef UNICODE
UINT QueryCB(BOOL bUnicode = TRUE)
#else
UINT QueryCB(BOOL bUnicode = FALSE)
#endif
{
if (bUnicode) {
return QueryCBW();
}
else {
return QueryCBA();
}
}
UINT QueryCBA()
{
if (m_bUnicode && !m_bInSync) {
//
// Force sync to set m_cbMultiByteLen
//
QueryStrA();
}
return (m_cbMultiByteLen * sizeof(CHAR));
}
UINT QueryCBW()
{
if (!m_bUnicode && !m_bInSync) {
//
// Force sync to set m_cchUnicodeLen
//
QueryStrW();
}
return (m_cchUnicodeLen * sizeof(WCHAR));
}
//
// Returns # of characters in the string excluding the terminating NULL
//
UINT QueryCCH( VOID )
{
//
// Unicode Len is same as # characters,
// but Multibyte Len is not, so use
// Unicode Len
//
if (!m_bUnicode && !m_bInSync) {
//
// Force sync to set m_cchUnicodeLen
//
QueryStrW();
}
return (m_cchUnicodeLen);
}
//
// Return the string buffer
//
#ifdef UNICODE
LPTSTR QueryStr(BOOL bUnicode = TRUE);
#else
LPTSTR QueryStr(BOOL bUnicode = FALSE);
#endif
LPSTR QueryStrA( VOID ) { return ( (LPSTR)QueryStr(FALSE)); }
LPWSTR QueryStrW( VOID ) { return ( (LPWSTR)QueryStr(TRUE)); }
BOOL IsCurrentUnicode(void)
{
return m_bUnicode;
}
private:
VOID AuxInit( const LPSTR pInit,
DWORD cchLen = 0 );
VOID AuxInit( const LPWSTR pInit,
DWORD cchLen = 0 );
DWORD m_cchUnicodeLen;
DWORD m_cbMultiByteLen;
BUFFER m_bufAnsi;
BUFFER m_bufUnicode;
BOOL m_bInSync;
BOOL m_bUnicode;
BOOL m_bIsValid;
};
#endif // !_MLSZAU_HXX_