srsf/vcommandhandler/src/desarrayconverter.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:17 +0100
branchRCL_3
changeset 19 e36f3802f733
parent 0 bf1d17376201
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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<NssRRDText>* 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<NssRRDText>* array = new (ELeave) CArrayFixFlat<NssRRDText>( 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<NssRRDText>& 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