/**********************************************************************/ /** 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 class IRTL_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 IRTL_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_