PECengine/AttributeLibrary2/Src/PEngAttributeRequestCodec.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/AttributeLibrary2/Src/PEngAttributeRequestCodec.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,301 @@
+/*
+* Copyright (c) 2005 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:  Codec to code attribute requests.
+*
+*/
+
+// INCLUDE FILES
+#include "PEngAttributeRequestCodec.h"
+#include "MPEngPresenceAdvancedAttrModel2.h"
+#include "MPEngPresenceAttrManager.h"
+
+
+#include <E32Base.h>
+#include <MPEngPresenceAttrModel2.h>
+#include <S32strm.h>
+#include <S32mem.h>
+
+
+//CONSTS
+const TInt KStreamExpandSize = 500;
+
+
+// ============================ LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// AlignBufferTo2L()
+// -----------------------------------------------------------------------------
+//
+void AlignBufferTo2L( CBufFlat& aBuffer, RWriteStream& aWStream )
+    {
+    //align stream size to 2
+    if ( ( aBuffer.Size() % 2 ) == 1 )
+        {
+        //pad with zero
+        aWStream.WriteInt8L( 0 );
+        }
+    }
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// PEngAttributeRequestCodec::PackModelArrayL()
+// -----------------------------------------------------------------------------
+//
+HBufC16* PEngAttributeRequestCodec::PackModelArrayL(
+    const RPointerArray<MPEngPresenceAttrModel2>& aModels )
+    {
+    //Init stream
+    CBufFlat* dynBuffer = CBufFlat::NewL( KStreamExpandSize );
+    CleanupStack::PushL( dynBuffer );
+
+    RBufWriteStream wstream;
+    wstream.Open( *dynBuffer );
+    CleanupClosePushL( wstream );
+
+
+    //Serialize the data
+    const TInt modelCount = aModels.Count();
+    wstream.WriteInt32L( modelCount );
+    for ( TInt ii = 0; ii < modelCount; ii++ )
+        {
+        const MPEngPresenceAdvancedAttrModel2* model = aModels[ ii ]->Advanced();
+        wstream.WriteUint32L( model->Type() );
+        WritePresenceIdL( wstream, model->PresenceID() );
+
+        model->ExternalizeL( wstream );
+        }
+
+
+    AlignBufferTo2L( *dynBuffer, wstream );
+
+    //Cleanup
+    wstream.CommitL();
+    CleanupStack::PopAndDestroy(); //wstream
+
+
+    //make 16 bit presentation of data
+    TPtrC8 bufDataPtr8( dynBuffer->Ptr( 0 ) );
+    TPtrC16 bufDataPtr16( ( TUint16* ) bufDataPtr8.Ptr(), ( bufDataPtr8.Size() / 2 ) );
+
+    HBufC16* heapBuffer = bufDataPtr16.AllocL();
+    CleanupStack::PopAndDestroy( dynBuffer );
+
+    return heapBuffer;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// PEngAttributeRequestCodec::UnpackModelArrayL()
+// -----------------------------------------------------------------------------
+//
+void PEngAttributeRequestCodec::UnpackModelArrayL(
+    const TDesC16& aModelPkg,
+    TInt aInstanceOptions,
+    RPointerArray<MPEngPresenceAttrModel2>& aModels,
+    MPEngPresenceAttrManager& aAttributeManager )
+
+    {
+    //make 8 bit presentation of data
+    TPtrC8 modelPkg8( ( TUint8* ) aModelPkg.Ptr(), ( aModelPkg.Size() * 2 ) );
+
+
+    //Init stream
+    RDesReadStream rstream;
+    rstream.Open( modelPkg8 );
+    CleanupClosePushL( rstream );
+
+    //Deserialize
+    const TInt modelCount = rstream.ReadInt32L();
+    for ( TInt ii = 0; ii < modelCount; ii++ )
+        {
+        //Read model details
+        TUint32 type = rstream.ReadUint32L();
+        HBufC* presenceId = ReadPresenceIdLC( rstream );
+
+        //Create model
+        MPEngPresenceAttrModel2* model = NULL;
+        aAttributeManager.InstantiateAttributeLC( model,
+                                                  *presenceId,
+                                                  type,
+                                                  aInstanceOptions );
+
+        model->Advanced()->InternalizeL( rstream );
+        aModels.AppendL( model );
+        CleanupStack::Pop(); //model
+        CleanupStack::PopAndDestroy( presenceId );
+        }
+
+
+    CleanupStack::PopAndDestroy(); //rstream
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngAttributeRequestCodec::PackFetchRequestL()
+// -----------------------------------------------------------------------------
+//
+HBufC16* PEngAttributeRequestCodec::PackFetchRequestL(
+    const MDesCArray& aPresenceIDs,
+    const TArray<TUint32>& aTypes )
+    {
+    CBufFlat* dynBuffer = CBufFlat::NewL( KStreamExpandSize );
+    CleanupStack::PushL( dynBuffer );
+
+    RBufWriteStream wstream;
+    wstream.Open( *dynBuffer );
+    CleanupClosePushL( wstream );
+
+
+    //Presence IDs
+    const TInt presenceIdCount = aPresenceIDs.MdcaCount();
+    wstream.WriteInt32L( presenceIdCount );
+    for ( TInt ii = 0; ii < presenceIdCount; ii++ )
+        {
+        WritePresenceIdL( wstream, aPresenceIDs.MdcaPoint( ii ) );
+        }
+
+    //Attribute types
+    const TInt typeCount = aTypes.Count();
+    wstream.WriteInt32L( typeCount );
+    for ( TInt jj = 0; jj < typeCount; jj++ )
+        {
+        wstream.WriteUint32L( aTypes[ jj ] );
+        }
+
+    AlignBufferTo2L( *dynBuffer, wstream );
+
+    wstream.CommitL();
+    CleanupStack::PopAndDestroy(); //wstream
+
+
+    //make 16 bit presentation of data
+    TPtrC8 bufDataPtr8( dynBuffer->Ptr( 0 ) );
+    TPtrC16 bufDataPtr16( ( TUint16* ) bufDataPtr8.Ptr(), ( bufDataPtr8.Size() / 2 ) );
+
+    HBufC16* heapBuffer = bufDataPtr16.AllocL();
+    CleanupStack::PopAndDestroy( dynBuffer );
+
+
+    return heapBuffer;
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngAttributeRequestCodec::UnpackFetchRequestL()
+// -----------------------------------------------------------------------------
+//
+void PEngAttributeRequestCodec::UnpackFetchRequestL( const TDesC16& aFetchRequestPkg,
+                                                     CDesCArray& aPresenceIDs,
+                                                     RArray<TUint32>& aTypes )
+    {
+    //make 8 bit presentation of data
+    TPtrC8 fetchRequestPkg8( ( TUint8* ) aFetchRequestPkg.Ptr(), ( aFetchRequestPkg.Size() * 2 ) );
+
+    //Init stream
+    RDesReadStream rstream;
+    rstream.Open( fetchRequestPkg8 );
+    CleanupClosePushL( rstream );
+
+    //Deserialize Presence IDs
+    const TInt presenceIdCount = rstream.ReadInt32L();
+    for ( TInt ii = 0; ii < presenceIdCount; ii++ )
+        {
+        HBufC* presenceId = ReadPresenceIdLC( rstream );
+        aPresenceIDs.AppendL( *presenceId );
+        CleanupStack::PopAndDestroy( presenceId );
+        }
+
+
+    //Deserialize Attribute types
+    const TInt typeCount = rstream.ReadInt32L();
+    for ( TInt jj = 0; jj < typeCount; jj++ )
+        {
+        TUint32 type = rstream.ReadUint32L();
+        aTypes.AppendL( type );
+        }
+
+    CleanupStack::PopAndDestroy(); //rstream
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngAttributeRequestCodec::CopyModelDataL()
+// -----------------------------------------------------------------------------
+//
+void PEngAttributeRequestCodec::CopyModelDataL( const MPEngPresenceAttrModel2& aSource,
+                                                MPEngPresenceAttrModel2& aDest )
+    {
+    const MPEngPresenceAdvancedAttrModel2* sourceAdv = aSource.Advanced();
+    TInt size = sourceAdv->ExternalizeSize();
+
+    //Init stream
+    CBufFlat* dynBuffer = CBufFlat::NewL( size );
+    CleanupStack::PushL( dynBuffer );
+
+    RBufWriteStream wstream;
+    wstream.Open( *dynBuffer );
+    CleanupClosePushL( wstream );
+
+    //Serialize the data
+    sourceAdv->ExternalizeL( wstream );
+    wstream.CommitL();
+    CleanupStack::PopAndDestroy(); //wstream
+
+
+    //And deserialize data to dest. model
+    RBufReadStream rstream;
+    rstream.Open( *dynBuffer );
+    CleanupClosePushL( rstream );
+
+    aDest.Advanced()->InternalizeL( rstream );
+
+    CleanupStack::PopAndDestroy(); //rstream
+    CleanupStack::PopAndDestroy( dynBuffer );
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngAttributeRequestCodec::WritePresenceIdL()
+// -----------------------------------------------------------------------------
+//
+void PEngAttributeRequestCodec::WritePresenceIdL( RWriteStream& aWStream,
+                                                  const TDesC& aPresenceId )
+    {
+    aWStream.WriteInt32L( aPresenceId.Length() );
+    aWStream.WriteL( aPresenceId );
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngAttributeRequestCodec::ReadPresenceIdLC()
+// -----------------------------------------------------------------------------
+//
+HBufC* PEngAttributeRequestCodec::ReadPresenceIdLC( RReadStream& aRStream )
+    {
+    const TInt presenceIdLength = aRStream.ReadInt32L();
+    HBufC* presenceId = HBufC::NewLC( presenceIdLength );
+    TPtr ptr( presenceId->Des() );
+    aRStream.ReadL( ptr, presenceIdLength );
+
+    return presenceId;
+    }
+
+
+//  End of File
+
+