--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvvariant/AlternatorSrc/CAlternatorImp.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,337 @@
+/*
+* Copyright (c) 2003-2005 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: Implementation of alternator.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CAlternatorImp.h"
+#include "ChatDebugPrint.h"
+#include "CCABrandInstallerImp.h"
+#include <eikenv.h>
+#include <bautils.h>
+#include <s32strm.h> // load/save
+#include <s32file.h>
+#include <eikapp.h>
+#include <bautils.h>
+#include <bldvariant.hrh>
+#include <e32std.h>
+#include <badesca.h>
+
+
+// CONSTANTS
+_LIT( KRsc, ".RSC" );
+_LIT( KRscWild, ".R*" );
+_LIT( KDirSeparator, "\\" );
+_LIT( KRelativeBrandPath, "branding\\" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CAlternatorImp::CAlternatorImp
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAlternatorImp::CAlternatorImp()
+// :iResFiles( 1 ) // usually just one,
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CAlternatorImp::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAlternatorImp::ConstructL( const TDesC& aBrandRoot )
+ {
+ CHAT_DP( D_CHAT_LIT( "CAlternatorImp::ConstructL brand root is:%S" ) ,
+ &aBrandRoot );
+ iBrandRoot = HBufC::NewL( KMaxPath );
+ TPtr myPtr = iBrandRoot->Des();
+ myPtr = aBrandRoot;
+
+ CHAT_DP( D_CHAT_LIT( "CAlternatorImp::ConstructL ourbrand root is:%S" ),
+ &myPtr );
+
+ iEikEnv = CEikonEnv::Static();
+
+ //Start procedure to install sis installed brands
+ iBrandInstaller = CCABrandInstallerImp::NewL();
+ if ( !( iBrandInstaller->ImportFolderExistsL() ) )
+ {
+ iBrandInstaller->CreateImportFolderL();
+ }
+ if ( iBrandInstaller->IsNewBrandAvailableL() )
+ {
+ iBrandInstaller->InstallNewBrandL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CAlternatorImp::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+
+CAlternatorImp* CAlternatorImp::NewL( const TDesC& aBrandRoot )
+ {
+ CAlternatorImp* self = new( ELeave ) CAlternatorImp();
+
+ CleanupStack::PushL( self );
+ self->ConstructL( aBrandRoot );
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// Destructor
+CAlternatorImp::~CAlternatorImp()
+ {
+ delete iBrandRoot;
+ delete iBrandInstaller;
+ }
+
+
+// constructs current bitmap file full path
+const TDesC& CAlternatorImp::CurrentBitmapFileL( const TDesC& aModuleId,
+ const TDesC& aAlternative,
+ const TDesC& aBitmapFileName )
+ {
+ // if the path is not ok, set bitmap path as empty
+ TInt ret( ConstructCompletePathAndCheck( iCurrentBitmap, aModuleId,
+ aAlternative,
+ aBitmapFileName ) );
+ if ( ret != KErrNone )
+ {
+ if ( ret == KErrNoMemory )
+ {
+ User::Leave( ret );
+ }
+ iCurrentBitmap.Zero();
+ }
+ CHAT_DP( D_CHAT_LIT( "CAlternatorImp::CurrentBitmapFileL :%S" ),
+ &iCurrentBitmap );
+
+ return iCurrentBitmap;
+ }
+
+
+// changes resource
+TInt CAlternatorImp::ChangeResourceL( const TDesC& aModuleId,
+ const TDesC& aAlternative,
+ const TDesC& aResFileName,
+ TInt& aResOffset )
+ {
+ TInt err = LoadResourceFileL( aModuleId, aAlternative, aResFileName,
+ aResOffset );
+ return err;
+ }
+
+// changes bitmap file
+TInt CAlternatorImp::ChangeBitmapFileL( const TDesC& aModuleId,
+ const TDesC& aAlternative,
+ const TDesC& aBitmapFileName )
+ {
+ // iCurrentBitmap contains the path if ok
+ iCurrentBitmap.Zero();
+ TInt ret( ConstructCompletePathAndCheck( iCurrentBitmap, aModuleId,
+ aAlternative, aBitmapFileName ) );
+ if ( ret == KErrNoMemory )
+ {
+ User::Leave( ret );
+ }
+ if ( ret != KErrNone )
+ {
+ return KErrNotFound;
+ }
+ // the new bitmap path is in iCurrentBitmap
+ return KErrNone;
+ }
+
+void CAlternatorImp::GetCurrentResourceFileL( const TDesC& aModuleId,
+ const TDesC& aAlternative,
+ const TDesC& aResFileName,
+ TDes& aFullPath )
+ {
+ TInt ret( ConstructCompletePathAndCheck( aFullPath, aModuleId,
+ aAlternative, aResFileName ) );
+ if ( ret == KErrNoMemory )
+ {
+ User::Leave( ret );
+ }
+ if ( ret != KErrNone )
+ {
+ aFullPath.Zero();
+ }
+
+ CHAT_DP( D_CHAT_LIT( "CAlternatorImp::GetCurrentResourceFileL :%S" ),
+ &aFullPath );
+
+ // otherwise the current resource file path is in aFullPath
+ }
+
+void CAlternatorImp::SetBrandRoot( const TDesC& aBrandRoot )
+ {
+ CHAT_DP( D_CHAT_LIT( "CAlternatorImp::SetBrandRoot %S" ), &aBrandRoot );
+
+ TPtr myPtr = iBrandRoot->Des();
+ myPtr = aBrandRoot;
+ }
+
+// loads resource file
+TInt CAlternatorImp::LoadResourceFileL( const TDesC& aModuleId,
+ const TDesC& aAlternative,
+ const TDesC& aResFileName,
+ TInt& aResOffSet )
+ {
+
+ TFileName resFilePath;
+ TInt ret( ConstructCompletePathAndCheck( resFilePath, aModuleId,
+ aAlternative, aResFileName ) );
+ if ( ret == KErrNoMemory )
+ {
+ User::Leave( ret );
+ }
+ if ( ret != KErrNone )
+ {
+#ifdef _DEBUG
+ RDebug::Print( _L( "path not found" ) );
+#endif
+ return KErrNotFound;
+ }
+
+ TEntry entry;
+ User::LeaveIfError( iEikEnv->FsSession().Entry( resFilePath, entry ) );
+ TInt fileSize( entry.iSize );
+ // test if there's enough heap available, this one leaves if not and
+ // resources won't get changed
+ HBufC8* allocTest = HBufC8::NewL( fileSize );
+ delete allocTest;
+
+
+ // if path ok, then make the change, first delete the previous one
+ iEikEnv->DeleteResourceFile( aResOffSet );
+
+ RFs& fs = iEikEnv->FsSession();
+
+ if ( resFilePath.Length() != 0 )
+ {
+ BaflUtils::NearestLanguageFile( fs, resFilePath );
+ }
+
+ TRAPD( err, aResOffSet = iEikEnv->AddResourceFileL( resFilePath ) );
+ if ( err == KErrNoMemory )
+ {
+ User::Leave( KErrNoMemory );
+ }
+
+
+#ifdef _DEBUG
+ RDebug::Print( _L( "ADDED resource file:" ) );
+ RDebug::Print( resFilePath );
+#endif
+
+ return err;
+ }
+
+
+TBool CAlternatorImp::IsPathOk( const TDesC& aCheckThis ) const
+ {
+ CHAT_DP( D_CHAT_LIT( "CAlternatorImp::IsPathOk %S" ), &aCheckThis );
+
+ return BaflUtils::FileExists( iEikEnv->FsSession(), aCheckThis );
+ }
+
+TInt CAlternatorImp::ConstructCompletePathAndCheck( TDes& aResult,
+ const TDesC& aModuleId,
+ const TDesC& aAlternative,
+ const TDesC& aFileName )
+ {
+ aResult.Zero();
+ aResult.Append( *iBrandRoot );
+
+ aResult.Append( KRelativeBrandPath() );
+ aResult.Append( aModuleId );
+ aResult.Append( KDirSeparator );
+ aResult.Append( aAlternative );
+ aResult.Append( KDirSeparator );
+
+ TBool resourceFile( EFalse );
+ TFileName file( aFileName );
+
+ TInt rscPos( aFileName.FindC( KRsc ) );
+ if ( rscPos != KErrNotFound )
+ {
+ // replace the ".RSC" with ".R*"
+ file.Copy( aFileName.Left( rscPos ) );
+ file.Append( KRscWild );
+ resourceFile = ETrue;
+ }
+ else
+ {
+ file.Copy( aFileName );
+ }
+
+ CHAT_DP( D_CHAT_LIT( "CAlternatorImp::ConstructCompletePathAndCheck \
+ trying to find %S%S" )
+ , &aResult, &file );
+
+ // Find the actual file
+ CDir* files = NULL;
+ TFindFile fileFinder( iEikEnv->FsSession() );
+ TInt err( fileFinder.FindWildByDir( file, aResult, files ) );
+ delete files;
+
+ // If file was found, then take the first appearance of it
+ // (order is correct aready)
+ if ( err == KErrNone )
+ {
+ aResult.Zero();
+ if ( resourceFile )
+ {
+ // change the ".R*" back to ".RSC"
+ TParsePtrC parse( fileFinder.File() );
+ file.Copy( parse.DriveAndPath() );
+ file.Append( parse.Name() );
+ file.Append( KRsc );
+
+ CHAT_DP( D_CHAT_LIT( "CAlternatorImp::ConstructCompletePathAndCheck \
+ finding nearest language file for %S" ), &file );
+
+ if ( file.Length() != 0 )
+ {
+ BaflUtils::NearestLanguageFile( iEikEnv->FsSession(), file );
+ }
+
+ aResult.Copy( file );
+ }
+ else
+ {
+ aResult.Append( fileFinder.File() );
+ }
+ }
+
+ CHAT_DP( D_CHAT_LIT( "CAlternatorImp::ConstructCompletePathAndCheck \
+ TFindFile returned %d for %S" ),
+ err, &aResult );
+
+ // return was the file found or not
+ return err;
+ }
+
+// End of File