sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: sl@0: #include "inputdata.h" sl@0: sl@0: #if defined(__LIGHTLOGGER_ENABLED) sl@0: #include "lightlogger.h" sl@0: #endif sl@0: sl@0: /**Default constructor. sl@0: */ sl@0: EXPORT_C CInputData::CInputData(unsigned int aMinPackageSize) sl@0: { sl@0: iMinPackageSize = aMinPackageSize; sl@0: } sl@0: sl@0: /**Destructor. sl@0: */ sl@0: EXPORT_C CInputData::~CInputData() sl@0: { sl@0: } sl@0: sl@0: /**Function creates new control data chunk (with EOL). sl@0: sl@0: @param aCommand A pointer to command literal. sl@0: @param aCommandSize Size of data poitned by aCommand. sl@0: @return Pointer to ControlData type is returned when chunk was successfully created, otherwise NULL. sl@0: */ sl@0: EXPORT_C ControlData* CInputData::CreatePackage(void* aCommand, signed long aCommandSize) sl@0: { sl@0: unsigned long trueSize = aCommandSize+SIZE_OF_EOL; sl@0: unsigned long size = trueSize; sl@0: if(sizeGetSize(aDataPtr); sl@0: unsigned long endPtr = 0; sl@0: sl@0: while(true) sl@0: { sl@0: if((*(aDataPtr+endPtr))==CD_CR) sl@0: break; sl@0: sl@0: if((*(aDataPtr+endPtr)) == DATA_SEPARATOR) sl@0: if(((*(aDataPtr+endPtr+1)) == CD_CR) || ((*(aDataPtr+endPtr+1)) == DATA_SEPARATOR)) sl@0: break; //offset sl@0: ++endPtr; sl@0: } sl@0: sl@0: return endPtr+1; sl@0: } sl@0: sl@0: //only for internal use sl@0: unsigned long CInputData::CalcNumberOfPaddingChars(const ControlData *aDataPtr) sl@0: { sl@0: unsigned long padd = 0; sl@0: int i=1; sl@0: sl@0: while(true) sl@0: { sl@0: if((*(aDataPtr+i))==DATA_SEPARATOR) sl@0: if((*(aDataPtr+i+1))==DATA_SEPARATOR) sl@0: ++padd; sl@0: if((*(aDataPtr+i))==CD_CR) sl@0: break; sl@0: ++i; sl@0: } sl@0: sl@0: return padd; sl@0: } sl@0: sl@0: /**Function returns size of control data chunk given as an argument. sl@0: aDataPtr must be ended with EOL (end if line) sequence. sl@0: sl@0: @param aDataPtr A poiter to existing control data. sl@0: @return Unsigned long number describing current size of control data. sl@0: */ sl@0: EXPORT_C unsigned long CInputData::GetSize(const ControlData *aDataPtr) sl@0: { sl@0: long i=0; sl@0: while(true) sl@0: { sl@0: if((*(aDataPtr+i)) == CD_CR) sl@0: if((*(aDataPtr+i+1)) == CD_LF) sl@0: return i+SIZE_OF_EOL; sl@0: ++i; sl@0: } sl@0: } sl@0: sl@0: sl@0: /**Function returns number of chunks in current control data package. sl@0: sl@0: @param aDataPtr A poiter to existing control data chunk. sl@0: @return Number of chunks in current control data. sl@0: */ sl@0: EXPORT_C unsigned long CInputData::GetChunksCount(const ControlData *aDataPtr) sl@0: { sl@0: unsigned long counter = 0; sl@0: unsigned long size = this->GetSize(aDataPtr); sl@0: unsigned long tmp = 0; sl@0: sl@0: while(tmp < size-1) sl@0: { sl@0: if( (*(aDataPtr+tmp) != DATA_SEPARATOR) && (*(aDataPtr+tmp) != CD_CR) && (*(aDataPtr+tmp) != CD_LF) ) sl@0: if( (*(aDataPtr+tmp+1) == DATA_SEPARATOR) || (*(aDataPtr+tmp+1) == CD_CR) || (*(aDataPtr+tmp+1) == CD_LF) ) sl@0: ++counter; sl@0: ++tmp; sl@0: } sl@0: return counter; sl@0: } sl@0: sl@0: sl@0: /**Function parses control data chunk and returns pointer to data chunk described in aChunkNumber argument and update sl@0: aChunkSize argument passed as a reference. sl@0: sl@0: @param aDataPtr A poiter to existing control data. sl@0: @param aChunkNumber Number of desired data chunk. sl@0: @param aChunkSize Reference to unsigned long variable, where size of returned chunk will be written. sl@0: @return A pointer to data or NULL. sl@0: */ sl@0: EXPORT_C const void* CInputData::GetChunk(const ControlData* aDataPtr, unsigned long aChunkNumber, unsigned long &aChunkSize) sl@0: { sl@0: aChunkSize = 0; sl@0: unsigned long counter = 0; sl@0: unsigned long size = this->GetSize(aDataPtr); sl@0: unsigned long tmp = 0; sl@0: sl@0: while(tmp < size) sl@0: { sl@0: if(counter == aChunkNumber) sl@0: { sl@0: unsigned long chunkStart = tmp; sl@0: while((*(aDataPtr+tmp)!=DATA_SEPARATOR) && (*(aDataPtr+tmp)!=CD_CR)) sl@0: {++tmp;} sl@0: aChunkSize = tmp-chunkStart; sl@0: const void* ret = aDataPtr+chunkStart; sl@0: return ret; sl@0: } sl@0: else if(*(aDataPtr+tmp)==DATA_SEPARATOR) sl@0: ++counter; sl@0: ++tmp; sl@0: } sl@0: sl@0: return NULL; sl@0: } sl@0: sl@0: /**Functions appends data to existing control data. All operations, like updating size and appending separators, are done internally. sl@0: sl@0: @param aDataPtr A reference to poiter to existing control data. sl@0: @param aAddData A pointer to data that should be appended to current payload. sl@0: @param aAddDataSize A size of data that should be appended. sl@0: @return A new size of control data chunk (size after 'append' operation). sl@0: */ sl@0: EXPORT_C unsigned long CInputData::AppendNewData(ControlData *&aDataPtr, const void *aAddData, unsigned long aAddDataSize) sl@0: { sl@0: unsigned long currentSize = this->GetSize(aDataPtr); //with EOL sl@0: unsigned long nextPayOffest = this->FindAvailablePlace(aDataPtr); sl@0: unsigned long paddChars = this->CalcNumberOfPaddingChars(aDataPtr); sl@0: sl@0: //calculate new size sl@0: unsigned long newSize = 0; sl@0: if(paddChars >= aAddDataSize) sl@0: newSize = currentSize; sl@0: else sl@0: newSize = currentSize+aAddDataSize+1; //1 char for separator sl@0: sl@0: //reallocate sl@0: ControlData *newPtr = new ControlData[newSize]; sl@0: if(newPtr == NULL) sl@0: { sl@0: delete [] aDataPtr; sl@0: return NULL; sl@0: } sl@0: sl@0: //fill with padding characters sl@0: for(int i=0; i