--- /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
+
+