diff -r 000000000000 -r 094583676ce7 PECengine/AttributeLibrary2/Src/PEngAttributeRequestCodec.cpp --- /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 +#include +#include +#include + + +//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& 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& 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& 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& 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 + +