diff -r cad71a31b7fc -r e36f3802f733 srsf/vcommandhandler/src/desarrayconverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srsf/vcommandhandler/src/desarrayconverter.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,89 @@ +/* +* Copyright (c) 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: A utility object to convert descriptors to +* VAS savable arrays and vise versa +* +*/ + + +#include "rubydebug.h" +#include "desarrayconverter.h" + +/** +* Converts the stream data into the array of fixed size descriptors +* @param aSource 8-bit descriptor to convert +*/ +CArrayFixFlat* CDesArrayConverter::DesC8ToArrayLC( + const TDesC8& aSource ) + { + NssRRDText buf; + + const TInt fieldSize = buf.MaxLength(); + TInt textFieldCount = aSource.Length() / fieldSize; + if( aSource.Length() % fieldSize != 0 ) + { + textFieldCount++; + } + RUBY_DEBUG1( "CDesArrayConverter::DesC8ToArrayLC [%d] slots are needed \ + to store the streamed command", textFieldCount ); + + + CArrayFixFlat* array = new (ELeave) CArrayFixFlat( textFieldCount ); + CleanupStack::PushL( array ); + + TInt appendedSize = fieldSize; + for( TInt i(0); i < textFieldCount; i++ ) + { + // the last piece + if( i == textFieldCount - 1 ) + { + appendedSize = aSource.Length() - fieldSize * i; + } + buf.Copy( aSource.Mid( fieldSize*i, appendedSize ) ); + array->AppendL( buf ); + } + return array; + } + +/** +* Constructs Des8 descriptor from the given array slice. Almost a +* counterpart of the DesC8ToArrayLC +* @param aArray Array to convert +* @param aStartIndex First element to convert. Zero-based +* @param aCount number of elements to convert. +* @leave KErrArgument if aStartIndex or aCount are out of the array bounds +*/ +TDesC8* CDesArrayConverter::ArrayToDesC8LC( const CArrayFixFlat& aArray, + TInt aStartIndex, TInt aCount ) + { + __ASSERT_ALWAYS( aStartIndex < aArray.Count(), User::Leave( KErrArgument) ); + __ASSERT_ALWAYS( aStartIndex + aCount <= aArray.Count(), User::Leave( KErrArgument) ); + // Calculate the required descriptor length + TInt storageLength (0); + for( TInt i = aStartIndex; i < aStartIndex + aCount; i++ ) + { + storageLength += aArray[i].Length(); + } + HBufC8* storage = HBufC8::NewLC( storageLength ); + + for( TInt i = aStartIndex; i < aStartIndex + aCount; i++ ) + { + // 16 bit chars are converted to 8-bit chars + storage->Des().Append( aArray[i] ); + } + return storage; + } + + +//End of file