--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/psln/PslnFramework/src/PslnFWPluginHandler.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,264 @@
+/*
+* Copyright (c) 2005-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: Base class for plugins containing other plugins.
+*
+*/
+
+
+// INCLUDE FILES
+#include "pslnfwpluginhandler.h"
+#include "PslnDebug.h"
+
+const TInt KPslnFWGeneralThemeViewLocation = 0;
+const TInt KPslnFWWallpaperViewLocation = 3;
+const TInt KPslnFWScreensaverViewLocation = 4;
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// CPslnFWPluginHandler::NewL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPslnFWPluginHandler* CPslnFWPluginHandler::NewL(
+ CAknViewAppUi* aAppUi, CArrayPtrFlat<CPslnFWPluginInterface>* aPluginArray )
+ {
+ PSLN_TRACE_DEBUG("CPslnFWPluginHandler::NewL");
+ CPslnFWPluginHandler* self =
+ new ( ELeave) CPslnFWPluginHandler( aAppUi, aPluginArray );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CPslnFWPluginHandler::CPslnFWPluginHandler()
+// ---------------------------------------------------------------------------
+//
+CPslnFWPluginHandler::CPslnFWPluginHandler(
+ CAknViewAppUi* aAppUi, CArrayPtrFlat<CPslnFWPluginInterface>* aPluginArray )
+ : iAppUi( aAppUi ), iPluginArray( aPluginArray )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPslnFWPluginHandler::~CPslnFWPluginHandler()
+ {
+ PSLN_TRACE_DEBUG("CPslnFWPluginHandler::destructor");
+ iImplInfoArray.ResetAndDestroy();
+ // iPluginArray is not owned, and thus not deleted.
+ }
+
+// ---------------------------------------------------------------------------
+// Loads all found plugins.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPslnFWPluginHandler::LoadPluginsL(
+ CArrayPtrFlat<CPslnFWPluginInterface>* aPluginArray )
+ {
+ PSLN_TRACE_DEBUG("CPslnFWPluginHandler::LoadPluginsL BEGIN");
+ if ( iPluginArray )
+ {
+ iPluginArray = aPluginArray;
+ }
+ else
+ {
+ User::Leave( KErrArgument );
+ }
+
+ REComSession::ListImplementationsL(
+ KPslnFWPluginInterfaceUid,
+ iImplInfoArray );
+
+ // Reset iterator:
+ iImplInfoArrayIterator = 0;
+
+ LoadNextPlugin();
+ PSLN_TRACE_DEBUG("CPslnFWPluginHandler::LoadPluginsL END");
+ }
+
+// ---------------------------------------------------------------------------
+// Loads one specific plugin.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPslnFWPluginInterface* CPslnFWPluginHandler::LoadPluginL( const TUid aPluginId )
+ {
+ PSLN_TRACE_DEBUG("CPslnFWPluginHandler::LoadPluginL BEGIN");
+ REComSession::ListImplementationsL(
+ KPslnFWPluginInterfaceUid,
+ iImplInfoArray );
+
+ // Reset iterator:
+ iImplInfoArrayIterator = 0;
+
+ // Iterate through iImplInfoArray.
+ for( ; iImplInfoArrayIterator < iImplInfoArray.Count(); )
+ {
+ CImplementationInformation* info =
+ iImplInfoArray[ iImplInfoArrayIterator ];
+ TUid implUid = info->ImplementationUid();
+
+ if ( implUid.iUid == aPluginId.iUid )
+ {
+ // Create a plugin.
+ CPslnFWPluginInterface* plugin = CPslnFWPluginInterface::NewL(
+ aPluginId,
+ iAppUi );
+ // Ownership transferred.
+ PSLN_TRACE_DEBUG("CPslnFWPluginHandler::LoadPluginL plugin found");
+ return plugin;
+ }
+
+ iImplInfoArrayIterator++;
+ }
+ PSLN_TRACE_DEBUG("CPslnFWPluginHandler::LoadPluginL END");
+ return NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// Constructor without array.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPslnFWPluginHandler* CPslnFWPluginHandler::NewL( CAknViewAppUi* aAppUi )
+ {
+ PSLN_TRACE_DEBUG("CPslnFWPluginHandler::NewL 2");
+ CPslnFWPluginHandler* self =
+ new ( ELeave) CPslnFWPluginHandler( aAppUi, NULL );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// Iterate through iImplInfoArray. Load the plugin if it is eligible for
+// loading. Loaded plugin is added to iPluginArray.
+// ----------------------------------------------------------------------------
+//
+void CPslnFWPluginHandler::LoadNextPlugin()
+ {
+ // Iterate through iImplInfoArray.
+ for( ; iImplInfoArrayIterator < iImplInfoArray.Count(); )
+ {
+ CImplementationInformation* info =
+ iImplInfoArray[ iImplInfoArrayIterator ];
+ TUid implUid = info->ImplementationUid();
+
+ iImplInfoArrayIterator++;
+
+ // Load plugin - if it fails, just go to next one.
+ TRAP_IGNORE( AppendPluginL( implUid ) );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// Inserts plugin to plugin-array.
+// ----------------------------------------------------------------------------
+//
+void CPslnFWPluginHandler::AppendPluginL( const TUid& aImplUid )
+ {
+ // Create a plugin.
+ CPslnFWPluginInterface* plugin = CPslnFWPluginInterface::NewL(
+ aImplUid,
+ iAppUi );
+ CleanupStack::PushL ( plugin );
+
+ CPslnFWPluginInterface::TPslnFWLocationType locType =
+ CPslnFWPluginInterface::EPslnFWNotSpecified;
+ TInt location = KErrNotFound;
+ plugin->GetLocationTypeAndIndex( locType, location );
+
+
+ // If plugin claims invalid location, OR location is not specified,
+ // append to the end.
+ if ( IsInvalidLocation( location ) ||
+ locType == CPslnFWPluginInterface::EPslnFWNotSpecified )
+ {
+ if ( iPluginArray )
+ {
+ iPluginArray->AppendL( plugin );
+ }
+ }
+ else
+ {
+ CPslnFWPluginInterface* arrayPlugin = NULL;
+
+ CPslnFWPluginInterface::TPslnFWLocationType pluginLocType =
+ CPslnFWPluginInterface::EPslnFWNotSpecified;
+ TInt pluginLoc = KErrNotFound;
+ TInt count = iPluginArray->Count();
+
+ // Exception - first item, is always appended
+ if ( count == 0 )
+ {
+ iPluginArray->AppendL( plugin );
+ }
+ else
+ {
+ // Loop through the plugin array, trying to find best location for the plugin.
+ TBool breakLoop = EFalse;
+ for ( TInt i = 0; i < count; i++ )
+ {
+ arrayPlugin = iPluginArray->At( i );
+ arrayPlugin->GetLocationTypeAndIndex( pluginLocType, pluginLoc );
+ if ( pluginLocType == CPslnFWPluginInterface::EPslnFWNotSpecified )
+ {
+ // There are no more valid locations, insert here
+ iPluginArray->InsertL( i, plugin );
+ breakLoop = ETrue;
+ }
+ if ( pluginLoc == location )
+ {
+ // Mismatch - plugin location already claimed.
+ // Append plugin to last position in the array.
+ iPluginArray->AppendL( plugin );
+ breakLoop = ETrue;
+ }
+ else if ( pluginLoc < location )
+ {
+ // Do nothing go to next inserted plugin
+ }
+ else
+ {
+ // This location is best for the new plugin.
+ iPluginArray->InsertL( i, plugin );
+ breakLoop = ETrue;
+ }
+ // If plugin has been inserted, or appended, break the loop.
+ if ( breakLoop )
+ {
+ i = count;
+ }
+ }
+ }
+ }
+
+ // Transfer ownership to array.
+ CleanupStack::Pop ( plugin );
+ }
+
+// ----------------------------------------------------------------------------
+// Checks if the plugin tries to claim invalid location.
+// ----------------------------------------------------------------------------
+//
+TBool CPslnFWPluginHandler::IsInvalidLocation( const TInt& aLoc ) const
+ {
+ TBool retVal = ETrue;
+ if ( aLoc == KPslnFWGeneralThemeViewLocation ||
+ aLoc == KPslnFWWallpaperViewLocation ||
+ aLoc == KPslnFWScreensaverViewLocation )
+ {
+ retVal = EFalse;
+ }
+ return retVal;
+ }
+
+// End of File