diff -r 000000000000 -r 3da2a79470a7 testexecmgmt/ucc/Source/Uccs.v2/Core/UCCS_CDataRecord.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecmgmt/ucc/Source/Uccs.v2/Core/UCCS_CDataRecord.cpp Mon Mar 08 15:04:18 2010 +0800 @@ -0,0 +1,457 @@ +/* +* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Filename: UCCS_CDataRecord.cpp +* System Includes +* +*/ + + + +#include +#include +#include +#include + + +/*********************************************************************************** + * + * Local Includes + * + **********************************************************************************/ +#include "UCCS_CDataRecord.h" +#include "UCCS_ErrorCodes.h" + + +/*********************************************************************************** + * + * PUBLIC METHOD: Constructor + * + **********************************************************************************/ +CDataRecord::CDataRecord() +{ + int i; + + // allocate a list to hold the fields + iFieldList = (CDataField**)malloc( sizeof(CDataField*) * INITIALFIELDCOUNT ); + memset( iFieldList, 0, (sizeof(CDataField*)*INITIALFIELDCOUNT) ); + + // initialise state + iCapacity = INITIALFIELDCOUNT; + iDataFields = 0; + iField = -1; + iLastFieldReturned = -1; + + // initialise all members + for( i = 0; i < iCapacity; i++) { + assert( iFieldList[i] == NULL ); + iFieldList[i] = NULL; + } +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: Destructor + * + **********************************************************************************/ +CDataRecord::~CDataRecord() +{ + // Delete all remaining fields + for(int a = 0; a < iCapacity; a++) { + if(iFieldList[a] != NULL) { + delete iFieldList[a]; + iFieldList[a] = NULL; + } + } + + // free the list + free( iFieldList ); + iFieldList = NULL; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: NewField() - Creates a new record using the string value passed. + * + **********************************************************************************/ +int CDataRecord::NewField( char* aDataFieldName, char* aValue ) +{ + int pos = 0; + + // get a free slot in the list + pos = GetFreeSlot(); + if( pos == -1 ) { + return UCCS_RECORDFULL; + } + + // create the field and set it's init value + iFieldList[pos] = new CDataField( aDataFieldName ); + iFieldList[pos]->SetValue( aValue ); + + // update the state + iDataFields++; + return UCCS_OK; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: NewField() - Creates a new record using the integer value passed. + * + **********************************************************************************/ +int CDataRecord::NewField(char* aDataFieldName, int aValue) +{ + int pos = 0; + + // get a free slot in the list + pos = GetFreeSlot(); + if( pos == -1 ) { + assert( pos != -1 ); + return UCCS_RECORDFULL; + } + + // create the field and set it's init value + iFieldList[pos] = new CDataField( aDataFieldName ); + iFieldList[pos]->SetValue( aValue ); + + // update the state + iDataFields++; + return UCCS_OK; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: NewField() - Creates a new record using the length value passed. + * + **********************************************************************************/ +int CDataRecord::NewField(char* aDataFieldName, void* aBuffer, int aLen) +{ + int pos = 0; + + // get a free slot in the list + pos = GetFreeSlot(); + if( pos == -1 ) { + assert( pos != -1 ); + return UCCS_RECORDFULL; + } + + // create the field and set it's init value + iFieldList[pos] = new CDataField( aDataFieldName ); + iFieldList[pos]->SetValue( aBuffer, aLen ); + + // update the state + iDataFields++; + return UCCS_OK; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: DeleteField() - Removes data item object of the parameter name. + * + **********************************************************************************/ +int CDataRecord::DeleteField(char* aDataFieldName) +{ + int err = 0; + + // Retrieve the item + err = GetField( aDataFieldName ); + if( err != UCCS_OK ) { + return err; + } + + // Update state + delete iFieldList[iField]; + iFieldList[iField] = NULL; + iDataFields -= 1; + return UCCS_OK; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: ChangeFieldData() - Alters the data item data. + * + **********************************************************************************/ +int CDataRecord::ChangeFieldData( char* aDataFieldName, char* aDataFieldValue ) +{ + int err = 0; + + // Retrieve the item + err = GetField( aDataFieldName ); + if( err != UCCS_OK ) { + return err; + } + + // Set the new value + (iFieldList[iField])->SetValue( aDataFieldValue ); + return UCCS_OK; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: ChangeFieldData() - Alters the data item data. + * + **********************************************************************************/ +int CDataRecord::ChangeFieldData( char* aDataFieldName, int aDataFieldValue ) +{ + int err = 0; + + // Retrieve the item + err = GetField( aDataFieldName ); + if( err != UCCS_OK ) { + return err; + } + + // Set the new value + (iFieldList[iField])->SetValue( aDataFieldValue ); + return UCCS_OK; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: ChangeFieldData() - Alters the data item data. + * + **********************************************************************************/ +int CDataRecord::ChangeFieldData(char* aDataField, void* aDataFieldValue, int aDataFieldLen ) +{ + int err = 0; + + // Retrieve the item + err = GetField( aDataField ); + if( err != UCCS_OK ) { + return err; + } + + // Set the new value + (iFieldList[iField])->SetValue( aDataFieldValue, aDataFieldLen ); + return UCCS_OK; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: GetFieldAsInt() - Returns the field as an integer. + * + **********************************************************************************/ +int CDataRecord::GetFieldAsInt(char* aFieldName, int* aValue) +{ + int err = 0; + + // Check params + assert( aValue != NULL ); + + // Retrieve the item + err = GetField( aFieldName ); + if( err != UCCS_OK ) { + return err; + } + + // Retrieve the value + *aValue = (iFieldList[iField])->GetIntValue(); + return UCCS_OK; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: GetFieldAsString() - Returns the field as a string. + * + **********************************************************************************/ +int CDataRecord::GetFieldAsString(char* aFieldName, char** aValue) +{ + int err = 0; + + // Check params + assert( aValue != NULL ); + *aValue = NULL; + + // Retrieve the item + err = GetField( aFieldName ); + if( err != UCCS_OK ) { + return err; + } + + // Retrieve the value + *aValue = (iFieldList[iField])->GetStrValue(); + return UCCS_OK; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: GetFieldAsBuffer() - Returns the field as a buffer. + * + **********************************************************************************/ +int CDataRecord::GetFieldAsBuffer(char* aFieldName, void** aValue, int* aLen) +{ + int err = 0; + + // Check params + assert( aValue != NULL ); + assert( aLen != NULL ); + + // Retrieve the item + err = GetField( aFieldName ); + if( err != UCCS_OK ) { + return err; + } + + // Retrieve the value + *aValue = (iFieldList[iField])->GetBufValue( aLen ); + return UCCS_OK; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: GetFieldCount() - Retrieve the number of active items in the list. + * + **********************************************************************************/ +int CDataRecord::GetFieldCount() +{ + int i; + int count = 0; + + // do a consistency check on the number of fields -- this should be taken out + // once system test is passed. + for( i = 0; i < iCapacity; i++ ) { + if( iFieldList[i] != NULL ) + count++; + } + assert( iDataFields == count ); + + // return the stored value + return iDataFields; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: GetFirstField() + * + **********************************************************************************/ +CDataField *CDataRecord::GetFirstField() +{ + int i; + for( i = 0; i < iCapacity; i++ ) { + if( iFieldList[i] != NULL ) { + iLastFieldReturned = i; + return iFieldList[i]; + } + } + return NULL; +} + + +/*********************************************************************************** + * + * PUBLIC METHOD: GetNextField() + * + **********************************************************************************/ +CDataField *CDataRecord::GetNextField() +{ + int i; + for( i = (iLastFieldReturned + 1); i < iCapacity; i++ ) { + if( iFieldList[i] != NULL ) { + iLastFieldReturned = i; + return iFieldList[i]; + } + } + return NULL; +} + + +/*********************************************************************************** + * + * PRIVATE METHODS: List Manipulation. Only these functions may modify iField + * + **********************************************************************************/ + +/*********************************************************************************** + * + * GetFreeSlot() - returns the index of a free slot also places the + * index in the iField member + * + **********************************************************************************/ +int CDataRecord::GetFreeSlot() +{ + int i; + int oldcapacity; + + // loop through the iFieldList array and look for a free slot + for( i = 0; i < iCapacity; i++ ) { + if( iFieldList[i] == NULL ) { + iField = i; + return i; + } + } + + // search failed, no spaces left. Allocate more space. + oldcapacity = iCapacity; + iCapacity *= CAPACITYINCREASEFACTOR; + iFieldList = (CDataField**)realloc( iFieldList, iCapacity*sizeof(CDataField*) ); + for( i = oldcapacity; i < iCapacity; i++ ) { + iFieldList[i] = NULL; + } + iField = oldcapacity; + return oldcapacity; +} + + +/*********************************************************************************** + * + * GetField() - returns the index of a field with the matching name + * + **********************************************************************************/ +int CDataRecord::GetField( char* aDataFieldName ) +{ + int i, match; + + // loop through the iFieldList array and check for a name match + for( i = 0; i < iCapacity; i++ ) { + if( iFieldList[i] != NULL ) { + match = iFieldList[i]->IsItem( aDataFieldName ); + if( match ) { + iField = i; + return UCCS_OK; + } + } + } + + // otherwise + return UCCS_FIELDNOTFOUND; +} + + +/*********************************************************************************** + * + * DEBUG METHODS: Print the record + * + **********************************************************************************/ +void CDataRecord::PrintRecord( FILE *aFile ) +{ + int i; + for( i = 0; i < iCapacity; i++ ) { + if( iFieldList[i] != NULL ) { + fprintf( aFile, " " ); + iFieldList[i]->PrintField( aFile ); + } + } +}