diff -r 000000000000 -r a2952bb97e68 mpx/collectionframework/collectionengine/src/mpxcollectionpluginhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpx/collectionframework/collectionengine/src/mpxcollectionpluginhandler.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,320 @@ +/* +* Copyright (c) 2006 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: Collection plug-in handler +* +*/ + +#include +#include +#include +#include "mpxcollectionpluginhandler.h" +#include "mpxcollectionplugininfo.h" + +// ============================ MEMBER FUNCTIONS ============================== + +// ---------------------------------------------------------------------------- +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CMPXCollectionPluginHandler* CMPXCollectionPluginHandler::NewL( + MMPXCollectionPluginObserver& aPluginObserver, + MMPXPluginHandlerObserver& aObserver) + { + CMPXCollectionPluginHandler* p=new(ELeave)CMPXCollectionPluginHandler( + aPluginObserver, aObserver); + CleanupStack::PushL(p); + p->ConstructL(); + CleanupStack::Pop(p); + return p; + } + +// ---------------------------------------------------------------------------- +// Constructor. +// ---------------------------------------------------------------------------- +// +CMPXCollectionPluginHandler::CMPXCollectionPluginHandler( + MMPXCollectionPluginObserver& aPluginObserver, + MMPXPluginHandlerObserver& aObserver) +: CMPXPluginHandlerBase(KMPXCollectionInterfaceUid, ESelectionType, EMcLocal, aObserver), + iPluginObserver(&aPluginObserver) + { + } + +// ---------------------------------------------------------------------------- +// 2nd phase constructor. +// ---------------------------------------------------------------------------- +// +void CMPXCollectionPluginHandler::ConstructL() + { + BaseConstructL(); + } + +// ---------------------------------------------------------------------------- +// Destructor. +// ---------------------------------------------------------------------------- +// +CMPXCollectionPluginHandler::~CMPXCollectionPluginHandler() + { + //close plugins + for (TInt i = iLoadedPlugins.Count(); --i >= 0;) + { + CMPXCollectionPlugin* p=iLoadedPlugins[i]; + TRAP_IGNORE( p->CommandL(EMcCmdClose) ); + } + iLoadedPlugins.ResetAndDestroy(); + } + +// ---------------------------------------------------------------------------- +// Return the list of loaded plugins +// ---------------------------------------------------------------------------- +// +TArray CMPXCollectionPluginHandler::LoadedPlugins() + { + return iLoadedPlugins.Array(); + } + +// ---------------------------------------------------------------------------- +// Remove tasks of a client which is the observer of tasks +// ---------------------------------------------------------------------------- +// +void CMPXCollectionPluginHandler::RemoveTask(TAny* aCallback) + { + for (TInt i=iLoadedPlugins.Count(); --i>=0; ) + { + CMPXCollectionPlugin* plugin(iLoadedPlugins[i]); + if (plugin->Callback()==aCallback) + { + MPX_DEBUG1("CMPXCollectoinPluginHandler::RemoveTask removes active task"); + plugin->CancelRequest(); + plugin->CompleteTask(); + plugin->SetCallback(NULL); + plugin->SetObserver(*iPluginObserver); + } + else + { + iLoadedPlugins[i]->RemoveTask(aCallback); + } + } + } + +// ---------------------------------------------------------------------------- +// Get the list of noncacheable attributes +// ---------------------------------------------------------------------------- +// +const TArray CMPXCollectionPluginHandler::NonCacheableAttributesL( + const TUid& aPluginId ) + { + TInt i(KErrNotFound); + TInt count( iPluginInfoArray.Count() ); + TBool found( EFalse ); + for( i = 0; !found && i < count; ++i ) + { + if ( iPluginInfoArray[i]->ImplementationUid() == aPluginId ) + { + found = ETrue; + break; + } + } + if ( !found ) + { + User::Leave( KErrNotFound ); + } + + return ((CMPXCollectionPluginInfo*)iPluginInfoArray[i])->NonCacheableAttrs(); + } + +// ---------------------------------------------------------------------------- +// Get whether the plugin is cacheable or not +// ---------------------------------------------------------------------------- +// +TBool CMPXCollectionPluginHandler::PluginCachable( const TUid& aPluginId ) + { + TUint flags(0); + + TInt count( iPluginInfoArray.Count() ); + for( TInt i = 0; i < count; ++i ) + { + if ( iPluginInfoArray[i]->ImplementationUid() == aPluginId ) + { + flags = iPluginInfoArray[i]->Flags(); + break; + } + } + return ((flags&EMPXCollectionPluginFlagCacheable) != 0); + } + +// ---------------------------------------------------------------------------- +// CMPXCollectionPluginHandler::LoadedPlugin +// ---------------------------------------------------------------------------- +// +CMPXCollectionPlugin* CMPXCollectionPluginHandler::LoadedPlugin(const TUid& aUid) + { + CMPXCollectionPlugin* plugin(NULL); + TInt index(LoadedPluginIndex(aUid)); + if (KErrNotFound != index) + { + plugin = iLoadedPlugins[index]; + } + return plugin; + } + +// ---------------------------------------------------------------------------- +// Resolve a plugin to iPlugin, based on properties (iDataType, iExt and iScheme) +// and selection criteria. If selection is by type, then there is always a +// plug-in resolved (if there are any of that type). Room for optimisation! +// ---------------------------------------------------------------------------- +// +void CMPXCollectionPluginHandler::ResolvePluginL() + { + // + // Resolve plugin + // + TUid pluginUid( KNullUid ); + TInt index( KErrNotFound ); + TPtrC displayName; + TInt pluginType( EMcUnknown ); + + DoResolvePluginL(pluginUid, index, displayName, pluginType ); + + iPlugin = CreateCollectionPluginL(pluginUid); + if(iPlugin != NULL) + UsePlugin(pluginUid); + } +// ---------------------------------------------------------------------------- +// CMPXCollectionPluginHandler::IsPluginLoaded +// ---------------------------------------------------------------------------- +// +TBool CMPXCollectionPluginHandler::IsPluginLoaded( + const TUid& aPluginUid) + { + return LoadedPluginIndex(aPluginUid) != KErrNotFound; + } + +// ---------------------------------------------------------------------------- +// CMPXCollectionPluginHandler::LoadPluginL +// ---------------------------------------------------------------------------- +// +void CMPXCollectionPluginHandler::LoadPluginL( + const TUid& aPluginUid) + { + (void)CreateCollectionPluginL(aPluginUid); + } + +// ---------------------------------------------------------------------------- +// Constructs the collection plugin info class +// ---------------------------------------------------------------------------- +// +CMPXPluginInfo* CMPXCollectionPluginHandler::ConstructPluginInfoLC( + const CImplementationInformation& aData ) + { + return CMPXCollectionPluginInfo::NewLC( aData ); + } + +// ---------------------------------------------------------------------------- +// Unloads a specified plugin. +// ---------------------------------------------------------------------------- +// +void CMPXCollectionPluginHandler::UnloadPlugin( + const TUid& aUid) + { + MPX_DEBUG3("===>CMPXCollectionPluginHandler::UnloadPlugin 0x%08x uid 0x%08x", + this, aUid.iUid); + TInt index(LoadedPluginIndex(aUid)); + if (index != KErrNotFound) + { + UnloadPlugin(index); + } + MPX_DEBUG3("<===CMPXCollectionPluginHandler::UnloadPlugin 0x%08x uid 0x%08x", + this, aUid.iUid); + } + +// ---------------------------------------------------------------------------- +// Return a plugin controller with the specific id +// ---------------------------------------------------------------------------- +// +CMPXCollectionPlugin* +CMPXCollectionPluginHandler::CreateCollectionPluginL(const TUid& aUid) + { + MPX_DEBUG3("===>CMPXCollectionPluginHandler::CreateCollectionPluginL 0x%08x uid 0x%08x", + this, aUid.iUid); + + CMPXCollectionPlugin* p=NULL; + + TInt index(LoadedPluginIndex(aUid)); + if (index == KErrNotFound) + { + MPX_DEBUG3("CMPXCollectionPluginHandler::CreateCollectionPluginL create a new plugin 0x%08x uid 0x%08x", + this, aUid.iUid); + TRAPD(err, p = CMPXCollectionPlugin::NewL(aUid, *iPluginObserver)); + if(err == KErrNone) + { + CleanupStack::PushL(p); + iLoadedPlugins.AppendL(p); + CleanupStack::Pop(p); + } + else + { + MPX_DEBUG3("CMPXCollectionPluginHandler::CreateCollectionPluginL error creating plugin %d uid 0x%08x", + err, aUid.iUid); + User::Leave(err); + } + } + else + { + p = iLoadedPlugins[index]; + } + + MPX_DEBUG3("<===CMPXCollectionPluginHandler::CreateCollectionPluginL 0x%08x uid 0x%08x", + this, aUid.iUid); + + return p; + } + +// ---------------------------------------------------------------------------- +// CMPXCollectionPluginHandler::LoadedPluginIndex +// ---------------------------------------------------------------------------- +// +TInt CMPXCollectionPluginHandler::LoadedPluginIndex(const TUid& aUid) + { + TInt index(KErrNotFound); + + for (TInt i = iLoadedPlugins.Count(); --i >= 0; ) + { + if (iLoadedPlugins[i]->Uid() == aUid) + { + index = i; + break; + } + } + + return index; + } + +// ---------------------------------------------------------------------------- +// CMPXCollectionPluginHandler::UnloadPlugin +// ---------------------------------------------------------------------------- +// +void CMPXCollectionPluginHandler::UnloadPlugin(TInt aIndex) + { + MPX_DEBUG3("===>CMPXCollectionPluginHandler::UnloadPlugin 0x%08x index 0x%08x", + this, aIndex); + CMPXCollectionPlugin* p = iLoadedPlugins[aIndex]; + TRAP_IGNORE(p->CommandL(EMcCmdClose)); + iLoadedPlugins.Remove(aIndex); + delete p; + MPX_DEBUG3("<===CMPXCollectionPluginHandler::UnloadPlugin 0x%08x index 0x%08x", + this, aIndex); + } + +// End of file