/* ** CPQDIF_PersistController class. The base class for persistence controller ** classes. These classes are used to control how the PQDIF data is stored ** and retrieved from a particular medium. ** -------------------------------------------------------------------------- ** ** File name: $Workfile: pcn_base.cpp $ ** Last modified: $Modtime: 7/07/99 5:08p $ ** Last modified by: $Author: Erich $ ** ** VCS archive path: $Archive: /PQDIF/PQDcom/PQDcom4/pqdiflib/pcn_base.cpp $ ** VCS revision: $Revision: 9 $ */ #include "PQDIF_classes.h" // Construction // ============ CPQDIF_PersistController::CPQDIF_PersistController() { m_arrayRecords.SetSize( 0, 8 ); m_state = pqpc_Empty; } CPQDIF_PersistController::~CPQDIF_PersistController() { CPQDIFRecord * prec = NULL; // Delete record objects in array for( int idx = 0; idx < m_arrayRecords.GetSize(); idx++ ) { prec = (CPQDIFRecord *)(m_arrayRecords[ idx ]); delete prec; } } CPQDIFRecord * CPQDIF_PersistController::GetRecord( long index ) { CPQDIFRecord * prec = NULL; if( index >= 0 && index < m_arrayRecords.GetSize() ) { prec = (CPQDIFRecord *) m_arrayRecords[ index ]; } return prec; } long CPQDIF_PersistController::GetRecordCount( void ) const { return m_arrayRecords.GetSize(); } bool CPQDIF_PersistController::InsertRecord( CPQDIFRecord * prec, long indexToInsert ) { bool status = FALSE; if( indexToInsert >= 0 && indexToInsert <= m_arrayRecords.GetSize() ) { m_arrayRecords.InsertAt( indexToInsert, prec ); status = TRUE; } return status; } bool CPQDIF_PersistController::RemoveRecord( long index ) { bool status = FALSE; CPQDIFRecord * prec = NULL; if( index >= 0 && index < m_arrayRecords.GetSize() ) { m_arrayRecords.RemoveAt( index ); status = TRUE; } return status; } long CPQDIF_PersistController::CreateContainerRecord ( const char * language, const char * title, const char * subject, const char * author, const char * keywords, const char * comments, const char * lastSavedBy, const char * application, const char * security, const char * owner, const char * copyright, const char * trademarks, const char * notes ) { CPQDIFRecord * prec; long idxNewRecord = 0; CPQDIF_E_Collection * pcollMain; prec = theFactory.NewRecord( PFR_Container ); if( prec ) { // Create main collection for new record pcollMain = (CPQDIF_E_Collection *) theFactory.NewElement( ID_ELEMENT_TYPE_COLLECTION ); if( pcollMain ) { // Add string entries pcollMain->SetVectorString( tagLanguage, language ); pcollMain->SetVectorString( tagTitle, title ); pcollMain->SetVectorString( tagSubject, subject ); pcollMain->SetVectorString( tagAuthor, author ); pcollMain->SetVectorString( tagKeywords, keywords ); pcollMain->SetVectorString( tagComments, comments ); pcollMain->SetVectorString( tagLastSavedBy, lastSavedBy ); pcollMain->SetVectorString( tagApplication, application ); pcollMain->SetVectorString( tagSecurity, security ); pcollMain->SetVectorString( tagOwner, owner ); pcollMain->SetVectorString( tagCopyright, copyright ); pcollMain->SetVectorString( tagTrademarks, trademarks ); pcollMain->SetVectorString( tagNotes, notes ); // Hand it over to the record object prec->SetMainCollection( pcollMain ); // Stuff the record into the first slot m_arrayRecords.SetAtGrow( 0, prec ); } } return idxNewRecord; } long CPQDIF_PersistController::CreateContainerRecord ( const char * szFileName, const TIMESTAMPPQDIF * timeCreate, const long lMajor, const long lMinor, const long lCompatMajor, const long lCompatMinor ) { CPQDIFRecord * prec; long idxNewRecord = 0; CPQDIF_E_Collection * pcollMain; prec = theFactory.NewRecord( PFR_Container ); if( prec ) { // Create main collection for new record pcollMain = (CPQDIF_E_Collection *) theFactory.NewElement( ID_ELEMENT_TYPE_COLLECTION ); if( pcollMain ) { // Add string entries pcollMain->SetVectorString( tagFileName, szFileName ); pcollMain->SetScalarTimeStamp( tagCreation, *timeCreate ); UINT4 aVer[4]; aVer[0] = lMajor; aVer[1] = lMinor; aVer[2] = lCompatMajor; aVer[3] = lCompatMinor; pcollMain->SetVectorUINT4( tagVersionInfo, aVer, 4 ); // Hand it over to the record object prec->SetMainCollection( pcollMain ); // Stuff the record into the first slot m_arrayRecords.SetAtGrow( 0, prec ); } } return idxNewRecord; } long CPQDIF_PersistController::CreateDataSourceRecord ( long indexInsert, const GUID& idDataSourceType, const GUID& idVendor, const GUID& idEquipment, const char * serialNumberDS, // Optional (can be NULL) const char * versionDS, // Optional const char * nameDS, const char * ownerDS, // Optional const char * locationDS, // Optional const char * timeZoneDS // Optional ) { CPQDIFRecord * prec; long idxNewRecord = indexInsert; // Is this right? need to fix CPQDIF_E_Collection * pcollMain; CPQDIF_E_Collection * pcollDefinitions; prec = theFactory.NewRecord( PFR_DataSource ); if( prec ) { // Create main collection for new record pcollMain = (CPQDIF_E_Collection *) theFactory.NewElement( ID_ELEMENT_TYPE_COLLECTION ); if( pcollMain ) { // Add GUID & string entries pcollMain->SetScalarGUID( tagDataSourceTypeID, idDataSourceType ); pcollMain->SetScalarGUID( tagVendorID, idVendor ); pcollMain->SetScalarGUID( tagEquipmentID, idEquipment ); pcollMain->SetVectorString( tagSerialNumberDS, serialNumberDS ); pcollMain->SetVectorString( tagVersionDS, versionDS ); pcollMain->SetVectorString( tagNameDS, nameDS ); pcollMain->SetVectorString( tagOwnerDS, ownerDS ); pcollMain->SetVectorString( tagLocationDS, locationDS ); pcollMain->SetVectorString( tagTimeZoneDS, timeZoneDS ); // Insert an empty collection ... pcollDefinitions = (CPQDIF_E_Collection *) theFactory.NewElement( ID_ELEMENT_TYPE_COLLECTION ); pcollDefinitions->SetTag( tagChannelDefns ); pcollMain->Add( pcollDefinitions ); // Hand it over to the record object prec->SetMainCollection( pcollMain ); // Add the record InsertRecord( prec, indexInsert ); } } return idxNewRecord; } long CPQDIF_PersistController::CreateMonitorSettingsRecord ( long indexInsert, const TIMESTAMPPQDIF * timeEffective, const TIMESTAMPPQDIF * timeInstalled, const TIMESTAMPPQDIF * timeRemoved, bool useCal, bool useTrans ) { long idxNewRecord = indexInsert; // Is this right? need to fix CPQDIF_R_Settings * prec; CPQDIF_E_Collection * pcollMain; prec = (CPQDIF_R_Settings *) theFactory.NewRecord( PFR_MonitorSettings ); if( prec ) { // Create main collection for new record pcollMain = (CPQDIF_E_Collection *) theFactory.NewElement( ID_ELEMENT_TYPE_COLLECTION ); if( pcollMain ) { prec->SetMainCollection( pcollMain ); prec->SetInfo( *timeEffective, *timeInstalled, *timeRemoved, useCal, useTrans ); // Add the record InsertRecord( prec, indexInsert ); } } return idxNewRecord; } long CPQDIF_PersistController::CreateMonitorSettingsRecord ( long indexInsert ) { long idxNewRecord = indexInsert; // Is this right? need to fix CPQDIF_R_Settings * prec; CPQDIF_E_Collection * pcollMain; prec = (CPQDIF_R_Settings *) theFactory.NewRecord( PFR_MonitorSettings ); if( prec ) { // Create main collection for new record pcollMain = (CPQDIF_E_Collection *) theFactory.NewElement( ID_ELEMENT_TYPE_COLLECTION ); if( pcollMain ) { prec->SetMainCollection( pcollMain ); // Add the record InsertRecord( prec, indexInsert ); } } return idxNewRecord; } long CPQDIF_PersistController::CreateObservationRecord ( long indexInsert, const char * name, const TIMESTAMPPQDIF * timeCreate, const TIMESTAMPPQDIF * timeStart, UINT4 idTriggerMethod, const TIMESTAMPPQDIF * timeTriggered, // Optional (can be NULL) long countTriggers, UINT4 * aidxChannelTrigger // Array of channel indices[ countTriggers ] // Optional (can be NULL) ) { CPQDIFRecord * prec; long idxNewRecord = indexInsert; // Is this right? need to fix CPQDIF_E_Collection * pcollMain; CPQDIF_E_Collection * pcollInstances; // Triggers long idxTrigger; CPQDIF_E_Vector * pvectChannelIdx; PQDIFValue valuePQDIF; // Create and populate the new record prec = theFactory.NewRecord( PFR_Observation ); if( prec ) { // Create main collection for new record pcollMain = (CPQDIF_E_Collection *) theFactory.NewElement( ID_ELEMENT_TYPE_COLLECTION ); if( pcollMain ) { // Add entries pcollMain->SetVectorString( tagObservationName, name ); pcollMain->SetScalarTimeStamp( tagTimeCreate, *timeCreate ); pcollMain->SetScalarTimeStamp( tagTimeStart, *timeStart ); pcollMain->SetScalarUINT4( tagTriggerMethodID, idTriggerMethod ); // Optional time triggered if( timeTriggered ) { pcollMain->SetScalarTimeStamp( tagTimeTriggered, *timeTriggered ); } // Optional triggers if( countTriggers > 0 && aidxChannelTrigger ) { pvectChannelIdx = (CPQDIF_E_Vector *) theFactory.NewElement( ID_ELEMENT_TYPE_VECTOR ); if( pvectChannelIdx ) { pvectChannelIdx->SetTag( tagChannelTriggerIdx ); pvectChannelIdx->SetPhysicalType( ID_PHYS_TYPE_UNS_INTEGER4 ); pvectChannelIdx->SetCount( countTriggers ); for( idxTrigger = 0; idxTrigger < countTriggers; idxTrigger++ ) { valuePQDIF.uint4 = aidxChannelTrigger[ idxTrigger ]; pvectChannelIdx->SetValue( idxTrigger, valuePQDIF ); } pcollMain->Add( pvectChannelIdx ); } } // Insert an empty collection ... pcollInstances = (CPQDIF_E_Collection *) theFactory.NewElement( ID_ELEMENT_TYPE_COLLECTION ); pcollInstances->SetTag( tagChannelInstances ); pcollMain->Add( pcollInstances ); // Hand it over to the record object prec->SetMainCollection( pcollMain ); // Add the record InsertRecord( prec, indexInsert ); } } return idxNewRecord; }