phonebookui/Phonebook2/UIExtensionManager/src/CPbk2UIExtensionLoader.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIExtensionManager/src/CPbk2UIExtensionLoader.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,303 @@
+/*
+* Copyright (c) 2002-2007 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:  Load UI extensions
+*
+*/
+
+
+#include "CPbk2UIExtensionLoader.h"
+#include "Pbk2InternalUID.h"
+
+// Phonebook 2
+#include "CPbk2UIExtensionPlugin.h"
+#include "CPbk2UIExtensionInformation.h"
+#include <Pbk2ExtensionUID.h>
+#include <Pbk2DataCaging.hrh>
+
+// System includes
+#include <coemain.h>
+#include <bautils.h>    // BaflUtils::NearestLanguageFile
+#include <featmgr.h>            
+
+// Debugging headers
+
+#include <Pbk2Debug.h>
+#include <Pbk2Profile.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+/// Resource file containing shared extension resources
+_LIT( KPbk2UIExtCommonResourceFile, "Pbk2UIExtCommon.rsc" );
+
+/**
+ * Custom cleanup function.
+ *
+ * @param aObj  Object to clean.
+ */
+void CleanupResetAndDestroy( TAny* aObj )
+    {
+    if ( aObj )
+        {
+        static_cast<RImplInfoPtrArray*>( aObj )->ResetAndDestroy();
+        }
+    }
+} /// namespace
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::CPbk2UIExtensionLoader
+// --------------------------------------------------------------------------
+//
+CPbk2UIExtensionLoader::CPbk2UIExtensionLoader() :
+            iCommonResourceFile( *CCoeEnv::Static() )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::~CPbk2UIExtensionLoader
+// --------------------------------------------------------------------------
+//
+CPbk2UIExtensionLoader::~CPbk2UIExtensionLoader()
+    {
+    iPluginInformation.ResetAndDestroy();
+    iPluginArray.ResetAndDestroy();
+    iCommonResourceFile.Close();
+    FeatureManager::UnInitializeLib(); 
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2UIExtensionLoader* CPbk2UIExtensionLoader::NewL()
+    {
+    CPbk2UIExtensionLoader* self = new( ELeave ) CPbk2UIExtensionLoader();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+	}
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::ConstructL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2UIExtensionLoader::ConstructL()
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2UIExtensionLoader::ConstructL(0x%x)"), this);
+
+    FeatureManager::InitializeLibL(); 
+    
+    PBK2_PROFILE_START(Pbk2Profile::EUiExtensionloaderLoadResourceFile);
+    iCommonResourceFile.OpenL(KPbk2RomFileDrive,
+        KDC_RESOURCE_FILES_DIR, KPbk2UIExtCommonResourceFile);
+    PBK2_PROFILE_END(Pbk2Profile::EUiExtensionloaderLoadResourceFile);
+
+    PBK2_PROFILE_START(Pbk2Profile::EUiExtensionloaderListImplementations);
+    RImplInfoPtrArray implementations;
+    REComSession::ListImplementationsL(TUid::Uid(
+            KPbk2UiExtensionInterfaceUID), implementations);
+    CleanupStack::PushL(TCleanupItem(
+            CleanupResetAndDestroy, &implementations));
+    PBK2_PROFILE_END(Pbk2Profile::EUiExtensionloaderListImplementations);
+
+    // loop through UI extensions in reverse order
+    PBK2_PROFILE_START(Pbk2Profile::EUiExtensionloaderLoopExtensionPlugins);
+    const TInt count = implementations.Count();
+    for (TInt i = count - 1; i >= 0; --i)
+        {
+        CImplementationInformation* implInfo = implementations[i];
+        CleanupStack::PushL(implInfo);
+        implementations.Remove(i);
+
+        TFileName resourceFileName;
+        resourceFileName.Copy(implInfo->OpaqueData());
+        BaflUtils::NearestLanguageFile( 
+                CCoeEnv::Static()->FsSession(), resourceFileName );
+
+        PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+                ("CPbk2UIExtensionLoader::ConstructL(0x%x), implUID %x"), 
+                    this, implInfo->ImplementationUid().iUid );
+
+        // add the UI Extension plugin information to the plugin info array
+        TEntry unusedEntry;
+        RFs& fs = CCoeEnv::Static()->FsSession();
+        if (fs.IsValidName(resourceFileName) &&
+            fs.Entry(resourceFileName, unusedEntry) == KErrNone)
+            {
+            // add the plugin information from the plugin resource structure
+            iPluginInformation.AppendL(
+                    CPbk2UIExtensionInformation::NewLC(resourceFileName));
+            CleanupStack::Pop(); // menu resource
+            }
+        CleanupStack::PopAndDestroy(implInfo);
+        }
+    CleanupStack::PopAndDestroy(); // implementations
+    PBK2_PROFILE_END(Pbk2Profile::EUiExtensionloaderLoopExtensionPlugins);
+
+    /// Load extension that have the loading policy KPbk2LoadInStartup
+    PBK2_PROFILE_START(Pbk2Profile::EUiExtensionloaderLoadStartupExtensions);
+    LoadStartUpExtensionsL();
+    PBK2_PROFILE_END(Pbk2Profile::EUiExtensionloaderLoadStartupExtensions);
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2UIExtensionLoader::ConstructL(0x%x) end"), this);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::IsLoaded
+// --------------------------------------------------------------------------
+//
+TBool CPbk2UIExtensionLoader::IsLoaded(TUid aImplementationUid)
+    {
+    if ( LoadedPlugin(aImplementationUid) )
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }    
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::EnsureLoadedL
+// --------------------------------------------------------------------------
+//
+void CPbk2UIExtensionLoader::EnsureLoadedL(
+        TUid aImplementationUid)
+    {
+    if (!IsLoaded(aImplementationUid))
+        {
+        LoadExtensionL(aImplementationUid);
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::LoadExtensionL
+// --------------------------------------------------------------------------
+//
+void CPbk2UIExtensionLoader::LoadExtensionL(
+        TUid aImplementationUid )
+    {
+    // instantiate the plugin object
+    
+    if ( IsOkToLoadL( aImplementationUid ))  
+        {                                       
+        CPbk2UIExtensionPlugin* plugin =
+                CPbk2UIExtensionPlugin::NewL( aImplementationUid );
+        if ( plugin )
+            {
+            CleanupStack::PushL(plugin);
+            iPluginArray.AppendL(plugin);
+            CleanupStack::Pop();
+            PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+                ("CPbk2UIExtensionLoader::LoadExtensionL(0x%x) %x loaded"), 
+                this, aImplementationUid.iUid );
+            }
+        }  
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::LoadStartUpExtensionsL
+// --------------------------------------------------------------------------
+//
+void CPbk2UIExtensionLoader::LoadStartUpExtensionsL()
+    {
+    // loop through the plugin information array and check
+    // if any item has the loading policy set so that they should be
+    // loaded startup.
+    const TInt count = iPluginInformation.Count();
+    for (TInt i = 0; i < count; ++i)
+        {
+        if (iPluginInformation[i]->LoadingPolicy() & KPbk2LoadInStartup)
+            {
+            // load plugin that have the start-up policy set as load
+            // in start-up
+            TUid implUid = iPluginInformation[i]->ImplementationUid();
+            LoadExtensionL(implUid);
+            // apply dynamic plugin information changes from extension
+            CPbk2UIExtensionPlugin* plugin = LoadedPlugin(implUid);
+            if(plugin)                       
+                {                            
+                plugin->ApplyDynamicPluginInformationDataL(*iPluginInformation[i]);
+                }                            
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::LoadedPlugin
+// --------------------------------------------------------------------------
+//    
+CPbk2UIExtensionPlugin* CPbk2UIExtensionLoader::LoadedPlugin
+        (TUid aImplementationUid) const
+    {
+    const TInt count = iPluginArray.Count();
+    for (TInt i = 0; i < count; ++i)
+        {
+        if (iPluginArray[i]->ImplementationUid() == aImplementationUid)
+            {
+            return iPluginArray[i];
+            }
+        }
+    return NULL;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::PluginInformation
+// --------------------------------------------------------------------------
+//
+TArray<CPbk2UIExtensionInformation*>
+        CPbk2UIExtensionLoader::PluginInformation() const
+    {
+    return iPluginInformation.Array();
+    }
+    
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::Plugins
+// --------------------------------------------------------------------------
+//    
+TArray<CPbk2UIExtensionPlugin*> CPbk2UIExtensionLoader::Plugins() const
+    {
+    return iPluginArray.Array();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2UIExtensionLoader::IsOkToLoadL
+// --------------------------------------------------------------------------
+//
+TBool CPbk2UIExtensionLoader::IsOkToLoadL(TUid aImplementationUid )
+    {
+    TBool ret(ETrue);
+    
+    //Don't unnecessarily load plugins that are not needed in current build
+    switch(aImplementationUid.iUid)
+        {
+        case KFscRclSettingExtensionImplementationUID:
+            if( !FeatureManager::FeatureSupported( KFeatureIdFfContactsRemoteLookup ) )  
+                {
+                ret = EFalse;
+                }
+            break;
+            
+        default:
+            ret = ETrue;
+            break;
+        }
+    return ret;
+    }
+
+// End of File