diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/nga/SERVER/openwfc/wspluginmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/nga/SERVER/openwfc/wspluginmanager.cpp Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,216 @@ +// 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: +// + +#include "wspluginmanager.h" +#include "Graphics/WSPLUGIN.H" +#include "inifile.h" + +GLREF_D CDebugLogBase* wsDebugLog; + +const TInt KPluginInterfaceId = 0x10285A29; + +/********************************************************************** +Plugin Info +**********************************************************************/ +CWsPluginManager::CPluginInfo::CPluginInfo() + { + } + +CWsPluginManager::CPluginInfo::~CPluginInfo() + { + delete iPlugin; + } + +/********************************************************************** +Plugin Manager +**********************************************************************/ +CWsPluginManager* CWsPluginManager::NewL() + { + CWsPluginManager* self = new (ELeave) CWsPluginManager(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CWsPluginManager::CWsPluginManager() : + iSession(REComSession::OpenL()) + { + } + +CWsPluginManager::~CWsPluginManager() + { + iPlugins.ResetAndDestroy(); + iSession.Close(); + REComSession::FinalClose(); + } + +void CWsPluginManager::ConstructL() + { + _LIT(KPlugins,"PLUGINS"); + + TPtrC pluginString; + TBool havePlugins=WsIniFile->FindVar(KPlugins,pluginString); + const TDesC * plugins; + _LIT(KDefaultPlugins, "FLICKERBUFFER DISPLAY"); + if (havePlugins) + plugins = &pluginString; + else + plugins = &KDefaultPlugins; + TLex lex(*plugins); + while(true) + { + TPtrC ptr = lex.NextToken(); + if (ptr.Length() > 0) + { + CWsPlugin * plugin = 0; + + TRAPD(err, plugin = LoadPluginL(ptr)); + + if (wsDebugLog) + { + TBuf<80> buf; + if (err == KErrNone) + { + _LIT(KLoadedPlugin,"Loaded plugin: "); + _LIT(KPluginName, " calling itself: "); + buf.Append(KLoadedPlugin); + buf.Append(ptr); + buf.Append(KPluginName); + buf.Append(plugin->PluginName()); + wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,buf); + } + else + { + _LIT(KMissingPlugin,"Failed to load plugin (%d): "); + buf.Append(KMissingPlugin); + buf.Append(ptr); + wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,buf,err); + } + } + + if (errFindVar(aSection,KId,id); + TBool hasType=WsIniFile->FindVar(aSection,KType,type); + if ((!hasId) && (!hasType)) + { + _LIT(KCscStage, "TCSC"); + _LIT(KFlickerBufferStage, "FLICKERBUFFER"); + _LIT(KDisplayStage, "DISPLAY"); + if (!aSection.CompareF(KFlickerBufferStage)) + { + hasId = ETrue; + id = 0x1028637B; + } + else if (!aSection.CompareF(KDisplayStage)) + { + hasId = ETrue; + id = 0x1028637A; + } + else if (!aSection.CompareF(KCscStage)) + { + hasId = ETrue; + id = 0x10286507; + } + else + { + hasType = ETrue; + type.Set(aSection); + } + } + TBool hasData = WsIniFile->FindVar(aSection,KData,data); + + if (hasData) + dataPtr = &data; + else + dataPtr = NULL; + + CPluginInfo* info = new (ELeave) CPluginInfo; + CleanupStack::PushL(info); + + if (hasId) + { + TUid uid = TUid::Uid(id); + plugin = reinterpret_cast(iSession.CreateImplementationL(uid, CWsPlugin::DtorIDKeyOffset(), dataPtr)); + } + else + { + TEComResolverParams params; + RBuf8 buf8; + buf8.CreateL(type.Length()); + CleanupClosePushL(buf8); + buf8.Copy(type); + params.SetDataType(buf8); + plugin = reinterpret_cast(iSession.CreateImplementationL(TUid::Uid(KPluginInterfaceId),CWsPlugin::DtorIDKeyOffset(),dataPtr,params)); + CleanupStack::PopAndDestroy(&buf8); + } + + User::LeaveIfNull(plugin); + info->iPlugin = plugin; + User::LeaveIfError(iPlugins.Append(info)); + CleanupStack::Pop(info); + return plugin; + } + +void CWsPluginManager::InitializePluginsL(MWsGraphicDrawerEnvironment& aEnvironment) + { + TInt nbPlugins=iPlugins.Count(); + RBuf8 empty; + for (TInt k=0;kiPlugin->ConstructL(aEnvironment,empty); + } + } + +TAny * CWsPluginManager::ResolveObjectInterface(TUint aId) + { + if (aId == MWsPluginManager::EWsObjectInterfaceId) + return static_cast(this); + return NULL; + } + +TAny * CWsPluginManager::ResolvePluginInterface(TUint aId) + { + for (TInt p = 0; p < iPlugins.Count(); ++p) + { + TAny * interface = iPlugins[p]->iPlugin->ResolveObjectInterface(aId); + if (interface) + return interface; + } + return NULL; + } +