--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/brandingserver/bsclient/cbselement.cpp Thu Dec 17 08:54:49 2009 +0200
@@ -0,0 +1,343 @@
+/*
+* Copyright (c) 2009 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: cbselement.cpp
+*
+*/
+// INCLUDE FILES
+
+#include <utf.h>
+#include "e32base.h"
+#include "s32strm.h"
+#include "cbselement.h"
+#include "cbsbitmap.h"
+
+
+CBSElement* CBSElement::NewL(
+ const TDesC8& aElementId,
+ TInt aData )
+ {
+
+ CBSElement* self = new ( ELeave ) CBSElement() ;
+ CleanupStack::PushL( self );
+ self->ConstructL( EBSInt,
+ aElementId,
+ aData,
+ ETrue,
+ NULL,
+ KNullDesC,
+ KNullDesC8,
+ NULL );
+ CleanupStack::Pop( self ); //self
+ return self;
+ }
+
+
+CBSElement* CBSElement::NewL(
+ const TDesC8& aElementId,
+ const TDesC& aData,
+ TBSElementType aType /*= EText*/ )
+ {
+ if( aType != EBSFile && aType != EBSText )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ CBSElement* self = new ( ELeave ) CBSElement() ;
+ CleanupStack::PushL( self );
+ self->ConstructL( aType,
+ aElementId,
+ 0,
+ EFalse,
+ NULL,
+ aData,
+ KNullDesC8,
+ NULL);
+ CleanupStack::Pop( self ); //self
+ return self;
+ }
+
+
+CBSElement* CBSElement::NewL(
+ const TDesC8& aElementId,
+ const TDesC8& aData )
+ {
+ CBSElement* self = new ( ELeave ) CBSElement() ;
+ CleanupStack::PushL( self );
+ self->ConstructL( EBSBuffer,
+ aElementId,
+ 0,
+ EFalse,
+ NULL,
+ KNullDesC,
+ aData,
+ NULL);
+ CleanupStack::Pop( self ); //self
+ return self;
+ }
+
+CBSElement* CBSElement::NewL(
+ const TDesC8& aElementId,
+ RBSObjOwningPtrArray<MBSElement>& aStructure )
+ {
+ CBSElement* self = new ( ELeave ) CBSElement();
+ CleanupStack::PushL( self );
+ self->ConstructL( EBSList,
+ aElementId,
+ 0,
+ EFalse,
+ NULL,
+ KNullDesC,
+ KNullDesC8,
+ &aStructure );
+ CleanupStack::Pop( self ); //self
+ return self;
+ }
+
+CBSElement* CBSElement::NewL(
+ const TDesC8& aElementId,
+ CBSBitmap* aBitmap )
+ {
+ CBSElement* self = new ( ELeave ) CBSElement() ;
+ CleanupStack::PushL( self );
+ self->ConstructL( EBSBitmap,
+ aElementId,
+ 0,
+ EFalse,
+ aBitmap,
+ KNullDesC,
+ KNullDesC8,
+ NULL );
+
+ if( !aBitmap )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ CleanupStack::Pop( self ); //self
+ return self;
+ }
+
+void CBSElement::ConstructL(
+ TBSElementType aElementType,
+ const TDesC8& aElementId,
+ TInt aIntData,
+ TBool aIntDataInitialized,
+ CBSBitmap* aBitmap,
+ const TDesC& aTextData,
+ const TDesC8& aBufferData,
+ RBSObjOwningPtrArray<MBSElement>* aStructure )
+ {
+ iElementType = aElementType;
+
+ iElementId = aElementId.AllocL();
+
+ iIntData = aIntData;
+ iIntDataInitialized = aIntDataInitialized;
+
+ iBitmapData = aBitmap;
+
+ if( 0 != aTextData.Compare( KNullDesC() ) )
+ {
+ iTextData = aTextData.AllocL();
+ }
+ if( 0 != aBufferData.Compare( KNullDesC8() ) )
+ {
+ iBufferData = aBufferData.AllocL();
+ }
+ if( aStructure )
+ {
+ iArrayInitialized = ETrue;
+ iArray = *aStructure;
+ }
+ }
+
+
+CBSElement::~CBSElement()
+ {
+ delete iTextData;
+ delete iBufferData;
+ delete iElementId;
+
+ iArray.Close();
+ delete iBitmapData;
+ }
+
+
+CBSElement::CBSElement()
+ {
+ }
+
+void CBSElement::Close()
+ {
+ delete this;
+ }
+
+
+TBSElementType CBSElement::ElementType()
+ {
+ return iElementType;
+ }
+
+const TDesC8& CBSElement::ElementId()
+ {
+ return *iElementId;
+ }
+
+TInt CBSElement::IntDataL()
+ {
+ if( !iIntDataInitialized )
+ {
+ User::Leave( KErrArgument );
+ }
+ return iIntData;
+ }
+
+const TDesC& CBSElement::TextDataL()
+ {
+ if( !iTextData )
+ {
+ User::Leave( KErrArgument );
+ }
+ return *iTextData;
+ }
+
+const TDesC8& CBSElement::BufferDataL()
+ {
+ if( !iBufferData )
+ {
+ User::Leave( KErrArgument );
+ }
+ return *iBufferData;
+ }
+
+const CBSBitmap& CBSElement::BitmapDataL()
+ {
+ if( !iBitmapData )
+ {
+ User::Leave( KErrArgument );
+ }
+ return *iBitmapData;
+ }
+
+TArray<MBSElement*> CBSElement::GetStructureL()
+ {
+ if( !iArrayInitialized )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ return iArray.Array();
+ }
+
+const MBSElement& CBSElement::FindSubEntryL( const TDesC& aElementId )
+ {
+ if ( !iArray.Count() )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ MBSElement* element = NULL;
+ HBufC8* id = CnvUtfConverter::ConvertFromUnicodeToUtf8L( aElementId );
+ User::LeaveIfNull( id );
+ CleanupStack::PushL( id );
+ for ( TInt i( 0 ) ; i < iArray.Count() ; i++ )
+ {
+ if ( iArray[ i ] )
+ {
+ if ( !iArray[ i ]->ElementId().CompareC( *id ) )
+ {
+ // Match found
+ element = iArray[ i ];
+ i = iArray.Count();// Exit loop.
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy( id );
+
+ if ( !element )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ return *element;
+ }
+
+void CBSElement::ExternalizeL( RWriteStream& aWriteStream )
+ {
+ // Write common header for all elements
+ aWriteStream.WriteInt16L( iElementType );
+ aWriteStream.WriteInt16L( iElementId->Length() );
+ if( iElementId->Length() > 0 )
+ {
+ // Write ID only if it's defined
+ aWriteStream.WriteL( *iElementId );
+ }
+
+ // Write element type specific data
+ switch( iElementType )
+ {
+ case EBSInt:
+ {
+ aWriteStream.WriteInt16L( iIntData );
+ break;
+ }
+ case EBSText: // flowthrough
+ case EBSFile:
+ {
+ aWriteStream.WriteInt16L( iTextData->Length() );
+ aWriteStream.WriteL( *iTextData );
+ break;
+ }
+ case EBSList:
+ {
+ TInt count = iArray.Count();
+ aWriteStream.WriteInt16L( count );
+ // Write all subitems to stream
+ for( TInt i = 0; i < count; i++ )
+ {
+ MBSElement* element = iArray[i];
+ element->ExternalizeL( aWriteStream );
+ }
+ break;
+ }
+ case EBSBitmap:
+ {
+ TPtrC8 ptr = iBitmapData->BitmapFileId();
+ aWriteStream.WriteInt16L( ptr.Length() );
+ aWriteStream.WriteL( ptr );
+
+ aWriteStream.WriteInt16L( iBitmapData->BitmapId() );
+ aWriteStream.WriteInt16L( iBitmapData->BitmapMaskId() );
+ aWriteStream.WriteInt16L( iBitmapData->SkinIdMajor() );
+ aWriteStream.WriteInt16L( iBitmapData->SkinIdMinor() );
+
+ break;
+ }
+ case EBSBuffer:
+ {
+ aWriteStream.WriteInt16L( iBufferData->Length() );
+ aWriteStream.WriteL( *iBufferData );
+ break;
+ }
+ default:
+ {
+ // unknown type!
+ User::Leave( KErrCorrupt );
+ break;
+ }
+ }
+ }
+
+
+// END OF FILE