diff -r 1fa9b890f29c -r 9dbc70490d9a brandingserver/BSClient/cbselement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/brandingserver/BSClient/cbselement.cpp Sun Apr 11 15:33:49 2010 +0530 @@ -0,0 +1,344 @@ +/* +* 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 the License "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 +#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& 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* 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 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