--- /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