diff -r 000000000000 -r e6b17d312c8b brandingserver/bsserver/cbsstorage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/brandingserver/bsserver/cbsstorage.cpp Thu Dec 17 08:54:49 2009 +0200 @@ -0,0 +1,371 @@ +/* +* Copyright (c) 2006-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: Stores element data and writes it to stream +* +*/ + + +#include "cbsstorage.h" +#include "bsimportconstants.h" +#include "debugtrace.h" + + +#include +#include +#include + +//#include "mbsimportlogger.h" +//#include "importlogwriter.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CBSStorage::NewL +// --------------------------------------------------------------------------- +// +CBSStorage* CBSStorage::NewL() + { + CBSStorage* self = NewLC(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------------------------- +// CBSStorage::NewLC +// --------------------------------------------------------------------------- +// +CBSStorage* CBSStorage::NewLC() + { + CBSStorage* self = new (ELeave) CBSStorage(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// CBSStorage::ConstructL +// --------------------------------------------------------------------------- +// +void CBSStorage::ConstructL() + { + } + +// --------------------------------------------------------------------------- +// CBSStorage::CBSStorage +// --------------------------------------------------------------------------- +// +CBSStorage::CBSStorage() + { + } + +// --------------------------------------------------------------------------- +// CBSStorage::~CBSStorage +// --------------------------------------------------------------------------- +// +CBSStorage::~CBSStorage() + { + iElements.Close(); + delete iAppId; + delete iStorageId; + delete iLanguage; + delete iFilename; + } + +// --------------------------------------------------------------------------- +// CBSStorage::AppendElement +// --------------------------------------------------------------------------- +// +void CBSStorage::AppendElementsL( MBSElement* aElement ) + { + if( !aElement ) + { + // Ignore empty + return; + } + + TPtrC8 id = aElement->ElementId(); + + // check if the id is unique + TInt count = iElements.Count(); + + for( TInt i = 0; i < count; i++ ) + { + if( 0 == iElements[i]->ElementId().Compare( id ) ) + { + // duplicate found + User::Leave( KErrAlreadyExists ); + } + } + + iElements.AppendL( aElement ); + } + + +// --------------------------------------------------------------------------- +// CBSStorage::ReplacesElementL +// --------------------------------------------------------------------------- +// +void CBSStorage::ReplaceElementL( MBSElement* aElement ) + { + if( !aElement ) + { + // Ignore empty + return; + } + + TPtrC8 id = aElement->ElementId(); + + // check if the id is unique + TInt count = iElements.Count(); + + for( TInt i = 0; i < count; i++ ) + { + if( 0 == iElements[i]->ElementId().Compare( id ) ) + { + // item found + MBSElement* element = iElements[i]; + iElements.Remove( i ); + delete element; + // put the new element + iElements.AppendL( aElement ); + return; + } + } + // the element was not found from this storage + User::Leave( KErrNotFound ); + } + + +// --------------------------------------------------------------------------- +// CBSStorage::ElementCount +// --------------------------------------------------------------------------- +// +TInt CBSStorage::ElementCount() + { + return iElements.Count(); + } + +// --------------------------------------------------------------------------- +// CBSStorage::ExternalizeL +// --------------------------------------------------------------------------- +// +void CBSStorage::ExternalizeL( RWriteStream& aWriteStream ) + { + if( !VerifyHeader() || !VerifyDataL( iElements ) ) + { + // Header not complete. Will not write to stream + User::Leave( KErrCorrupt ); + } + // Write header + aWriteStream.WriteInt16L( iVersion ); + + // Write elements + TInt count = iElements.Count(); + aWriteStream.WriteInt16L( count ); + for( TInt i = 0; i < count; i++ ) + { + iElements[i]->ExternalizeL( aWriteStream ); + } + } + +// --------------------------------------------------------------------------- +// CBSStorage::SetVersion +// --------------------------------------------------------------------------- +// +void CBSStorage::SetVersion( TInt aVersion ) + { + iVersion = aVersion; + } + +// --------------------------------------------------------------------------- +// CBSStorage::SetApplicationIdL +// --------------------------------------------------------------------------- +// +void CBSStorage::SetApplicationIdL( const TDesC& aAppId ) + { + HBufC* tmp = aAppId.AllocL(); + + delete iAppId; + iAppId = tmp; + } + +// --------------------------------------------------------------------------- +// CBSStorage::SetStorageIdL +// --------------------------------------------------------------------------- +// +void CBSStorage::SetStorageIdL( const TDesC& aStorageId ) + { + HBufC* tmp = aStorageId.AllocL(); + delete iStorageId; + iStorageId = tmp; + } + +// --------------------------------------------------------------------------- +// CBSStorage::SetLanguageL +// --------------------------------------------------------------------------- +// +void CBSStorage::SetLanguageL( TLanguage aLanguage ) + { + TBuf buffer; + buffer.AppendNum( aLanguage ); + + HBufC* tmp = buffer.AllocL(); + delete iLanguage; + iLanguage = tmp; + } + +// --------------------------------------------------------------------------- +// CBSStorage::VerifyHeader +// --------------------------------------------------------------------------- +// +TBool CBSStorage::VerifyHeader() + { + // not checking version as it is been consider not to use. - Pankaj - 31 may 07 + //return ( iAppId && iStorageId && iVersion > 0 && iLanguage ); + return ( iAppId && iStorageId && iLanguage ); + } + + +// --------------------------------------------------------------------------- +// CBSStorage::VerifyDataL +// --------------------------------------------------------------------------- +// +TBool CBSStorage::VerifyDataL( TArray aArray, + TBool aIgnoreEmptyID /* = EFalse */ ) + { + // Check that elements have unique ID's in their own namespace + TInt count = aArray.Count(); + for( TInt i = 0; i < count; i++ ) + { + // Verify inside list elements + if( aArray[i]->ElementType() == EBSList ) + { + TArray listArray = aArray[i]->GetStructureL(); + if( !VerifyDataL( listArray, ETrue ) ) + { + return EFalse; + } + } + + if( aIgnoreEmptyID && + aArray[i]->ElementId().CompareC( KNullDesC8() ) == 0 ) + { + // ignore empty id + continue; + } + + // Check that sibling elements have unique ID + for( TInt j = i + 1; j < count; j++ ) + { + if( aArray[i]->ElementId().CompareC( aArray[j]->ElementId() ) == 0 ) + { + // convert elementID to 16-bit for event logger + TPtrC8 id( aArray[i]->ElementId() ); + HBufC* conv = HBufC::NewLC( id.Length() ); + TPtr uniptr( conv->Des() ); + CnvUtfConverter::ConvertToUnicodeFromUtf8( uniptr, id ); + TRACE( T_LIT("ERROR: Found duplicate element ID (%S)!"), &uniptr ); + CleanupStack::PopAndDestroy(); + return EFalse; + } + } + } + + // All elements ok + return ETrue; + } + + +// --------------------------------------------------------------------------- +// CBSStorage::VerifyDataL +// --------------------------------------------------------------------------- +// +TBool CBSStorage::VerifyDataL( RBSObjOwningPtrArray& aArray, + TBool aIgnoreEmptyID /* = EFalse */ ) + { + return VerifyDataL( aArray.Array(), aIgnoreEmptyID ); + } + + +// --------------------------------------------------------------------------- +// CBSStorage::ProposeFileNameL +// --------------------------------------------------------------------------- +// +TPtrC CBSStorage::ProposeFileNameL() + { + if( !iFilename ) + { + User::Leave( KErrNotReady ); + } + return iFilename->Des(); + } + +// --------------------------------------------------------------------------- +// CBSStorage::ProposeFileNameL +// --------------------------------------------------------------------------- +// +TPtrC CBSStorage::ProposedDirL() + { + if( !iFilename ) + { + User::Leave( KErrNotReady ); + } + return iDir; + } + + +// --------------------------------------------------------------------------- +// CBSStorage::GetListOfFiles() +// --------------------------------------------------------------------------- +// +void CBSStorage::GetListOfFilesL( RArray& aFileList ) + { + TInt count = iElements.Count(); + for( TInt i = 0; i < count; i++ ) + { + AppendFilesL( iElements[i], aFileList ); + } + } + +// --------------------------------------------------------------------------- +// CBSStorage::AppendFiles() +// --------------------------------------------------------------------------- +// +void CBSStorage::AppendFilesL( MBSElement* aElement, RArray& aFileList ) + { + if( !aElement ) + { + // invalid element + return; + } + + TBSElementType type = aElement->ElementType(); + if( EBSList == type ) + { + TArray list = aElement->GetStructureL(); + + TInt count = list.Count(); + for( TInt i = 0; i < count; i++ ) + { + AppendFilesL( list[i], aFileList ); + } + } + else if( EBSFile == type ) + { + TPtrC ptr( aElement->TextDataL() ); + aFileList.Append( aElement->TextDataL() ); + } + } + +// End of file