mpx/collectionframework/collectionengine/src/mpxcollectionpluginhandler.cpp
changeset 0 a2952bb97e68
--- /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 <mpxlog.h>
+#include <mpxcollectionplugin.h>
+#include <mpxcollectionplugin.hrh>
+#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<CMPXCollectionPlugin*> 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<TUid> 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