brandingserver/bsserver/cbsstorage.cpp
changeset 0 e6b17d312c8b
child 14 7797b2f86d2b
--- /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 <s32strm.h>
+#include <utf.h>
+#include <mbselement.h>
+
+//#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<KLangBufLength> 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<MBSElement*> 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<MBSElement*> 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<MBSElement>& 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<TPtrC>& aFileList )
+    {
+    TInt count = iElements.Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        AppendFilesL( iElements[i], aFileList );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CBSStorage::AppendFiles()
+// ---------------------------------------------------------------------------
+//
+void CBSStorage::AppendFilesL( MBSElement* aElement, RArray<TPtrC>& aFileList )
+    {
+    if( !aElement )
+        {
+        // invalid element
+        return;
+        }
+
+    TBSElementType type = aElement->ElementType();
+    if( EBSList == type )
+        {
+        TArray<MBSElement*> 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