Files
Work/com/variant.hpp
2024-08-07 09:12:07 -04:00

151 lines
3.7 KiB
C++

#ifndef _COM_VARIANT_HPP_
#define _COM_VARIANT_HPP_
#ifndef _COM_OLE2_HPP_
#include <com/ole2.hpp>
#endif
#ifndef _COM_OBJIDL_HPP_
#include <com/objidl.hpp>
#endif
#ifndef _COM_RESULT_HPP_
#include <com/result.hpp>
#endif
#ifndef _COM_BSTRING_HPP_
#include <com/bstring.hpp>
#endif
class SafeArray;
typedef enum VariantType{VTEmpty=VT_EMPTY,VTUint=VT_UINT,VTInt=VT_INT,VTInt1=VT_I1,VTInt2=VT_I2,VTInt4=VT_I4,VTInt8=VT_I8,VTReal4=VT_R4,VTReal8=VT_R8,
VTCcy=VT_CY,VTBStr=VT_BSTR,VTError=VT_ERROR,VTBool=VT_BOOL,VTVariant=VT_VARIANT,VTUChar=VT_UI1,VTArray=VT_ARRAY,
VTDispatch=VT_DISPATCH,VTUnknown=VT_UNKNOWN,VTNull=VT_NULL,VTDate=VT_DATE,VTDecimal=VT_DECIMAL,VTUShort=VT_UI2,
VTUInt4=VT_UI4,VTUInt8=VT_UI8,VTVoid=VT_VOID,VTHResult=VT_HRESULT,VTPtr=VT_PTR,VTSafeArray=VT_SAFEARRAY,VTCArray=VT_CARRAY,
VTUserDefined=VT_USERDEFINED,VTLPSTR=VT_LPSTR,VTLPWSTR=VT_LPWSTR,VTFileTime=VT_FILETIME,VTBlob=VT_BLOB,VTStream=VT_STREAM,
VTStorage=VT_STORAGE,VTClipboardFormat=VT_CF,VTClassID=VT_CLSID,VTVector=VT_VECTOR,VTByRef=VT_BYREF};
class Variant : private tagVARIANT
{
public:
enum Disposition{Assume,Delete};
Variant(void);
virtual ~Variant();
Variant &operator=(const Variant &someVariant);
Variant &operator=(VARIANT &someVariant);
bool changeType(VariantType varType);
bool changeType(Variant &someVariant,VariantType varType);
bool setData(BString &string);
bool getData(BString &string);
bool getData(SafeArray &safeArray);
bool getData(VariantType variantType,void *pData);
bool setData(const long &data);
bool setData(SafeArray &safeArray);
VariantType getType(void)const;
tagVARIANT &getVARIANT(void);
const ComResult &getLastResult(void)const;
Disposition disposition(void)const;
void disposition(Disposition disposition);
bool clear(void);
private:
void init(void);
ComResult mLastResult;
Disposition mDisposition;
};
inline
Variant &Variant::operator=(const Variant &someVariant)
{
mLastResult=::VariantCopyInd(&getVARIANT(),&((Variant&)someVariant).getVARIANT());
return *this;
}
inline
Variant &Variant::operator=(VARIANT &someVariant)
{
mLastResult=::VariantCopyInd(&getVARIANT(),&someVariant);
return *this;
}
inline
tagVARIANT &Variant::getVARIANT(void)
{
return *this;
}
inline
void Variant::init(void)
{
::VariantInit(&getVARIANT());
}
inline
bool Variant::changeType(VariantType varType)
{
mLastResult=::VariantChangeType(&getVARIANT(),&getVARIANT(),0,varType);
return mLastResult.success();
}
inline
bool Variant::changeType(Variant &someVariant,VariantType varType)
{
mLastResult=::VariantChangeType(&someVariant.getVARIANT(),&getVARIANT(),0,varType);
return mLastResult.success();
}
inline
bool Variant::setData(BString &string)
{
if(tagVARIANT::vt!=VTBStr)return false;
tagVARIANT::bstrVal=(wchar_t*)string.str();
return true;
}
inline
bool Variant::setData(const long &data)
{
if(tagVARIANT::vt!=VTInt4&&!changeType(VTInt4))return false;
tagVARIANT::lVal=data;
return true;
}
inline
bool Variant::getData(BString &string)
{
if(tagVARIANT::vt!=VTBStr||!tagVARIANT::bstrVal)return false;
string=tagVARIANT::bstrVal;
return true;
}
inline
VariantType Variant::getType(void)const
{
return VariantType(tagVARIANT::vt);
}
inline
bool Variant::clear(void)
{
if(Assume==disposition())return true;
mLastResult=::VariantClear(&getVARIANT());
return mLastResult.success();
}
inline
const ComResult &Variant::getLastResult(void)const
{
return mLastResult;
}
inline
Variant::Disposition Variant::disposition(void)const
{
return mDisposition;
}
inline
void Variant::disposition(Disposition disposition)
{
mDisposition=disposition;
}
#endif