新增了PQDIF补招线程,导入了新的lib库
This commit is contained in:
413
LFtid1056/pqdif/include/rec_general.cpp
Normal file
413
LFtid1056/pqdif/include/rec_general.cpp
Normal file
@@ -0,0 +1,413 @@
|
||||
/*
|
||||
** CPQDIF_R_General class. The base class for a PQDIF record.
|
||||
** --------------------------------------------------------------------------
|
||||
**
|
||||
** File name: $Workfile: rec_general.cpp $
|
||||
** Last modified: $Modtime: 11/14/00 8:41a $
|
||||
** Last modified by: $Author: Bill $
|
||||
**
|
||||
** VCS archive path: $Archive: /Hank/DMM/FirmWare/Level3/ObDatMgr/rec_general.cpp $
|
||||
** VCS revision: $Revision: 11 $
|
||||
*/
|
||||
#include "PQDIF_classes.h"
|
||||
|
||||
|
||||
|
||||
// Construction
|
||||
// ============
|
||||
|
||||
CPQDIF_R_General::CPQDIF_R_General()
|
||||
{
|
||||
// Init header structure
|
||||
memset( &m_headerRecord, 0, sizeof( m_headerRecord ) );
|
||||
m_headerRecord.guidRecordSignature = guidRecordSignaturePQDIF;
|
||||
m_headerRecord.tagRecordType = tagBlank;
|
||||
m_headerRecord.sizeHeader = sizeof( m_headerRecord );
|
||||
// sizeData;
|
||||
// linkNextRecord;
|
||||
// checksum;
|
||||
// auiReserved[ 4 ];
|
||||
|
||||
m_posThisRecord = 0;
|
||||
m_pcollMain = NULL; // Body not read
|
||||
|
||||
m_changed = false;
|
||||
}
|
||||
|
||||
|
||||
CPQDIF_R_General::~CPQDIF_R_General()
|
||||
{
|
||||
if( m_pcollMain )
|
||||
delete m_pcollMain;
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF_R_General::ReadHeader( CPQDIF_StreamIO * pstream )
|
||||
{
|
||||
bool status = false;
|
||||
BYTE * buffer = NULL;
|
||||
int sizeActual;
|
||||
int pos;
|
||||
|
||||
// Init header structure
|
||||
memset( &m_headerRecord, 0, sizeof( m_headerRecord ) );
|
||||
|
||||
status = pstream->GetPos( pos );
|
||||
if( status )
|
||||
{
|
||||
m_posThisRecord = (LINKABS4) pos;
|
||||
buffer = pstream->ReadBlock( sizeof( m_headerRecord ), sizeActual );
|
||||
//ASSERT( sizeActual == sizeof( m_headerRecord ) );
|
||||
}
|
||||
|
||||
if( status && buffer)
|
||||
{
|
||||
m_headerRecord = *( (c_record_mainheader *) buffer );
|
||||
|
||||
// Validate the signature
|
||||
if( !PQDIF_IsEqualGUID( m_headerRecord.guidRecordSignature, guidRecordSignaturePQDIF ) )
|
||||
{
|
||||
status = FALSE;
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF_R_General::ReadBody( CPQDIF_StreamIO * pstream )
|
||||
{
|
||||
bool status = false;
|
||||
PQController controller;
|
||||
|
||||
// Have we already read it?
|
||||
if( m_pcollMain )
|
||||
{
|
||||
status = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Nope -- create the top-level collection
|
||||
m_pcollMain = (CPQDIF_E_Collection *) theFactory.NewElement( ID_ELEMENT_TYPE_COLLECTION );
|
||||
//ASSERT( m_pcollMain );
|
||||
if( m_pcollMain )
|
||||
{
|
||||
// Link the collection to the record.
|
||||
m_pcollMain->SetRecord( this );
|
||||
|
||||
// Attach the record tag to the main collection
|
||||
m_pcollMain->SetTag( m_headerRecord.tagRecordType );
|
||||
|
||||
// Position us to the right place
|
||||
status = pstream->SeekPos( m_posThisRecord + m_headerRecord.sizeHeader );
|
||||
if( status )
|
||||
{
|
||||
int sizeActual;
|
||||
BYTE * buffer;
|
||||
|
||||
buffer = pstream->ReadBlock( m_headerRecord.sizeData, sizeActual );
|
||||
if( buffer && sizeActual > 0 )
|
||||
{
|
||||
// Do it!
|
||||
controller.ParseRecord( buffer, sizeActual, m_pcollMain );
|
||||
status = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF_R_General::WriteHeader( CPQDIF_StreamIO * pstream )
|
||||
{
|
||||
bool status = FALSE;
|
||||
SIZE4 sizeActual;
|
||||
|
||||
// Just write the dern block out!
|
||||
// Position us to the right place
|
||||
status = pstream->SeekPos( m_posThisRecord );
|
||||
status = pstream->BeginBlock();
|
||||
if( status )
|
||||
{
|
||||
status = pstream->AppendBlock(
|
||||
(BYTE *) &m_headerRecord,
|
||||
sizeof( m_headerRecord ) );
|
||||
status = pstream->WriteBlock( sizeActual );
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF_R_General::WriteBody( CPQDIF_StreamIO * pstream )
|
||||
{
|
||||
bool status = FALSE;
|
||||
PQAlloc allocPQ;
|
||||
long sizeTotal;
|
||||
c_collection_element * aem;
|
||||
|
||||
// Use the allocPQ to write out the main collection
|
||||
if( m_pcollMain )
|
||||
{
|
||||
long idx;
|
||||
SIZE4 size;
|
||||
|
||||
// Prepare
|
||||
pstream->ResetChecksum();
|
||||
|
||||
// Position us to the right place
|
||||
status = pstream->SeekPos( m_posThisRecord + m_headerRecord.sizeHeader );
|
||||
|
||||
aem = allocPQ.addCollection( m_pcollMain->GetCount(), idx, size );
|
||||
if( aem )
|
||||
{
|
||||
status = BufferUpCollection( pstream, allocPQ, m_pcollMain, aem );
|
||||
if( status )
|
||||
{
|
||||
sizeTotal = allocPQ.WriteListToStream( pstream );
|
||||
if( sizeTotal == 0 )
|
||||
status = false;
|
||||
else
|
||||
{
|
||||
// Update header with data
|
||||
m_headerRecord.sizeData = sizeTotal;
|
||||
m_headerRecord.linkNextRecord = m_posThisRecord + m_headerRecord.sizeHeader + m_headerRecord.sizeData;
|
||||
m_headerRecord.checksum = pstream->GetChecksum();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF_R_General::BufferUpCollection
|
||||
(
|
||||
CPQDIF_StreamIO * pstream,
|
||||
PQAlloc& allocPQ,
|
||||
CPQDIF_E_Collection * pcoll,
|
||||
c_collection_element * aem
|
||||
)
|
||||
{
|
||||
bool status = TRUE;
|
||||
long idxElement;
|
||||
long countElements = pcoll->GetCount();
|
||||
CPQDIF_Element * pel;
|
||||
|
||||
c_collection_element * aemNew;
|
||||
long typePhysical;
|
||||
PQDIFValue value;
|
||||
|
||||
long idx;
|
||||
SIZE4 size;
|
||||
|
||||
for( idxElement = 0; idxElement < countElements; idxElement++ )
|
||||
{
|
||||
pel = pcoll->GetElement( idxElement );
|
||||
if( pel )
|
||||
{
|
||||
switch( pel->GetElementType() )
|
||||
{
|
||||
case ID_ELEMENT_TYPE_COLLECTION:
|
||||
{
|
||||
CPQDIF_E_Collection * pcollNext = (CPQDIF_E_Collection *) pel;
|
||||
|
||||
aemNew = allocPQ.addCollection(
|
||||
pcollNext->GetCount(),
|
||||
idx, size,
|
||||
pel->GetTag(),
|
||||
aem[ idxElement ] );
|
||||
if( aemNew )
|
||||
{
|
||||
status = BufferUpCollection(
|
||||
pstream,
|
||||
allocPQ,
|
||||
pcollNext,
|
||||
aemNew );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_ELEMENT_TYPE_SCALAR :
|
||||
{
|
||||
CPQDIF_E_Scalar * pscalar = (CPQDIF_E_Scalar *) pel;
|
||||
|
||||
pscalar->GetValue( typePhysical, value );
|
||||
status = allocPQ.addScalarValue(
|
||||
typePhysical,
|
||||
value,
|
||||
idx, size,
|
||||
pscalar->GetTag(),
|
||||
aem[ idxElement ] );
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_ELEMENT_TYPE_VECTOR :
|
||||
{
|
||||
CPQDIF_E_Vector * pvector = (CPQDIF_E_Vector *) pel;
|
||||
long count;
|
||||
|
||||
pvector->GetCount( count );
|
||||
typePhysical = pvector->GetPhysicalType();
|
||||
|
||||
status = allocPQ.addVectorValue(
|
||||
typePhysical,
|
||||
count,
|
||||
pvector->GetRawData(),
|
||||
idx, size,
|
||||
pvector->GetTag(),
|
||||
aem[ idxElement ] );
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF_R_General::SetMainCollection( CPQDIF_E_Collection * collMain )
|
||||
{
|
||||
bool status = true;
|
||||
|
||||
// Clear out old collection?
|
||||
if( m_pcollMain )
|
||||
{
|
||||
delete m_pcollMain;
|
||||
m_pcollMain = NULL;
|
||||
}
|
||||
|
||||
if( collMain )
|
||||
{
|
||||
m_pcollMain = collMain;
|
||||
collMain->SetRecord( this );
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF_R_General::GetTimeInMainCollection (const GUID &tag, TIMESTAMPPQDIF& timeTime)
|
||||
{
|
||||
// Initialize
|
||||
bool foundItem = false;
|
||||
|
||||
memset( &timeTime, 0, sizeof( timeTime ) );
|
||||
//
|
||||
//
|
||||
// See if we can find the item
|
||||
//
|
||||
CPQDIF_E_Scalar * psc = FindScalarInCollection( m_pcollMain, tag );
|
||||
if( psc )
|
||||
{
|
||||
foundItem = psc->GetValueTimeStamp( timeTime );
|
||||
}
|
||||
return foundItem;
|
||||
}
|
||||
|
||||
bool CPQDIF_R_General::GetREAL8InMainCollection (const GUID &tag, REAL8 & dVal)
|
||||
{
|
||||
// Initialize
|
||||
bool foundItem = false;
|
||||
|
||||
dVal = 0.0;
|
||||
//
|
||||
//
|
||||
// See if we can find the item
|
||||
//
|
||||
CPQDIF_E_Scalar * psc = FindScalarInCollection( m_pcollMain, tag );
|
||||
if( psc )
|
||||
{
|
||||
foundItem = psc->GetValueREAL8( dVal );
|
||||
}
|
||||
return foundItem;
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF_R_General::GetBOOL4InMainCollection (const GUID &tag, BOOL4 & bVal)
|
||||
{
|
||||
// Initialize
|
||||
bool foundItem = false;
|
||||
|
||||
bVal = false;
|
||||
//
|
||||
//
|
||||
// See if we can find the item
|
||||
//
|
||||
CPQDIF_E_Scalar * psc = FindScalarInCollection( m_pcollMain, tag );
|
||||
if( psc )
|
||||
{
|
||||
bool val;
|
||||
foundItem = psc->GetValueBOOL4( val );
|
||||
bVal = val;
|
||||
}
|
||||
return foundItem;
|
||||
}
|
||||
|
||||
bool CPQDIF_R_General::SetTimeInMainCollection (const GUID &tag, const TIMESTAMPPQDIF& timeTime)
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
CPQDIF_E_Scalar * psc = FindOrCreateScalarInCollection( m_pcollMain,
|
||||
tag, ID_PHYS_TYPE_TIMESTAMPPQDIF );
|
||||
|
||||
// Set value
|
||||
PQDIFValue value;
|
||||
|
||||
if( psc )
|
||||
{
|
||||
value.ts = timeTime;
|
||||
status = psc->SetValue( ID_PHYS_TYPE_TIMESTAMPPQDIF, value );
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CPQDIF_R_General::SetREAL8InMainCollection (const GUID &tag, const REAL8 dVal)
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
CPQDIF_E_Scalar * psc = FindOrCreateScalarInCollection( m_pcollMain,
|
||||
tag, ID_PHYS_TYPE_REAL8 );
|
||||
|
||||
// Set value
|
||||
PQDIFValue value;
|
||||
|
||||
if( psc )
|
||||
{
|
||||
value.real8 = dVal;
|
||||
status = psc->SetValue( ID_PHYS_TYPE_REAL8, value );
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CPQDIF_R_General::SetBOOL4InMainCollection (const GUID &tag, const BOOL4 bVal)
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
CPQDIF_E_Scalar * psc = FindOrCreateScalarInCollection( m_pcollMain,
|
||||
tag, ID_PHYS_TYPE_BOOLEAN4 );
|
||||
|
||||
// Set value
|
||||
PQDIFValue value;
|
||||
|
||||
if( psc )
|
||||
{
|
||||
value.bool4 = bVal;
|
||||
status = psc->SetValue( ID_PHYS_TYPE_BOOLEAN4, value );
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user