windowing/windowserver/nonnga/SERVER/wspluginmanager.h
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nonnga/SERVER/wspluginmanager.h	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,100 @@
+// Copyright (c) 2007-2009 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:
+//
+
+#ifndef __WSPLUGINMANAGER_H__
+#define __WSPLUGINMANAGER_H__
+
+#include <e32base.h>
+#include "Graphics/WSPLUGIN.H"
+#include <graphics/wsgraphicdrawerinterface.h>
+
+/**
+The window server has a single plugin manager object, which maintains the set
+of loaded plugins.
+*/
+class CWsPluginManager : public CBase, public MWsPluginManager
+	{
+private:
+	class CPluginInfo : public CBase
+		{
+	public:
+		CPluginInfo();
+		~CPluginInfo();
+		CWsPlugin * iPlugin;
+		};
+public:
+	static CWsPluginManager* NewL(MWsGraphicDrawerEnvironment& aEnvironment);
+	~CWsPluginManager();
+	
+	CWsPlugin * CreatePluginL(const TDesC& aSection);
+	template <class T> T * FindImplementation(TInt & aStart);
+	template <class T> T * FindNamedImplementation(const TDesC& aName);
+	
+public: // from MWsObjectProvider:
+	TAny * ResolveObjectInterface(TUint aId);
+	
+public: // from MWsPluginManager
+	TAny * ResolvePluginInterface(TUint aId);
+
+private:
+	CWsPluginManager(MWsGraphicDrawerEnvironment& aEnvironment);
+	void ConstructL();
+	
+private:
+	RPointerArray<CPluginInfo> iPlugins;
+	MWsGraphicDrawerEnvironment& iEnvironment;
+	};
+
+/**
+This searches for any plugin which implements a specified interface.
+Calling this function modifies the value of aStart, and passing it back in
+allows the next implementation to be found.
+*/
+template <class T> T * CWsPluginManager::FindImplementation(TInt & aStart)
+	{
+	while (aStart < iPlugins.Count())
+		{
+		T * impl = iPlugins[aStart]->iPlugin->ObjectInterface<T>();
+		++aStart;
+		if (impl)
+			{
+			return impl;
+			}
+		}
+	return NULL;
+	}
+
+/**
+This searches for any plugin which implements a specified interface and
+has the specified name returned from PluginName.
+
+Maybe plugin name should be a function on an MWsNamed class instead of CWsPlugin?
+*/
+template <class T> T * CWsPluginManager::FindNamedImplementation(const TDesC& aName)
+	{
+	TInt pos = 0;
+	while (pos < iPlugins.Count())
+		{
+		T * impl = iPlugins[pos]->iPlugin->ObjectInterface<T>();
+		if (impl && iPlugins[pos]->iPlugin->PluginName() == aName)
+			{
+			return impl;
+			}
+		++pos;
+		}
+	return NULL;
+	}
+
+#endif // __WSPLUGINMANAGER_H__