322 lines
6.7 KiB
C
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_
|