diff -r 6b5204869ed5 -r 89c890c70182 psln/PslnFramework/src/PslnFWPluginHandler.cpp --- a/psln/PslnFramework/src/PslnFWPluginHandler.cpp Fri Jun 25 18:53:58 2010 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,264 +0,0 @@ -/* -* 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