Windows-Server-2003/inetcore/urlmon/utils/cvar.hxx

306 lines
10 KiB
C++

class COleVariant; // OLE VARIANT wrapper
class COleDateTime; // Based on OLE DATE
class CLongBinary; // forward reference (see afxdb_.h)
/*
class COleCurrency; // Based on OLE CY
class COleDateTimeSpan; // Based on a double
class COleSafeArray; // Based on OLE VARIANT
*/
/////////////////////////////////////////////////////////////////////////////
// AFXDLL support
#undef AFX_DATA
#define AFX_DATA AFX_OLE_DATA
#include <delaydll.h>
// parameter types: by value VTs
#define VTS_I2 "\x02" // a 'short'
#define VTS_I4 "\x03" // a 'long'
#define VTS_R4 "\x04" // a 'float'
#define VTS_R8 "\x05" // a 'double'
#define VTS_CY "\x06" // a 'CY' or 'CY*'
#define VTS_DATE "\x07" // a 'DATE'
#define VTS_WBSTR "\x08" // an 'LPCOLESTR'
#define VTS_DISPATCH "\x09" // an 'IDispatch*'
#define VTS_SCODE "\x0A" // an 'SCODE'
#define VTS_BOOL "\x0B" // a 'BOOL'
#define VTS_VARIANT "\x0C" // a 'const VARIANT&' or 'VARIANT*'
#define VTS_UNKNOWN "\x0D" // an 'IUnknown*'
#if defined(_UNICODE) || defined(OLE2ANSI)
#define VTS_BSTR VTS_WBSTR// an 'LPCOLESTR'
#define VT_BSTRT VT_BSTR
#else
#define VTS_BSTR "\x0E" // an 'LPCSTR'
#define VT_BSTRA 14
#define VT_BSTRT VT_BSTRA
#endif
// parameter types: by reference VTs
#define VTS_PI2 "\x42" // a 'short*'
#define VTS_PI4 "\x43" // a 'long*'
#define VTS_PR4 "\x44" // a 'float*'
#define VTS_PR8 "\x45" // a 'double*'
#define VTS_PCY "\x46" // a 'CY*'
#define VTS_PDATE "\x47" // a 'DATE*'
#define VTS_PBSTR "\x48" // a 'BSTR*'
#define VTS_PDISPATCH "\x49" // an 'IDispatch**'
#define VTS_PSCODE "\x4A" // an 'SCODE*'
#define VTS_PBOOL "\x4B" // a 'VARIANT_BOOL*'
#define VTS_PVARIANT "\x4C" // a 'VARIANT*'
#define VTS_PUNKNOWN "\x4D" // an 'IUnknown**'
// special VT_ and VTS_ values
#define VTS_NONE NULL // used for members with 0 params
#define VT_MFCVALUE 0xFFF // special value for DISPID_VALUE
#define VT_MFCBYREF 0x40 // indicates VT_BYREF type
#define VT_MFCMARKER 0xFF // delimits named parameters (INTERNAL USE)
// variant handling (use V_BSTRT when you have ANSI BSTRs, as in DAO)
#ifndef _UNICODE
#define V_BSTRT(b) (LPSTR)V_BSTR(b)
#else
#define V_BSTRT(b) V_BSTR(b)
#endif
/////////////////////////////////////////////////////////////////////////////
// COleVariant class - wraps VARIANT types
typedef const VARIANT* LPCVARIANT;
class COleVariant : public tagVARIANT
{
// Constructors
public:
COleVariant();
COleVariant(const VARIANT& varSrc);
COleVariant(LPCVARIANT pSrc);
COleVariant(const COleVariant& varSrc);
COleVariant(LPCTSTR lpszSrc);
COleVariant(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set to ANSI string
COleVariant(CString& strSrc);
COleVariant(BYTE nSrc);
COleVariant(short nSrc, VARTYPE vtSrc = VT_I2);
COleVariant(long lSrc, VARTYPE vtSrc = VT_I4);
//COleVariant(const COleCurrency& curSrc);
COleVariant(float fltSrc);
COleVariant(double dblSrc);
COleVariant(const COleDateTime& timeSrc);
//COleVariant(const CByteArray& arrSrc);
COleVariant(const CLongBinary& lbSrc);
// Operations
public:
void Clear();
void ChangeType(VARTYPE vartype, LPVARIANT pSrc = NULL);
void Attach(VARIANT& varSrc);
VARIANT Detach();
BOOL operator==(const VARIANT& varSrc) const;
BOOL operator==(LPCVARIANT pSrc) const;
const COleVariant& operator=(const VARIANT& varSrc);
const COleVariant& operator=(LPCVARIANT pSrc);
const COleVariant& operator=(const COleVariant& varSrc);
const COleVariant& operator=(const LPCTSTR lpszSrc);
const COleVariant& operator=(const CString& strSrc);
const COleVariant& operator=(BYTE nSrc);
const COleVariant& operator=(short nSrc);
const COleVariant& operator=(long lSrc);
//const COleVariant& operator=(const COleCurrency& curSrc);
const COleVariant& operator=(float fltSrc);
const COleVariant& operator=(double dblSrc);
const COleVariant& operator=(const COleDateTime& dateSrc);
//const COleVariant& operator=(const CByteArray& arrSrc);
const COleVariant& operator=(const CLongBinary& lbSrc);
void SetString(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set ANSI string
HRESULT Save(IStream *pStm, BOOL fClearDirty = FALSE);
HRESULT Load(IStream *pStm);
//HRESULT GetSizeMax(ULARGE_INTEGER *pcbSize);
HRESULT GetSizeMax(ULONG *pcbSize);
operator LPVARIANT();
operator LPCVARIANT() const;
// Implementation
public:
~COleVariant();
};
// COleVariant diagnostics and serialization
#ifdef _DEBUG
CDumpContext& AFXAPI operator<<(CDumpContext& dc, COleVariant varSrc);
#endif
//CArchive& AFXAPI operator<<(CArchive& ar, COleVariant varSrc);
//CArchive& AFXAPI operator>>(CArchive& ar, COleVariant& varSrc);
// Helper for initializing VARIANT structures
void AFXAPI AfxVariantInit(LPVARIANT pVar);
class COleSafeArray;
/////////////////////////////////////////////////////////////////////////////
// Helper for initializing COleSafeArray
void AFXAPI AfxSafeArrayInit(COleSafeArray* psa);
/////////////////////////////////////////////////////////////////////////////
// CSafeArray class
typedef const SAFEARRAY* LPCSAFEARRAY;
class COleSafeArray : public tagVARIANT
{
//Constructors
public:
COleSafeArray();
COleSafeArray(const SAFEARRAY& saSrc, VARTYPE vtSrc);
COleSafeArray(LPCSAFEARRAY pSrc, VARTYPE vtSrc);
COleSafeArray(const COleSafeArray& saSrc);
COleSafeArray(const VARIANT& varSrc);
COleSafeArray(LPCVARIANT pSrc);
COleSafeArray(const COleVariant& varSrc);
// Operations
public:
void Clear();
void Attach(VARIANT& varSrc);
VARIANT Detach();
COleSafeArray& operator=(const COleSafeArray& saSrc);
COleSafeArray& operator=(const VARIANT& varSrc);
COleSafeArray& operator=(LPCVARIANT pSrc);
COleSafeArray& operator=(const COleVariant& varSrc);
BOOL operator==(const SAFEARRAY& saSrc) const;
BOOL operator==(LPCSAFEARRAY pSrc) const;
BOOL operator==(const COleSafeArray& saSrc) const;
BOOL operator==(const VARIANT& varSrc) const;
BOOL operator==(LPCVARIANT pSrc) const;
BOOL operator==(const COleVariant& varSrc) const;
operator LPVARIANT();
operator LPCVARIANT() const;
// One dim array helpers
void CreateOneDim(VARTYPE vtSrc, DWORD dwElements,
void* pvSrcData = NULL, long nLBound = 0);
DWORD GetOneDimSize();
void ResizeOneDim(DWORD dwElements);
// Multi dim array helpers
void Create(VARTYPE vtSrc, DWORD dwDims, DWORD* rgElements);
// SafeArray wrapper classes
void Create(VARTYPE vtSrc, DWORD dwDims, SAFEARRAYBOUND* rgsabounds);
void AccessData(void** ppvData);
void UnaccessData();
void AllocData();
void AllocDescriptor(DWORD dwDims);
void Copy(LPSAFEARRAY* ppsa);
void GetLBound(DWORD dwDim, long* pLBound);
void GetUBound(DWORD dwDim, long* pUBound);
void GetElement(long* rgIndices, void* pvData);
void PtrOfIndex(long* rgIndices, void** ppvData);
void PutElement(long* rgIndices, void* pvData);
void Redim(SAFEARRAYBOUND* psaboundNew);
void Lock();
void Unlock();
DWORD GetDim();
DWORD GetElemSize();
void Destroy();
void DestroyData();
void DestroyDescriptor();
//Implementation
public:
~COleSafeArray();
// Cache info to make element access (operator []) faster
DWORD m_dwElementSize;
DWORD m_dwDims;
};
// COleSafeArray diagnostics and serialization
#ifdef _DEBUG
CDumpContext& AFXAPI operator<<(CDumpContext& dc, COleSafeArray saSrc);
#endif
//CArchive& AFXAPI operator<<(CArchive& ar, COleSafeArray saSrc);
//CArchive& AFXAPI operator>>(CArchive& ar, COleSafeArray& saSrc);
#define _AFXDISP_INLINE inline
#ifdef _AFX_INLINE
// COleVariant
_AFXDISP_INLINE COleVariant::COleVariant()
{ AfxVariantInit(this); }
_AFXDISP_INLINE COleVariant::~COleVariant()
{ ::VariantClear(this); }
_AFXDISP_INLINE COleVariant::COleVariant(LPCTSTR lpszSrc)
{ vt = VT_EMPTY; *this = lpszSrc; }
_AFXDISP_INLINE COleVariant::COleVariant(CString& strSrc)
{ vt = VT_EMPTY; *this = strSrc; }
_AFXDISP_INLINE COleVariant::COleVariant(BYTE nSrc)
{ vt = VT_UI1; bVal = nSrc; }
//_AFXDISP_INLINE COleVariant::COleVariant(const COleCurrency& curSrc)
// { vt = VT_CY; cyVal = curSrc.m_cur; }
_AFXDISP_INLINE COleVariant::COleVariant(float fltSrc)
{ vt = VT_R4; fltVal = fltSrc; }
_AFXDISP_INLINE COleVariant::COleVariant(double dblSrc)
{ vt = VT_R8; dblVal = dblSrc; }
//_AFXDISP_INLINE COleVariant::COleVariant(const COleDateTime& dateSrc)
// { vt = VT_DATE; date = dateSrc.m_dt; }
//_AFXDISP_INLINE COleVariant::COleVariant(const CByteArray& arrSrc)
// { vt = VT_EMPTY; *this = arrSrc; }
_AFXDISP_INLINE COleVariant::COleVariant(const CLongBinary& lbSrc)
{ vt = VT_EMPTY; *this = lbSrc; }
_AFXDISP_INLINE BOOL COleVariant::operator==(LPCVARIANT pSrc) const
{ return *this == *pSrc; }
_AFXDISP_INLINE COleVariant::operator LPVARIANT()
{ return this; }
_AFXDISP_INLINE COleVariant::operator LPCVARIANT() const
{ return this; }
#endif //_AFX_INLINE
/*
/////////////////////////////////////////////////////////////////////////////
// Inline function declarations
#ifdef _AFX_PACKING
#pragma pack(pop)
#endif
#ifdef _AFX_ENABLE_INLINES
#define _AFXDISP_INLINE inline
//#include <afxole.inl>
#undef _AFXDISP_INLINE
#endif
#undef AFX_DATA
#define AFX_DATA
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, on)
#endif
#ifndef _AFX_FULLTYPEINFO
#pragma component(mintypeinfo, off)
#endif
*/
/////////////////////////////////////////////////////////////////////////////