guestrendering/vghwserialiser/src/serializedfunctioncall.cpp
branchbug235_bringup_0
changeset 51 4f400a6ea71f
parent 49 3b4f7e9d873f
child 52 39e5f73667ba
equal deleted inserted replaced
49:3b4f7e9d873f 51:4f400a6ea71f
     1 // Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 
       
    15 #include "serializedfunctioncall.h"
       
    16 #include "remotefunctioncall.h"
       
    17 
       
    18 // -----------------------------------------------------------------------------
       
    19 // 
       
    20 // -----------------------------------------------------------------------------
       
    21 //
       
    22 TInt SerializedFunctionCall::Write( TUint8* aDest, TInt& aDestIndex, const TInt aDestSize,
       
    23         const TUint8* aSource, const TInt aSize, TInt& aSourceIndex, const TInt aOffset, TBool aVector )
       
    24     {        
       
    25     if ( aSourceIndex + aSize > aOffset )
       
    26         {
       
    27         TInt32 offset(0);
       
    28         TInt32 size( aSize );  
       
    29         if ( aOffset - aSourceIndex > 0 )
       
    30             {
       
    31             offset = aOffset - aSourceIndex;
       
    32             size = aSize - offset;
       
    33             }
       
    34 
       
    35         if ( aDestIndex + size >= aDestSize )
       
    36             {
       
    37             size = aDestSize - aDestIndex;
       
    38             }
       
    39 
       
    40         if ( aSource )
       
    41             {
       
    42             if ( iDataCopier && aVector )
       
    43                 {
       
    44                 iDataCopier->CopyVector( &aDest[aDestIndex], &aSource[offset], size );
       
    45                 }
       
    46             else if ( iDataCopier )
       
    47                 {
       
    48                 iDataCopier->CopyData( &aDest[aDestIndex], &aSource[offset], size );            
       
    49                 }
       
    50             else
       
    51                 {
       
    52 				RemoteFunctionCallData::CopyData( &aDest[aDestIndex], &aSource[offset], size );
       
    53                 }
       
    54             }
       
    55         aSourceIndex += size;
       
    56         aDestIndex += size;
       
    57         }
       
    58     else
       
    59         {
       
    60         aSourceIndex += aSize;
       
    61         }
       
    62     return aDestSize - aDestIndex; 
       
    63     }
       
    64 
       
    65 // -----------------------------------------------------------------------------
       
    66 // 
       
    67 // -----------------------------------------------------------------------------
       
    68 //
       
    69 TInt SerializedFunctionCall::WriteParam( const TUint8* aParam, const TInt aParamSize )
       
    70     {
       
    71     ASSERT( aParam );
       
    72 
       
    73     return Write( iWriteState.iBuffer, iWriteState.iDestIndex, iWriteState.iStreamMaxLength,
       
    74             aParam, aParamSize, iWriteState.iSourceIndex, iWriteState.iOffset, 0 );        
       
    75     }
       
    76 
       
    77 // -----------------------------------------------------------------------------
       
    78 // 
       
    79 // -----------------------------------------------------------------------------
       
    80 //
       
    81 TInt SerializedFunctionCall::WriteVector( const TUint8* aParam, const TInt32 aDataTypeSize, const TInt aVectorSize, const TInt8 aDataTypeAlignment )
       
    82     {
       
    83     ASSERT( aParam );
       
    84     iWriteState.iDestIndex = RemoteFunctionCallData::AlignIndex( iWriteState.iDestIndex, aDataTypeAlignment );
       
    85     return Write( iWriteState.iBuffer, iWriteState.iDestIndex, iWriteState.iStreamMaxLength,
       
    86             aParam, aVectorSize*aDataTypeSize, iWriteState.iSourceIndex, iWriteState.iOffset, 1 );        
       
    87     }
       
    88 
       
    89 // -----------------------------------------------------------------------------
       
    90 // 
       
    91 // -----------------------------------------------------------------------------
       
    92 //
       
    93 TInt SerializedFunctionCall::ReadParam( TUint8* aParam, const TInt aParamSize )
       
    94     {
       
    95     return Read( aParam, iReadState.iReadDestOffset, aParamSize, 
       
    96         iReadState.iReadBuffer, iReadState.iReadBufferIndex, iReadState.iReadBufferLength, 0 );        
       
    97     }
       
    98 
       
    99 // -----------------------------------------------------------------------------
       
   100 // 
       
   101 // -----------------------------------------------------------------------------
       
   102 //
       
   103 TInt SerializedFunctionCall::ReadVectorParam( TUint8* aParam, 
       
   104 		const TInt32 aDataTypeSize, const TInt aVectorSize, const TInt8 aDataTypeAlignment )
       
   105     {
       
   106 	iReadState.iReadBufferIndex = RemoteFunctionCallData::AlignIndex( iReadState.iReadBufferIndex, aDataTypeAlignment );
       
   107     return Read( aParam, iReadState.iReadDestOffset, aVectorSize*aDataTypeSize, 
       
   108         iReadState.iReadBuffer, iReadState.iReadBufferIndex, iReadState.iReadBufferLength, 1 );        
       
   109     }
       
   110 
       
   111 // -----------------------------------------------------------------------------
       
   112 // 
       
   113 // -----------------------------------------------------------------------------
       
   114 //
       
   115 TUint8* SerializedFunctionCall::ReadVectorPointer( 
       
   116 		const TInt32 aDataTypeSize, const TInt aVectorSize, const TInt8 aDataTypeAlignment )
       
   117     {
       
   118 	iReadState.iReadBufferIndex = RemoteFunctionCallData::AlignIndex( iReadState.iReadBufferIndex, aDataTypeAlignment );
       
   119 	TUint8* data = const_cast<TUint8*>(&iReadState.iReadBuffer[iReadState.iReadBufferIndex]);
       
   120 	iReadState.iReadBufferIndex += aVectorSize*aDataTypeSize;
       
   121     iReadState.iReadDestOffset += 0;
       
   122 	return data;
       
   123     }
       
   124 
       
   125 // -----------------------------------------------------------------------------
       
   126 // 
       
   127 // -----------------------------------------------------------------------------
       
   128 //
       
   129 TInt SerializedFunctionCall::Read( TUint8* aDest, TInt& aDestIndex, const TInt aDestSize,
       
   130         const TUint8* aSource, TInt& aSourceIndex, const TInt aSourceSize, TBool aVector )
       
   131     {
       
   132     TInt ret(1);
       
   133     TInt size = aDestSize - aDestIndex;
       
   134     if ( aSourceIndex + size > aSourceSize )
       
   135         {
       
   136         //Read buffer overflow
       
   137         iError = EMoreData;
       
   138         ret = 0;
       
   139         size = aSourceSize - aSourceIndex; 
       
   140         }
       
   141     
       
   142     if ( iDataCopier && aVector )
       
   143         {
       
   144         iDataCopier->CopyVector( &aDest[aDestIndex], &aSource[aSourceIndex], size );
       
   145         }
       
   146     else if ( iDataCopier )
       
   147         {
       
   148         iDataCopier->CopyData( &aDest[aDestIndex], &aSource[aSourceIndex], size );            
       
   149         }
       
   150     else
       
   151         {
       
   152 		RemoteFunctionCallData::CopyData( &aDest[aDestIndex], &aSource[aSourceIndex], size );
       
   153         }
       
   154 
       
   155     aSourceIndex += size;
       
   156     aDestIndex += size;
       
   157     
       
   158     if ( ret )
       
   159         {
       
   160         aDestIndex = 0;
       
   161         }
       
   162     return ret;
       
   163     }
       
   164 
       
   165 // -----------------------------------------------------------------------------
       
   166 // 
       
   167 // -----------------------------------------------------------------------------
       
   168 //
       
   169 void SerializedFunctionCall::StartRead( const TUint8* aBuffer, const TInt aBufferLength )
       
   170     {
       
   171     iReadState.iReadBuffer = aBuffer;
       
   172     iReadState.iReadBufferIndex = 0;
       
   173     iReadState.iReadBufferLength = aBufferLength;
       
   174     iReadState.iParseState = EReadingApiUid;
       
   175     iReadState.iReadDestOffset = 0;
       
   176     iError = ESuccess;
       
   177     }
       
   178 
       
   179 // -----------------------------------------------------------------------------
       
   180 // 
       
   181 // -----------------------------------------------------------------------------
       
   182 //
       
   183 TInt SerializedFunctionCall::ReadHeaderFromBuffer( const TUint8* aBuffer, const TInt aBufferLength )
       
   184     {
       
   185     iReadState.iParamsIndex = 0;
       
   186     StartRead( aBuffer, aBufferLength );
       
   187 
       
   188     if ( EReadingApiUid == iReadState.iParseState )
       
   189         {
       
   190         if ( !ReadParam( (TUint8*)&iRFC.HeaderData().iApiUid, 
       
   191                 sizeof(iRFC.HeaderData().iApiUid) ) )
       
   192             {
       
   193             return 0;
       
   194             }
       
   195         iReadState.iParseState = EReadingOpCode;
       
   196         }
       
   197 
       
   198 	if ( EReadingOpCode == iReadState.iParseState )
       
   199         {
       
   200         if ( !ReadParam( (TUint8*)&iRFC.HeaderData().iOpCode, 
       
   201                 sizeof(iRFC.HeaderData().iOpCode) ) )
       
   202             {
       
   203             return 0;
       
   204             }
       
   205         iReadState.iParseState = EReadingTransactionId;
       
   206         }
       
   207 
       
   208     if ( iReadState.iParseState == EReadingTransactionId )
       
   209         {
       
   210         if ( !ReadParam( (TUint8*)&iRFC.HeaderData().iTransactionId, 
       
   211                 sizeof(iRFC.HeaderData().iTransactionId) ) )
       
   212             {
       
   213             return 0;
       
   214             }
       
   215         iReadState.iParseState = EReadingParameterCount;
       
   216         }
       
   217     if ( iReadState.iParseState == EReadingParameterCount )
       
   218         {
       
   219         if ( !ReadParam( (TUint8*)&iRFC.HeaderData().iParameterCount, 
       
   220                 sizeof(iRFC.HeaderData().iParameterCount) ) )
       
   221             {
       
   222             return 0;
       
   223             }
       
   224         iReadState.iParseState = EReadingProcessId;
       
   225         }
       
   226     if ( iReadState.iParseState == EReadingProcessId )
       
   227         {
       
   228         if ( !ReadParam( (TUint8*)&iRFC.HeaderData().iProcessId, 
       
   229                 sizeof(iRFC.HeaderData().iProcessId) ) )
       
   230             {
       
   231             return 0;
       
   232             }
       
   233         iReadState.iParseState = EReadingThreadId;
       
   234         }
       
   235     if ( iReadState.iParseState == EReadingThreadId )
       
   236         {
       
   237         if ( !ReadParam( (TUint8*)&iRFC.HeaderData().iThreadId, 
       
   238                 sizeof(iRFC.HeaderData().iThreadId) ) )
       
   239             {
       
   240             return 0;
       
   241             }
       
   242         iReadState.iParseState = EReadingOpType;
       
   243         }
       
   244     if ( iReadState.iParseState == EReadingOpType )
       
   245         {
       
   246         if ( !ReadParam( (TUint8*)&iRFC.HeaderData().iOpType, 
       
   247                 sizeof(iRFC.HeaderData().iOpType) ) )
       
   248             {
       
   249             return 0;
       
   250             }
       
   251         iReadState.iParseState = EReadingReturnValue;
       
   252         }
       
   253     if ( iReadState.iParseState == EReadingReturnValue )
       
   254         {
       
   255         if ( !ReadParam( (TUint8*)&iRFC.HeaderData().iReturnValue, 
       
   256                 sizeof(iRFC.HeaderData().iReturnValue) ) )
       
   257             {
       
   258             return 0;
       
   259             }
       
   260         iReadState.iParseState = EReadingParamDir;
       
   261         }
       
   262     
       
   263     return 1;
       
   264     }
       
   265 
       
   266 // -----------------------------------------------------------------------------
       
   267 // 
       
   268 // -----------------------------------------------------------------------------
       
   269 //
       
   270 SER_EXPORT_C TInt SerializedFunctionCall::ParseBuffer( const TUint8* aBuffer, const TInt aBufferLength )
       
   271     {
       
   272     StartRead( aBuffer, aBufferLength );
       
   273     if ( ReadHeaderFromBuffer( aBuffer, aBufferLength ) )
       
   274         {        
       
   275         for ( ;iReadState.iParamsIndex < iRFC.Header().iParameterCount; iReadState.iParamsIndex++ )
       
   276             {
       
   277 			RemoteFunctionCallData::TParam& param( iRFC.Parameters()[iReadState.iParamsIndex] );
       
   278     
       
   279             ReadParam( (TUint8*)&param.iDir, sizeof(param.iDir) );
       
   280             if ( ReadParam( (TUint8*)&param.iType, sizeof(param.iType) ) )
       
   281                 {
       
   282     
       
   283                 if ( RemoteFunctionCallData::TParam::ESimple == param.iType )
       
   284                     {
       
   285                     ReadParam( (TUint8*)&param.iSimpleParam.iDataType, sizeof(param.iSimpleParam.iDataType) ); 
       
   286                     ReadParam( (TUint8*)&param.iSimpleParam.iDataTypeSize, sizeof(param.iSimpleParam.iDataTypeSize) ); 
       
   287                     ReadParam( (TUint8*)&param.iSimpleParam.iData, param.iSimpleParam.iDataTypeSize );
       
   288                     }
       
   289                 else if ( RemoteFunctionCallData::TParam::EVector == param.iType )
       
   290                     {
       
   291                     ReadParam( (TUint8*)&param.iVectorParam.iDataType, sizeof(param.iVectorParam.iDataType) );
       
   292                     ReadParam( (TUint8*)&param.iVectorParam.iVectorLength, sizeof(param.iVectorParam.iVectorLength) );            
       
   293                     ReadParam( (TUint8*)&param.iVectorParam.iCallerAddress, sizeof(param.iVectorParam.iCallerAddress) );
       
   294                     ReadParam( (TUint8*)&param.iVectorParam.iDataTypeSize, sizeof(param.iVectorParam.iDataTypeSize) );
       
   295                     ReadParam( (TUint8*)&param.iVectorParam.iDataTypeAlignment, sizeof(param.iVectorParam.iDataTypeAlignment) );
       
   296                     
       
   297                     if ( !param.iVectorParam.iVectorLength )
       
   298                         {
       
   299                         param.iVectorParam.iData = NULL;
       
   300 						param.iVectorParam.iCallerAddress = NULL;
       
   301                         }
       
   302                     else if ( (param.iDir & RemoteFunctionCallData::EIn) && ( RemoteFunctionCallData::EOpRequest == iRFC.Header().iOpType || RemoteFunctionCallData::EOpRequestWithReply == iRFC.Header().iOpType ) )
       
   303                         {
       
   304                         param.iVectorParam.iData = ReadVectorPointer( param.iVectorParam.iDataTypeSize, param.iVectorParam.iVectorLength, param.iVectorParam.iDataTypeAlignment );
       
   305                         }
       
   306                     else if ( (param.iDir & RemoteFunctionCallData::EOut) && iRFC.Header().iOpType == RemoteFunctionCallData::EOpReply ) 
       
   307                         {
       
   308                         ReadVectorParam( (TUint8*)param.iVectorParam.iCallerAddress, 
       
   309                                 param.iVectorParam.iDataTypeSize, param.iVectorParam.iVectorLength, param.iVectorParam.iDataTypeAlignment );
       
   310                         }
       
   311                     }
       
   312                 else
       
   313                     {
       
   314                     //Parse error
       
   315                     iError = EParseError;
       
   316                     return -1;
       
   317                     }
       
   318                 }
       
   319             }
       
   320         iReadState.iParseState = EReadingDone;
       
   321         }
       
   322     else
       
   323         {
       
   324         iError = EParseError;
       
   325         return -1;
       
   326         }
       
   327     return iReadState.iReadBufferIndex;
       
   328     }
       
   329 
       
   330 // -----------------------------------------------------------------------------
       
   331 // 
       
   332 // -----------------------------------------------------------------------------
       
   333 //
       
   334 void SerializedFunctionCall::StartWrite( TUint8* aBuffer, const TInt aStreamMaxLength, TInt aOffset )
       
   335     {
       
   336     iWriteState.iBuffer = aBuffer;
       
   337     iWriteState.iDestIndex = 0;
       
   338     iWriteState.iStreamMaxLength = aStreamMaxLength;
       
   339     iWriteState.iSourceIndex = 0;
       
   340     iWriteState.iOffset = aOffset;
       
   341     iError = ESuccess;    
       
   342     }
       
   343 
       
   344 // -----------------------------------------------------------------------------
       
   345 // 
       
   346 // -----------------------------------------------------------------------------
       
   347 //
       
   348 TInt SerializedFunctionCall::WriteHeaderToBuffer( TUint8* aBuffer, const TInt aStreamMaxLength, TInt aOffset )
       
   349     {
       
   350     StartWrite( aBuffer, aStreamMaxLength, aOffset );
       
   351     if ( !WriteParam( (TUint8*)&iRFC.Header().iApiUid, 
       
   352             sizeof(iRFC.Header().iApiUid) ) )
       
   353         {
       
   354         return iWriteState.iSourceIndex;
       
   355         }
       
   356     if ( !WriteParam( (TUint8*)&iRFC.Header().iOpCode, 
       
   357             sizeof(iRFC.Header().iOpCode) ) )
       
   358         {
       
   359         return iWriteState.iSourceIndex;
       
   360         }
       
   361     if ( !WriteParam( (TUint8*)&iRFC.Header().iTransactionId, 
       
   362             sizeof(iRFC.Header().iTransactionId) ) )
       
   363         {
       
   364         return iWriteState.iSourceIndex;
       
   365         }
       
   366     if ( !WriteParam( (TUint8*)&iRFC.Header().iParameterCount, 
       
   367             sizeof(iRFC.Header().iParameterCount) ) )
       
   368         {
       
   369         return iWriteState.iSourceIndex;
       
   370         }
       
   371     if ( !WriteParam( (TUint8*)&iRFC.Header().iProcessId, 
       
   372             sizeof(iRFC.Header().iProcessId) ) )
       
   373         {
       
   374         return iWriteState.iSourceIndex;
       
   375         }
       
   376     if ( !WriteParam( (TUint8*)&iRFC.Header().iThreadId, 
       
   377             sizeof(iRFC.Header().iThreadId) ) )
       
   378         {
       
   379         return iWriteState.iSourceIndex;
       
   380         }
       
   381     if ( !WriteParam( (TUint8*)&iRFC.Header().iOpType, 
       
   382             sizeof(iRFC.Header().iOpType) ) )
       
   383         {
       
   384         return iWriteState.iSourceIndex;
       
   385         }
       
   386     if ( !WriteParam( (TUint8*)&iRFC.Header().iReturnValue, 
       
   387             sizeof(iRFC.Header().iReturnValue) ) )
       
   388         {
       
   389         return iWriteState.iSourceIndex;
       
   390         }
       
   391     return iWriteState.iSourceIndex;
       
   392     }
       
   393 
       
   394 
       
   395 // -----------------------------------------------------------------------------
       
   396 // 
       
   397 // -----------------------------------------------------------------------------
       
   398 //
       
   399 SER_EXPORT_C TInt SerializedFunctionCall::WriteToBuffer( TUint8* aBuffer, const TInt aStreamMaxLength, TInt aOffset )
       
   400     {
       
   401     WriteHeaderToBuffer( aBuffer, aStreamMaxLength, aOffset );
       
   402     for ( TInt i = 0; i < iRFC.Header().iParameterCount; i++ )
       
   403         {
       
   404         const RemoteFunctionCallData::TParam& param( iRFC.Parameters()[i] );
       
   405         
       
   406         if ( !WriteParam( (TUint8*)&param.iDir, 
       
   407                 sizeof(param.iDir) ) )
       
   408             {
       
   409             break;
       
   410             }
       
   411 
       
   412         if ( !WriteParam( (TUint8*)&param.iType, 
       
   413                 sizeof(param.iType) ) )
       
   414             {
       
   415             break;
       
   416             }
       
   417         
       
   418 		if ( RemoteFunctionCallData::TParam::ESimple == param.iType )
       
   419             {
       
   420             if ( !WriteParam( (TUint8*)&param.iSimpleParam.iDataType, 
       
   421                     sizeof(param.iSimpleParam.iDataType) ) )
       
   422                 {
       
   423                 break;
       
   424                 }
       
   425             if ( !WriteParam( (TUint8*)&param.iSimpleParam.iDataTypeSize, 
       
   426                     sizeof(param.iSimpleParam.iDataTypeSize) ) )
       
   427                 {
       
   428                 break;
       
   429                 }
       
   430 
       
   431 			if ( !WriteParam( (TUint8*)&param.iSimpleParam.iData, param.iSimpleParam.iDataTypeSize ) )
       
   432                 {
       
   433                 break;
       
   434                 }
       
   435             }
       
   436         else if ( RemoteFunctionCallData::TParam::EVector == param.iType )
       
   437             {
       
   438             if ( !WriteParam( (TUint8*)&param.iVectorParam.iDataType, sizeof(param.iVectorParam.iDataType) ))
       
   439                 {
       
   440                 break;
       
   441                 }
       
   442 
       
   443             if ( !WriteParam( (TUint8*)&param.iVectorParam.iVectorLength, sizeof(param.iVectorParam.iVectorLength) ))
       
   444                 {
       
   445                 break;
       
   446                 }
       
   447 
       
   448             if ( !WriteParam( (TUint8*)&param.iVectorParam.iCallerAddress, sizeof(param.iVectorParam.iCallerAddress) ))
       
   449                 {
       
   450                 break;
       
   451                 }
       
   452 
       
   453             if ( !WriteParam( (TUint8*)&param.iVectorParam.iDataTypeSize, sizeof(param.iVectorParam.iDataTypeSize) ))
       
   454                 {
       
   455                 break;
       
   456                 }
       
   457 
       
   458             if ( !WriteParam( (TUint8*)&param.iVectorParam.iDataTypeAlignment, sizeof(param.iVectorParam.iDataTypeAlignment) ))
       
   459                 {
       
   460                 break;
       
   461                 }
       
   462 
       
   463             if ( param.iVectorParam.iVectorLength && ( ( (param.iDir & RemoteFunctionCallData::EIn) && ( RemoteFunctionCallData::EOpRequestWithReply == iRFC.Header().iOpType || RemoteFunctionCallData::EOpRequest == iRFC.Header().iOpType ) ) ||
       
   464                     ( (param.iDir & RemoteFunctionCallData::EOut) && iRFC.Header().iOpType == RemoteFunctionCallData::EOpReply ) ) )
       
   465                 {
       
   466                 //Only serialise vector data if data is valid and the direction matches
       
   467                 if ( !WriteVector( param.iVectorParam.iData, param.iVectorParam.iDataTypeSize, param.iVectorParam.iVectorLength, param.iVectorParam.iDataTypeAlignment ) )
       
   468                     {
       
   469                     break;
       
   470                     }
       
   471                 }
       
   472             }
       
   473         }
       
   474     
       
   475     return iWriteState.iDestIndex;
       
   476     }
       
   477 
       
   478 // -----------------------------------------------------------------------------
       
   479 // 
       
   480 // -----------------------------------------------------------------------------
       
   481 //
       
   482 SER_EXPORT_C void SerializedFunctionCall::SetDataCopier( MDataCopier* aDataCopier )
       
   483     {
       
   484     iDataCopier = aDataCopier;        
       
   485     }
       
   486 
       
   487 // -----------------------------------------------------------------------------
       
   488 // 
       
   489 // -----------------------------------------------------------------------------
       
   490 //
       
   491 SER_EXPORT_C SerializedFunctionCall::SerializedFunctionCall( RemoteFunctionCallData& aRFC, MDataCopier* aDataCopier ):
       
   492 	iRFC( aRFC ),
       
   493     iDataCopier( aDataCopier )
       
   494     {
       
   495     }