diff -r 3b4f7e9d873f -r 4f400a6ea71f vghwinterface/vghwserialiser/inc/serializedfunctioncall.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vghwinterface/vghwserialiser/inc/serializedfunctioncall.h Wed Oct 06 15:43:10 2010 +0100 @@ -0,0 +1,163 @@ +// Copyright (c) 2010 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: + +#ifndef SERIALIZEDFUNCTIONCALL_H_ +#define SERIALIZEDFUNCTIONCALL_H_ + +#include "serializerplatform.h" + +class RemoteFunctionCallData; +//Copy operations for simple and array parameters +class MDataCopier + { +public: + virtual TInt CopyData( TUint8* aDest, const TUint8* aSource, TUint32 aSize ) = 0; + virtual TInt CopyVector( TUint8* aDest, const TUint8* aSource, TUint32 aSize ) = 0; + }; + +/** + * Serialized function call. + * Serializes the parameters to a given memory location. + */ +class SerializedFunctionCall + { +public: + + //Parse error + enum TError + { + ESuccess, + EMoreData, + EParseError + }; + + //Parse state + enum TParseState + { + EReadingApiUid, + EReadingOpCode, + EReadingTransactionId, + EReadingParameterCount, + EReadingProcessId, + EReadingThreadId, + EReadingOpType, + EReadingReturnValue, + EReadingParamDir, + EReadingParamType, + EReadingSimpleParamType, + EReadingSimpleParamData, + EReadingVectorParamType, + EReadingVectorParamDataSize, + EReadingVectorParamVectorLength, + EReadingVectorParamCallerAddress, + EReadingVectorParamData, + EReadingDone + }; + + //Constructor + SER_IMPORT_C SerializedFunctionCall( RemoteFunctionCallData& aRFC, MDataCopier* aDataCopier = NULL ); + + SER_IMPORT_C void SetDataCopier( MDataCopier* aDataCopier ); + + //Parses a serialized function call. Updates parameter array and utilises data copier to + // copy array parameters + SER_IMPORT_C TInt ParseBuffer( const TUint8* aBuffer, const TInt aBufferLength ); + + //Serializes function call to a stream. + SER_IMPORT_C TInt WriteToBuffer( TUint8* aBuffer, const TInt aStreamMaxLength, TInt aOffset = 0 ); + +private: + + //Writes header to stream + TInt WriteHeaderToBuffer( TUint8* aBuffer, const TInt aStreamMaxLength, TInt aOffset = 0 ); + + //Reads header from buffer + TInt ReadHeaderFromBuffer( const TUint8* aBuffer, const TInt aBufferLength ); + + //Writes a data. Accounts destination buffer overflow and can continue write + // from a given offset + TInt Write( TUint8* aDest, TInt& aDestIndex, const TInt aDestSize, + const TUint8* aSource, const TInt aSize, TInt& aSourceIndex, + const TInt aOffset, TBool aVector ); + + //Serializes a simple param to a current stream + TInt WriteParam( const TUint8* aParam, const TInt aParamSize ); + + //Serializes an array param to a current stream + //TInt WriteVector( const TUint8* aParam, const TInt aParamSize ); + TInt WriteVector( const TUint8* aParam, const TInt32 aDataTypeSize, const TInt aVectorSize, const TInt8 aDataTypeAlignment ); + + //Initialises write state + void StartWrite( TUint8* aBuffer, const TInt aStreamMaxLength, TInt aOffset = 0 ); + + //Gets a direct pointer to the stream data for an array parameter + //TUint8* ReadVector( const TInt aParamSize ); + TUint8* ReadVectorPointer( const TInt32 aDataTypeSize, const TInt aVectorSize, const TInt8 aDataTypeAlignment ); + + //Reads simple parameter from a stream + TInt ReadParam( TUint8* aParam, const TInt aParamSize ); + + //Reads an array parameter from a stream and utilises data copier for data transfer + //TInt ReadVectorParam( TUint8* aParam, const TInt aParamSize ); + TInt ReadVectorParam( TUint8* aParam, const TInt32 aDataTypeSize, const TInt aVectorSize, const TInt8 aDataTypeAlignment ); + + //Reads a data. Accounts source buffer overflow and can continue read + // from a given offset + TInt Read( TUint8* aDest, TInt& aDestIndex, const TInt aDestSize, + const TUint8* aSource, TInt& aSourceIndex, const TInt aSourceSize, TBool aVector ); + + //Initialises a read state + void StartRead( const TUint8* aBuffer, const TInt aBufferLength ); + + //Last error + TError GetLastError() { return iError; } + + RemoteFunctionCallData& GetRemoteFunctionCall() { return iRFC; } + +private: + RemoteFunctionCallData& iRFC; + MDataCopier* iDataCopier; + + TError iError; + + struct WriteState + { + //Write state + TUint8* iBuffer; + TInt iDestIndex; + TInt iStreamMaxLength; + TInt iSourceIndex; + TInt iOffset; + }; + + struct ReadState + { + //Read state + TInt iReadDestOffset; + const TUint8* iReadBuffer; + TInt iReadBufferIndex; + TInt iReadBufferLength; + TParseState iParseState; + TInt iParamsIndex; + }; + + union + { + WriteState iWriteState; + ReadState iReadState; + }; + + }; + +#endif