sensorservices/sensorserver/src/server/sensrvchanneldatareader.cpp
changeset 0 4e1aa6a622a0
equal deleted inserted replaced
-1:000000000000 0:4e1aa6a622a0
       
     1 /*
       
     2 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  TSensrvChannelDataReader implementation
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <ecom/implementationinformation.h>
       
    20 #include "sensrvchanneldatareader.h"
       
    21 #include "sensrvtrace.h"
       
    22 
       
    23 /**
       
    24 *   version         1 byte
       
    25 *   length          1 byte
       
    26 *   flags           1 byte
       
    27 *   channeltype     4 bytes
       
    28 *   contexttype     4 bytes
       
    29 *   quantity        4 bytes
       
    30 *   location        1 bytes (byte array, at least length (zero) must be present if empty)
       
    31 *   vendorid        1 bytes (byte array, at least length (zero) must be present if empty)
       
    32 *   data type id    4 bytes
       
    33 *   security policy 8 bytes
       
    34 */
       
    35 const TInt KChannelInfoVersion 		= 1;
       
    36 const TInt KChannelGroupBitShift	= 4;
       
    37 const TInt KByteShift 				= 8;
       
    38 
       
    39 /**
       
    40  *  An internal helper class for SSY info read stream.
       
    41  *
       
    42  *  @lib None.
       
    43  *  @since S60 5.0
       
    44  */
       
    45 class TSsyInfoReadStream
       
    46     {
       
    47     public:
       
    48         TSsyInfoReadStream( const CImplementationInformation& aSsyInfo );
       
    49         TUint8 ReadTUint8L();
       
    50         TUint32 ReadTUint32L();
       
    51         void ReadTDes8L( TDes8& aValue, TInt aLength );
       
    52         inline TInt DataLeft() const { return iMaxLen - iPos; }
       
    53         inline TInt DataPos() const { return iPos; }
       
    54 
       
    55     private:
       
    56         TSsyInfoReadStream();
       
    57         void DoReadL( TAny* aPtr, TInt aLength );
       
    58 
       
    59     private:
       
    60         TPtrC8 iDefaultData;
       
    61         TPtrC8 iOpaqueData;
       
    62         TInt iPos;
       
    63         TInt iMaxLen;
       
    64         };
       
    65 
       
    66 // ---------------------------------------------------------------------------
       
    67 // TSsyInfoReadStream::TSsyInfoReadStream
       
    68 // ---------------------------------------------------------------------------
       
    69 //
       
    70 TSsyInfoReadStream::TSsyInfoReadStream( const CImplementationInformation& aSsyInfo ) :
       
    71     iDefaultData( aSsyInfo.DataType() ),
       
    72     iOpaqueData( aSsyInfo.OpaqueData() ),
       
    73     iPos( 0 ),
       
    74     iMaxLen( iDefaultData.Length() + iOpaqueData.Length() )
       
    75     {
       
    76     }
       
    77 
       
    78 // ---------------------------------------------------------------------------
       
    79 // TSsyInfoReadStream::ReadTUint8L
       
    80 // ---------------------------------------------------------------------------
       
    81 //
       
    82 TUint8 TSsyInfoReadStream::ReadTUint8L()
       
    83     {
       
    84     TUint8 ret( 0 );
       
    85     DoReadL( &ret, sizeof( TUint8 ) );
       
    86     return ret;
       
    87     }
       
    88 
       
    89 // ---------------------------------------------------------------------------
       
    90 // TSsyInfoReadStream::ReadTUint32L
       
    91 // ---------------------------------------------------------------------------
       
    92 //
       
    93 TUint32 TSsyInfoReadStream::ReadTUint32L()
       
    94     {
       
    95     TUint8 intBytes[ sizeof( TUint32) ];
       
    96     DoReadL( intBytes, sizeof( TUint32 ) );
       
    97 
       
    98     // Convert array of bytes read from resource file to TUint32. DoReadL() cannot
       
    99     // directly copy to TUint32 because of potential panics on ARM targets when byte
       
   100     // boundaries are crossed by the raw data read from the resource file.
       
   101     TUint32 ret( 0 );
       
   102     TInt i( sizeof( TUint32 ) );
       
   103     while (i--)
       
   104         {
       
   105         ret <<= KByteShift;
       
   106         ret |= intBytes[ i ];
       
   107         }
       
   108     return ret;
       
   109     }
       
   110 
       
   111 // ---------------------------------------------------------------------------
       
   112 // TSsyInfoReadStream::ReadTDes8L
       
   113 // ---------------------------------------------------------------------------
       
   114 //
       
   115 void TSsyInfoReadStream::ReadTDes8L( TDes8& aValue, TInt aLength )
       
   116     {
       
   117     if ( aLength < 0 || aLength > aValue.MaxLength() )
       
   118         {
       
   119         ERROR_TRACE( ( _L("Sensor server - TSsyInfoReadStream::ReadTDes8L: invalid length %d" ), aLength ) );
       
   120         User::Leave( KErrCorrupt );
       
   121         }
       
   122     else if ( aLength > 0 )
       
   123         {
       
   124         DoReadL( const_cast< TUint8* >( aValue.Ptr() ), aLength );
       
   125         aValue.SetLength( aLength );
       
   126         }
       
   127     else // !aLength
       
   128         {
       
   129         aValue.Zero();
       
   130         }
       
   131     }
       
   132 
       
   133 // ---------------------------------------------------------------------------
       
   134 // TSsyInfoReadStream::DoReadL
       
   135 // ---------------------------------------------------------------------------
       
   136 //
       
   137 void TSsyInfoReadStream::DoReadL( TAny* aPtr, TInt aLength )
       
   138     {
       
   139     if ( iPos + aLength > iMaxLen )
       
   140         {
       
   141         ERROR_TRACE( ( _L("Sensor server - TSsyInfoReadStream::DoReadL: read overflow (max %d read %d)" ), iMaxLen, iPos + aLength ) );
       
   142         User::Leave( KErrCorrupt );
       
   143         }
       
   144     
       
   145     TUint8* ptr = static_cast< TUint8* >( aPtr );
       
   146     if( (aPtr == NULL) || (ptr == NULL) )
       
   147         return;
       
   148     
       
   149     TInt defaultLen( iDefaultData.Length() );
       
   150     if ( iPos < defaultLen )
       
   151         {
       
   152         // Copy from default data and handle possible concatenation
       
   153         TInt len( Min( defaultLen - iPos, aLength ) );
       
   154         Mem::Copy( ptr, iDefaultData.Ptr() + iPos, len );
       
   155         ptr += len;
       
   156         aLength -= len;
       
   157         iPos += len;
       
   158         }
       
   159     if ( aLength > 0 && iPos < iMaxLen )
       
   160         {
       
   161         // Copy from opaque data
       
   162         Mem::Copy( ptr, iOpaqueData.Ptr() + iPos - defaultLen, aLength );
       
   163         iPos += aLength;
       
   164         }
       
   165     }
       
   166 
       
   167 // ======== LOCAL FUNCTIONS ========
       
   168 
       
   169 // ---------------------------------------------------------------------------
       
   170 // ReadChannelDataL
       
   171 // ---------------------------------------------------------------------------
       
   172 //
       
   173 static void ReadChannelDataL( TSsyInfoReadStream& aReadStream, TSensrvResourceChannelInfo& aChannel )
       
   174     {
       
   175     COMPONENT_TRACE( _L("Sensor server - ReadChannelDataL") );
       
   176 
       
   177     TUint8 flags( aReadStream.ReadTUint8L() ); // Flags field
       
   178     aChannel.iChannelType = aReadStream.ReadTUint32L(); // Channel type field
       
   179     aChannel.iContextType = aReadStream.ReadTUint32L(); // Context type field
       
   180     aChannel.iQuantity = aReadStream.ReadTUint32L(); // Quantity field
       
   181 
       
   182 	TSensrvResourceChannelInfo::TSensrvChannelGroup group =
       
   183 		static_cast<TSensrvResourceChannelInfo::TSensrvChannelGroup>(
       
   184 			( ( flags & TSensrvChannelDataReader::EChannelFlagChannelGroupReserved ) >> KChannelGroupBitShift ) );
       
   185 
       
   186     if (   group != TSensrvResourceChannelInfo::ESensrvChannelGroupNotDefined
       
   187     	&& group != TSensrvResourceChannelInfo::ESensrvChannelGroupData
       
   188     	&& group != TSensrvResourceChannelInfo::ESensrvChannelGroupEvent
       
   189     	&& group != TSensrvResourceChannelInfo::ESensrvChannelGroupState )
       
   190 		{
       
   191 		ERROR_TRACE( _L("Sensor server - ReadChannelDataL: invalid channel group set") );
       
   192 		User::Leave( KErrCorrupt );
       
   193 		}
       
   194 
       
   195 	aChannel.iChannelGroup = group;
       
   196 
       
   197 	// check location present for static channels
       
   198 	if ( !( flags & TSensrvChannelDataReader::EChannelFlagDynamic ) &&
       
   199 	         !( flags & TSensrvChannelDataReader::EChannelFlagLocationPresent ) )
       
   200 		{
       
   201 		ERROR_TRACE( _L("Sensor server - ReadChannelDataL: location missing for a static channel") );
       
   202 		User::Leave( KErrCorrupt );
       
   203 		}
       
   204 
       
   205 	// check required for dynamic channels, will always succeed for static channels
       
   206     if ( flags & TSensrvChannelDataReader::EChannelFlagLocationPresent )
       
   207         {
       
   208         TUint8 locationLen( aReadStream.ReadTUint8L() ); // Location byte array field
       
   209 
       
   210         if ( !locationLen )
       
   211             {
       
   212             ERROR_TRACE( _L("Sensor server - ReadChannelDataL: location length is 0 ") );
       
   213             User::Leave( KErrCorrupt );
       
   214             }
       
   215 
       
   216         if ( locationLen > KSensrvLocationLength )
       
   217             {
       
   218             ERROR_TRACE( _L("Sensor server - ReadChannelDataL: location length above maximum") );
       
   219             User::Leave( KErrCorrupt );
       
   220             }
       
   221 
       
   222         aReadStream.ReadTDes8L( aChannel.iLocation, locationLen );
       
   223         }
       
   224 
       
   225 	// check vendorId present for static channels
       
   226 	if ( !( flags & TSensrvChannelDataReader::EChannelFlagDynamic ) &&
       
   227 	         !( flags & TSensrvChannelDataReader::EChannelFlagVendorIdPresent ) )
       
   228 		{
       
   229 		ERROR_TRACE( _L("Sensor server - ReadChannelDataL: vendor id missing for a static channel") );
       
   230 		User::Leave( KErrCorrupt );
       
   231 		}
       
   232 
       
   233 	// check required for dynamic channels, will always succeed for static channels
       
   234     if ( flags & TSensrvChannelDataReader::EChannelFlagVendorIdPresent )
       
   235         {
       
   236         TUint8 vendorIdLen( aReadStream.ReadTUint8L() ); // Vendor byte array field
       
   237 
       
   238         if ( !vendorIdLen )
       
   239             {
       
   240             ERROR_TRACE( _L("Sensor server - ReadChannelDataL: vendor id length is 0") );
       
   241             User::Leave( KErrCorrupt );
       
   242             }
       
   243 
       
   244         if ( vendorIdLen > KSensrvVendorIdLength )
       
   245             {
       
   246             ERROR_TRACE( _L("Sensor server - ReadChannelDataL: vendor id length above maximum") );
       
   247             User::Leave( KErrCorrupt );
       
   248             }
       
   249 
       
   250         aReadStream.ReadTDes8L( aChannel.iVendorId, vendorIdLen );
       
   251         }
       
   252 
       
   253     aChannel.iChannelDataTypeId = aReadStream.ReadTUint32L(); // Data type Id field
       
   254 
       
   255     // Security policy byte array field, if not present encoded as ETypePass i.e. use default
       
   256     if ( flags & TSensrvChannelDataReader::EChannelFlagSecPolicyPresent )
       
   257         {
       
   258         TBuf8< sizeof( TSecurityPolicy ) > policyData;
       
   259         aReadStream.ReadTDes8L( policyData, sizeof( TSecurityPolicy ) );
       
   260         aChannel.iPolicy.Set( policyData );
       
   261         }
       
   262 
       
   263     if ( flags & TSensrvChannelDataReader::EChannelFlagDynamic )
       
   264         {
       
   265         aChannel.iDynamic = ETrue;
       
   266         }
       
   267 
       
   268     COMPONENT_TRACE( _L("Sensor server - ReadChannelDataL return") );
       
   269     }
       
   270 
       
   271 // ---------------------------------------------------------------------------
       
   272 // ReadChannelsL
       
   273 // ---------------------------------------------------------------------------
       
   274 //
       
   275 void ReadChannelsL( const CImplementationInformation& aSsyInfo,
       
   276                     RSensrvResourceChannelInfoList& aChannelList,
       
   277                     RSensrvResourceChannelInfoList& aDynamicChannelList )
       
   278     {
       
   279     COMPONENT_TRACE( _L("Sensor server - ReadChannelsL") );
       
   280 
       
   281     aChannelList.Reset(); // Clean channel lists
       
   282     aDynamicChannelList.Reset();
       
   283 
       
   284     // See the channel data field format from beginning of this file. Parsing logic in nutshell:
       
   285     // 1. Read 'version' and 'length' fields first
       
   286     // 2. Read the actual channel data fields ('flags', ..., 'security policy') using ReadChannelDataL()
       
   287 
       
   288     TSsyInfoReadStream readStream( aSsyInfo );
       
   289     while ( readStream.DataLeft() > 0 )
       
   290         {
       
   291         TInt dataStartPos( readStream.DataPos() );
       
   292         TUint8 version( readStream.ReadTUint8L() ); // Version field
       
   293         if ( version != KChannelInfoVersion )
       
   294             {
       
   295             ERROR_TRACE( ( _L("Sensor server - ReadChannelsL: invalid version %d" ), version ) );
       
   296             User::Leave( KErrCorrupt );
       
   297             }
       
   298 
       
   299         TInt dataLen( readStream.ReadTUint8L() ); // Length field
       
   300         TSensrvResourceChannelInfo channel;
       
   301         channel.iSsyImplementationUid = aSsyInfo.ImplementationUid();
       
   302         ReadChannelDataL( readStream, channel );
       
   303 
       
   304         if ( readStream.DataPos() - dataStartPos != dataLen ) // Verify read data size
       
   305             {
       
   306             ERROR_TRACE( ( _L("Sensor server - ReadChannelsL: invalid data length %d (expected %d)" ),
       
   307                 readStream.DataPos() - dataStartPos, dataLen ) );
       
   308             User::Leave( KErrCorrupt );
       
   309             }
       
   310 
       
   311         if ( channel.iDynamic )
       
   312             {
       
   313             aDynamicChannelList.AppendL( channel );
       
   314             }
       
   315         else
       
   316             {
       
   317             aChannelList.AppendL( channel );
       
   318             }
       
   319         }
       
   320 
       
   321     COMPONENT_TRACE( _L("Sensor server - ReadChannelsL return") );
       
   322     }
       
   323 
       
   324 
       
   325 // ======== MEMBER FUNCTIONS ========
       
   326 
       
   327 // ---------------------------------------------------------------------------
       
   328 // TSensrvChannelDataReader::ReadChannels
       
   329 // ---------------------------------------------------------------------------
       
   330 //
       
   331 TInt TSensrvChannelDataReader::ReadChannels( const CImplementationInformation& aSsyInfo,
       
   332                                              RSensrvResourceChannelInfoList& aChannelList,
       
   333                                              RSensrvResourceChannelInfoList& aDynamicChannelList )
       
   334     {
       
   335     COMPONENT_TRACE( _L("Sensor server - TSensrvChannelDataReader::ReadChannels") );
       
   336 
       
   337     TRAPD( ret, ReadChannelsL( aSsyInfo, aChannelList, aDynamicChannelList ) );
       
   338     if ( ret != KErrNone )
       
   339         {
       
   340         ERROR_TRACE( (_L("Sensor server - ReadChannels: error %d SsyUid 0x%x" ), ret, aSsyInfo.ImplementationUid().iUid ) );
       
   341         }
       
   342     else if ( !aChannelList.Count() && !aDynamicChannelList.Count() )
       
   343         {
       
   344         ERROR_TRACE( (_L("Sensor server - ReadChannels: No channels found SsyUid 0x%x" ), aSsyInfo.ImplementationUid().iUid ) );
       
   345         }
       
   346 
       
   347     COMPONENT_TRACE( _L("Sensor server - TSensrvChannelDataReader::ReadChannels return" ) );
       
   348 
       
   349     return ret;
       
   350     }