accessoryservices/accessoryserver/src/Policy/AccPolNameValueArraySerial.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessoryserver/src/Policy/AccPolNameValueArraySerial.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2002-2006 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:  Private, Accessory Policy Name Value Array Serialization
+ *
+ */
+
+// INCLUDE FILES
+#include    <s32mem.h>
+#include    <AccPolCommonNameValuePairs.h>
+#include    <AccPolNameValueRecord.h>
+
+#include    <accpolobjectcon.h>
+#include    "AccClientServerMessages.h"
+
+#include    "AccPolNameValueArraySerial.h"
+#include    "acc_debug.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// TAccPolNameValueArraySerial::ExternalizeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TAccPolNameValueArraySerial::ExternalizeL( const RArray<
+    TAccPolNameValueRecord>& aNameValueArray, RWriteStream& aStream )
+    {
+    COM_TRACE_( "[AccFW:ACCPOLICY] TAccPolNameValueArraySerial::ExternalizeL()" );
+
+    TInt16 count( aNameValueArray.Count() );
+    aStream.WriteInt16L( count );
+
+    CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+    CleanupStack::PushL( buf );
+    buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+    for( TInt16 i( 0 ); i < count; ++i )
+        {
+        TUint32 name;
+        aNameValueArray[i].NameRecord().GetName( name );
+
+        //write name to stream
+        aStream.WriteUint16L( name );
+
+        //set location bit
+        TUint8 properties( 0 );
+        if( aNameValueArray[i].ValueRecord().Location() == EAPVAccessory )
+            {
+            properties = 1;
+            }
+
+        //set type bits
+        properties |= ( aNameValueArray[i].ValueRecord().Type() << 1 );
+
+        TUint8 size( 0 );
+        TInt value( 0 );
+        TUint8 tempSize( 0 );
+
+        //code size (bytes) of the value to propeties field (last 2 bits, size 1-4)
+        if( aNameValueArray[i].ValueRecord().Type() != EAPVBool &&
+            aNameValueArray[i].ValueRecord().Type() != EAPVNone )
+            {
+            value = aNameValueArray[i].ValueRecord().Value();
+
+            if( aNameValueArray[i].ValueRecord().Type() == EAPVDes8 )
+                {
+                value = aNameValueArray[i].ValueRecord().ValueRef().Length();
+                }
+
+            if( aNameValueArray[i].ValueRecord().Type() == EAPVObject )
+                {
+                if( aNameValueArray[i].ValueRecord().Location() == EAPVPolicy
+                    && !reinterpret_cast<CAccPolObjectCon*> (
+                        aNameValueArray[i].ValueRecord().Value() ) )
+                    {
+                    User::Leave( KErrArgument );
+                    }
+                if( aNameValueArray[i].ValueRecord().Location() == EAPVPolicy
+                    && reinterpret_cast<CAccPolObjectCon*> (
+                        aNameValueArray[i].ValueRecord().Value() ) )
+                    {
+                    RBufWriteStream wStrm;
+                    wStrm.Open( *buf );
+                    wStrm.PushL();
+                    reinterpret_cast<CAccPolObjectCon*> (
+                        aNameValueArray[i].ValueRecord().Value() )->ExternalizeL( wStrm );
+                    wStrm.CommitL();
+                    MStreamBuf* snk = wStrm.Sink();
+                    TStreamPos position = snk->TellL( MStreamBuf::EWrite );
+                    value = position.Offset();
+                    buf->Compress();
+                    wStrm.Close();
+                    wStrm.Pop();
+                    buf->ResizeL( value );
+                    }
+                else
+                    {
+                    //location must be accessory
+                    value = size;
+                    }
+                }
+            TUint32 mask = 0xFF000000;
+            size = 4;
+            for( TUint8 sizeindex( 0 ); sizeindex < 3; sizeindex++ )
+                {
+                if( mask & value )
+                    {
+                    break;
+                    }
+                size--;
+                mask = mask >> 8;
+                }
+
+            tempSize = size;
+            size--;
+            properties |= size << 6;
+            }
+        else
+            {
+            if( aNameValueArray[i].ValueRecord().Type() == EAPVBool )
+                {
+                if( aNameValueArray[i].ValueRecord().Value() == KErrUnknown )
+                    {
+                    //not defined bit on...
+                    size = 0x02;
+                    }
+                else
+                    {
+                    //set boolean bit...
+                    size = ( 1 & aNameValueArray[i].ValueRecord().Value() );
+                    }
+                }
+            //write size to properties and properties to stream
+            tempSize = size;
+            properties |= size << 6;
+            }
+
+        aStream.WriteUint8L( properties );
+
+        switch( aNameValueArray[i].ValueRecord().Type() )
+            {
+            case EAPVDes8:
+            case EAPVUInt:
+            case EAPVInt:
+            case EAPVObject:
+                {
+                TInt32 writemask = 0xFF;
+                for( TUint8 index( 0 ); index < tempSize; index++ )
+                    {
+                    aStream.WriteUint8L( ( TUint8 )( ( writemask & value )
+                        >> ( index * 8 ) ) );
+                    }
+
+                if( aNameValueArray[i].ValueRecord().Type() == EAPVDes8 )
+                    {
+                    const TDesC8
+                        & des( aNameValueArray[i].ValueRecord().ValueRef() );
+
+                    for( TInt i( 0 ); i < value; i++ )
+                        {
+                        aStream.WriteUint8L( des[i] );
+                        }
+                    }
+
+                if( aNameValueArray[i].ValueRecord().Type() == EAPVObject )
+                    {
+                    TPtr8 ptr( buf->Ptr( 0 ) );
+                    const TDesC8& des( ptr );
+                    for( TInt i( 0 ); i < value; i++ )
+                        {
+                        aStream.WriteUint8L( des[i] );
+                        }
+                    buf->Reset();
+                    }
+                }
+                break;
+            default:
+                break;
+            }
+        }
+
+    CleanupStack::PopAndDestroy( buf );
+
+    COM_TRACE_( "[AccFW:ACCPOLICY] TAccPolNameValueArraySerial::ExternalizeL - return void" );
+    }
+
+//  End of File