|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name: Shell String Class
shstr.h
Author:
Zeke Lucas (zekel) 27-Oct-96
Environment:
User Mode - Win32
Revision History:
Abstract:
this allows automatic resizing and stuff
NOTE: this class is specifically designed to be used as a stack variable
--*/
#ifndef _SHSTR_H_
// default shstr to something small, so we don't waste too much stack space
// MAX_PATH is used frequently, so we'd like to a factor of that - so that
// if we do grow to MAX_PATH size, we don't waste any extra.
#define DEFAULT_SHSTR_LENGTH (MAX_PATH/4)
#ifdef UNICODE
#define ShStr ShStrW
#define UrlStr UrlStrW
#else
#define ShStr ShStrA
#define UrlStr UrlStrA
#endif //UNICODE
class ShStrA { public:
//
// Constructors
//
ShStrA();
//
// Destructor
//
~ShStrA() {Reset();}
//
// the first are the only ones that count
//
HRESULT SetStr(LPCSTR pszStr, DWORD cchStr); HRESULT SetStr(LPCSTR pszStr); HRESULT SetStr(LPCWSTR pwszStr, DWORD cchStr);
// the rest just call into the first three
HRESULT SetStr(LPCWSTR pwszStr) {return SetStr(pwszStr, (DWORD) -1);} HRESULT SetStr(ShStrA &shstr) {return SetStr(shstr._pszStr);}
ShStrA& operator=(LPCSTR pszStr) {SetStr(pszStr); return *this;} ShStrA& operator=(LPCWSTR pwszStr) {SetStr(pwszStr); return *this;} ShStrA& operator=(ShStrA &shstr) {SetStr(shstr._pszStr); return *this;}
LPCSTR GetStr() {return _pszStr;} operator LPCSTR() {return _pszStr;}
LPSTR GetInplaceStr(void) {return _pszStr;}
// People want to play with the bytes in OUR internal buffer. If they
// call us correctly, and assume that the resulting pointer is only valid
// as far as they want or as far as the current length, then let them.
LPSTR GetModifyableStr(DWORD cchSizeToModify) { if (cchSizeToModify > _cchSize) if (FAILED(SetSize(cchSizeToModify))) return NULL; return _pszStr; }
HRESULT Append(LPCSTR pszStr, DWORD cchStr); HRESULT Append(LPCSTR pszStr) {return Append(pszStr, (DWORD) -1);} HRESULT Append(CHAR ch) {return Append(&ch, 1);}
//
// the Clone methods return memory that must be freed
//
ShStrA *Clone(); LPSTR CloneStrA(); LPWSTR CloneStrW(); LPSTR CloneStr() {return CloneStrA();}
VOID Reset(); VOID Trim();
#ifdef DEBUG
BOOL IsValid(); #else
inline BOOL IsValid() {return _pszStr != NULL;} #endif //DEBUG
DWORD GetSize() {ASSERT(!(_cchSize % DEFAULT_SHSTR_LENGTH)); return (_pszStr ? _cchSize : 0);}
HRESULT SetSize(DWORD cchSize); DWORD GetLen() {return lstrlenA(_pszStr);}
protected: // friend UrlStr;
/*
TCHAR GetAt(DWORD cch) {return cch < _cchSize ? _pszStr[cch] : TEXT('\0');} TCHAR SetAt(TCHAR ch, DWORD cch) {return cch < _cchSize ? _pszStr[cch] = ch : TEXT('\0');} */ private:
HRESULT _SetStr(LPCSTR psz); HRESULT _SetStr(LPCSTR psz, DWORD cb); HRESULT _SetStr(LPCWSTR pwszStr, DWORD cchStr);
CHAR _szDefaultBuffer[DEFAULT_SHSTR_LENGTH]; LPSTR _pszStr; DWORD _cchSize;
}; //ShStrA
class ShStrW { public:
//
// Constructors
//
ShStrW();
//
// Destructor
//
~ShStrW() {Reset();}
//
// the first are the only ones that count
//
HRESULT SetStr(LPCSTR pszStr, DWORD cchStr); HRESULT SetStr(LPCSTR pszStr); HRESULT SetStr(LPCWSTR pwszStr, DWORD cchStr);
// the rest just call into the first three
HRESULT SetStr(LPCWSTR pwszStr) {return SetStr(pwszStr, (DWORD) -1);} HRESULT SetStr(ShStrW &shstr) {return SetStr(shstr._pszStr);}
ShStrW& operator=(LPCSTR pszStr) {SetStr(pszStr); return *this;} ShStrW& operator=(LPCWSTR pwszStr) {SetStr(pwszStr); return *this;} ShStrW& operator=(ShStrW &shstr) {SetStr(shstr._pszStr); return *this;}
LPCWSTR GetStr() {return _pszStr;} operator LPCWSTR() {return _pszStr;}
LPWSTR GetInplaceStr(void) {return _pszStr;}
// People want to play with the bytes in OUR internal buffer. If they
// call us correctly, and assume that the resulting pointer is only valid
// as far as they want or as far as the current length, then let them.
LPWSTR GetModifyableStr(DWORD cchSizeToModify) { if (cchSizeToModify > _cchSize) if (FAILED(SetSize(cchSizeToModify))) return NULL; return _pszStr; }
HRESULT Append(LPCWSTR pszStr, DWORD cchStr); HRESULT Append(LPCWSTR pszStr) {return Append(pszStr, (DWORD) -1);} HRESULT Append(WCHAR ch) {return Append(&ch, 1);}
//
// the Clone methods return memory that must be freed
//
ShStrW *Clone(); LPSTR CloneStrA(); LPWSTR CloneStrW(); LPWSTR CloneStr() {return CloneStrW();}
VOID Reset(); VOID Trim();
#ifdef DEBUG
BOOL IsValid(); #else
BOOL IsValid() {return (BOOL) (_pszStr ? TRUE : FALSE);} #endif //DEBUG
DWORD GetSize() {ASSERT(!(_cchSize % DEFAULT_SHSTR_LENGTH)); return (_pszStr ? _cchSize : 0);}
HRESULT SetSize(DWORD cchSize); DWORD GetLen() {return lstrlenW(_pszStr);}
protected: // friend UrlStr;
/*
TCHAR GetAt(DWORD cch) {return cch < _cchSize ? _pszStr[cch] : TEXT('\0');} TCHAR SetAt(TCHAR ch, DWORD cch) {return cch < _cchSize ? _pszStr[cch] = ch : TEXT('\0');} */ private:
HRESULT _SetStr(LPCSTR psz); HRESULT _SetStr(LPCSTR psz, DWORD cb); HRESULT _SetStr(LPCWSTR pwszStr, DWORD cchStr);
WCHAR _szDefaultBuffer[DEFAULT_SHSTR_LENGTH]; LPWSTR _pszStr; DWORD _cchSize;
}; //ShStrW
#ifdef UNICODE
typedef ShStrW SHSTR; typedef ShStrW *PSHSTR; #else
typedef ShStrA SHSTR; typedef ShStrA *PSHSTR; #endif //UNICODE
typedef ShStrW SHSTRW; typedef ShStrW *PSHSTRW;
typedef ShStrA SHSTRA; typedef ShStrA *PSHSTRA;
#if 0 //DISABLED until i have written the SHUrl* functions - zekel 7-Nov-96
class UrlStr { public: UrlStr() {return;}
operator LPCTSTR(); operator SHSTR();
UrlStr &SetUrl(LPCSTR pszUrl); UrlStr &SetUrl(LPCWSTR pwszUrl); UrlStr &SetUrl(LPCSTR pszUrl, DWORD cchUrl); UrlStr &SetUrl(LPCWSTR pwszUrl, DWORD cchUrl);
DWORD GetScheme(); VOID GetSchemeStr(PSHSTR pstrScheme);
HRESULT Combine(LPCTSTR pszUrl, DWORD dwFlags);
/*
ShStr &GetLocation(); ShStr &GetAnchor(); ShStr &GetQuery();
HRESULT Canonicalize(DWORD dwFlags); */ protected: SHSTR _strUrl; }; #endif //DISABLED
#endif // _SHSTR_H_
|