os/persistentdata/traceservices/tracefw/ulogger/src/pluginframework/inputdata.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
sl@0
    17
#include "inputdata.h"
sl@0
    18
sl@0
    19
#if defined(__LIGHTLOGGER_ENABLED)
sl@0
    20
#include "lightlogger.h" 
sl@0
    21
#endif
sl@0
    22
sl@0
    23
/**Default constructor.
sl@0
    24
*/
sl@0
    25
EXPORT_C CInputData::CInputData(unsigned int aMinPackageSize)
sl@0
    26
{
sl@0
    27
	iMinPackageSize = aMinPackageSize;
sl@0
    28
}
sl@0
    29
sl@0
    30
/**Destructor.
sl@0
    31
*/
sl@0
    32
EXPORT_C CInputData::~CInputData()
sl@0
    33
{
sl@0
    34
}
sl@0
    35
sl@0
    36
/**Function creates new control data chunk (with EOL).
sl@0
    37
sl@0
    38
@param aCommand A pointer to command literal.
sl@0
    39
@param aCommandSize Size of data poitned by aCommand.
sl@0
    40
@return Pointer to ControlData type is returned when chunk was successfully created, otherwise NULL.
sl@0
    41
*/
sl@0
    42
EXPORT_C ControlData* CInputData::CreatePackage(void* aCommand, signed long aCommandSize)
sl@0
    43
{
sl@0
    44
	unsigned long trueSize = aCommandSize+SIZE_OF_EOL; 
sl@0
    45
	unsigned long size = trueSize;
sl@0
    46
	if(size<iMinPackageSize)
sl@0
    47
		size = iMinPackageSize;
sl@0
    48
sl@0
    49
	//create package
sl@0
    50
	ControlData *package = new ControlData[size]; //minimum package
sl@0
    51
	if(!package)
sl@0
    52
		return NULL;
sl@0
    53
	
sl@0
    54
	//add command 
sl@0
    55
	memcpy((void*)package, aCommand, aCommandSize);
sl@0
    56
	
sl@0
    57
	//apend padding character if necessary (between last string and EOL)
sl@0
    58
	long padd = 0;
sl@0
    59
	if(trueSize < iMinPackageSize)
sl@0
    60
	{
sl@0
    61
	padd = iMinPackageSize-trueSize;
sl@0
    62
		for(int i=0; i<padd; i++) //skip separator
sl@0
    63
			memcpy((void*)(package+aCommandSize+i), (void*)&DATA_SEPARATOR, 1);
sl@0
    64
	}
sl@0
    65
	
sl@0
    66
	//add EOL
sl@0
    67
	memcpy((void*)(package+aCommandSize+padd), (void*)&CD_EOL, SIZE_OF_EOL);
sl@0
    68
	
sl@0
    69
	return package;
sl@0
    70
}
sl@0
    71
sl@0
    72
//only for internal use
sl@0
    73
unsigned long CInputData::FindAvailablePlace(const ControlData *aDataPtr)
sl@0
    74
{
sl@0
    75
	unsigned long currentSize = this->GetSize(aDataPtr);
sl@0
    76
	unsigned long endPtr = 0;
sl@0
    77
	
sl@0
    78
	while(true)
sl@0
    79
	{
sl@0
    80
		if((*(aDataPtr+endPtr))==CD_CR)
sl@0
    81
			break;
sl@0
    82
		
sl@0
    83
		if((*(aDataPtr+endPtr)) == DATA_SEPARATOR)
sl@0
    84
			if(((*(aDataPtr+endPtr+1)) == CD_CR) || ((*(aDataPtr+endPtr+1)) == DATA_SEPARATOR))
sl@0
    85
				break; //offset
sl@0
    86
		++endPtr;
sl@0
    87
	}
sl@0
    88
	
sl@0
    89
	return endPtr+1;
sl@0
    90
}
sl@0
    91
sl@0
    92
//only for internal use
sl@0
    93
unsigned long CInputData::CalcNumberOfPaddingChars(const ControlData *aDataPtr)
sl@0
    94
{
sl@0
    95
	unsigned long padd = 0;
sl@0
    96
	int i=1;
sl@0
    97
	
sl@0
    98
	while(true)
sl@0
    99
	{
sl@0
   100
		if((*(aDataPtr+i))==DATA_SEPARATOR)
sl@0
   101
			if((*(aDataPtr+i+1))==DATA_SEPARATOR)
sl@0
   102
				++padd;
sl@0
   103
		if((*(aDataPtr+i))==CD_CR)
sl@0
   104
			break;
sl@0
   105
		++i;
sl@0
   106
	}
sl@0
   107
	
sl@0
   108
	return padd;
sl@0
   109
}
sl@0
   110
sl@0
   111
/**Function returns size of control data chunk given as an argument.
sl@0
   112
aDataPtr must be ended with EOL (end if line) sequence.
sl@0
   113
sl@0
   114
@param aDataPtr A poiter to existing control data.
sl@0
   115
@return Unsigned long number describing current size of control data.
sl@0
   116
*/
sl@0
   117
EXPORT_C unsigned long CInputData::GetSize(const ControlData *aDataPtr)
sl@0
   118
{
sl@0
   119
	long i=0;
sl@0
   120
	while(true)
sl@0
   121
		{
sl@0
   122
		if((*(aDataPtr+i)) == CD_CR)
sl@0
   123
			if((*(aDataPtr+i+1)) == CD_LF)
sl@0
   124
				return i+SIZE_OF_EOL;
sl@0
   125
		++i;
sl@0
   126
		}
sl@0
   127
}
sl@0
   128
sl@0
   129
sl@0
   130
/**Function returns number of chunks in current control data package.
sl@0
   131
 
sl@0
   132
@param aDataPtr A poiter to existing control data chunk.
sl@0
   133
@return Number of chunks in current control data.
sl@0
   134
*/
sl@0
   135
EXPORT_C unsigned long CInputData::GetChunksCount(const ControlData *aDataPtr)
sl@0
   136
{
sl@0
   137
	unsigned long counter = 0;
sl@0
   138
	unsigned long size = this->GetSize(aDataPtr);
sl@0
   139
	unsigned long tmp = 0;
sl@0
   140
	
sl@0
   141
	while(tmp < size-1)
sl@0
   142
	{
sl@0
   143
		if( (*(aDataPtr+tmp) != DATA_SEPARATOR) && (*(aDataPtr+tmp) != CD_CR) && (*(aDataPtr+tmp) != CD_LF) )
sl@0
   144
			if( (*(aDataPtr+tmp+1) == DATA_SEPARATOR) || (*(aDataPtr+tmp+1) == CD_CR) || (*(aDataPtr+tmp+1) == CD_LF) )
sl@0
   145
				++counter;
sl@0
   146
		++tmp;
sl@0
   147
	}	
sl@0
   148
	return counter;
sl@0
   149
}
sl@0
   150
sl@0
   151
sl@0
   152
/**Function parses control data chunk and returns pointer to data chunk described in aChunkNumber argument and update 
sl@0
   153
aChunkSize argument passed as a reference.
sl@0
   154
 
sl@0
   155
@param aDataPtr A poiter to existing control data.
sl@0
   156
@param aChunkNumber Number of desired data chunk.
sl@0
   157
@param aChunkSize Reference to unsigned long variable, where size of returned chunk will be written.
sl@0
   158
@return A pointer to data or NULL.
sl@0
   159
*/
sl@0
   160
EXPORT_C const void* CInputData::GetChunk(const ControlData* aDataPtr, unsigned long aChunkNumber, unsigned long &aChunkSize)
sl@0
   161
{
sl@0
   162
	aChunkSize = 0;
sl@0
   163
	unsigned long counter = 0;
sl@0
   164
	unsigned long size = this->GetSize(aDataPtr);
sl@0
   165
	unsigned long tmp = 0;
sl@0
   166
	
sl@0
   167
	while(tmp < size)
sl@0
   168
	{
sl@0
   169
		if(counter == aChunkNumber)
sl@0
   170
		{
sl@0
   171
			unsigned long chunkStart = tmp;
sl@0
   172
			while((*(aDataPtr+tmp)!=DATA_SEPARATOR) && (*(aDataPtr+tmp)!=CD_CR))
sl@0
   173
				{++tmp;}
sl@0
   174
			aChunkSize = tmp-chunkStart;
sl@0
   175
			const void* ret = aDataPtr+chunkStart;
sl@0
   176
			return ret;
sl@0
   177
		}
sl@0
   178
		else if(*(aDataPtr+tmp)==DATA_SEPARATOR)
sl@0
   179
				++counter;
sl@0
   180
		++tmp;
sl@0
   181
	}
sl@0
   182
	
sl@0
   183
	return NULL;
sl@0
   184
}
sl@0
   185
sl@0
   186
/**Functions appends data to existing control data. All operations, like updating size and appending separators, are done internally.
sl@0
   187
sl@0
   188
@param aDataPtr A reference to poiter to existing control data.
sl@0
   189
@param aAddData A pointer to data that should be appended to current payload.
sl@0
   190
@param aAddDataSize A size of data that should be appended.
sl@0
   191
@return A new size of control data chunk (size after 'append' operation).
sl@0
   192
*/
sl@0
   193
EXPORT_C unsigned long CInputData::AppendNewData(ControlData *&aDataPtr, const void *aAddData, unsigned long aAddDataSize)
sl@0
   194
{	
sl@0
   195
	unsigned long currentSize = this->GetSize(aDataPtr); //with EOL
sl@0
   196
	unsigned long nextPayOffest = this->FindAvailablePlace(aDataPtr);
sl@0
   197
	unsigned long paddChars = this->CalcNumberOfPaddingChars(aDataPtr);
sl@0
   198
	
sl@0
   199
	//calculate new size
sl@0
   200
	unsigned long newSize = 0;
sl@0
   201
	if(paddChars >= aAddDataSize)
sl@0
   202
		newSize = currentSize;	
sl@0
   203
		else
sl@0
   204
			newSize = currentSize+aAddDataSize+1; //1 char for separator
sl@0
   205
sl@0
   206
	//reallocate 
sl@0
   207
	ControlData *newPtr = new ControlData[newSize];
sl@0
   208
	if(newPtr == NULL)
sl@0
   209
		{
sl@0
   210
		delete [] aDataPtr;
sl@0
   211
		return NULL;
sl@0
   212
		}
sl@0
   213
sl@0
   214
	//fill with padding characters
sl@0
   215
	for(int i=0; i<newSize; i++)
sl@0
   216
		memcpy((void*)(newPtr+i), (void*)&DATA_SEPARATOR, 1);
sl@0
   217
	
sl@0
   218
	//copy old content to new location
sl@0
   219
	memcpy((void*)newPtr, (void*)aDataPtr, currentSize-SIZE_OF_EOL); //except EOL
sl@0
   220
	delete [] aDataPtr;
sl@0
   221
	
sl@0
   222
	//add new Data
sl@0
   223
	memcpy((void*)(newPtr+nextPayOffest), (void*)aAddData, aAddDataSize);
sl@0
   224
	
sl@0
   225
	//add EOL (end of package indicator)
sl@0
   226
	memcpy((void*)(newPtr+newSize-SIZE_OF_EOL), (void*)&CD_EOL, SIZE_OF_EOL);
sl@0
   227
sl@0
   228
	//assign new data
sl@0
   229
	aDataPtr = newPtr;
sl@0
   230
	
sl@0
   231
	return newSize;
sl@0
   232
}
sl@0
   233
sl@0
   234