diff -r 000000000000 -r 094583676ce7 wvuing/wvvariant/AlternatorSrc/CAlternatorImp.cpp --- /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 +#include +#include // load/save +#include +#include +#include +#include +#include +#include + + +// 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