srsf/vcommandhandler/src/desarrayconverter.cpp
branchRCL_3
changeset 19 e36f3802f733
parent 0 bf1d17376201
--- /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<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