wvuing/wvvariant/AlternatorSrc/CAlternatorImp.cpp
changeset 0 094583676ce7
--- /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