diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/nga/SERVER/openwfc/wspluginmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/nga/SERVER/openwfc/wspluginmanager.h Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,102 @@ +// 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 +#include "Graphics/WSPLUGIN.H" +#include + +/** +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(); + ~CWsPluginManager(); + + void InitializePluginsL(MWsGraphicDrawerEnvironment& aEnvironment); + + template T * FindImplementation(TInt & aStart); + template T * FindNamedImplementation(const TDesC& aName); + +public: // from MWsObjectProvider: + TAny * ResolveObjectInterface(TUint aId); + +public: // from MWsPluginManager + TAny * ResolvePluginInterface(TUint aId); + +private: + CWsPluginManager(); + void ConstructL(); + CWsPlugin * LoadPluginL(const TDesC& aSection); + +private: + RPointerArray iPlugins; + REComSession& iSession; + }; + +/** +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 T * CWsPluginManager::FindImplementation(TInt & aStart) + { + while (aStart < iPlugins.Count()) + { + T * impl = iPlugins[aStart]->iPlugin->ObjectInterface(); + ++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 T * CWsPluginManager::FindNamedImplementation(const TDesC& aName) + { + TInt pos = 0; + while (pos < iPlugins.Count()) + { + T * impl = iPlugins[pos]->iPlugin->ObjectInterface(); + if (impl && iPlugins[pos]->iPlugin->PluginName() == aName) + { + return impl; + } + ++pos; + } + return NULL; + } + +#endif // __WSPLUGINMANAGER_H__