diff -r 000000000000 -r 72b543305e3a messagingappbase/ncnlist/src/CNcnUnpackDescrArray.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/ncnlist/src/CNcnUnpackDescrArray.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,138 @@ +/* +* 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: Class for unpacking a descriptor array received via IPC. +* +*/ + + + +#include "CNcnUnpackDescrArray.h" +#include + +namespace { + +// Local constants and definitions + +const TInt KNcnPackedArrayGranularity = 4; + +// Local utility functions: + +void UnpackArrayL( const TDes8& aBuffer, CDesCArray& aArray ) + { + RDesReadStream stream( aBuffer ); + CleanupClosePushL( stream ); + + TInt status = KErrNone; + do + { + TInt length( 0 ); + TRAP( status, length = stream.ReadInt32L() ); + if ( status == KErrNone && length > 0 ) + { + HBufC* desBuf = HBufC::NewLC( length ); + TPtr desBufPtr = desBuf->Des(); + stream.ReadL( desBufPtr, length ); + aArray.AppendL( *desBuf ); + CleanupStack::PopAndDestroy( desBuf ); + } + } + while ( status == KErrNone ); + + if ( status != KErrEof ) + { + User::Leave( status ); + } + CleanupStack::PopAndDestroy(); // stream + } + +} // namespace + +// ---------------------------------------------------------------------------- +// MEMBER FUNCTIONS +// ---------------------------------------------------------------------------- +// + +// ---------------------------------------------------------------------------- +// CNcnUnpackDescrArray::NewLC +// +// Symbian two-phased constructor. +// ---------------------------------------------------------------------------- +// +CNcnUnpackDescrArray* CNcnUnpackDescrArray::NewLC() + { + CNcnUnpackDescrArray* self = new( ELeave ) CNcnUnpackDescrArray; + CleanupStack::PushL( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CNcnUnpackDescrArray::UnpackL +// +// Unpacks descriptor array from IPC message. +// ---------------------------------------------------------------------------- +// +void CNcnUnpackDescrArray::UnpackL( const RMessagePtr2& aMessage, TInt aParam ) + { + const TInt packedLength = aMessage.GetDesLength( aParam ); + HBufC8* buffer = HBufC8::NewLC( packedLength ); + TPtr8 bufferPtr = buffer->Des(); + aMessage.ReadL( aParam, bufferPtr ); + UnpackArrayL( bufferPtr, iArray ); + CleanupStack::PopAndDestroy( buffer ); + } + +// ---------------------------------------------------------------------------- +// CNcnUnpackDescrArray::~CNcnUnpackDescrArray +// +// Destructor. +// ---------------------------------------------------------------------------- +// +CNcnUnpackDescrArray::~CNcnUnpackDescrArray() + { + } + +// ---------------------------------------------------------------------------- +// CNcnUnpackDescrArray::MdcaCount +// +// From MDesCArray. +// ---------------------------------------------------------------------------- +// +TInt CNcnUnpackDescrArray::MdcaCount() const + { + return iArray.MdcaCount(); + } + +// ---------------------------------------------------------------------------- +// CNcnUnpackDescrArray::MdcaPoint +// +// From MDesCArray. +// ---------------------------------------------------------------------------- +// +TPtrC16 CNcnUnpackDescrArray::MdcaPoint( TInt aIndex ) const + { + return iArray.MdcaPoint( aIndex ); + } + +// ---------------------------------------------------------------------------- +// CNcnUnpackDescrArray::CNcnUnpackDescrArray +// +// Constructor. +// ---------------------------------------------------------------------------- +// +CNcnUnpackDescrArray::CNcnUnpackDescrArray() + : iArray( KNcnPackedArrayGranularity ) + { + } + +// End of file