diff -r e8c1ea2c6496 -r 8758140453c0 localisation/apparchitecture/apfile/APRuleBased.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localisation/apparchitecture/apfile/APRuleBased.CPP Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,157 @@ +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// @file +// +// + +#include +#include +#include "APFSTD.H" // Panics etc. + +void CleanUpEComInfoArray(TAny* aInfoArray); + +/////////////////////////////// +// CApaRuleBasedDll +/////////////////////////////// +/** The rule-based framework. Mantain all rule-based plug-ins available in the system */ +class CApaRuleBasedDll : public CBase + { +public: + CApaRuleBasedDll(); + ~CApaRuleBasedDll(); // closes lib and deletes next +public: + enum TPresence { ENotPresent, EIsPresent }; + inline TPresence Present() const { return iPresent; } + inline void Present(TPresence aPresence) { iPresent = aPresence; } + inline TUid Uid() const { return iUid; } + inline void Uid(TUid aUid) { iUid = aUid; } + inline CAppLaunchChecker* LaunchChecker() { return iLaunchChecker; } + inline void LaunchChecker(CAppLaunchChecker* aLaunchChecker) { iLaunchChecker = aLaunchChecker; } +private: + TPresence iPresent; + TUid iUid; + CAppLaunchChecker* iLaunchChecker; // pointer to plug-in implementation + }; + +CApaRuleBasedDll::CApaRuleBasedDll() + { + } + +CApaRuleBasedDll::~CApaRuleBasedDll() + { + delete iLaunchChecker; + } + +/** The function provides access to launch checker interface by index */ +EXPORT_C CAppLaunchChecker* CApaScanningRuleBasedPlugIns::operator[](TInt aIndex) const + { + return iRuleBasedLib[aIndex]->LaunchChecker(); + } + +EXPORT_C CApaScanningRuleBasedPlugIns* CApaScanningRuleBasedPlugIns::NewL() + { + CApaScanningRuleBasedPlugIns* self = new(ELeave) CApaScanningRuleBasedPlugIns(); + CleanupStack::PushL(self); + self -> ScanForRuleBasedPlugInsL(); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CApaScanningRuleBasedPlugIns::~CApaScanningRuleBasedPlugIns() + { + iRuleBasedLib.ResetAndDestroy(); + } + +/** The function loads the ecom rule-based plug-ins */ +void CApaScanningRuleBasedPlugIns::LoadEcomRuleBasedPlugInL(TUid aUid) + { + // check we haven't loaded this one already + for(TInt index = 0; index < iRuleBasedLib.Count(); index++) + { + CApaRuleBasedDll* lib = iRuleBasedLib[index]; + if (lib->Uid() == aUid) + {// already found + lib -> Present(CApaRuleBasedDll::EIsPresent); + return; + } + } + + // load the library + CApaRuleBasedDll* lib = new(ELeave) CApaRuleBasedDll(); + CleanupStack::PushL(lib); + TRAPD(error, lib -> LaunchChecker(CAppLaunchChecker::NewL(aUid))); + if((error == KErrNone) && lib -> LaunchChecker()) + { + lib->Present(CApaRuleBasedDll::EIsPresent); + lib->Uid(aUid); + + // add lib to the library list + iRuleBasedLib.Append(lib); + CleanupStack::Pop(lib); + } + else + { + CleanupStack::PopAndDestroy(lib); + } + } + +/** The function scans and initializes all rule-based plug-ins available in the system */ +EXPORT_C void CApaScanningRuleBasedPlugIns::ScanForRuleBasedPlugInsL() + { + // set all rule based plug-ins to not present - pending rediscoivery + TInt index; + for (index = 0; index < iRuleBasedLib.Count(); index++) + { + CApaRuleBasedDll* rule = iRuleBasedLib[index]; + rule -> Present(CApaRuleBasedDll::ENotPresent); + } + + //scan ecom plugin + RImplInfoPtrArray implementationArray; + TCleanupItem cleanup(CleanUpEComInfoArray, &implementationArray); + CleanupStack::PushL(cleanup); + REComSession::ListImplementationsL(KUidRuleBasedInterfaceUid, implementationArray); + const TInt availCount = implementationArray.Count(); + for (TInt count = 0; count < availCount; ++count) + { + const CImplementationInformation* info = implementationArray[count]; + TUid uid = info -> ImplementationUid(); + LoadEcomRuleBasedPlugInL(uid); + } + CleanupStack::PopAndDestroy(&implementationArray); + + // remove any rule based plug-ins that are no longer present + index = 0; + while (index < iRuleBasedLib.Count()) + { + CApaRuleBasedDll* rule = iRuleBasedLib[index]; + if (rule -> Present() == CApaRuleBasedDll::ENotPresent) + { + iRuleBasedLib.Remove(index); + delete rule; + } + else + { + index++; + } + } + } + +/** The function returns number of plug-ins available in the system*/ +EXPORT_C TInt CApaScanningRuleBasedPlugIns::ImplementationCount() const + { + return iRuleBasedLib.Count(); + } + +