windows-nt/Source/XPSP1/NT/shell/inc/shstr.h
2020-09-26 16:20:57 +08:00

322 lines
6.7 KiB
C++

/*++
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_