diff -r 000000000000 -r 2f259fa3e83a psln/PslnFramework/src/PslnFWPluginHandler.cpp --- /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* aPluginArray ) + { + PSLN_TRACE_DEBUG("CPslnFWPluginHandler::NewL"); + CPslnFWPluginHandler* self = + new ( ELeave) CPslnFWPluginHandler( aAppUi, aPluginArray ); + return self; + } + +// --------------------------------------------------------------------------- +// CPslnFWPluginHandler::CPslnFWPluginHandler() +// --------------------------------------------------------------------------- +// +CPslnFWPluginHandler::CPslnFWPluginHandler( + CAknViewAppUi* aAppUi, CArrayPtrFlat* 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* 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