accessoryservices/accessoryserver/src/Policy/AccPolNameValueArraySerial.cpp
changeset 0 4e1aa6a622a0
equal deleted inserted replaced
-1:000000000000 0:4e1aa6a622a0
       
     1 /*
       
     2  * Copyright (c) 2002-2006 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:  Private, Accessory Policy Name Value Array Serialization
       
    15  *
       
    16  */
       
    17 
       
    18 // INCLUDE FILES
       
    19 #include    <s32mem.h>
       
    20 #include    <AccPolCommonNameValuePairs.h>
       
    21 #include    <AccPolNameValueRecord.h>
       
    22 
       
    23 #include    <accpolobjectcon.h>
       
    24 #include    "AccClientServerMessages.h"
       
    25 
       
    26 #include    "AccPolNameValueArraySerial.h"
       
    27 #include    "acc_debug.h"
       
    28 
       
    29 // EXTERNAL DATA STRUCTURES
       
    30 
       
    31 // EXTERNAL FUNCTION PROTOTYPES  
       
    32 
       
    33 // CONSTANTS
       
    34 
       
    35 // MACROS
       
    36 
       
    37 // LOCAL CONSTANTS AND MACROS
       
    38 
       
    39 // MODULE DATA STRUCTURES
       
    40 
       
    41 // LOCAL FUNCTION PROTOTYPES
       
    42 
       
    43 // FORWARD DECLARATIONS
       
    44 
       
    45 // ============================ MEMBER FUNCTIONS ===============================
       
    46 
       
    47 
       
    48 // -----------------------------------------------------------------------------
       
    49 // TAccPolNameValueArraySerial::ExternalizeL
       
    50 // -----------------------------------------------------------------------------
       
    51 //
       
    52 EXPORT_C void TAccPolNameValueArraySerial::ExternalizeL( const RArray<
       
    53     TAccPolNameValueRecord>& aNameValueArray, RWriteStream& aStream )
       
    54     {
       
    55     COM_TRACE_( "[AccFW:ACCPOLICY] TAccPolNameValueArraySerial::ExternalizeL()" );
       
    56 
       
    57     TInt16 count( aNameValueArray.Count() );
       
    58     aStream.WriteInt16L( count );
       
    59 
       
    60     CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
       
    61     CleanupStack::PushL( buf );
       
    62     buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
       
    63 
       
    64     for( TInt16 i( 0 ); i < count; ++i )
       
    65         {
       
    66         TUint32 name;
       
    67         aNameValueArray[i].NameRecord().GetName( name );
       
    68 
       
    69         //write name to stream
       
    70         aStream.WriteUint16L( name );
       
    71 
       
    72         //set location bit
       
    73         TUint8 properties( 0 );
       
    74         if( aNameValueArray[i].ValueRecord().Location() == EAPVAccessory )
       
    75             {
       
    76             properties = 1;
       
    77             }
       
    78 
       
    79         //set type bits
       
    80         properties |= ( aNameValueArray[i].ValueRecord().Type() << 1 );
       
    81 
       
    82         TUint8 size( 0 );
       
    83         TInt value( 0 );
       
    84         TUint8 tempSize( 0 );
       
    85 
       
    86         //code size (bytes) of the value to propeties field (last 2 bits, size 1-4)
       
    87         if( aNameValueArray[i].ValueRecord().Type() != EAPVBool &&
       
    88             aNameValueArray[i].ValueRecord().Type() != EAPVNone )
       
    89             {
       
    90             value = aNameValueArray[i].ValueRecord().Value();
       
    91 
       
    92             if( aNameValueArray[i].ValueRecord().Type() == EAPVDes8 )
       
    93                 {
       
    94                 value = aNameValueArray[i].ValueRecord().ValueRef().Length();
       
    95                 }
       
    96 
       
    97             if( aNameValueArray[i].ValueRecord().Type() == EAPVObject )
       
    98                 {
       
    99                 if( aNameValueArray[i].ValueRecord().Location() == EAPVPolicy
       
   100                     && !reinterpret_cast<CAccPolObjectCon*> (
       
   101                         aNameValueArray[i].ValueRecord().Value() ) )
       
   102                     {
       
   103                     User::Leave( KErrArgument );
       
   104                     }
       
   105                 if( aNameValueArray[i].ValueRecord().Location() == EAPVPolicy
       
   106                     && reinterpret_cast<CAccPolObjectCon*> (
       
   107                         aNameValueArray[i].ValueRecord().Value() ) )
       
   108                     {
       
   109                     RBufWriteStream wStrm;
       
   110                     wStrm.Open( *buf );
       
   111                     wStrm.PushL();
       
   112                     reinterpret_cast<CAccPolObjectCon*> (
       
   113                         aNameValueArray[i].ValueRecord().Value() )->ExternalizeL( wStrm );
       
   114                     wStrm.CommitL();
       
   115                     MStreamBuf* snk = wStrm.Sink();
       
   116                     TStreamPos position = snk->TellL( MStreamBuf::EWrite );
       
   117                     value = position.Offset();
       
   118                     buf->Compress();
       
   119                     wStrm.Close();
       
   120                     wStrm.Pop();
       
   121                     buf->ResizeL( value );
       
   122                     }
       
   123                 else
       
   124                     {
       
   125                     //location must be accessory
       
   126                     value = size;
       
   127                     }
       
   128                 }
       
   129             TUint32 mask = 0xFF000000;
       
   130             size = 4;
       
   131             for( TUint8 sizeindex( 0 ); sizeindex < 3; sizeindex++ )
       
   132                 {
       
   133                 if( mask & value )
       
   134                     {
       
   135                     break;
       
   136                     }
       
   137                 size--;
       
   138                 mask = mask >> 8;
       
   139                 }
       
   140 
       
   141             tempSize = size;
       
   142             size--;
       
   143             properties |= size << 6;
       
   144             }
       
   145         else
       
   146             {
       
   147             if( aNameValueArray[i].ValueRecord().Type() == EAPVBool )
       
   148                 {
       
   149                 if( aNameValueArray[i].ValueRecord().Value() == KErrUnknown )
       
   150                     {
       
   151                     //not defined bit on...
       
   152                     size = 0x02;
       
   153                     }
       
   154                 else
       
   155                     {
       
   156                     //set boolean bit...
       
   157                     size = ( 1 & aNameValueArray[i].ValueRecord().Value() );
       
   158                     }
       
   159                 }
       
   160             //write size to properties and properties to stream
       
   161             tempSize = size;
       
   162             properties |= size << 6;
       
   163             }
       
   164 
       
   165         aStream.WriteUint8L( properties );
       
   166 
       
   167         switch( aNameValueArray[i].ValueRecord().Type() )
       
   168             {
       
   169             case EAPVDes8:
       
   170             case EAPVUInt:
       
   171             case EAPVInt:
       
   172             case EAPVObject:
       
   173                 {
       
   174                 TInt32 writemask = 0xFF;
       
   175                 for( TUint8 index( 0 ); index < tempSize; index++ )
       
   176                     {
       
   177                     aStream.WriteUint8L( ( TUint8 )( ( writemask & value )
       
   178                         >> ( index * 8 ) ) );
       
   179                     }
       
   180 
       
   181                 if( aNameValueArray[i].ValueRecord().Type() == EAPVDes8 )
       
   182                     {
       
   183                     const TDesC8
       
   184                         & des( aNameValueArray[i].ValueRecord().ValueRef() );
       
   185 
       
   186                     for( TInt i( 0 ); i < value; i++ )
       
   187                         {
       
   188                         aStream.WriteUint8L( des[i] );
       
   189                         }
       
   190                     }
       
   191 
       
   192                 if( aNameValueArray[i].ValueRecord().Type() == EAPVObject )
       
   193                     {
       
   194                     TPtr8 ptr( buf->Ptr( 0 ) );
       
   195                     const TDesC8& des( ptr );
       
   196                     for( TInt i( 0 ); i < value; i++ )
       
   197                         {
       
   198                         aStream.WriteUint8L( des[i] );
       
   199                         }
       
   200                     buf->Reset();
       
   201                     }
       
   202                 }
       
   203                 break;
       
   204             default:
       
   205                 break;
       
   206             }
       
   207         }
       
   208 
       
   209     CleanupStack::PopAndDestroy( buf );
       
   210 
       
   211     COM_TRACE_( "[AccFW:ACCPOLICY] TAccPolNameValueArraySerial::ExternalizeL - return void" );
       
   212     }
       
   213 
       
   214 //  End of File