brandingserver/bsserver/cbsbrandhandler.cpp
changeset 0 e6b17d312c8b
child 2 89455bbf90d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/brandingserver/bsserver/cbsbrandhandler.cpp	Thu Dec 17 08:54:49 2009 +0200
@@ -0,0 +1,611 @@
+/*
+* 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: CBSBrandHandler.cpp
+*
+*/
+
+
+//  INCLUDE FILES
+
+#include "cbsbrandhandler.h"
+#include "bselementfactory.h"
+#include "debugtrace.h"
+#include "cbsstoragemanager.h"
+#include "cbsbitmap.h"
+#include "bsimportconstants.h"
+
+#include <e32base.h>
+#include <utf.h>
+#include <s32file.h>
+
+void Panic(TInt aPanic)
+    {
+    _LIT( KPanic, "CBS" );
+    User::Panic( KPanic, aPanic );
+    }
+
+// Two-phased constructor.
+CBSBrandHandler* CBSBrandHandler::NewL( const TDesC& aApplicationId,
+									    const TDesC& aBrandId, 
+									    const TDesC& aDefaultBrandId, 
+									    TLanguage aLanguage,
+									    CBSSession* aSession,
+									    TInt aReserved )
+    {
+    CBSBrandHandler* self = new ( ELeave ) CBSBrandHandler( aLanguage, aReserved ) ;
+    CleanupStack::PushL( self );
+    self->ConstructL( aApplicationId, aBrandId, aDefaultBrandId, aSession );
+    CleanupStack::Pop( self );  //self
+    return self;
+    }
+
+// Symbian OS default constructor can leave.
+void CBSBrandHandler::ConstructL( const TDesC& aApplicationId,
+						 		  const TDesC& aBrandId,
+						 		  const TDesC& aDefaultBrandId,
+						 		  CBSSession* aSession )
+    {
+	iApplicationId = aApplicationId.AllocL();
+	iBrandId = aBrandId.AllocL();
+	iDefaultBrandId = aDefaultBrandId.AllocL();
+	iSession = aSession;
+	
+	User::LeaveIfError( iFs.Connect() );
+	
+	iHandle = new(ELeave) RFile(); // CSI: 74 # this needs to be like this
+
+	isDefaultBrandUsed = ETrue;
+	iStorageManager = CBSStorageManager::NewL( iSession, KNullDesC );
+    TInt err = -1;
+    TRAP (err, iStorageManager->BrandHandleL( *iApplicationId,
+                                   *iBrandId, iLanguage,
+                                   *iHandle,
+                                   iReserved ));
+
+
+    if (err != KErrNone)
+        {
+	iStorageManager->BrandHandleL( *iApplicationId,
+                                           *iDefaultBrandId, iLanguage,
+								   *iHandle,
+								   iReserved );
+        }
+	VerifyVersionL();
+    }
+
+// Destructor
+CBSBrandHandler::~CBSBrandHandler()
+    {
+    delete iDefaultBrand;
+    delete iApplicationId;
+    delete iBrandId;
+    delete iDefaultBrandId;
+  	if( iHandle )
+  		{
+  		iHandle->Close();
+		delete iHandle;
+		iHandle = NULL;
+  		}
+
+    delete iStorageManager;
+  
+    iFs.Close();
+    }
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CBSBrandHandler::CBSBrandHandler( TLanguage aLanguage,
+						 		  TInt aReserved )
+: iLanguage( aLanguage ), iReserved( aReserved)
+	{
+	}
+
+
+
+TInt CBSBrandHandler:: isBrandUpdateRequiredL ()
+{
+	TRACE( T_LIT( "isBrandUpdateRequired  entered"));
+	TInt updateRequired = -1;
+	if (isDefaultBrandUsed)
+		{
+		TRACE( T_LIT( "isBrandUpdateRequired  isDefaultBrandused is TRUE."));
+		/* default brand is used, so can check if the actual brand is installed by anychance or not */
+		updateRequired = iStorageManager->isActualBrandInstalledL (*iApplicationId, *iBrandId, iLanguage );
+		if (1 == updateRequired)
+			{
+				TRACE( T_LIT( "isBrandUpdateRequired  isDefaultBrandused returned 1, so update required, setting defaultbrand FALSE."));
+				isDefaultBrandUsed = EFalse;
+			}
+		}
+	TRACE( T_LIT( "isBrandUpdateRequired  isDefaultBrandused leaving.."));		
+	return updateRequired;
+}
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::SetDefaultBrandIdL()
+// -----------------------------------------------------------------------------
+//
+void CBSBrandHandler::SetDefaultBrandIdL( const TDesC8& aBrandId )
+    {
+    HBufC* temp = CnvUtfConverter::ConvertToUnicodeFromUtf8L( aBrandId );
+    delete iDefaultBrand;
+    iDefaultBrand = temp;
+    }
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::GetTextL()
+// -----------------------------------------------------------------------------
+//
+HBufC* CBSBrandHandler::GetTextL( const TDesC8& aId )
+	{
+	TRACE( T_LIT( "CBranding::GetTextL begin [%S]"), &aId);
+	
+	MBSElement* element = ReadElementLC( aId );
+
+	HBufC* returnValue = element->TextDataL().AllocL();
+
+	CleanupStack::PopAndDestroy(); // element
+	TRACE( T_LIT( "CBranding::GetTextL end") );
+    return returnValue;
+	}
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::GetBufferL()
+// -----------------------------------------------------------------------------
+//
+HBufC8* CBSBrandHandler::GetBufferL( const TDesC8& aId )
+	{
+	TRACE( T_LIT( "CBSBrandHandler::GetBufferL begin") );
+	
+	MBSElement* element = ReadElementLC( aId );
+
+	HBufC8* returnValue = element->BufferDataL().AllocL();
+
+	CleanupStack::PopAndDestroy(); // element
+	TRACE( T_LIT( "CBSBrandHandler::GetBufferL end") );
+    return returnValue;
+	}
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::GetIntL()
+// -----------------------------------------------------------------------------
+//
+TInt CBSBrandHandler::GetIntL( const TDesC8& aId )
+	{
+    TRACE( T_LIT( "CBSBrandHandler::GetIntL begin") );
+	TInt value = 0;
+
+	MBSElement* element = ReadElementLC( aId );
+
+	value = element->IntDataL();
+
+	CleanupStack::PopAndDestroy(); // element
+
+	TRACE( T_LIT( "CBSBrandHandler::GetIntL end") );
+    return value;
+	}
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::GetFileL()
+// -----------------------------------------------------------------------------
+//
+void CBSBrandHandler::GetFileL( const TDesC8& aId, RFile& aFile )
+	{
+	TRACE( T_LIT( "CBSBrandHandler::GetFileL begin aId[%S] "), &aId );
+	RFile file;
+	User::LeaveIfError( iFs.ShareProtected() );
+
+	if (iLanguage >= 100)
+		User::LeaveIfError (KErrNotFound);
+	HBufC* fileName = GetTextL( aId );
+
+    TBuf<KLangBufLength> buffer;
+// append leading zero only if language code is <10.
+    if ( 10 > iLanguage )
+        {
+    	buffer.AppendNum( KLeadingZero );
+        }		
+
+    buffer.AppendNum( iLanguage );
+
+	TInt err = -1;
+	TRAP (err, iStorageManager->FileElementHandleL( *iApplicationId,
+						     			 *iBrandId,
+						     			 *fileName,
+						     			 buffer,
+						     			 file ));
+
+	if (KErrNone != err)
+	    {
+		/* if the file is not found in the default brand also, then leave */
+	    iStorageManager->FileElementHandleL( *iApplicationId,
+	                                         *iDefaultBrandId,
+	                                         *fileName,
+	                                         buffer,
+	                                         file);
+
+		TRACE( T_LIT( "CBSBrandHandler::GetFileL found in default brand") );
+	    
+	    }
+
+	aFile = file;
+    TRACE( T_LIT( "CBSBrandHandler::GetFileL end") );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::GetSeveralL()
+// -----------------------------------------------------------------------------
+//
+MBSElement* CBSBrandHandler::GetSeveralL( RBSObjOwningPtrArray<HBufC8>& aIds )
+	{
+	MBSElement* returnValue = NULL;
+	TInt count = aIds.Count();
+	
+	RBSObjOwningPtrArray<MBSElement> listData;
+	CleanupClosePushL( listData );
+	for(TInt i = 0; i < count; i++ )
+		{
+		MBSElement* subElement = ReadElementLC( *aIds[ i ] );
+		listData.AppendL( subElement );
+		CleanupStack::Pop( subElement );
+		}
+	returnValue = BSElementFactory::CreateBSElementL( KNullDesC8,
+													  EBSList,
+													  listData );
+	CleanupStack::Pop(); // listData
+	return returnValue;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::GetStructureL()
+// -----------------------------------------------------------------------------
+//
+MBSElement* CBSBrandHandler::GetStructureL( TDesC8& aId )
+	{
+	MBSElement* returnValue = NULL;
+
+	TRACE( T_LIT( "CBSBrandHandler::GetStructureL begin") );
+	
+	returnValue = ReadElementLC( aId );
+
+	CleanupStack::Pop(); // element
+
+	TRACE( T_LIT( "CBSBrandHandler::GetStructureL end") );
+
+	return returnValue;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::ReadElementLC()
+// -----------------------------------------------------------------------------
+//
+MBSElement* CBSBrandHandler::ReadElementLC( const TDesC8& aId, TBool aForceDefault /*= EFalse*/ )
+	{
+	TRACE( T_LIT( "CBSBrandHandler::ReadElementLC begin aId"));
+
+	if( aForceDefault )
+		{
+		TRACE( T_LIT( "CBSBrandHandler::ReadElementLC default brand"));
+		iStorageManager->BrandHandleL( *iApplicationId,
+									   *iDefaultBrandId, iLanguage,
+									   *iHandle,
+									   iReserved );		
+		}
+	else
+		{
+		TInt err = -1;
+		TRAP (err, iStorageManager->BrandHandleL( *iApplicationId,
+									   *iBrandId, iLanguage,
+									   *iHandle,
+									   iReserved ));
+		if (KErrNone != err)
+			{
+			iStorageManager->BrandHandleL( *iApplicationId,
+										   *iDefaultBrandId, iLanguage,
+										   *iHandle,
+										   iReserved ); 	
+			}
+		}
+	
+	RFileReadStream stream;
+	stream.Attach( *iHandle );
+	CleanupClosePushL( stream );
+	
+	VerifyVersionL( stream );
+	
+	TInt count = stream.ReadInt16L();
+	
+	MBSElement* returnValue = NULL;
+
+	for( TInt i = 0; i < count; i++ )
+		{
+		TRAPD( err, returnValue = ReadStreamL( aId, stream ) );
+		
+		if( err == KErrEof )
+			{
+			TRACE( T_LIT( "CBSBrandHandler::ReadElementLC EOF!") );
+			// the id is not found in this file
+			User::Leave( KErrNotFound );
+			}
+		if( returnValue )
+			{
+			TRACE( T_LIT( "CBSBrandHandler::ReadElementLC ELEMENT FOUND.. at position %d"), i);
+			// we found what we are looking for
+			break;
+			}
+		}
+		
+	CleanupStack::PopAndDestroy( &stream ); // stream	
+	
+	TBool popElementFromCleanupStack( EFalse );
+	
+	/* If retur value is not found and if its read the actual brand, then try in default brand as well. aForceDefault will decide that. */
+	if( !returnValue && !aForceDefault)
+		{
+		TRACE( T_LIT( "CBSBrandHandler::ReadElementLC force default is true") );
+
+		// the element was not found
+		// try the default brand if it's not the same as wanted brand
+		if( 0 != iBrandId->Compare( *iDefaultBrandId ) )
+			{
+			TRACE( T_LIT( "CBSBrandHandler::ReadElementLC calling READELEMENTLC again") );
+
+			/* Call ReadElementLC wiht aForceDefault set to TRUE */
+			returnValue = ReadElementLC( aId, ETrue );
+
+			if ( returnValue )
+			    {
+				TRACE( T_LIT( "CBSBrandHandler::ReadElementLC VALUE IS FOUND!!!") );
+			    popElementFromCleanupStack = ETrue;
+			    }
+			else
+				{
+				TRACE( T_LIT( "CBSBrandHandler::ReadElementLC VALUE IS NOT FOUND!!!") );
+				CleanupStack :: Pop (returnValue);
+				}
+			}
+		if( !returnValue )
+			{
+			TRACE( T_LIT( "CBSBrandHandler::ReadElementLC VALUE not FOUND LEAVING WITH -1 !!!") );
+			User::Leave( KErrNotFound );			
+			}
+		}
+	
+	CleanupClosePushL( *returnValue );
+    // since we make one function call to ReadElementLC in case the default 
+	// brand id is used to retrieved the element, we have to pop one returnValue
+	// pointer from CleanupStack (otherwise we have two identical pointers on 
+	// the stack!!!)
+	if ( popElementFromCleanupStack )
+   		{
+   	 	CleanupStack::Pop( returnValue );
+    	}
+	
+	TRACE( T_LIT( "CBSBrandHandler::ReadElementLC end ") );
+	return returnValue;
+	}
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::VerifyVersionL()
+// -----------------------------------------------------------------------------
+//
+void CBSBrandHandler::VerifyVersionL( RFileReadStream& aStream )
+	{
+	TInt version = aStream.ReadInt16L();
+	if( version != iReserved )
+		{
+		User::Leave( KErrArgument );
+		}
+	}
+
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::VerifyVersionL()
+// -----------------------------------------------------------------------------
+//
+void CBSBrandHandler::VerifyVersionL()
+	{
+	if( !iHandle )
+		{
+		User::Leave( KErrNotReady );
+		}
+	RFileReadStream stream;
+	stream.Attach( *iHandle );
+	CleanupClosePushL( stream );
+	
+	VerifyVersionL( stream );
+	
+	CleanupStack::PopAndDestroy(); // stream
+	}
+
+// -----------------------------------------------------------------------------
+// CBSBrandHandler::ReadStreamL()
+// -----------------------------------------------------------------------------
+//
+MBSElement* CBSBrandHandler::ReadStreamL( const TDesC8& aId, RFileReadStream& aStream,
+										  TBool aAllowEmptyId /* = EFalse */ )
+	{
+	TRACE( T_LIT( "CBSBrandHandler::ReadStreamL BEGIN"));
+	TBSElementType type = (TBSElementType)aStream.ReadInt16L();
+	MBSElement* returnValue = NULL;
+	
+	TInt idSize = aStream.ReadInt16L();
+	
+	HBufC8* elementId = HBufC8::NewLC( idSize );
+	TPtr8 elementIdPtr = elementId->Des();
+
+	if( idSize == 0 && aAllowEmptyId )
+		{
+		// we don't read empty ID
+		}
+	else
+		{
+		aStream.ReadL( elementIdPtr, idSize );
+        elementIdPtr.SetLength( idSize );// Set length
+		}
+	
+
+	TBool match = EFalse;
+	if( aAllowEmptyId || ( 0 == elementIdPtr.Compare( aId ) ) )
+		{
+		match = ETrue;
+		}
+		
+    TPtrC8 idPtrC( *elementId );// idPtrC creation moved here so it will be updated correctly.
+	if( elementId->Length() == 0 )
+		{
+		CleanupStack::PopAndDestroy( elementId );
+		elementId = NULL;
+		idPtrC.Set( KNullDesC8 );
+		}
+
+	switch( type )
+		{
+		case EBSInt:
+			{
+			TInt intData = aStream.ReadInt16L();
+			TRACE( T_LIT( "CBSBrandHandler::ReadStreamL type INT"));
+			if( match )
+				{
+                // Codescanner warning: neglected to put variable on cleanup stack (id:35)
+                // This method cannot leave after this line
+				returnValue = BSElementFactory::CreateBSElementL( idPtrC, // CSI: 35 # See above
+																  EBSInt,
+																  intData ); 
+				}
+			break;
+			}		
+		case EBSText:
+		case EBSFile: // flow through
+			{
+			TInt textSize = aStream.ReadInt16L();
+			HBufC* textData = HBufC::NewLC( textSize );
+
+			TPtr textPtr = textData->Des();
+			aStream.ReadL( textPtr, textSize );
+
+			TRACE( T_LIT( "CBSBrandHandler::ReadStreamL type TEXT/ FILE"));
+			if( match )
+				{
+                // Codescanner warning: neglected to put variable on cleanup stack (id:35)
+                // This method cannot leave after this line
+				returnValue = BSElementFactory::CreateBSElementL( idPtrC, // CSI: 35 # See above
+																  type,
+																  *textData ); 
+				}
+
+			CleanupStack::PopAndDestroy( textData );
+			break;
+			}
+		case EBSList:
+			{
+			RBSObjOwningPtrArray<MBSElement> listData;
+			CleanupClosePushL( listData );
+			TInt count = aStream.ReadInt16L();
+			
+			for( TInt i = 0; i < count; i++ )
+				{
+				MBSElement* subElement = ReadStreamL( KNullDesC8, aStream, ETrue );
+				CleanupDeletePushL( subElement );
+				listData.AppendL( subElement );
+				CleanupStack::Pop(); // subElement
+				}
+				
+			if( match )
+				{
+                // Codescanner warning: neglected to put variable on cleanup stack (id:35)
+                // This method cannot leave after this line
+				returnValue = BSElementFactory::CreateBSElementL( idPtrC, // CSI: 35 # See above
+																  EBSList,
+																  listData ); 
+				}
+			CleanupStack::Pop(); // listData
+			break;
+			}
+		case EBSBuffer:
+			{
+			TInt bufferSize = aStream.ReadInt16L();
+			HBufC8* buffeData = HBufC8::NewLC( bufferSize );
+
+			TPtr8 bufferPtr = buffeData->Des();
+			aStream.ReadL( bufferPtr, bufferSize );
+
+			if( match )
+				{
+                // Codescanner warning: neglected to put variable on cleanup stack (id:35)
+                // This method cannot leave after this line				
+				returnValue = BSElementFactory::CreateBSElementL( idPtrC, // CSI: 35 # See above
+																  EBSBuffer,
+																  *buffeData ); 
+				}
+
+			CleanupStack::PopAndDestroy( buffeData );
+			break;
+			}
+		case EBSBitmap:
+			{
+			TInt length = aStream.ReadInt16L();
+			HBufC8* fileId = HBufC8::NewLC( length );
+			
+			TPtr8 fileIdPtr = fileId->Des();
+			aStream.ReadL( fileIdPtr, length );
+			
+			TInt bitmapId = aStream.ReadInt16L();
+			TInt maskId = aStream.ReadInt16L();
+			TInt skinId = aStream.ReadInt16L();
+			TInt skinMaskId = aStream.ReadInt16L();
+
+			TRACE( T_LIT( "CBSBrandHandler::ReadStreamL type BITMAP .. bitmap ID is [%d]"), bitmapId);
+			if( match )
+				{
+				CBSBitmap* bitmap = CBSBitmap::NewLC( bitmapId,
+													  maskId,
+													  skinId,
+													  skinMaskId,
+													  fileIdPtr );
+
+                // Codescanner warning: neglected to put variable on cleanup stack (id:35)
+                // This method cannot leave after this line
+				returnValue = BSElementFactory::CreateBSElementL( idPtrC, // CSI: 35 # See above
+																  EBSBitmap,
+																  bitmap ); 
+				CleanupStack::Pop( bitmap ); 
+				}
+		    CleanupStack::PopAndDestroy( fileId ); 
+
+			break;
+			}
+		default:
+			{
+			TRACE( T_LIT( "CBSBrandHandler::ReadStreamL type DEFAULT : corrupt"));
+			User::Leave( KErrCorrupt );
+			break;
+			}
+		}
+
+	if( elementId )
+		{
+		CleanupStack::PopAndDestroy( elementId );
+		}
+
+	TRACE( T_LIT( "CBSBrandHandler::ReadStreamL END"));
+	return returnValue;
+	}
+
+//  END OF FILE
+