/* ** CPQDIF_E_Vector class. Implements the PQDIF vector element. ** -------------------------------------------------------------------------- ** ** File name: $Workfile: el_vect.cpp $ ** Last modified: $Modtime: 11/13/00 3:56p $ ** Last modified by: $Author: Bill $ ** ** VCS archive path: $Archive: /Hank/DMM/FirmWare/Level3/ObDatMgr/el_vect.cpp $ ** VCS revision: $Revision: 14 $ */ #include "PQDIF_classes.h" const int defaultGrowBy = 4; // Construction // ============ CPQDIF_E_Vector::CPQDIF_E_Vector() { m_array.SetSize( 0, defaultGrowBy ); } CPQDIF_E_Vector::~CPQDIF_E_Vector() { } void CPQDIF_E_Vector::SetPhysicalType( long type ) { long count = m_array.GetSize() / getNumBytesOfType(); if( m_typePhysical != type ) { // Yup, it's changed! m_typePhysical = type; // ... and realloc space for the new type. SetCount( count ); // Signal that the record changed. if( m_pRecord ) m_pRecord->SetChanged( true ); } } #ifdef PQDIF_USE_COM bool CPQDIF_E_Vector::SetValue( long index, VARIANT & value ) { bool status = false; PQDIFValue valPQ; // Copy over the information status = convertFromVariant( value, valPQ ); if( status ) { SetValue( index, valPQ ); } return status; } bool CPQDIF_E_Vector::GetValue( long index, VARIANT & value ) const { bool status = false; PQDIFValue valPQ; long nItem; GetCount(nItem); if( index >= 0 && index < nItem ) { status = GetValue( index, valPQ ); if( status ) { status = convertToVariant( valPQ, value ); } } return status; } #endif bool CPQDIF_E_Vector::SetValue( long index, const PQDIFValue& value ) { bool status = false; BYTE * pvalSource = (BYTE *) getPointerToValue( value ); BYTE * pvalTarget = (BYTE *) getPointer( index ); if( pvalSource && pvalTarget ) { memcpy( pvalTarget, pvalSource, getNumBytesOfType() ); status = true; } return status; } bool CPQDIF_E_Vector::GetValue( long index, PQDIFValue& value ) const { bool status = false; BYTE * pvalTarget = (BYTE *) getPointerToValue( value ); BYTE * pvalSource = (BYTE *) getPointer( index ); if( pvalSource && pvalTarget ) { memcpy( pvalTarget, pvalSource, getNumBytesOfType() ); status = true; } return status; } bool CPQDIF_E_Vector::SetValue( long index, double value ) { bool status; PQDIFValue valuePQ; status = convertFromDouble( value, valuePQ ); if( status ) { status = SetValue( index, valuePQ ); } return status; } bool CPQDIF_E_Vector::GetValue( long index, double& value ) const { bool status; PQDIFValue valuePQ; status = GetValue( index, valuePQ ); if( status ) { status = convertToDouble( valuePQ, value ); } return status; } bool CPQDIF_E_Vector::SetValues( const char * text ) { bool status = false; long idxItem; long countItems; BYTE * data = NULL; // Init countItems = strlen( text ) + 1; switch( GetPhysicalType() ) { case ID_PHYS_TYPE_CHAR1: SetCount( countItems ); data = GetRawData(); if( data ) { // Copy the string across directly memcpy( data, text, countItems - 1 ); // Make sure it's null-terminated data[ countItems - 1 ] = (BYTE) 0; status = true; } break; case ID_PHYS_TYPE_CHAR2: SetCount( countItems ); data = GetRawData(); if( data ) { CHAR2 * temp = (CHAR2 *) data; // Copy the data across by physical item size // Don't copy the last character -- should be a NULL for( idxItem = 0; idxItem < ( countItems - 1); idxItem++ ) { // Copy each value *temp = (CHAR2) text[ (int) idxItem ]; temp++; } // NULL-terminate it *temp = (CHAR2) 0; status = true; } break; default: status = false; break; } return status; } bool CPQDIF_E_Vector::GetValues( string& strOutput ) const { bool status = false; long idxItem; long countItems; const BYTE * data = NULL; // Init GetCount( countItems ); data = GetRawData(); switch( GetPhysicalType() ) { case ID_PHYS_TYPE_CHAR1: if( data ) { // Copy the data across by physical item size // Don't copy the last character -- should be a NULL strOutput = (const char *) data; status = TRUE; } break; case ID_PHYS_TYPE_CHAR2: if( data ) { CHAR2 * temp = (CHAR2 *) data; // Copy the data across by physical item size // Don't copy the last character -- should be a NULL for( idxItem = 0; idxItem < ( countItems - 1); idxItem++ ) { // Copy across a single value strOutput += (TCHAR) ( *temp ); // Next! temp++; } status = TRUE; } break; default: status = false; break; } return status; } BYTE * CPQDIF_E_Vector::GetRawData( void ) { return m_array.GetData(); } const BYTE * CPQDIF_E_Vector::GetRawData( void ) const { return m_array.GetData(); } bool CPQDIF_E_Vector::GetCount( long& count ) const { bool status = false; count = m_array.GetSize() / getNumBytesOfType(); status = true; return status; } bool CPQDIF_E_Vector::SetCount( long count ) { bool status = false; // Resize the array. int size = count * getNumBytesOfType(); m_array.SetSize( size, defaultGrowBy ); status = m_array.GetSize() == size; return status; } long CPQDIF_E_Vector::GetSizeBytes( void ) { return m_array.GetSize(); } BYTE * CPQDIF_E_Vector::getPointer( int idx ) { BYTE * ptr = NULL; long count = m_array.GetSize() / getNumBytesOfType(); ptr = m_array.GetData(); if( ptr && idx >= 0 && idx < count ) { ptr += ( idx * getNumBytesOfType() ); } return ptr; } const BYTE * CPQDIF_E_Vector::getPointer( int idx ) const { const BYTE * ptr = NULL; long count = m_array.GetSize() / getNumBytesOfType(); ptr = m_array.GetData(); if( ptr && idx >= 0 && idx < count ) { ptr += ( idx * getNumBytesOfType() ); } return ptr; } // Type-specific member functions // ------------------------------ #define ELVECT_SETVALUE( nametype, type, idtype ) \ void CPQDIF_E_Vector::SetValue##nametype( long index, type value ) \ { \ bool status = false; \ type * pval = NULL; \ SetPhysicalType( idtype ); \ pval = (type *) getPointer( index ); \ if( pval ) \ { \ *pval = value; \ status = true; \ } \ } #define ELVECT_GETVALUE( nametype, type, idtype ) \ bool CPQDIF_E_Vector::GetValue##nametype( long index, type& value ) const \ { bool status = false; \ type * pval = NULL; \ if( GetPhysicalType() == idtype ) \ { \ pval = (type *) getPointer( index ); \ if( pval ) \ { \ value = *pval; \ status = true; \ } \ } \ return status; } #define ELVECT_SETVALUES_ARRAY( nametype, type, idtype ) \ void CPQDIF_E_Vector::SetValues##nametype( const type * values, long count ) \ { bool status = false; \ type * pval = NULL; \ SetPhysicalType( idtype ); \ SetCount( count ); \ pval = (type *) getPointer( 0 ); \ if( pval ) \ { \ memcpy( pval, values, count * sizeof( type ) ); \ status = true; \ } \ } #define ELVECT_GETVALUES_ARRAY( nametype, type, idtype ) \ long CPQDIF_E_Vector::GetValues##nametype( type * values, long max ) const \ { long countActual = 0; \ type * pval = NULL; \ long sizeType = getNumBytesOfType(); \ long count = m_array.GetSize() / sizeType; \ if( GetPhysicalType() == idtype ) \ { \ pval = (type *) getPointer( 0 ); \ if( pval ) \ { \ countActual = min( max, count ); \ memcpy( values, pval, countActual * sizeType ); \ } \ } \ return countActual; } ELVECT_SETVALUE ( INT1, INT1, ID_PHYS_TYPE_INTEGER1 ) ELVECT_SETVALUES_ARRAY( INT1, INT1, ID_PHYS_TYPE_INTEGER1 ) ELVECT_GETVALUE ( INT1, INT1, ID_PHYS_TYPE_INTEGER1 ) ELVECT_GETVALUES_ARRAY( INT1, INT1, ID_PHYS_TYPE_INTEGER1 ) ELVECT_SETVALUE ( INT2, INT2, ID_PHYS_TYPE_INTEGER2 ) ELVECT_SETVALUES_ARRAY( INT2, INT2, ID_PHYS_TYPE_INTEGER2 ) ELVECT_GETVALUE ( INT2, INT2, ID_PHYS_TYPE_INTEGER2 ) ELVECT_GETVALUES_ARRAY( INT2, INT2, ID_PHYS_TYPE_INTEGER2 ) ELVECT_SETVALUE ( INT4, INT4, ID_PHYS_TYPE_INTEGER4 ) ELVECT_SETVALUES_ARRAY( INT4, INT4, ID_PHYS_TYPE_INTEGER4 ) ELVECT_GETVALUE ( INT4, INT4, ID_PHYS_TYPE_INTEGER4 ) ELVECT_GETVALUES_ARRAY( INT4, INT4, ID_PHYS_TYPE_INTEGER4 ) ELVECT_SETVALUE ( UINT4, UINT4, ID_PHYS_TYPE_UNS_INTEGER4 ) ELVECT_SETVALUES_ARRAY( UINT4, UINT4, ID_PHYS_TYPE_UNS_INTEGER4 ) ELVECT_GETVALUE ( UINT4, UINT4, ID_PHYS_TYPE_UNS_INTEGER4 ) ELVECT_GETVALUES_ARRAY( UINT4, UINT4, ID_PHYS_TYPE_UNS_INTEGER4 ) ELVECT_SETVALUE ( REAL4, REAL4, ID_PHYS_TYPE_REAL4 ) ELVECT_SETVALUES_ARRAY( REAL4, REAL4, ID_PHYS_TYPE_REAL4 ) ELVECT_GETVALUE ( REAL4, REAL4, ID_PHYS_TYPE_REAL4 ) ELVECT_GETVALUES_ARRAY( REAL4, REAL4, ID_PHYS_TYPE_REAL4 ) ELVECT_SETVALUE ( REAL8, REAL8, ID_PHYS_TYPE_REAL8 ) ELVECT_SETVALUES_ARRAY( REAL8, REAL8, ID_PHYS_TYPE_REAL8 ) ELVECT_GETVALUE ( REAL8, REAL8, ID_PHYS_TYPE_REAL8 ) ELVECT_GETVALUES_ARRAY( REAL8, REAL8, ID_PHYS_TYPE_REAL8 ) ELVECT_SETVALUE ( TimeStamp, TIMESTAMPPQDIF, ID_PHYS_TYPE_TIMESTAMPPQDIF ) ELVECT_SETVALUES_ARRAY( TimeStamp, TIMESTAMPPQDIF, ID_PHYS_TYPE_TIMESTAMPPQDIF ) ELVECT_GETVALUE ( TimeStamp, TIMESTAMPPQDIF, ID_PHYS_TYPE_TIMESTAMPPQDIF ) ELVECT_GETVALUES_ARRAY( TimeStamp, TIMESTAMPPQDIF, ID_PHYS_TYPE_TIMESTAMPPQDIF )