Files
front_linux/LFtid1056/pqdif/include/el_base.cpp

565 lines
18 KiB
C++
Raw Normal View History

/*
** CPQDIF_Element class. The base class for PQDIF elements.
** --------------------------------------------------------------------------
**
** File name: $Workfile: el_base.cpp $
** Last modified: $Modtime: 11/13/00 3:40p $
** Last modified by: $Author: Bill $
**
** VCS archive path: $Archive: /Hank/DMM/FirmWare/Level3/ObDatMgr/el_base.cpp $
** VCS revision: $Revision: 13 $
*/
#include "PQDIF_classes.h"
CPQDIF_Element::CPQDIF_Element()
{
m_pRecord = NULL;
memset( &m_tag, 0, sizeof( m_tag ) );
m_typePhysical = 0;
}
#ifdef PQDIF_USE_COM
bool CPQDIF_Element::convertFromVariant( const VARIANT & value, PQDIFValue& m_value ) const
{
bool status = true;
INT1 val_int1;
INT2 val_int2;
INT4 val_int4;
// First, verify the variant physical type matches
// (and pull out the integer values)
status = TRUE;
switch( m_typePhysical )
{
case ID_PHYS_TYPE_BOOLEAN1 :
case ID_PHYS_TYPE_BOOLEAN2 :
case ID_PHYS_TYPE_BOOLEAN4 :
if( value.vt != VT_BOOL )
status = false;
break;
case ID_PHYS_TYPE_CHAR1 :
case ID_PHYS_TYPE_INTEGER1 :
case ID_PHYS_TYPE_UNS_INTEGER1 :
switch( value.vt )
{
case VT_UI1:
val_int1 = (INT1) value.bVal;
break;
case VT_I1:
val_int1 = (INT1) value.cVal;
break;
default:
status = false;
}
break;
case ID_PHYS_TYPE_CHAR2 :
case ID_PHYS_TYPE_INTEGER2 :
case ID_PHYS_TYPE_UNS_INTEGER2 :
switch( value.vt )
{
case VT_UI2:
val_int2 = (INT2) value.uiVal;
break;
case VT_I2:
val_int2 = (INT2) value.iVal;
break;
default:
status = false;
}
break;
case ID_PHYS_TYPE_INTEGER4 :
case ID_PHYS_TYPE_UNS_INTEGER4 :
switch( value.vt )
{
case VT_UI4:
val_int4 = (INT4) value.ulVal;
break;
case VT_I4:
val_int4 = (INT4) value.lVal;
break;
default:
status = false;
}
break;
// Real/complex
case ID_PHYS_TYPE_REAL4 :
if( value.vt != VT_R4 )
status = false;
break;
case ID_PHYS_TYPE_REAL8 :
if( value.vt != VT_R4 )
status = false;
break;
case ID_PHYS_TYPE_COMPLEX8 :
case ID_PHYS_TYPE_COMPLEX16 :
//if( value.vt == VT_ARRAY ) ???
break;
case ID_PHYS_TYPE_TIMESTAMPPQDIF :
if( value.vt != VT_DATE )
status = false;
break;
case ID_PHYS_TYPE_GUID :
//if( value.vt == VT_ARRAY ) ???
break;
default:
status = false;
break;
}
if( status )
{
switch( m_typePhysical )
{
case ID_PHYS_TYPE_BOOLEAN1 :
m_value.bool1 = (BOOL1) value.boolVal;
case ID_PHYS_TYPE_BOOLEAN2 :
m_value.bool2 = (BOOL2) value.boolVal;
case ID_PHYS_TYPE_BOOLEAN4 :
m_value.bool4 = (BOOL4) value.boolVal;
break;
case ID_PHYS_TYPE_CHAR1 :
m_value.char1 = (CHAR1) val_int1;
break;
case ID_PHYS_TYPE_INTEGER1 :
m_value.int1 = (INT1) val_int1;
break;
case ID_PHYS_TYPE_UNS_INTEGER1 :
m_value.uint1 = (UINT1) val_int1;
break;
case ID_PHYS_TYPE_CHAR2 :
m_value.char2 = (CHAR2) val_int2;
break;
case ID_PHYS_TYPE_INTEGER2 :
m_value.int2 = (INT2) val_int2;
break;
case ID_PHYS_TYPE_UNS_INTEGER2 :
m_value.uint2 = (UINT2) val_int2;
break;
case ID_PHYS_TYPE_INTEGER4 :
m_value.int4 = (INT4) val_int4;
break;
case ID_PHYS_TYPE_UNS_INTEGER4 :
m_value.uint4 = (UINT4) val_int4;
break;
// Real/complex
case ID_PHYS_TYPE_REAL4 :
m_value.real4 = (REAL4) value.fltVal;
break;
case ID_PHYS_TYPE_REAL8 :
m_value.real8 = (REAL8) value.dblVal;
break;
case ID_PHYS_TYPE_COMPLEX8 :
case ID_PHYS_TYPE_COMPLEX16 :
// need to fix
// SAFEARRAY?
break;
// Date/time
case ID_PHYS_TYPE_TIMESTAMPPQDIF :
// From the documentation, it appears that the
// whole number portion of the DATE is compatible
// with our .day member. (Although it is possible that
// they will be off by 1 day...)
m_value.ts.day = (UINT4) ( value.date );
// Convert the fractional day to fractional seconds.
m_value.ts.sec = (REAL8) ( value.date - (DATE) m_value.ts.day );
m_value.ts.sec *= (REAL8) SECONDS_PER_DAY;
break;
// GUID
case ID_PHYS_TYPE_GUID :
// need to fix
// SAFEARRAY?
break;
default:
status = false;
break;
}
}
return status;
}
bool CPQDIF_Element::convertToVariant( const PQDIFValue& m_value, VARIANT & value ) const
{
bool status = true;
string strRep;
VariantInit( &value );
USES_CONVERSION;
if( status )
{
switch( m_typePhysical )
{
case ID_PHYS_TYPE_BOOLEAN1 :
value.vt = VT_BOOL;
value.boolVal = m_value.bool1;
break;
case ID_PHYS_TYPE_CHAR1 :
value.vt = VT_I1;
value.cVal = m_value.char1;
break;
case ID_PHYS_TYPE_INTEGER1 :
value.vt = VT_I1;
value.cVal = m_value.int1;
break;
case ID_PHYS_TYPE_UNS_INTEGER1 :
// VT_UI1 / value.bVal
value.vt = VT_I1;
value.cVal = m_value.uint1;
break;
case ID_PHYS_TYPE_BOOLEAN2 :
value.vt = VT_BOOL;
value.boolVal = m_value.bool2;
break;
case ID_PHYS_TYPE_CHAR2 :
// Single-char Unicode string instead?
value.vt = VT_I2;
value.iVal = m_value.char2;
break;
case ID_PHYS_TYPE_INTEGER2 :
value.vt = VT_I2;
value.iVal = m_value.int2;
break;
case ID_PHYS_TYPE_UNS_INTEGER2 :
//VT_UI2 / uiVal
value.vt = VT_I2;
value.iVal = m_value.uint2 ;
break;
case ID_PHYS_TYPE_BOOLEAN4 :
value.vt = VT_BOOL;
value.boolVal = (VARIANT_BOOL) m_value.bool4;
break;
case ID_PHYS_TYPE_INTEGER4 :
value.vt = VT_I4;
value.lVal = m_value.int4;
break;
case ID_PHYS_TYPE_UNS_INTEGER4 :
// VT_UI4 / ulVal
value.vt = VT_I4;
value.lVal = m_value.uint4;
break;
// Real/complex
case ID_PHYS_TYPE_REAL4 :
value.vt = VT_R4;
value.fltVal = m_value.real4;
break;
case ID_PHYS_TYPE_REAL8 :
value.vt = VT_R8;
value.dblVal = m_value.real8;
break;
case ID_PHYS_TYPE_COMPLEX8 :
case ID_PHYS_TYPE_COMPLEX16 :
// need to fix
// SAFEARRAY?
//value.vt = VT_ARRAY;
//value.parray = NULL;
// In string form ("real imag")
// strRep = _T( "" );
strRep = "";
char szBuffer[64];
if( m_typePhysical == ID_PHYS_TYPE_COMPLEX8 )
{
sprintf( szBuffer, "%.8g %.8g",
m_value.complex8.real,
m_value.complex8.image );
strRep = szBuffer;
}
else
{
sprintf( szBuffer, "%.16g %.16g",
m_value.complex16.real,
m_value.complex16.image );
strRep = szBuffer;
}
value.vt = VT_BSTR;
#if _MSC_VER >= 1100
value.bstrVal = SysAllocString(_bstr_t(strRep.c_str()));
#else
value.bstrVal = SysAllocString(A2W(strRep.c_str()));
#endif
break;
// Date/time
case ID_PHYS_TYPE_TIMESTAMPPQDIF :
value.vt = VT_DATE;
value.date = (double) m_value.ts.day
+ ( (double) m_value.ts.sec / (double) SECONDS_PER_DAY );
break;
// GUID
case ID_PHYS_TYPE_GUID :
status = theSupport.NewVariantArrayFromGUID( value, m_value.guid );
// need to fix
// SAFEARRAY?
//value.vt = VT_ARRAY;
//value.parray = NULL;
//unsigned char ** pstrRPC;
// Generate a GUID string
//UuidToString( &m_value.guid, pstrRPC );
//RpcStringFree( pstrRPC );
// String in this format:
// {89738618-F1C3-11cf-9D89-0080C72E70A3}
//{
//char * pstr = strRep.GetBuffer( 64 );
//sprintf( pstr, "{%08.8lx-%04.4x-%04.4x-%02.2x%02.2x%02.2x%02.2x}",
// m_value.guid.Data1,
// m_value.guid.Data2,
// m_value.guid.Data3,
// (short) m_value.guid.Data4[ 0 ],
// (short) m_value.guid.Data4[ 1 ],
// (short) m_value.guid.Data4[ 2 ],
// (short) m_value.guid.Data4[ 3 ]
// );
//strRep.ReleaseBuffer();
//}
// Return it back in the variant...
//value.vt = VT_BSTR | VT_BYREF;
//*value.pbstrVal = strRep.AllocSysString();
//value.vt = VT_BSTR;
//value.bstrVal = strRep.AllocSysString();
break;
default:
status = false;
break;
}
}
return status;
}
#endif
bool CPQDIF_Element::convertFromDouble( double valueSource, PQDIFValue& valueTarget ) const
{
bool status = true;
// First, verify the variant physical type matches
// (and pull out the integer values)
if( status )
{
switch( m_typePhysical )
{
case ID_PHYS_TYPE_BOOLEAN1 :
valueTarget.bool1 = (BOOL1) valueSource;
break;
case ID_PHYS_TYPE_BOOLEAN2 :
valueTarget.bool2 = (BOOL2) valueSource;
break;
case ID_PHYS_TYPE_BOOLEAN4 :
valueTarget.bool4 = (BOOL4) valueSource;
break;
case ID_PHYS_TYPE_CHAR1 :
valueTarget.char1 = (CHAR1) valueSource;
break;
case ID_PHYS_TYPE_INTEGER1 :
valueTarget.int1 = (INT1) valueSource;
break;
case ID_PHYS_TYPE_UNS_INTEGER1 :
valueTarget.uint1 = (UINT1) valueSource;
break;
case ID_PHYS_TYPE_CHAR2 :
valueTarget.char2 = (CHAR2) valueSource;
break;
case ID_PHYS_TYPE_INTEGER2 :
valueTarget.int2 = (INT2) valueSource;
break;
case ID_PHYS_TYPE_UNS_INTEGER2 :
valueTarget.uint2 = (UINT2) valueSource;
break;
case ID_PHYS_TYPE_INTEGER4 :
valueTarget.int4 = (INT4) valueSource;
break;
case ID_PHYS_TYPE_UNS_INTEGER4 :
valueTarget.uint4 = (UINT4) valueSource;
break;
// Real/complex
case ID_PHYS_TYPE_REAL4 :
valueTarget.real4 = (REAL4) valueSource;
break;
case ID_PHYS_TYPE_REAL8 :
valueTarget.real8 = (REAL8) valueSource;
break;
case ID_PHYS_TYPE_COMPLEX8 :
valueTarget.complex8.real = (REAL4) valueSource;
valueTarget.complex8.image = 0.0;
break;
case ID_PHYS_TYPE_COMPLEX16 :
valueTarget.complex16.real = (REAL4) valueSource;
valueTarget.complex16.image = 0.0;
break;
// Date/time
case ID_PHYS_TYPE_TIMESTAMPPQDIF :
// From the documentation, it appears that the
// whole number portion of the DATE is compatible
// with our .day member. (Although it is possible that
// they will be off by 1 day...)
valueTarget.ts.day = (UINT4) ( valueSource );
// Convert the fractional day to fractional seconds.
valueTarget.ts.sec = (REAL8) ( valueSource - (double) valueTarget.ts.day );
valueTarget.ts.sec *= (REAL8) SECONDS_PER_DAY;
break;
// GUID
case ID_PHYS_TYPE_GUID :
// Cannot convert from double.
break;
default:
status = false;
break;
}
}
return status;
}
bool CPQDIF_Element::convertToDouble( const PQDIFValue& valueSource, double& valueTarget ) const
{
bool status = true;
valueTarget = 0.0;
if( status )
{
switch( m_typePhysical )
{
case ID_PHYS_TYPE_BOOLEAN1 :
valueTarget = (double) valueSource.bool1;
break;
case ID_PHYS_TYPE_CHAR1 :
valueTarget = (double) valueSource.char1;
break;
case ID_PHYS_TYPE_INTEGER1 :
valueTarget = (double) valueSource.int1;
break;
case ID_PHYS_TYPE_UNS_INTEGER1 :
valueTarget = (double) valueSource.uint1;
break;
case ID_PHYS_TYPE_BOOLEAN2 :
valueTarget = (double) valueSource.bool2;
break;
case ID_PHYS_TYPE_CHAR2 :
// Single-char Unicode string instead?
valueTarget = (double) valueSource.char2;
break;
case ID_PHYS_TYPE_INTEGER2 :
valueTarget = (double) valueSource.int2;
break;
case ID_PHYS_TYPE_UNS_INTEGER2 :
valueTarget = (double) valueSource.uint2 ;
break;
case ID_PHYS_TYPE_BOOLEAN4 :
valueTarget = (double) valueSource.bool4;
break;
case ID_PHYS_TYPE_INTEGER4 :
valueTarget = (double) valueSource.int4;
break;
case ID_PHYS_TYPE_UNS_INTEGER4 :
valueTarget = (double) valueSource.uint4;
break;
// Real/complex
case ID_PHYS_TYPE_REAL4 :
valueTarget = (double) valueSource.real4;
break;
case ID_PHYS_TYPE_REAL8 :
valueTarget = (double) valueSource.real8;
break;
case ID_PHYS_TYPE_COMPLEX8 :
case ID_PHYS_TYPE_COMPLEX16 :
// Cannot convert to double.
break;
// Date/time
case ID_PHYS_TYPE_TIMESTAMPPQDIF :
//valueTarget.vt = VT_DATE;
valueTarget = (double) valueSource.ts.day
+ ( (double) valueSource.ts.sec / (double) SECONDS_PER_DAY );
break;
// GUID
case ID_PHYS_TYPE_GUID :
// Cannot convert to double.
break;
default:
status = false;
break;
}
}
return status;
}
long CPQDIF_Element::getNumBytesOfType( void ) const
{
return theInfo.GetNumBytesOfType( m_typePhysical );
}