home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1997 April
/
Chip_1997-04_cd.bin
/
prezent
/
cb
/
data.z
/
VARIANT.CPP
< prev
next >
Wrap
Text File
|
1997-01-16
|
57KB
|
2,495 lines
//---------------------------------------------------------------------------
// variant.cpp - support for delphi variants in cpp
//---------------------------------------------------------------------------
// $Revision: 1.39 $
//-------------------------------------------------------------------------
// copyright (c) 1996 Borland International
//----------------------------------------------------------------------------
#pragma inline
// PRONTO_NAMESPACES must be defined when .HPP headers where generated
// with namespace enabled.. (BB)
//
// #define PRONTO_NAMESPACES
#include<windows.hpp>
#include<ole2.hpp>
#include<oleauto.hpp>
#include <sysutils.hpp>
#include "variant.hpp"
#ifdef near
#undef near
#endif
#if defined(PRONTO_NAMESPACES)
namespace System
{
#endif
//---------------------------------------------------------------------------
//statics
Variant __fastcall Variant::CreateObject(const String& ProgID)
{
#if defined(PRONTO_NAMESPACES)
return Oleauto::CreateOleObject(const_cast<String&>(ProgID));
#else
return ::CreateOleObject(const_cast<String&>(ProgID));
#endif
}
Variant __fastcall Variant::GetActiveObject(const String& ProgID)
{
#if defined(PRONTO_NAMESPACES)
return Oleauto::GetActiveOleObject(const_cast<String&>(ProgID));
#else
return ::GetActiveOleObject(const_cast<String&>(ProgID));
#endif
}
//ctors
__fastcall Variant::Variant()
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
}
__fastcall Variant::Variant(const Variant& rhs)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
#if defined(PRONTO_NAMESPACES)
System::VarCopyNoInd(*this, rhs);
#else
::VarCopyNoInd(*this, rhs);
#endif
}
__fastcall Variant::Variant(const short src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varSmallint;
VSmallint = src;
}
__fastcall Variant::Variant(const int src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varInteger;
VInteger = src;
}
__fastcall Variant::Variant(const float src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varSingle;
VSingle = src;
}
__fastcall Variant::Variant(const double src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varDouble;
VDouble = src;
}
__fastcall Variant::Variant(const Currency src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varCurrency;
VCurrency = src;
}
__fastcall Variant::Variant(const TDateTime src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varDate;
VDate = src;
}
__fastcall Variant::Variant(const bool src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varBoolean;
VBoolean = src;
}
__fastcall Variant::Variant(const WordBool src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varBoolean;
VBoolean = src;
}
__fastcall Variant::Variant(const Byte src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varByte;
VByte = src;
}
__fastcall Variant::Variant(const String& src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varString;
VString = 0;
(AnsiString&)VString = src;
}
//!JK for now, I'm treating this as a character array
//!JK but it could also be viewed as a character by reference!!!!
__fastcall Variant::Variant(const char* src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varString;
VString = 0;
(AnsiString&)VString = src;
}
__fastcall Variant::Variant(wchar_t* const src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varOleStr;
VOleStr = SysAllocString(src);
}
__fastcall Variant::Variant(Ole2::IDispatch* const src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varDispatch;
if (src)
src->AddRef();
VDispatch = src;
}
__fastcall Variant::Variant(Ole2::IUnknown* const src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varUnknown;
if (src)
src->AddRef();
VUnknown = src;
}
//ByRef constructors
__fastcall Variant::Variant(short* src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varSmallint | varByRef;
VPointer = src;
}
__fastcall Variant::Variant(int* src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varInteger | varByRef;
VPointer = src;
}
__fastcall Variant::Variant(float* src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varSingle | varByRef;
VPointer = src;
}
__fastcall Variant::Variant(double* src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varDouble | varByRef;
VPointer = src;
}
__fastcall Variant::Variant(Currency* src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varCurrency | varByRef;
VPointer = src;
}
__fastcall Variant::Variant(TDateTime* src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varDate | varByRef;
VPointer = src;
}
__fastcall Variant::Variant(WordBool* src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varBoolean | varByRef;
VPointer = src;
}
__fastcall Variant::Variant(Byte* src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varByte | varByRef;
VPointer = src;
}
__fastcall Variant::Variant(wchar_t** src)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
VType = varOleStr | varByRef;
VPointer = src;
}
//construct a Variant array of type varType
__fastcall Variant::Variant(const int* bounds,const int boundsSize,Word varType)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
#if defined(PRONTO_NAMESPACES)
*this = System::VarArrayCreate(bounds, boundsSize, varType);
#else
*this = ::VarArrayCreate(bounds, boundsSize, varType);
#endif
}
// construct a one dimensional Variant array of type varVariant
// and fill with values
__fastcall Variant::Variant(const Variant* values, const int valuesSize)
{
VariantInit(reinterpret_cast<VARIANTARG *>(this));
#if defined(PRONTO_NAMESPACES)
*this = System::VarArrayOf(values, valuesSize);
#else
*this = ::VarArrayOf(values, valuesSize);
#endif
}
__fastcall Variant::~Variant()
{
#if defined(PRONTO_NAMESPACES)
System::VarClear(*this);
#else
::VarClear(*this);
#endif
}
Variant& __fastcall Variant::operator =(const Variant& rhs)
{
#if defined(PRONTO_NAMESPACES)
System::VarCopyNoInd(*this, rhs);
#else
::VarCopyNoInd(*this, rhs);
#endif
return *this;
}
Variant& __fastcall Variant::operator +=(const Variant&)
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarAdd$qqrv:near
call @System@@VarAdd$qqrv
#else
extrn @@VarAdd$qqrv:near
call @@VarAdd$qqrv
#endif
}
return *this;
}
Variant& __fastcall Variant::operator -=(const Variant&)
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarSub$qqrv:near
call @System@@VarSub$qqrv
#else
extrn @@VarSub$qqrv:near
call @@VarSub$qqrv
#endif
}
return *this;
}
Variant& __fastcall Variant::operator *=(const Variant&)
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarMul$qqrv:near
call @System@@VarMul$qqrv
#else
extrn @@VarMul$qqrv:near
call @@VarMul$qqrv
#endif
}
return *this;
}
Variant& __fastcall Variant::operator /=(const Variant&)
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarRDiv$qqrv:near
call @System@@VarRDiv$qqrv
#else
extrn @@VarRDiv$qqrv:near
call @@VarRDiv$qqrv
#endif
}
return *this;
}
Variant& __fastcall Variant::operator %=(const Variant&)
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarMod$qqrv:near
call @System@@VarMod$qqrv
#else
extrn @@VarMod$qqrv:near
call @@VarMod$qqrv
#endif
}
return *this;
}
Variant& __fastcall Variant::operator &=(const Variant&)
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarAnd$qqrv:near
call @System@@VarAnd$qqrv
#else
extrn @@VarAnd$qqrv:near
call @@VarAnd$qqrv
#endif
}
return *this;
}
Variant& __fastcall Variant::operator |=(const Variant&)
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarOr$qqrv:near
call @System@@VarOr$qqrv
#else
extrn @@VarOr$qqrv:near
call @@VarOr$qqrv
#endif
}
return *this;
}
Variant& __fastcall Variant::operator ^=(const Variant&)
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarXor$qqrv:near
call @System@@VarXor$qqrv
#else
extrn @@VarXor$qqrv:near
call @@VarXor$qqrv
#endif
}
return *this;
}
Variant& __fastcall Variant::operator <<=(const Variant&)
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarShl$qqrv:near
call @System@@VarShl$qqrv
#else
extrn @@VarShl$qqrv:near
call @@VarShl$qqrv
#endif
}
return *this;
}
Variant& __fastcall Variant::operator >>=(const Variant&)
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarShr$qqrv:near
call @System@@VarShr$qqrv
#else
extrn @@VarShr$qqrv:near
call @@VarShr$qqrv
#endif
}
return *this;
}
bool __fastcall Variant::operator ==(const Variant&) const
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarCmp$qqrv:near
call @System@@VarCmp$qqrv
#else
extrn @@VarCmp$qqrv:near
call @@VarCmp$qqrv
#endif
sete al
and eax, 1
}
}
bool __fastcall Variant::operator !=(const Variant&) const
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarCmp$qqrv:near
call @System@@VarCmp$qqrv
#else
extrn @@VarCmp$qqrv:near
call @@VarCmp$qqrv
#endif
setne al
and eax, 1
}
}
bool __fastcall Variant::operator <(const Variant&) const
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarCmp$qqrv:near
call @System@@VarCmp$qqrv
#else
extrn @@VarCmp$qqrv:near
call @@VarCmp$qqrv
#endif
setb al
and eax, 1
}
}
bool __fastcall Variant::operator >(const Variant&) const
{
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarCmp$qqrv:near
call @System@@VarCmp$qqrv
#else
extrn @@VarCmp$qqrv:near
call @@VarCmp$qqrv
#endif
seta al
and eax, 1
}
}
bool __fastcall Variant::operator <=(const Variant& rhs) const
{
return !operator >(rhs);
}
bool __fastcall Variant::operator >=(const Variant& rhs) const
{
return !operator <(rhs);
}
Variant __fastcall Variant::operator +(const Variant& rhs) const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarAdd$qqrv:near
#else
extrn @@VarAdd$qqrv:near
#endif
mov eax, ptmp
mov edx, rhs
#if defined(PRONTO_NAMESPACES)
call @System@@VarAdd$qqrv
#else
call @@VarAdd$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator -(const Variant& rhs) const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarSub$qqrv:near
#else
extrn @@VarSub$qqrv:near
#endif
mov eax, ptmp
mov edx, rhs
#if defined(PRONTO_NAMESPACES)
call @System@@VarSub$qqrv
#else
call @@VarSub$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator *(const Variant& rhs) const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarMul$qqrv:near
#else
extrn @@VarMul$qqrv:near
#endif
mov eax, ptmp
mov edx, rhs
#if defined(PRONTO_NAMESPACES)
call @System@@VarMul$qqrv
#else
call @@VarMul$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator /(const Variant& rhs) const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarRDiv$qqrv:near
#else
extrn @@VarRDiv$qqrv:near
#endif
mov eax, ptmp
mov edx, rhs
#if defined(PRONTO_NAMESPACES)
call @System@@VarRDiv$qqrv
#else
call @@VarRDiv$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator %(const Variant& rhs) const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarMod$qqrv:near
#else
extrn @@VarMod$qqrv:near
#endif
mov eax, ptmp
mov edx, rhs
#if defined(PRONTO_NAMESPACES)
call @System@@VarMod$qqrv
#else
call @@VarMod$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator &(const Variant& rhs) const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarAnd$qqrv:near
#else
extrn @@VarAnd$qqrv:near
#endif
mov eax, ptmp
mov edx, rhs
#if defined(PRONTO_NAMESPACES)
call @System@@VarAnd$qqrv
#else
call @@VarAnd$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator |(const Variant& rhs) const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarOr$qqrv:near
#else
extrn @@VarOr$qqrv:near
#endif
mov eax, ptmp
mov edx, rhs
#if defined(PRONTO_NAMESPACES)
call @System@@VarOr$qqrv
#else
call @@VarOr$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator ^(const Variant& rhs) const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarXor$qqrv:near
#else
extrn @@VarXor$qqrv:near
#endif
mov eax, ptmp
mov edx, rhs
#if defined(PRONTO_NAMESPACES)
call @System@@VarXor$qqrv
#else
call @@VarXor$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator <<(const Variant& rhs) const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarShl$qqrv:near
#else
extrn @@VarShl$qqrv:near
#endif
mov eax, ptmp
mov edx, rhs
#if defined(PRONTO_NAMESPACES)
call @System@@VarShl$qqrv
#else
call @@VarShl$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator >>(const Variant& rhs) const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarShr$qqrv:near
#else
extrn @@VarShr$qqrv:near
#endif
mov eax, ptmp
mov edx, rhs
#if defined(PRONTO_NAMESPACES)
call @System@@VarShr$qqrv
#else
call @@VarShr$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator -() const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarNeg$qqrv:near
#else
extrn @@VarNeg$qqrv:near
#endif
mov eax, ptmp
#if defined(PRONTO_NAMESPACES)
call @System@@VarNeg$qqrv
#else
call @@VarNeg$qqrv
#endif
}
return tmp;
}
Variant __fastcall Variant::operator !() const
{
Variant tmp(*this);
Variant* ptmp = &tmp;
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarNot$qqrv:near
#else
extrn @@VarNot$qqrv:near
#endif
mov eax, ptmp
#if defined(PRONTO_NAMESPACES)
call @System@@VarNot$qqrv
#else
call @@VarNot$qqrv
#endif
}
return tmp;
}
__fastcall Variant::operator short() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varSmallint);
#else
::VarCast(tmp, *this, varSmallint);
#endif
return tmp.VSmallint;
}
__fastcall Variant::operator int() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varInteger);
#else
::VarCast(tmp, *this, varInteger);
#endif
return tmp.VInteger;
}
__fastcall Variant::operator float() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varSingle);
#else
::VarCast(tmp, *this, varSingle);
#endif
return tmp.VSingle;
}
__fastcall Variant::operator double() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varDouble);
#else
::VarCast(tmp, *this, varDouble);
#endif
return tmp.VDouble;
}
__fastcall Variant::operator Currency() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varCurrency);
#else
::VarCast(tmp, *this, varCurrency);
#endif
return tmp.VCurrency;
}
__fastcall Variant::operator TDateTime() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varDate);
#else
::VarCast(tmp, *this, varDate);
#endif
return tmp.VDate;
}
__fastcall Variant::operator bool() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varBoolean);
#else
::VarCast(tmp, *this, varBoolean);
#endif
return (bool)tmp.VBoolean;
}
__fastcall Variant::operator WordBool() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varBoolean);
#else
::VarCast(tmp, *this, varBoolean);
#endif
return tmp.VBoolean;
}
__fastcall Variant::operator Byte() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varByte);
#else
::VarCast(tmp, *this, varByte);
#endif
return tmp.VByte;
}
__fastcall Variant::operator AnsiString() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varString);
#else
::VarCast(tmp, *this, varString);
#endif
return AnsiString((AnsiString&)(tmp.VString));
}
__fastcall Variant::operator Ole2::IDispatch*()
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varDispatch);
#else
::VarCast(tmp, *this, varDispatch);
#endif
if (tmp.VDispatch)
tmp.VDispatch->AddRef();
return tmp.VDispatch;
}
__fastcall Variant::operator Ole2::IUnknown*()
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varUnknown);
#else
::VarCast(tmp, *this, varUnknown);
#endif
if (tmp.VUnknown)
tmp.VUnknown->AddRef();
return tmp.VUnknown;
}
// by ref conversion operators
__fastcall Variant::operator short*()
{
if (VType == (varSmallint | varByRef))
return reinterpret_cast<short*>(VPointer);
else if (VType == varSmallint)
return &VSmallint;
else
throw new EVariantError(sOpShortPtr);
}
__fastcall Variant::operator int*()
{
if (VType == (varInteger | varByRef))
return reinterpret_cast<int*>(VPointer);
else if (VType == varInteger)
return &VInteger;
else
throw new EVariantError(sOpIntPtr);
}
__fastcall Variant::operator float*()
{
if (VType == (varSingle | varByRef))
return reinterpret_cast<float*>(VPointer);
else if (VType == varSingle)
return &VSingle;
else
throw new EVariantError(sOpFloatPtr);
}
__fastcall Variant::operator double*()
{
if (VType == (varDouble | varByRef))
return reinterpret_cast<double*>(VPointer);
else if (VType == varDouble)
return &VDouble;
else
throw new EVariantError(sOpDoublePtr);
}
__fastcall Variant::operator Currency*()
{
if (VType == (varCurrency | varByRef))
return reinterpret_cast<Currency*>(VPointer);
else if (VType == varCurrency)
return reinterpret_cast<Currency*>(&VCurrency);
else
throw new EVariantError(sOpCurrencyPtr);
}
__fastcall Variant::operator TDateTime*()
{
if (VType == (varDate | varByRef))
return reinterpret_cast<TDateTime*>(VPointer);
else if (VType == varDate)
return reinterpret_cast<TDateTime*>(&VDate);
else
throw new EVariantError(sOpTDateTimePtr);
}
__fastcall Variant::operator WordBool*()
{
if (VType == (varBoolean | varByRef))
return reinterpret_cast<WordBool*>(VPointer);
else
throw new EVariantError(sOpBoolPtr);
}
__fastcall Variant::operator Byte*()
{
if (VType == (varByte | varByRef))
return reinterpret_cast<Byte*>(VPointer);
else if (VType == varByte)
return &VByte;
else
throw new EVariantError(sOpBytePtr);
}
__fastcall Variant::operator wchar_t**()
{
if (VType == (varOleStr | varByRef))
return reinterpret_cast<wchar_t**>(VPointer);
else if (VType == varOleStr)
return &VOleStr;
else
throw new EVariantError(sOpWCharTPtr);
}
void __fastcall Variant::SetError(const int err)
{
Clear();
VType = varError;
VError = err;
}
int __fastcall Variant::GetError() const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varError);
#else
::VarCast(tmp, *this, varError);
#endif
return tmp.VError;
}
Variant& __fastcall Variant::ChangeType(int varType)
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varType);
#else
::VarCast(tmp, *this, varType);
#endif
return operator =(tmp);
}
Variant __fastcall Variant::AsType(int varType) const
{
Variant tmp;
#if defined(PRONTO_NAMESPACES)
System::VarCast(tmp, *this, varType);
#else
::VarCast(tmp, *this, varType);
#endif
return tmp;
}
void __fastcall Variant::Clear()
{
#if defined(PRONTO_NAMESPACES)
System::VarClear(*this);
#else
::VarClear(*this);
#endif
}
int __fastcall Variant::Type() const
{
#if defined(PRONTO_NAMESPACES)
return System::VarType(*this);
#else
return ::VarType(*this);
#endif
}
bool __fastcall Variant::IsNull() const
{
#if defined(PRONTO_NAMESPACES)
return System::VarIsNull(*this);
#else
return ::VarIsNull(*this);
#endif
}
bool __fastcall Variant::IsEmpty() const
{
#if defined(PRONTO_NAMESPACES)
return System::VarIsEmpty(*this);
#else
return ::VarIsEmpty(*this);
#endif
}
bool __fastcall Variant::IsArray() const
{
#if defined(PRONTO_NAMESPACES)
return System::VarIsArray(*this);
#else
return ::VarIsArray(*this);
#endif
}
int __fastcall Variant::ArrayDimCount() const
{
#if defined(PRONTO_NAMESPACES)
return System::VarArrayDimCount(*this);
#else
return ::VarArrayDimCount(*this);
#endif
}
int __fastcall Variant::ArrayLowBound(const int dim) const
{
#if defined(PRONTO_NAMESPACES)
return System::VarArrayLowBound(*this, dim);
#else
return ::VarArrayLowBound(*this, dim);
#endif
}
int __fastcall Variant::ArrayHighBound(const int dim) const
{
#if defined(PRONTO_NAMESPACES)
return System::VarArrayHighBound(*this, dim);
#else
return ::VarArrayHighBound(*this, dim);
#endif
}
void __fastcall Variant::ArrayRedim(int highBound)
{
#if defined(PRONTO_NAMESPACES)
System::VarArrayRedim(*this, highBound);
#else
::VarArrayRedim(*this, highBound);
#endif
}
Pointer __fastcall Variant::ArrayLock()
{
#if defined(PRONTO_NAMESPACES)
return System::VarArrayLock(*this);
#else
return ::VarArrayLock(*this);
#endif
}
void __fastcall Variant::ArrayUnlock()
{
#if defined(PRONTO_NAMESPACES)
System::VarArrayUnlock(*this);
#else
::VarArrayUnlock(*this);
#endif
}
Variant& __fastcall Variant::operator [](const int idx)
{
//!JK only use this function for arrays of type Variant!
if (!IsArray() || idx < ArrayLowBound() || idx > ArrayHighBound())
throw new EVariantError(sVarRangeArray);
Variant* array((Variant*)ArrayLock());
Variant* v(array + idx);
ArrayUnlock();
return *v;
}
Variant __fastcall Variant::GetElement(const int i1) const
{
Variant tmp;
Variant* ptmp = &tmp;
asm {
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarArrayGet$qr14System@Variantii:near
#else
extrn @@VarArrayGet$qr7Variantii:near
#endif
push i1
push 1
mov eax, this
push eax
mov eax, ptmp
push eax
#if defined(PRONTO_NAMESPACES)
call @System@@VarArrayGet$qr14System@Variantii
#else
call @@VarArrayGet$qr7Variantii
#endif
add esp, 0x10
}
return tmp;
}
Variant __fastcall Variant::GetElement(const int i1, const int i2) const
{
Variant tmp;
Variant* ptmp = &tmp;
asm {
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarArrayGet$qr14System@Variantii:near
#else
extrn @@VarArrayGet$qr7Variantii:near
#endif
push i2
push i1
push 2
mov eax, this
push eax
mov eax, ptmp
push eax
#if defined(PRONTO_NAMESPACES)
call @System@@VarArrayGet$qr14System@Variantii
#else
call @@VarArrayGet$qr7Variantii
#endif
add esp, 0x14
}
return tmp;
}
Variant __fastcall Variant::GetElement(const int i1, const int i2,
const int i3) const
{
Variant tmp;
Variant* ptmp = &tmp;
asm {
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarArrayGet$qr14System@Variantii:near
#else
extrn @@VarArrayGet$qr7Variantii:near
#endif
push i3
push i2
push i1
push 3
mov eax, this
push eax
mov eax, ptmp
push eax
#if defined(PRONTO_NAMESPACES)
call @System@@VarArrayGet$qr14System@Variantii
#else
call @@VarArrayGet$qr7Variantii
#endif
add esp, 0x18
}
return tmp;
}
Variant __fastcall Variant::GetElement(const int i1, const int i2,
const int i3, const int i4) const
{
Variant tmp;
Variant* ptmp = &tmp;
asm {
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarArrayGet$qr14System@Variantii:near
#else
extrn @@VarArrayGet$qr7Variantii:near
#endif
push i4
push i3
push i2
push i1
push 4
mov eax, this
push eax
mov eax, ptmp
push eax
#if defined(PRONTO_NAMESPACES)
call @System@@VarArrayGet$qr14System@Variantii
#else
call @@VarArrayGet$qr7Variantii
#endif
add esp, 0x1C
}
return tmp;
}
Variant __fastcall Variant::GetElement(const int i1, const int i2,
const int i3, const int i4, const int i5) const
{
Variant tmp;
Variant* ptmp = &tmp;
asm {
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarArrayGet$qr14System@Variantii:near
#else
extrn @@VarArrayGet$qr7Variantii:near
#endif
push i5
push i4
push i3
push i2
push i1
push 5
mov eax, this
push eax
mov eax, ptmp
push eax
#if defined(PRONTO_NAMESPACES)
call @System@@VarArrayGet$qr14System@Variantii
#else
call @@VarArrayGet$qr7Variantii
#endif
add esp, 0x20
}
return tmp;
}
void __fastcall Variant::PutElement(const Variant& data, const int i1)
{
asm {
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarArrayPut$qr14System@Variantrx14System@Variantii:near
#else
extrn @@VarArrayPut$qr7Variantrx7Variantii:near
#endif
push i1
push 1
mov eax, data
push eax
mov eax, this
push eax
#if defined(PRONTO_NAMESPACES)
call @System@@VarArrayPut$qr14System@Variantrx14System@Variantii
#else
call @@VarArrayPut$qr7Variantrx7Variantii
#endif
add esp, 0x10
}
}
void __fastcall Variant::PutElement(const Variant& data, const int i1,
const int i2)
{
asm {
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarArrayPut$qr14System@Variantrx14System@Variantii:near
#else
extrn @@VarArrayPut$qr7Variantrx7Variantii:near
#endif
push i2
push i1
push 2
mov eax, data
push eax
mov eax, this
push eax
#if defined(PRONTO_NAMESPACES)
call @System@@VarArrayPut$qr14System@Variantrx14System@Variantii
#else
call @@VarArrayPut$qr7Variantrx7Variantii
#endif
add esp, 0x14
}
}
void __fastcall Variant::PutElement(const Variant& data, const int i1,
const int i2, const int i3)
{
asm {
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarArrayPut$qr14System@Variantrx14System@Variantii:near
#else
extrn @@VarArrayPut$qr7Variantrx7Variantii:near
#endif
push i3
push i2
push i1
push 3
mov eax, data
push eax
mov eax, this
push eax
#if defined(PRONTO_NAMESPACES)
call @System@@VarArrayPut$qr14System@Variantrx14System@Variantii
#else
call @@VarArrayPut$qr7Variantrx7Variantii
#endif
add esp, 0x18
}
}
void __fastcall Variant::PutElement(const Variant& data, const int i1,
const int i2, const int i3, const int i4)
{
asm {
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarArrayPut$qr14System@Variantrx14System@Variantii:near
#else
extrn @@VarArrayPut$qr7Variantrx7Variantii:near
#endif
push i4
push i3
push i2
push i1
push 4
mov eax, data
push eax
mov eax, this
push eax
#if defined(PRONTO_NAMESPACES)
call @System@@VarArrayPut$qr14System@Variantrx14System@Variantii
#else
call @@VarArrayPut$qr7Variantrx7Variantii
#endif
add esp, 0x1C
}
}
void __fastcall Variant::PutElement(const Variant& data, const int i1,
const int i2, const int i3, const int i4, const int i5)
{
asm {
#if defined(PRONTO_NAMESPACES)
extrn @System@@VarArrayPut$qr14System@Variantrx14System@Variantii:near
#else
extrn @@VarArrayPut$qr7Variantrx7Variantii:near
#endif
push i5
push i4
push i3
push i2
push i1
push 5
mov eax, data
push eax
mov eax, this
push eax
#if defined(PRONTO_NAMESPACES)
call @System@@VarArrayPut$qr14System@Variantrx14System@Variantii
#else
call @@VarArrayPut$qr7Variantrx7Variantii
#endif
add esp, 0x20
}
}
Variant __fastcall Variant::Exec(AutoCmd& cmd, Integer lcid)
{
//Result
Variant tmp;
Variant* ptmp = 0;
if (cmd.RequestResult())
ptmp = &tmp;
//construct a call descriptor
TCallDesc callDesc;
TCallDesc* pcallDesc = &callDesc;
// set calltype, argcount, named arg count
callDesc.CallType = cmd.GetCallType();
callDesc.ArgCount = cmd.GetArgCount();
callDesc.NamedArgCount = cmd.GetNamedArgCount();
callDesc.Locale = lcid;
// fill in arg types for named args
for (Byte i = 0; i < callDesc.NamedArgCount; i++)
{
int argType = cmd.GetNamedArgType(i);
if (argType == varString)
callDesc.ArgTypes[i] = varStrArg;
else if (argType == (varString | varByRef))
callDesc.ArgTypes[i] = varStrArg + 128;
else
{
callDesc.ArgTypes[i] = (Byte)(argType & varTypeMask);
callDesc.ArgTypes[i] += (Byte)((argType & varByRef)? 128: 0);
}
}
// fill in arg types for un-named args
for (Byte i = callDesc.NamedArgCount; i < callDesc.ArgCount; i++)
{
int argType = cmd.GetArgType((Byte)(i-callDesc.NamedArgCount));
if (argType == varString)
callDesc.ArgTypes[i] = varStrArg;
else if (argType == (varString | varByRef))
callDesc.ArgTypes[i] = varStrArg + 128;
else
{
callDesc.ArgTypes[i] = (Byte)(argType & varTypeMask);
callDesc.ArgTypes[i] += (Byte)((argType & varByRef)? 128: 0);
}
}
// get ptr that points after all argtypes
char* p = (char*) &callDesc.ArgTypes[callDesc.ArgCount];
// fill in the name of the cmd
strcpy(p, (char*)cmd.GetName().c_str());
// fill in names of named args
for (Byte i = 0; i < callDesc.NamedArgCount; i++)
strcat(p, (char*)cmd.GetNamedParmName(i).c_str());
// fill an array of values/addresses of named args (makes asm easier)
void* namedParms[MaxDispArgs*2];
void* namedParmsPtr = &namedParms;
Byte namedCursor = 0;
for (Byte i = 0; i < callDesc.NamedArgCount; i++)
{
Variant* v = & cmd.GetNamedParm(i);
int argType = cmd.GetNamedArgType(i) & varTypeMask;
bool byRef = cmd.GetNamedArgType(i) & varByRef;
if (!byRef)
{
switch (argType)
{
case varString:
namedParms[namedCursor++] = cmd.GetNamedStringArg(i).c_str();
break;
case varDouble:
case varDate:
case varCurrency:
namedParms[namedCursor++] = reinterpret_cast<void*>(*((&v->VInteger) + 1)); //half
namedParms[namedCursor++] = reinterpret_cast<void*>(v->VInteger); // other half
break;
case varSingle:
case varDispatch:
case varInteger:
case varBoolean:
case varUnknown:
namedParms[namedCursor++] = reinterpret_cast<void*>(v->VInteger); // pick 1 (union)
break;
case varSmallint:
namedParms[namedCursor++] = reinterpret_cast<void*>((int)v->VSmallint);
break;
case varByte:
namedParms[namedCursor++] = reinterpret_cast<void*>((int)v->VByte);
break;
case varVariant:
namedParms[namedCursor++] = v;
break;
}
}
else // byRef
{
if (argType == varString)
namedParms[namedCursor++] = cmd.GetNamedStringPtr(i);
else if (argType == varVariant)
namedParms[namedCursor++] = v;
else
namedParms[namedCursor++] = v->VPointer;
}
}
// fill an array of values/addresses of un-named args (makes asm easier)
void* parms[MaxDispArgs*2];
void* parmsPtr = &parms;
Byte cursor = 0;
for (Byte i = 0; i < callDesc.ArgCount - callDesc.NamedArgCount; i++)
{
Variant* v = & cmd.GetParm(i);
int argType = cmd.GetArgType(i) & varTypeMask;
bool byRef = cmd.GetArgType(i) & varByRef;
if (!byRef)
{
switch (argType)
{
case varString:
parms[cursor++] = cmd.GetStringArg(i).c_str();
break;
case varDouble:
case varDate:
case varCurrency:
parms[cursor++] = reinterpret_cast<void*>(*((&v->VInteger) + 1)); //half
parms[cursor++] = reinterpret_cast<void*>(v->VInteger); // other half
break;
case varSingle:
case varDispatch:
case varInteger:
case varBoolean:
case varUnknown:
parms[cursor++] = reinterpret_cast<void*>(v->VInteger); // pick 1 (union)
break;
case varSmallint:
parms[cursor++] = reinterpret_cast<void*>((int)v->VSmallint);
break;
case varByte:
parms[cursor++] = reinterpret_cast<void*>((int)v->VByte);
break;
case varVariant:
parms[cursor++] = v;
break;
}
}
else // byRef
{
if (argType == varString)
parms[cursor++] = cmd.GetStringPtr(i);
else if (argType == varVariant)
parms[cursor++] = v;
else
parms[cursor++] = v->VPointer;
}
}
asm
{
#if defined(PRONTO_NAMESPACES)
extrn @System@@DispInvoke$qv:near
#else
extrn @@DispInvoke$qv:near
#endif
xor edx, edx
mov dl, cursor
dec edx
imul edx, 4
add edx, parmsPtr
mov cl, cursor
@@0:
dec cl
test cl, cl
jl @@1
mov eax, [edx]
push eax
sub edx, 4
jmp @@0
@@1:
xor edx, edx
mov dl, namedCursor
dec edx
imul edx, 4
add edx, namedParmsPtr
@@2:
dec cl
test cl, cl
jl @@3
mov eax, [edx]
push eax
sub edx, 4
jmp @@2
@@3:
push pcallDesc
push this
push ptmp
#if defined(PRONTO_NAMESPACES)
call @System@@DispInvoke$qv
#else
call @@DispInvoke$qv
#endif
xor ecx, ecx
mov cl, cursor
add cl, namedCursor
imul ecx, 4
add ecx, 12
add esp, ecx
}
// if no result is returned, return a true
if (!cmd.RequestResult())
tmp = true;
return tmp;
}
// alternate syntax automation stuff
void Variant::OleProcedure(const String& name, Variant& v0,
Variant& v1, Variant& v2, Variant& v3,
Variant& v4, Variant& v5, Variant& v6,
Variant& v7, Variant& v8, Variant& v9)
{
Procedure p(name);
if (v0.Type() != varEmpty)
{
p << v0;
if (v1.Type() != varEmpty)
{
p << v1;
if (v2.Type() != varEmpty)
{
p << v2;
if (v3.Type() != varEmpty)
{
p << v3;
if (v4.Type() != varEmpty)
{
p << v4;
if (v5.Type() != varEmpty)
{
p << v5;
if (v6.Type() != varEmpty)
{
p << v6;
if (v7.Type() != varEmpty)
{
p << v7;
if (v8.Type() != varEmpty)
{
p << v8;
if (v9.Type() != varEmpty)
p << v9;
}
}
}
}
}
}
}
}
}
Exec(p);
}
Variant Variant::OleFunction(const String& name, Variant& v0,
Variant& v1, Variant& v2, Variant& v3,
Variant& v4, Variant& v5, Variant& v6,
Variant& v7, Variant& v8, Variant& v9)
{
Function p(name);
if (v0.Type() != varEmpty)
{
p << v0;
if (v1.Type() != varEmpty)
{
p << v1;
if (v2.Type() != varEmpty)
{
p << v2;
if (v3.Type() != varEmpty)
{
p << v3;
if (v4.Type() != varEmpty)
{
p << v4;
if (v5.Type() != varEmpty)
{
p << v5;
if (v6.Type() != varEmpty)
{
p << v6;
if (v7.Type() != varEmpty)
{
p << v7;
if (v8.Type() != varEmpty)
{
p << v8;
if (v9.Type() != varEmpty)
p << v9;
}
}
}
}
}
}
}
}
}
return Exec(p);
}
Variant Variant::OlePropertyGet(const String& name, Variant& v0,
Variant& v1, Variant& v2, Variant& v3,
Variant& v4, Variant& v5, Variant& v6,
Variant& v7, Variant& v8, Variant& v9)
{
PropertyGet p(name);
if (v0.Type() != varEmpty)
{
p << v0;
if (v1.Type() != varEmpty)
{
p << v1;
if (v2.Type() != varEmpty)
{
p << v2;
if (v3.Type() != varEmpty)
{
p << v3;
if (v4.Type() != varEmpty)
{
p << v4;
if (v5.Type() != varEmpty)
{
p << v5;
if (v6.Type() != varEmpty)
{
p << v6;
if (v7.Type() != varEmpty)
{
p << v7;
if (v8.Type() != varEmpty)
{
p << v8;
if (v9.Type() != varEmpty)
p << v9;
}
}
}
}
}
}
}
}
}
return Exec(p);
}
void Variant::OlePropertySet(const String& name, Variant& v0,
Variant& v1, Variant& v2, Variant& v3,
Variant& v4, Variant& v5, Variant& v6,
Variant& v7, Variant& v8, Variant& v9)
{
PropertySet p(name);
if (v0.Type() != varEmpty)
{
p << v0;
if (v1.Type() != varEmpty)
{
p << v1;
if (v2.Type() != varEmpty)
{
p << v2;
if (v3.Type() != varEmpty)
{
p << v3;
if (v4.Type() != varEmpty)
{
p << v4;
if (v5.Type() != varEmpty)
{
p << v5;
if (v6.Type() != varEmpty)
{
p << v6;
if (v7.Type() != varEmpty)
{
p << v7;
if (v8.Type() != varEmpty)
{
p << v8;
if (v9.Type() != varEmpty)
p << v9;
}
}
}
}
}
}
}
}
}
Exec(p);
}
// end of alternate syntax automation stuff
ostream& operator <<(ostream& os, const Variant& arg)
{
switch (arg.VType)
{
case varEmpty:
os << "varEmpty";
break;
case varNull:
os << "varNull";
break;
case varSmallint:
os << "varSmallint: " << arg.VSmallint;
break;
case varInteger:
os << "varInteger: " << arg.VInteger;
break;
case varSingle:
os << "varSingle: " << arg.VSingle;
break;
case varDouble:
os << "varDouble: " << arg.VDouble;
break;
case varCurrency:
os << "varCurrency: " << arg.VCurrency;
break;
case varDate:
os << "varDate: " << arg.VDate;
break;
case varOleStr:
os << "varOleStr: " << AnsiString(arg.VOleStr);
break;
case varDispatch:
os << "varDispatch: " << static_cast<void*>(arg.VDispatch);
break;
case varError:
os << "varError: " << arg.VError;
break;
case varBoolean:
os << "varBoolean: " << arg.operator bool();
break;
case varUnknown:
os << "varUnknown: " << static_cast<void*>(arg.VUnknown);
break;
case varByte:
os << "varByte: " << arg.VByte;
break;
case varString:
os << "varString: " << arg.operator AnsiString();
break;
case varArray:
os << "varArray: " << static_cast<void*>(arg.VArray);
break;
case varSmallint | varByRef:
os << "varSmallint | varByRef: " << arg.VPointer;
break;
case varInteger | varByRef:
os << "varInteger | varByRef: " << arg.VPointer;
break;
case varSingle | varByRef:
os << "varSingle | varByRef: " << arg.VPointer;
break;
case varDouble | varByRef:
os << "varDouble | varByRef: " << arg.VPointer;
break;
case varCurrency | varByRef:
os << "varCurrency | varByRef: " << arg.VPointer;
break;
case varDate | varByRef:
os << "varDate | varByRef: " << arg.VPointer;
break;
case varOleStr | varByRef:
os << "varOleStr | varByRef: " << arg.VPointer;
break;
case varDispatch | varByRef:
os << "varDispatch | varByRef: " << arg.VPointer;
break;
case varError | varByRef:
os << "varError | varByRef: " << arg.VPointer;
break;
case varBoolean | varByRef:
os << "varBoolean | varByRef: " << arg.VPointer;
break;
case varUnknown | varByRef:
os << "varUnknown | varByRef: " << arg.VPointer;
break;
case varByte | varByRef:
os << "varByte | varByRef: " << arg.VPointer;
break;
case varString | varByRef:
os << "varString | varByRef: " << arg.VPointer;
break;
case varArray | varByRef:
os << "varArray | varByRef: " << arg.VPointer;
break;
}
return os;
}
AutoCmd::AutoCmd(const AutoCmd& src): Name(src.Name), Parms(src.Parms),
ParmTypes(src.ParmTypes), NamedParms(src.NamedParms),
NamedParmTypes(src.NamedParmTypes), NamedParmNames(src.NamedParmNames)
{
for (int i = 0; i < MaxDispArgs; i++)
{
StringArgs[i] = src.StringArgs[i];
StringPtrs[i] = src.StringPtrs[i];
NamedStringArgs[i] = NamedStringArgs[i];
NamedStringPtrs[i] = NamedStringPtrs[i];
}
}
AutoCmd& AutoCmd::SetName(const String& name)
{
Name = name;
return *this;
}
AutoCmd& AutoCmd::Clear()
{
ClearName();
ClearArgs();
return *this;
}
AutoCmd& AutoCmd::ClearName()
{
SetName("");
return *this;
}
AutoCmd& AutoCmd::ClearArgs()
{
Parms.Clear();
ParmTypes.Clear();
NamedParms.Clear();
NamedParmTypes.Clear();
NamedParmNames.Clear();
return *this;
}
int AutoCmd::GetArgType(const Byte idx) const
{
if (ParmTypes.IsEmpty() || ParmTypes.ArrayHighBound() < idx)
throw new EVariantError(sAcGatRange);
return ParmTypes.GetElement(idx);
}
int AutoCmd::GetNamedArgType(const Byte idx) const
{
if (NamedParmTypes.IsEmpty() || NamedParmTypes.ArrayHighBound() < idx)
throw new EVariantError(sAcGnatRange);
return NamedParmTypes.GetElement(idx);
}
Byte AutoCmd::GetArgCount() const
{
int count = GetNamedArgCount();
if (!Parms.IsEmpty())
count += Parms.ArrayHighBound() + 1;
return (Byte) count;
}
Byte AutoCmd::GetNamedArgCount() const
{
int count = 0;
if (!NamedParms.IsEmpty())
count += NamedParms.ArrayHighBound() + 1;
return (Byte)count;
}
Variant& AutoCmd::GetParm(const Byte idx)
{
if (Parms.IsEmpty() || Parms.ArrayHighBound() < idx)
throw new EVariantError(sAcGpRange);
return Parms[idx];
}
Variant& AutoCmd::GetNamedParm(const Byte idx)
{
if (NamedParms.IsEmpty() || NamedParms.ArrayHighBound() < idx)
throw new EVariantError(sAcGnpRange);
return NamedParms[idx];
}
String AutoCmd::GetNamedParmName(const Byte idx) const
{
if (NamedParms.IsEmpty() || NamedParms.ArrayHighBound() < idx)
throw new EVariantError(sAcGnpnRange);
return NamedParmNames.GetElement(idx);
}
void AutoCmd::AddElement()
{
if (Parms.IsEmpty())
{
Parms = Variant(OPENARRAY(int, (0, 0)), varVariant);
ParmTypes = Variant(OPENARRAY(int, (0, 0)), varInteger);
}
else
{
Parms.ArrayRedim(Parms.ArrayHighBound()+1);
ParmTypes.ArrayRedim(ParmTypes.ArrayHighBound()+1);
}
}
AutoCmd& AutoCmd::operator <<(const Variant& v)
{
AddElement();
Parms.PutElement(v, Parms.ArrayHighBound());
ParmTypes.PutElement(varVariant, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(const short arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varSmallint, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(const int arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varInteger, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(const float arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varSingle, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(const double arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varDouble, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(const Currency arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varCurrency, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(const TDateTime arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varDate, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(const bool arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varBoolean, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(const WordBool arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varBoolean, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(const Byte arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varByte, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(const AnsiString& arg)
{
AddElement();
int dummy = 0;
Parms.PutElement(dummy, Parms.ArrayHighBound());
ParmTypes.PutElement(varString, ParmTypes.ArrayHighBound());
StringArgs[Parms.ArrayHighBound()] = arg;
return *this;
}
AutoCmd& AutoCmd::operator <<(Ole2::IDispatch* const arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varDispatch, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(Ole2::IUnknown* const arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varUnknown, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(Variant* arg)
{
Variant v;
v.VType = varVariant | varByRef;
v.VPointer = arg;
AddElement();
Parms.PutElement(v, Parms.ArrayHighBound());
ParmTypes.PutElement(varVariant | varByRef, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(short* arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varSmallint | varByRef, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(int* arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varInteger | varByRef, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(float* arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varSingle | varByRef, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(double* arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varDouble | varByRef, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(Currency* arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varCurrency | varByRef, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(TDateTime* arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varDate | varByRef, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(WordBool* arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varBoolean | varByRef, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(Byte* arg)
{
AddElement();
Parms.PutElement(arg, Parms.ArrayHighBound());
ParmTypes.PutElement(varByte | varByRef, ParmTypes.ArrayHighBound());
return *this;
}
AutoCmd& AutoCmd::operator <<(AnsiString* arg)
{
AddElement();
int dummy = 0;
Parms.PutElement(dummy, Parms.ArrayHighBound());
ParmTypes.PutElement(varString | varByRef, ParmTypes.ArrayHighBound());
StringPtrs[Parms.ArrayHighBound()] = arg;
return *this;
}
AutoCmd& AutoCmd::operator <<(const NamedParm& np)
{
if (NamedParms.IsEmpty())
{
NamedParms = Variant(OPENARRAY(int, (0, 0)), varVariant);
NamedParmTypes = Variant(OPENARRAY(int, (0, 0)), varInteger);
NamedParmNames = Variant(OPENARRAY(int, (0, 0)), varVariant);
}
else
{
NamedParms.ArrayRedim(NamedParms.ArrayHighBound()+1);
NamedParmTypes.ArrayRedim(NamedParmTypes.ArrayHighBound()+1);
NamedParmNames.ArrayRedim(NamedParmNames.ArrayHighBound()+1);
}
NamedParmNames[NamedParmNames.ArrayHighBound()] = np.GetParmName();
int parmType = np.GetType();
NamedParmTypes.PutElement(parmType, NamedParmTypes.ArrayHighBound());
if (parmType == varString)
{
int dummy = 0;
NamedParms.PutElement(dummy, NamedParms.ArrayHighBound());
NamedStringArgs[NamedParms.ArrayHighBound()] = np.GetStringParm();
}
else if (parmType == (varString | varByRef))
{
int dummy = 0;
NamedParms.PutElement(dummy, NamedParms.ArrayHighBound());
NamedStringPtrs[NamedParms.ArrayHighBound()] = np.GetStringPtr();
}
else
NamedParms.PutElement(np.GetParm(), NamedParms.ArrayHighBound());
return *this;
}
NamedParm::NamedParm(const String& name, Variant* arg): Name(name),
Type(varVariant | varByRef)
{
Variant v;
v.VType = varVariant | varByRef;
v.VPointer = arg;
Parm = v;
}
Byte Procedure::GetCallType() const
{
return DISPATCH_METHOD;
}
Byte Function::GetCallType() const
{
return DISPATCH_METHOD;
}
Byte PropertySet::GetCallType() const
{
return DISPATCH_PROPERTYPUT;
}
Byte PropertyGet::GetCallType() const
{
return DISPATCH_PROPERTYGET;
}
//---------------------------------------------------------------------
//!JK DateTime functions are kind of just shoved in here for now
//statics
TDateTime __fastcall TDateTime::CurrentDate()
{
//TDateTime t = ::Date();
//return t;
#if defined(PRONTO_NAMESPACES)
return Sysutils::Date();
#else
return ::Date();
#endif
}
TDateTime __fastcall TDateTime::CurrentTime()
{
#if defined(PRONTO_NAMESPACES)
return Sysutils::Time();
#else
return ::Time();
#endif
}
TDateTime __fastcall TDateTime::CurrentDateTime()
{
#if defined(PRONTO_NAMESPACES)
return Sysutils::Now();
#else
return ::Now();
#endif
}
TDateTime __fastcall TDateTime::FileDateToDateTime(int fileDate)
{
#if defined(PRONTO_NAMESPACES)
return Sysutils::FileDateToDateTime(fileDate);
#else
return ::FileDateToDateTime(fileDate);
#endif
}
//ctors
__fastcall TDateTime::TDateTime(const AnsiString& src, TDateTimeFlag flag)
{
TDateTime tmp;
if (flag == DateTime )
#if defined(PRONTO_NAMESPACES)
tmp = Sysutils::StrToDateTime(src);
#else
tmp = ::StrToDateTime(src);
#endif
else if (flag == Date)
#if defined(PRONTO_NAMESPACES)
tmp = Sysutils::StrToDate(src);
#else
tmp = ::StrToDate(src);
#endif
else // flag == Time
#if defined(PRONTO_NAMESPACES)
tmp = Sysutils::StrToTime(src);
#else
tmp = ::StrToTime(src);
#endif
Val = tmp.Val;
}
__fastcall TDateTime::TDateTime(unsigned short year, unsigned short month,
unsigned short day)
{
#if defined(PRONTO_NAMESPACES)
TDateTime tmp = Sysutils::EncodeDate(year, month, day);
#else
TDateTime tmp = ::EncodeDate(year, month, day);
#endif
Val = tmp.Val;
}
__fastcall TDateTime::TDateTime(unsigned short hour, unsigned short min,
unsigned short sec, unsigned short msec)
{
#if defined(PRONTO_NAMESPACES)
TDateTime tmp = Sysutils::EncodeTime(hour, min, sec, msec);
#else
TDateTime tmp = ::EncodeTime(hour, min, sec, msec);
#endif
Val = tmp.Val;
}
//other TDateTime functions
__fastcall TDateTime::operator AnsiString() const
{
if (Val < 1)
#if defined(PRONTO_NAMESPACES)
return Sysutils::TimeToStr(*this);
#else
return ::TimeToStr(*this);
#endif
else if ((Val - int(Val)))
#if defined(PRONTO_NAMESPACES)
return Sysutils::DateTimeToStr(*this);
return Sysutils::DateToStr(*this);
#else
return ::DateTimeToStr(*this);
return ::DateToStr(*this);
#endif
}
AnsiString __fastcall TDateTime::FormatString(const AnsiString& format)
{
#if defined(PRONTO_NAMESPACES)
return Sysutils::FormatDateTime(format, *this);
#else
return ::FormatDateTime(format, *this);
#endif
}
AnsiString __fastcall TDateTime::DateString() const
{
#if defined(PRONTO_NAMESPACES)
return Sysutils::DateToStr(*this);
#else
return ::DateToStr(*this);
#endif
}
AnsiString __fastcall TDateTime::TimeString() const
{
#if defined(PRONTO_NAMESPACES)
return Sysutils::TimeToStr(*this);
#else
return ::TimeToStr(*this);
#endif
}
AnsiString __fastcall TDateTime::DateTimeString() const
{
#if defined(PRONTO_NAMESPACES)
return Sysutils::DateTimeToStr(*this);
#else
return ::DateTimeToStr(*this);
#endif
}
int __fastcall TDateTime::DayOfWeek() const
{
#if defined(PRONTO_NAMESPACES)
return Sysutils::DayOfWeek(*this);
#else
return ::DayOfWeek(*this);
#endif
}
int __fastcall TDateTime::FileDate() const
{
#if defined(PRONTO_NAMESPACES)
return Sysutils::DateTimeToFileDate(*this);
#else
return ::DateTimeToFileDate(*this);
#endif
}
void __fastcall TDateTime::DecodeDate(unsigned short* year,
unsigned short* month, unsigned short* day) const
{
#if defined(PRONTO_NAMESPACES)
Sysutils::DecodeDate(*this, *year, *month, *day);
#else
::DecodeDate(*this, *year, *month, *day);
#endif
}
void __fastcall TDateTime::DecodeTime(unsigned short* hour,
unsigned short* min, unsigned short* sec, unsigned short* msec) const
{
#if defined(PRONTO_NAMESPACES)
Sysutils::DecodeTime(*this, *hour, *min, *sec, *msec);
#else
::DecodeTime(*this, *hour, *min, *sec, *msec);
#endif
}
//-----------------------------------------------------------------------
//!JK These Currency functions are kind of just shoved in here
__fastcall Currency::Currency(const AnsiString& src)
{
#if defined(PRONTO_NAMESPACES)
*this = Sysutils::StrToCurr(src);
#else
*this = ::StrToCurr(src);
#endif
}
//-----------------------------------------------------------------------
__fastcall Currency::operator AnsiString() const
{
return CurrToStr(*this);
}
#if defined(PRONTO_NAMESPACES)
}
#endif