Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

508 lines
12 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Forms
// Copyright (C) Microsoft Corporation, 1994-2000
//
// File: cstrinout.h
//
// Contents: shell-wide string thunkers, for use by unicode wrappers
//
//----------------------------------------------------------------------------
#ifndef _CSTRINOUT_HXX_
#define _CSTRINOUT_HXX_
#include "uniansi.h"
#define CP_ATOM 0xFFFFFFFF /* not a string at all */
//+---------------------------------------------------------------------------
//
// Class: CConvertStr (CStr)
//
// Purpose: Base class for conversion classes.
//
//----------------------------------------------------------------------------
class CConvertStr
{
public:
operator char *();
inline BOOL IsAtom() { return _uCP == CP_ATOM; }
protected:
CConvertStr(UINT uCP);
~CConvertStr();
void Free();
UINT _uCP;
LPSTR _pstr;
char _ach[MAX_PATH * sizeof(WCHAR)];
};
//+---------------------------------------------------------------------------
//
// Member: CConvertStr::CConvertStr
//
// Synopsis: ctor.
//
//----------------------------------------------------------------------------
inline
CConvertStr::CConvertStr(UINT uCP)
{
_uCP = uCP;
_pstr = NULL;
}
//+---------------------------------------------------------------------------
//
// Member: CConvertStr::~CConvertStr
//
// Synopsis: dtor.
//
//----------------------------------------------------------------------------
inline
CConvertStr::~CConvertStr()
{
Free();
}
//+---------------------------------------------------------------------------
//
// Member: CConvertStr::operator char *
//
// Synopsis: Returns the string.
//
//----------------------------------------------------------------------------
inline
CConvertStr::operator char *()
{
return _pstr;
}
//+---------------------------------------------------------------------------
//
// Class: CStrIn (CStrI)
//
// Purpose: Converts string function arguments which are passed into
// a Windows API.
//
//----------------------------------------------------------------------------
class CStrIn : public CConvertStr
{
public:
CStrIn(LPCWSTR pwstr);
CStrIn(LPCWSTR pwstr, int cwch);
CStrIn(UINT uCP, LPCWSTR pwstr);
CStrIn(UINT uCP, LPCWSTR pwstr, int cwch);
int strlen();
protected:
CStrIn();
void Init(LPCWSTR pwstr, int cwch);
int _cchLen;
};
//+---------------------------------------------------------------------------
//
// Member: CStrIn::CStrIn
//
// Synopsis: Inits the class with a given length
//
//----------------------------------------------------------------------------
inline
CStrIn::CStrIn(LPCWSTR pwstr, int cwch) : CConvertStr(CP_ACP)
{
Init(pwstr, cwch);
}
inline
CStrIn::CStrIn(UINT uCP, LPCWSTR pwstr, int cwch) : CConvertStr(uCP)
{
Init(pwstr, cwch);
}
//+---------------------------------------------------------------------------
//
// Member: CStrIn::CStrIn
//
// Synopsis: Initialization for derived classes which call Init.
//
//----------------------------------------------------------------------------
inline
CStrIn::CStrIn() : CConvertStr(CP_ACP)
{
}
//+---------------------------------------------------------------------------
//
// Member: CStrIn::strlen
//
// Synopsis: Returns the length of the string in characters, excluding
// the terminating NULL.
//
//----------------------------------------------------------------------------
inline int
CStrIn::strlen()
{
return _cchLen;
}
//+---------------------------------------------------------------------------
//
// Class: CStrInMulti (CStrIM)
//
// Purpose: Converts multiple strings which are terminated by two NULLs,
// e.g. "Foo\0Bar\0\0"
//
//----------------------------------------------------------------------------
class CStrInMulti : public CStrIn
{
public:
CStrInMulti(LPCWSTR pwstr);
};
//+---------------------------------------------------------------------------
//
// Class: CPPFIn
//
// Purpose: Converts string function arguments which are passed into
// a Win9x PrivateProfile API. Win9x DBCS has a bug where
// passing a string longer than MAX_PATH will fault kernel.
//
// PPF = Private Profile Filename
//
//----------------------------------------------------------------------------
class CPPFIn
{
public:
operator char *();
CPPFIn(LPCWSTR pwstr);
private:
char _ach[MAX_PATH];
};
//+---------------------------------------------------------------------------
//
// Member: CPPFIn::operator char *
//
// Synopsis: Returns the string.
//
//----------------------------------------------------------------------------
inline
CPPFIn::operator char *()
{
return _ach;
}
//+---------------------------------------------------------------------------
//
// Class: CStrOut (CStrO)
//
// Purpose: Converts string function arguments which are passed out
// from a Windows API.
//
//----------------------------------------------------------------------------
class CStrOut : public CConvertStr
{
public:
CStrOut(LPWSTR pwstr, int cwchBuf);
CStrOut(UINT uCP, LPWSTR pwstr, int cwchBuf);
~CStrOut();
int BufSize();
int ConvertIncludingNul();
int ConvertExcludingNul();
int CopyNoConvert(int srcBytes);
protected:
void Init(LPWSTR pwstr, int cwchBuf);
private:
LPWSTR _pwstr;
int _cwchBuf;
};
//+---------------------------------------------------------------------------
//
// Member: CStrOut::BufSize
//
// Synopsis: Returns the size of the buffer to receive an out argument,
// including the terminating NULL.
//
//----------------------------------------------------------------------------
inline int
CStrOut::BufSize()
{
return _cwchBuf * sizeof(WCHAR);
}
//
// Multi-Byte ---> Unicode conversion
//
//+---------------------------------------------------------------------------
//
// Class: CConvertStrW (CStr)
//
// Purpose: Base class for multibyte conversion classes.
//
//----------------------------------------------------------------------------
class CConvertStrW
{
public:
operator WCHAR *();
protected:
CConvertStrW();
~CConvertStrW();
void Free();
LPWSTR _pwstr;
WCHAR _awch[MAX_PATH * sizeof(WCHAR)];
};
//+---------------------------------------------------------------------------
//
// Member: CConvertStrW::CConvertStrW
//
// Synopsis: ctor.
//
//----------------------------------------------------------------------------
inline
CConvertStrW::CConvertStrW()
{
_pwstr = NULL;
}
//+---------------------------------------------------------------------------
//
// Member: CConvertStrW::~CConvertStrW
//
// Synopsis: dtor.
//
//----------------------------------------------------------------------------
inline
CConvertStrW::~CConvertStrW()
{
Free();
}
//+---------------------------------------------------------------------------
//
// Member: CConvertStrW::operator WCHAR *
//
// Synopsis: Returns the string.
//
//----------------------------------------------------------------------------
inline
CConvertStrW::operator WCHAR *()
{
return _pwstr;
}
//+---------------------------------------------------------------------------
//
// Class: CStrInW (CStrI)
//
// Purpose: Converts multibyte strings into UNICODE
//
//----------------------------------------------------------------------------
class CStrInW : public CConvertStrW
{
public:
CStrInW(LPCSTR pstr) { Init(pstr, -1); }
CStrInW(LPCSTR pstr, int cch) { Init(pstr, cch); }
int strlen();
protected:
CStrInW();
void Init(LPCSTR pstr, int cch);
int _cwchLen;
};
//+---------------------------------------------------------------------------
//
// Member: CStrInW::CStrInW
//
// Synopsis: Initialization for derived classes which call Init.
//
//----------------------------------------------------------------------------
inline
CStrInW::CStrInW()
{
}
//+---------------------------------------------------------------------------
//
// Member: CStrInW::strlen
//
// Synopsis: Returns the length of the string in characters, excluding
// the terminating NULL.
//
//----------------------------------------------------------------------------
inline int
CStrInW::strlen()
{
return _cwchLen;
}
//+---------------------------------------------------------------------------
//
// Class: CStrOutW (CStrO)
//
// Purpose: Converts returned unicode strings into ANSI. Used for [out]
// params (so we initialize with a buffer that should later be
// filled with the correct ansi data)
//
//
//----------------------------------------------------------------------------
class CStrOutW : public CConvertStrW
{
public:
CStrOutW(LPSTR pstr, int cchBuf);
~CStrOutW();
int BufSize();
int ConvertIncludingNul();
int ConvertExcludingNul();
private:
LPSTR _pstr;
int _cchBuf;
};
//+---------------------------------------------------------------------------
//
// Member: CStrOutW::BufSize
//
// Synopsis: Returns the size of the buffer to receive an out argument,
// including the terminating NULL.
//
//----------------------------------------------------------------------------
inline int
CStrOutW::BufSize()
{
return _cchBuf;
}
//+---------------------------------------------------------------------------
//
// Class: CWin32FindDataInOut
//
// Purpose: Converts WIN32_FIND_DATA structures from UNICODE to ANSI
// on the way in, then ANSI to UNICODE on the way out.
//
//----------------------------------------------------------------------------
class CWin32FindDataInOut
{
public:
operator LPWIN32_FIND_DATAA();
CWin32FindDataInOut(LPWIN32_FIND_DATAW pfdW);
~CWin32FindDataInOut();
protected:
LPWIN32_FIND_DATAW _pfdW;
WIN32_FIND_DATAA _fdA;
};
//+---------------------------------------------------------------------------
//
// Member: CWin32FindDataInOut::CWin32FindDataInOut
//
// Synopsis: Convert the non-string fields to ANSI. You'd think this
// isn't necessary, but it is, because Win95 puts secret
// goo into the dwReserved fields that must be preserved.
//
//----------------------------------------------------------------------------
inline
CWin32FindDataInOut::CWin32FindDataInOut(LPWIN32_FIND_DATAW pfdW) :
_pfdW(pfdW)
{
memcpy(&_fdA, _pfdW, FIELD_OFFSET(WIN32_FIND_DATA, cFileName));
_fdA.cFileName[0] = '\0';
_fdA.cAlternateFileName[0] = '\0';
}
//+---------------------------------------------------------------------------
//
// Member: CWin32FindDataInOut::~CWin32FindDataInOut
//
// Synopsis: Convert all the fields from ANSI back to UNICODE.
//
//----------------------------------------------------------------------------
inline
CWin32FindDataInOut::~CWin32FindDataInOut()
{
memcpy(_pfdW, &_fdA, FIELD_OFFSET(WIN32_FIND_DATA, cFileName));
SHAnsiToUnicode(_fdA.cFileName, _pfdW->cFileName, ARRAYSIZE(_pfdW->cFileName));
SHAnsiToUnicode(_fdA.cAlternateFileName, _pfdW->cAlternateFileName, ARRAYSIZE(_pfdW->cAlternateFileName));
}
//+---------------------------------------------------------------------------
//
// Member: CWin32FindDataInOut::operator LPWIN32_FIND_DATAA
//
// Synopsis: Returns the WIN32_FIND_DATAA.
//
//----------------------------------------------------------------------------
inline
CWin32FindDataInOut::operator LPWIN32_FIND_DATAA()
{
return &_fdA;
}
#endif // _CSTRINOUT_HXX_