--- a/languageinterworkingfw/servicehandler/src/liwservicehandlerimpl.cpp Fri Apr 16 15:54:49 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3068 +0,0 @@
-/*
-* Copyright (c) 2003-2005 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 "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: Implements API for consumer application to access Language
-* Interworking Framework.
-*
-*/
-
-
-
-
-
-
-#include <eikenv.h>
-#include <bautils.h> // file helpers
-#include <liwservicehandler.rsg>
-#include "liwmenubinding.h"
-#include "liwservicehandler.h"
-#include "liwservicehandlerimpl.h"
-#include "liwmenu.h"
-#include "liwuids.hrh"
-#include "liwcommon.hrh"
-#include "liwmenuslot.hrh"
-#include "liwecommonitor.h"
-#include "liwtlsdata.h"
-#include "data_caging_path_literals.hrh"
-
-#include "liwxmlhandler.h"
-#include "liwservicedata.h"
-
-#include <rtsecmgrscriptsession.h>
-
-// CONSTANTS
-// Max number of empty menu resource slots.
-const TInt KMaxMenuResources = 16;
-
-// This value tells how many times consumer can call InitializeMenuPaneL() without
-// closing the Options-menu.
-const TInt KMaxPaneIds = KMaxMenuResources;
-
-// The range reserved for individual menu pane.
-const TInt KIndividualMenuPaneIdRange = 10000;
-
-// The whole range that is reserved to all menu panes. Currently value is 170 000.
-const TInt KMenuPaneCommandRange = (KMaxMenuResources + 1) * KIndividualMenuPaneIdRange;
-
-_LIT(KLiwResourceFile, "liwServiceHandler.rsc");
-_LIT(KLiwZDrive, "z:");
-_LIT8(KDataSeparator, "||");
-_LIT(KPerExtension,".per");
-
-const TInt KMaxMenuTitleSize = 100;
-
-// Command id space reserved for single placeholder.
-const TInt KPlaceholderCmdIdRange = 200;
-
-const TInt KMaxLength=255;
-
-const TReal KDefVersion = 1.0;
-const TReal KUnspVersion = 0.0;
-
-void Cleanup(TAny* aAny);
-void InterestCleanup(TAny* aAny);
-void IntArrayCleanup(TAny* aAny);
-void FilteredCleanup(TAny* aAny);
-void Int32ArrayCleanup(TAny* aAny);
-void InterfaceCleanup(TAny* aAny);
-
-_LIT8(KResolverInterface, "IResolver");
-_LIT8(KResolverDomain, "ServiceManager");
-_LIT8(serviceCmdSeparator, "::");
-
-const TInt KDummySrvCmd=1;
-_LIT(KCapabilityCommDD,"CDD");
-_LIT(KCapabilityPowerMgmt,"PMT");
-_LIT(KCapabilityMultimediaDD,"MDD");
-_LIT(KCapabilityReadDeviceData,"RDD");
-_LIT(KCapabilityWriteDeviceData,"WDD");
-_LIT(KCapabilityDRM,"DRM");
-_LIT(KCapabilityTrustedUI,"TUI");
-_LIT(KCapabilityProtServ,"PSV");
-_LIT(KCapabilityDiskAdmin,"DAD");
-_LIT(KCapabilityNetworkControl,"NWC");
-_LIT(KCapabilityAllFiles,"ALF");
-_LIT(KCapabilitySwEvent,"SWE");
-_LIT(KCapabilityNetworkServices,"NWS");
-_LIT(KCapabilityLocalServices,"LOS");
-_LIT(KCapabilityReadUserData,"RUD");
-_LIT(KCapabilityWriteUserData,"WUD");
-_LIT(KCapabilityLocation,"LOC");
-_LIT(KCapabilitySurroundingsDD,"SDD");
-_LIT(KCapabilityUserEnvironment,"USE");
-
-using namespace LIW;
-//
-// LiwServiceHandler
-//
-
-CLiwServiceHandlerImpl* CLiwServiceHandlerImpl::NewL()
- {
- CLiwServiceHandlerImpl* handler = new (ELeave) CLiwServiceHandlerImpl();
- CleanupStack::PushL( handler );
- handler->ConstructL();
- CleanupStack::Pop(handler); // handler
- return handler;
- }
-
-
-
-CLiwServiceHandlerImpl::CLiwServiceHandlerImpl()
- {
- // Nothing to do here.
- }
-
-
-
-void CLiwServiceHandlerImpl::ConstructL()
- {
- TFileName resFile;
- TCallBack callBack(SynchronizeCallBack, this);
- iEcomMonitor = CLiwEcomMonitor::NewL(callBack);
-
-
- iCoeEnv = CCoeEnv::Static();
- RFs rFs;
- TInt err = rFs.Connect();
-
- TFileName dllName;
- Dll::FileName(dllName);
-
- TBuf<2> drive = dllName.Left(2);
- resFile.Copy(drive);
- resFile.Append(KDC_RESOURCE_FILES_DIR);
- resFile.Append(KLiwResourceFile);
- TBool fileExists( BaflUtils::FileExists(rFs, resFile) );
- if ( ! fileExists )
- {
- resFile.Copy(KLiwZDrive);
- resFile.Append(KDC_RESOURCE_FILES_DIR);
- resFile.Append(KLiwResourceFile);
- }
- rFs.Close();
- // A Service Handler instance can be created also when CCoeEnv is not
- // available (e.g. from server applications). In this case, the methods
- // needing CCoeEnv/CEikonEnv will leave with KErrNotSupported.
- if(iCoeEnv)
- {
- // This is commented to avoid resource file getting locked affecting the IAD update.
- // Also, there is no use of resource file since LIW does not support menu related services
- // iResourceOffset = iCoeEnv->AddResourceFileL(resFile);
- }
- // CLiwTlsData has a reference count so each OpenL call
- // must have a matching Close call (done in destructor).
- // OpenL is called only here, the TLS data object can be
- // referenced by calling CLiwTlsData::Instance().
- CLiwTlsData* data = CLiwTlsData::OpenL();
- iTlsDataOpened = ETrue;
-
- // CEikMenuPane informs all menu launch observers
- // when an options menu is launched.
- data->AddMenuLaunchObserverL( this );
- }
-
-
-
-CLiwServiceHandlerImpl::~CLiwServiceHandlerImpl()
- {
- if (iResourceOffset && iCoeEnv)
- {
- // This is commented to avoid resource file getting locked affecting the IAD update.
- // Also, there is no use of resource file since LIW does not support menu related services
- // iCoeEnv->DeleteResourceFile(iResourceOffset);
- }
- Reset();
-
- delete iEcomMonitor;
-
- if ( iTlsDataOpened )
- {
- CLiwTlsData* data = CLiwTlsData::Instance();
- data->RemoveMenuLaunchObserver( this );
- CLiwTlsData::Close();
- }
- }
-
-
-
-void CLiwServiceHandlerImpl::Reset()
- {
- iInterestList.ResetAndDestroy();
- iMenuBindings.ResetAndDestroy();
- iBaseBindings.ResetAndDestroy();
- iProviders.ResetAndDestroy();
-
- iLastInitialized.Reset();
-
- iMenuPanes.ResetAndDestroy();
-
- delete iInParams;
- iInParams = NULL;
- delete iOutParams;
- iOutParams = NULL;
- }
-
-void CLiwServiceHandlerImpl::AttachServiceManagerPluginsL()
-{
- CLiwCriteriaItem* crit = CLiwCriteriaItem::NewLC(KDummySrvCmd, KResolverInterface, KResolverDomain);
- crit->SetServiceClass(TUid::Uid(KLiwClassBase));
-
- RCriteriaArray a;
- a.AppendL(crit);
-
- AttachL(a);
-
- CleanupStack::Pop(crit); // crit
- a.ResetAndDestroy();
-}
-
-void CLiwServiceHandlerImpl::ServiceManagerPlugin_ListImplementationsL(RArray<TInt32>& aArray,
- CLiwCriteriaItem* aItem)
-{
- CLiwGenericParamList* inps = &(InParamListL());
- CLiwGenericParamList* outps = &(OutParamListL());
-
- CLiwCriteriaItem* crit = CLiwCriteriaItem::NewLC(KDummySrvCmd, KResolverInterface, KResolverDomain);
- crit->SetServiceClass(TUid::Uid(KLiwClassBase));
-
- ExecuteServiceCmdL(*crit, *inps, *outps);
- CleanupStack::PopAndDestroy(crit); // crit
-
- TInt pos = 0;
- MLiwInterface* ifp;
- const TLiwGenericParam* p = outps->FindFirst(pos, KResolverInterface, EVariantTypeInterface);
- if (p) {
- ifp = p->Value().AsInterface();
- CleanupStack::PushL(TCleanupItem(InterfaceCleanup, ifp));
- }
- else
- return;
-
- outps->Reset();
- inps->Reset();
-
- _LIT8(KId,"id");
- _LIT8(KCmd,"cmd");
- _LIT8(KCmdStr,"cmd_str");
- _LIT8(KType,"type");
- _LIT8(KListImpl,"ListImplementations");
-
- inps->AppendL(TLiwGenericParam(KId, TLiwVariant(aItem->Id())));
- inps->AppendL(TLiwGenericParam(KCmd, TLiwVariant(aItem->ServiceCmd())));
- inps->AppendL(TLiwGenericParam(KCmdStr, TLiwVariant(aItem->ServiceCmdStr())));
- inps->AppendL(TLiwGenericParam(KType, TLiwVariant(aItem->ContentType())));
- ifp->ExecuteCmdL(KListImpl, *inps, *outps);
-
- pos = 0;
- p = outps->FindFirst(pos, EGenericParamError);
- if (p && (p->Value().AsTInt32() == KErrNone)) {
- pos = 0;
- const CLiwList* list;
- _LIT8(KIdList,"id_list");
- p = outps->FindFirst(pos, KIdList, EVariantTypeList);
- if (p) {
- list = p->Value().AsList();
- for (TInt i = 0; i < list->Count(); i++) {
- TLiwVariant v;
- v.PushL();
- list->AtL(i, v);
- aArray.AppendL(v.AsTInt32());
- CleanupStack::Pop(&v);
- v.Reset();
- }
- }
- }
-
- CleanupStack::Pop(ifp); // ifp
- ifp->Close();
-}
-
-CLiwServiceIfBase* CLiwServiceHandlerImpl::ServiceManagerPlugin_CreateImplementationL(TInt32 aImplUid)
-{
- CLiwGenericParamList* inps = &(InParamListL());
- CLiwGenericParamList* outps = &(OutParamListL());
-
- CLiwCriteriaItem* crit = CLiwCriteriaItem::NewLC(KDummySrvCmd, KResolverInterface, KResolverDomain);
- crit->SetServiceClass(TUid::Uid(KLiwClassBase));
-
- ExecuteServiceCmdL(*crit, *inps, *outps);
- CleanupStack::PopAndDestroy(crit); // crit
-
- TInt pos = 0;
- MLiwInterface* ifp = NULL;
- const TLiwGenericParam* p = outps->FindFirst(pos, KResolverInterface, EVariantTypeInterface);
- if (p) {
- ifp = p->Value().AsInterface();
- CleanupStack::PushL(TCleanupItem(InterfaceCleanup, ifp));
- }
- else
- User::Leave(KErrNotFound);
-
- outps->Reset();
- inps->Reset();
- _LIT8(KUid,"uid");
- _LIT8(KCreateImpl,"CreateImplementation");
-
- inps->AppendL(TLiwGenericParam(KUid, TLiwVariant(aImplUid)));
- ifp->ExecuteCmdL(KCreateImpl, *inps, *outps);
-
- pos = 0;
- p = outps->FindFirst(pos, EGenericParamError);
- User::LeaveIfError(p->Value().AsTInt32());
-
- pos = 0;
- CLiwServiceIfBase* iface = NULL;
- _LIT8(KImplPtr, "impl_ptr");
- p = outps->FindFirst(pos, KImplPtr, EVariantTypeDesC8);
- if (p) {
- TPtrC8 buf = p->Value().AsData();
- if (buf.Size() == sizeof(iface))
- Mem::Copy(&iface, buf.Ptr(), buf.Size());
- else
- User::Leave(KErrNotFound);
- }
- else
- User::Leave(KErrNotFound);
-
- CleanupStack::Pop(ifp); // ifp
- ifp->Close();
-
- return iface;
-}
-
-void CLiwServiceHandlerImpl::ListProvidersForCriteriaL(RArray<TInt>& aResult,
- CLiwCriteriaItem& aItem)
- {
- TInt i;
-
- for (i = 0; i < iProviders.Count(); i++)
- {
- if (iProviders[i]->HasCriteria(aItem))
- {
- User::LeaveIfError(aResult.Append(iProviders[i]->ImplementationUid().iUid));
- }
- }
- }
-
-
-
-TInt CLiwServiceHandlerImpl::NbrOfProviders(const CLiwCriteriaItem* aCriteria)
- {
- if(!aCriteria)
- {
- return 0;
- }
-
- TInt i, j;
-
- for (i = 0; i < iBaseBindings.Count(); i++)
- {
- for (j = 0; j < iBaseBindings[i]->Interest().Count(); j++)
- {
- if ((*iBaseBindings[i]->Interest()[j]) == (*aCriteria))
- {
- return iBaseBindings[i]->NumberOfProviders();
- }
- }
- }
-
- for (i = 0; i < iMenuBindings.Count(); i++)
- {
- for (j = 0; j < iMenuBindings[i]->Interest().Count(); j++)
- {
- if ((*iMenuBindings[i]->Interest()[j]) == (*aCriteria))
- {
- return iMenuBindings[i]->NumberOfProviders();
- }
- }
- }
-
- return 0;
- }
-
-
-
-void CLiwServiceHandlerImpl::AttachL(TInt aInterestResourceId)
- {
- // CCoeEnv/CEikonEnv needs to be accessible.
- if(!iCoeEnv)
- {
- User::Leave(KErrNotSupported);
- }
-
- RCriteriaArray interest, filtered;
-
- CleanupStack::PushL( TCleanupItem( InterestCleanup, &interest ) );
- CleanupStack::PushL( TCleanupItem( FilteredCleanup, &filtered ) );
-
- TResourceReader reader;
- iCoeEnv->CreateResourceReaderLC(reader, aInterestResourceId);
- ReadInterestListL(reader, interest);
- CleanupStack::PopAndDestroy(); //reader
-
- FilterInterestListL(interest, filtered);
-
- DoAttachL(filtered,NULL);
-
- filtered.Reset();
-
- CleanupStack::Pop(&filtered); // filtered
- CleanupStack::Pop(&interest); // interest
- }
-
-
-
-TInt CLiwServiceHandlerImpl::AttachL(const RCriteriaArray& aInterest)
- {
- return (this->AttachL(aInterest,NULL));
- }
-
-TInt CLiwServiceHandlerImpl::AttachL(const RCriteriaArray& aInterest ,CRTSecMgrScriptSession* aSecMgrScriptSession)
- {
- RCriteriaArray interest, filtered;
-
- CleanupStack::PushL( TCleanupItem( InterestCleanup, &interest ) );
- CleanupStack::PushL( TCleanupItem( FilteredCleanup, &filtered ) );
-
- for(TInt i = 0; i < aInterest.Count(); i++)
- {
- CLiwCriteriaItem* item = CLiwCriteriaItem::NewLC();
-
- item->SetId( aInterest[i]->Id() );
- if (aInterest[i]->ServiceCmd() == KLiwCmdAsStr)
- item->SetServiceCmdL( aInterest[i]->ServiceCmdStr() );
- else
- item->SetServiceCmd( aInterest[i]->ServiceCmd() );
- item->SetContentTypeL( aInterest[i]->ContentType() );
- item->SetServiceClass( aInterest[i]->ServiceClass() );
-
- item->SetOptions( aInterest[i]->Options() );
-
- //Setting the imetadataOptions of item
- TLiwVariant metadataOption;
- metadataOption.PushL();
-
- aInterest[i]->GetMetaDataOptions(metadataOption);
- item->SetMetaDataOptions(metadataOption);
- metadataOption.Reset();
-
- item->SetDefaultProvider( (aInterest[i]->DefaultProvider()).iUid );
- item->SetMaxProviders( aInterest[i]->MaxProviders() );
-
- User::LeaveIfError(interest.Append(item));
- CleanupStack::Pop(&metadataOption);
- CleanupStack::Pop(item);
- }
-
- FilterInterestListL(interest, filtered);
-
- TInt result = DoAttachL(filtered,aSecMgrScriptSession);
-
- filtered.Reset();
-
- CleanupStack::Pop(&filtered); // filtered
- CleanupStack::Pop(&interest); // interest
-
- return result;
- }
-
-TInt CLiwServiceHandlerImpl::DoAttachL(const RCriteriaArray& aInterest,CRTSecMgrScriptSession* aSecMgrScriptSession)
- {
- CLiwBinding* bind;
- TInt success = -1;
- for (TInt i = 0; i < aInterest.Count(); i++)
- {
- bind = CLiwBinding::NewLC();
-
- success = ResolveProvidersL(bind, aInterest[i],aSecMgrScriptSession);
-
- if (success == KLiwServiceLoadSuccess)
- {
- User::LeaveIfError(iBaseBindings.Append( bind ));
- CleanupStack::Pop(bind); // bind
- bind->AddCriteriaL(aInterest[i]);
-
- // Initialise providers.
- for (TInt k = 0; k < bind->NumberOfProviders(); k++)
- {
- // Trap the initialisation. If not done, a leaving provider
- // could prevent the initialisation of other providers.
- TRAPD(err, bind->BaseProvider(k)->InitialiseL(*this, bind->Interest()));
-
-
-
- if(err)
- {
-#ifdef _DEBUG
- RDebug::Print(_L("LIW PROVIDER ERROR: CLiwServiceIfBase::InitialiseL() failed, leave code:%d"), err);
-#endif
- }
- }
- }
- else
- {
- CleanupStack::PopAndDestroy(bind); // bind
- }
- }
- return success; // returns status of 'n'th criteria in interest
- }
-
-
-void CLiwServiceHandlerImpl::GetInterest(RCriteriaArray& aInterest)
- {
- for (TInt i = 0; i < iInterestList.Count(); i++)
- {
- if (aInterest.Append(iInterestList[i]) != KErrNone)
- {
- return;
- }
- }
- }
-
-
-
-void CLiwServiceHandlerImpl::DetachL(const RCriteriaArray& aInterest)
- {
- // First, remove relevant criteria items from relevat base bindings.
- for (TInt i = 0; i < aInterest.Count(); i++)
- {
- for (TInt j = 0; j < iBaseBindings.Count(); j++)
- {
- TInt index = iBaseBindings[j]->HasCriteriaItem(*aInterest[i]);
- if (index != KErrNotFound)
- {
- iBaseBindings[j]->RemoveCriteria(index);
- }
- }
- }
-
- // Second pass removes empty bindings.
- for (TInt i = 0; i < iBaseBindings.Count(); i++)
- {
- if (iBaseBindings[i]->Interest().Count() == 0)
- {
- delete iBaseBindings[i];
- iBaseBindings.Remove(i);
- i--;
- }
- }
-
- // Then check if there were left obselete criteria items and remove them.
- RemoveObsoleteCriteriaItems();
-
- // Finally check if there were left obselete providers and remove them.
- RemoveObsoleteProviders();
- }
-
-
-
-void CLiwServiceHandlerImpl::DetachL(TInt aInterestResourceId)
- {
- // CCoeEnv/CEikonEnv needs to be accessible.
- if(!iCoeEnv)
- {
- User::Leave(KErrNotSupported);
- }
-
- RCriteriaArray interest;
-
- CleanupStack::PushL( TCleanupItem( InterestCleanup, &interest ) );
-
- TResourceReader reader;
- iCoeEnv->CreateResourceReaderLC(reader, aInterestResourceId);
- ReadInterestListL(reader, interest);
- CleanupStack::PopAndDestroy(); //reader
-
- DetachL( interest );
-
- interest.ResetAndDestroy();
- CleanupStack::Pop(&interest); // interest
- }
-
-
-const CLiwCriteriaItem* CLiwServiceHandlerImpl::GetCriteria(TInt aId)
- {
- for (TInt i = 0; i < iInterestList.Count(); i++)
- {
- if (iInterestList[i]->Id() == aId)
- {
- return iInterestList[i];
- }
- }
-
- return NULL;
- }
-
-TInt CLiwServiceHandlerImpl::NumAlreadyInitializedPaneIdsL() const
- {
- TInt ret = 0;
- TInt paneIds[KMaxPaneIds] = {0};
- TBool found = EFalse;
-
- for (TInt i = 0; i < iLastInitialized.Count(); i++)
- {
- found = EFalse;
-
- for (TInt j = 0; j < ret; j++)
- {
- if (iLastInitialized[i]->MenuResourceId() == paneIds[j])
- {
- found = ETrue;
- break;
- }
- }
-
- if (!found)
- {
- // Create new item.
- if (ret >= KMaxPaneIds)
- {
-#ifdef _DEBUG
- RDebug::Print(_L("ERROR: OVERFLOW in CLiwServiceHandlerImpl::NumAlreadyInitializedPaneIdsL()"));
-#endif
- User::Leave(KErrOverflow);
- }
- paneIds[ret] = iLastInitialized[i]->MenuResourceId();
- ret++;
- }
- }
- return ret;
- }
-
-void CLiwServiceHandlerImpl::InitializeMenuPaneL(
- CEikMenuPane& aMenuPane,
- TInt aMenuResourceId,
- TInt aBaseMenuCmdId,
- const CLiwGenericParamList& aInParamList)
- {
- InitializeMenuPaneL(aMenuPane, aMenuResourceId, aBaseMenuCmdId, aInParamList, EFalse);
- }
-
-void CLiwServiceHandlerImpl::InitializeMenuPaneL(
- CEikMenuPane& aMenuPane,
- TInt aMenuResourceId,
- TInt aBaseMenuCmdId,
- const CLiwGenericParamList& aInParamList,
- TBool aUseSubmenuTextsIfAvailable)
- {
- // CCoeEnv/CEikonEnv needs to be accessible.
- if(!iCoeEnv)
- {
- User::Leave(KErrNotSupported);
- }
-
- if (!iMenuBindings.Count())
- {
- // Either no menu is attached to interest or menu was attached but
- // it didn't contain any placeholders for criteria items. So
- // nothing to do, get out.
- return;
- }
-
- TInt index;
- TInt slotcmd;
- TBuf <KMaxMenuTitleSize> subTitle;
- TBool titleLocked;
- TInt paneOffset = NumAlreadyInitializedPaneIdsL() * KIndividualMenuPaneIdRange;
-
- iSubmenuCmd = aBaseMenuCmdId + KMenuPaneCommandRange;
- slotcmd = SlotItemCmd(aMenuPane);
- if (slotcmd >= 0)
- {
- // aMenuPane is liw submenu. At this point it is empty and we must
- // copy provider menu items to it.
- CLiwMenuPane* liwPane = MenuPaneForSlotCmd(slotcmd);
- if (liwPane)
- {
- CopyMenuItemsL(liwPane, aMenuPane, 0, ETrue);
- aMenuPane.DeleteMenuItem(slotcmd);
- iSubmenu = liwPane;
- }
- }
- else
- {
- iSubmenu = NULL;
-
- const TInt bindcount = iMenuBindings.Count();
- for (TInt i = 0; i < bindcount; i++)
- {
- if ((iMenuBindings[i]->MenuId() == aMenuResourceId) &&
- (aMenuPane.MenuItemExists(iMenuBindings[i]->MenuCmd(), index)))
- {
- CLiwMenuPane* liwPane = iMenuBindings[i]->MenuPane();
- TInt menuResourceId = -1;
- if(liwPane)
- {
- // An LIW menu pane already exists (this means that a normal
- // non-LIW submenu with LIW items has been opened more than once).
- // In this case we use the existing resource slot id.
- menuResourceId = liwPane->ResourceSlotId();
- paneOffset = liwPane->PaneOffset();
- DeleteLiwMenuPane(liwPane);
- liwPane = NULL;
- }
- liwPane = CreateEmptyLiwMenuPaneL(aBaseMenuCmdId, menuResourceId);
- CleanupStack::PushL(liwPane);
- liwPane->SetPaneOffset(paneOffset);
- paneOffset += KPlaceholderCmdIdRange;
- iMenuBindings[i]->SetMenuPane(liwPane);
-
- // Clean previous service commands from list.
- CLiwGenericParamList& list = const_cast<CLiwGenericParamList&>(aInParamList);
- while (list.Remove(EGenericParamServiceCommand))
- {
- // Intentionally left empty.
- }
-
- // Add service commands for current placeholder.
- const TInt icount = iMenuBindings[i]->Interest().Count();
- for (TInt k = 0; k < icount; k++)
- {
- list.AppendL(TLiwGenericParam(EGenericParamServiceCommand,
- TLiwVariant(iMenuBindings[i]->Interest()[k]->ServiceCmd())));
- }
-
- // Loop from last entry to first entry always inserting to same index.
- // Default provider is the first item in list, so if there is a default
- // provider defined, it will be the first one to appear in menus.
- for (TInt j = iMenuBindings[i]->NumberOfProviders() - 1; j >= 0; j--)
- {
- liwPane->SetInitializingOwner(iMenuBindings[i]->MenuProvider(j));
- iMenuBindings[i]->MenuProvider(j)->InitializeMenuPaneHookL(liwPane,
- 0, 0, aInParamList);
- }
-
- GetSubmenuTitle(liwPane->MenuPane(), subTitle);
-
- TLiwPlaceholderType phtype = PlaceholderType(aMenuPane,
- iMenuBindings[i]->MenuCmd(), titleLocked);
-
- if ((phtype == ELiwPlaceholderCascade) ||
- (phtype == ELiwPlaceholderIntelligentCascade))
- {
- if (liwPane->MenuPane().NumberOfItemsInPane() == 1)
- {
- // Remove placeholder item.
- aMenuPane.DeleteMenuItem(iMenuBindings[i]->MenuCmd());
- CleanupStack::PopAndDestroy(liwPane); // liwPane
- continue;
- }
- else if ((liwPane->MenuPane().NumberOfItemsInPane() == 2) &&
- (phtype == ELiwPlaceholderIntelligentCascade))
- {
- UnCascadeL(aMenuPane, iMenuBindings[i]->MenuCmd(), *liwPane);
- User::LeaveIfError(iLastInitialized.Append(liwPane));
- }
- else
- {
- if (titleLocked)
- {
- subTitle.Zero();
- }
- ConvertPlaceholderL(aMenuPane, iMenuBindings[i]->MenuCmd(), *liwPane,
- subTitle);
- }
- }
- else
- {
- // Remove placeholder item.
- aMenuPane.DeleteMenuItem(iMenuBindings[i]->MenuCmd());
-
- // Copy menu items to actual menu pane
- CopyMenuItemsL(liwPane, aMenuPane, index, aUseSubmenuTextsIfAvailable);
- User::LeaveIfError(iLastInitialized.Append(liwPane));
- }
- liwPane->SetMenuResourceId(aMenuResourceId);
- User::LeaveIfError(iMenuPanes.Append(liwPane));
- CleanupStack::Pop(liwPane); // liwPane
- }
- }
- }
- }
-
-
-
-
-TInt CLiwServiceHandlerImpl::ServiceCmdByMenuCmd(TInt aMenuCmdId) const
- {
- for (TInt i = 0; i < iMenuBindings.Count(); i++)
- {
- if ((IsInLastInitialized(iMenuBindings[i]->MenuPane())) &&
- (iMenuBindings[i]->MenuPane()->IsCmdInRange(KPlaceholderCmdIdRange, aMenuCmdId)))
- {
- return iMenuBindings[i]->MenuPane()->ServiceCmdId(aMenuCmdId);
- }
- }
-
- return 0;
- }
-
-
-
-void CLiwServiceHandlerImpl::ExecuteMenuCmdL(
- TInt aMenuCmdId,
- const CLiwGenericParamList& aInParamList,
- CLiwGenericParamList& aOutParamList,
- TUint aCmdOptions,
- MLiwNotifyCallback* aCallback)
- {
- // CCoeEnv/CEikonEnv needs to be accessible.
- if(!iCoeEnv)
- {
- User::Leave(KErrNotSupported);
- }
-
- if (!iMenuBindings.Count())
- {
- return;
- }
-
- // Handle real menu providers.
- for (TInt i = 0; i < iMenuBindings.Count(); i++)
- {
- CLiwMenuPane* menuPane = iMenuBindings[i]->MenuPane();
-
- if (IsInLastInitialized(menuPane))
- {
- for (TInt j = 0; j < iMenuBindings[i]->NumberOfProviders(); j++)
- {
- if ((menuPane->IsCmdInRange(KPlaceholderCmdIdRange, aMenuCmdId)) &&
- (menuPane->CommandOwner(aMenuCmdId) == iMenuBindings[i]->MenuProvider(j)))
- {
- iMenuBindings[i]->MenuProvider(j)->HandleMenuCmdHookL(
- menuPane,
- aMenuCmdId,
- aInParamList,
- aOutParamList,
- aCmdOptions,
- aCallback);
- return;
- }
- }
- }
- }
- }
-
-
-
-void CLiwServiceHandlerImpl::AttachMenuL(TInt aMenuResourceId, TInt aInterestResourceId)
- {
- // CCoeEnv/CEikonEnv needs to be accessible.
- if(!iCoeEnv)
- {
- User::Leave(KErrNotSupported);
- }
-
- RCriteriaArray interest, filtered;
- TResourceReader reader;
-
- CleanupStack::PushL( TCleanupItem( InterestCleanup, &interest ) );
- CleanupStack::PushL( TCleanupItem( FilteredCleanup, &filtered ) );
- iCoeEnv->CreateResourceReaderLC(reader, aInterestResourceId);
- ReadInterestListL(reader, interest);
- CleanupStack::PopAndDestroy(); //reader
- FilterInterestListL(interest, filtered);
-
- iCoeEnv->CreateResourceReaderLC(reader, aMenuResourceId);
- DoAttachMenuL(reader, aMenuResourceId, filtered);
- filtered.Reset();
- CleanupStack::PopAndDestroy(); //reader
- CleanupStack::Pop(&filtered); // filtered
- CleanupStack::Pop(&interest); // interest
- }
-
-
-
-void CLiwServiceHandlerImpl::AttachMenuL(TInt aMenuResourceId, TResourceReader& aReader)
- {
- // CCoeEnv/CEikonEnv needs to be accessible.
- if(!iCoeEnv)
- {
- User::Leave(KErrNotSupported);
- }
-
- RCriteriaArray interest, filtered;
- TResourceReader reader;
-
- CleanupStack::PushL( TCleanupItem( InterestCleanup, &interest ) );
- CleanupStack::PushL( TCleanupItem( FilteredCleanup, &filtered ) );
- ReadInterestListL(aReader, interest);
- FilterInterestListL(interest, filtered);
-
- iCoeEnv->CreateResourceReaderLC(reader, aMenuResourceId);
- DoAttachMenuL(reader, aMenuResourceId, filtered);
- filtered.Reset();
- CleanupStack::PopAndDestroy(); //reader
- CleanupStack::Pop(&filtered); // filtered
- CleanupStack::Pop(&interest); // interest
- }
-
-void CLiwServiceHandlerImpl::AttachMenuL(TInt aMenuResourceId, const RCriteriaArray& aInterest)
- {
- // CCoeEnv/CEikonEnv needs to be accessible.
- if(!iCoeEnv)
- {
- User::Leave(KErrNotSupported);
- }
-
- RCriteriaArray interest, filtered;
- TResourceReader reader;
-
- CleanupStack::PushL( TCleanupItem( InterestCleanup, &interest ) );
- CleanupStack::PushL( TCleanupItem( FilteredCleanup, &filtered ) );
-
- for(TInt i = 0; i < aInterest.Count(); i++)
- {
- CLiwCriteriaItem* item = CLiwCriteriaItem::NewLC();
-
- item->SetId( aInterest[i]->Id() );
- item->SetServiceCmd( aInterest[i]->ServiceCmd() );
- item->SetContentTypeL( aInterest[i]->ContentType() );
- item->SetServiceClass( aInterest[i]->ServiceClass() );
- item->SetOptions( aInterest[i]->Options() );
- item->SetDefaultProvider( (aInterest[i]->DefaultProvider()).iUid );
- item->SetMaxProviders( aInterest[i]->MaxProviders() );
-
- User::LeaveIfError(interest.Append(item));
- CleanupStack::Pop(item);
- }
-
- FilterInterestListL(interest, filtered);
-
- iCoeEnv->CreateResourceReaderLC(reader, aMenuResourceId);
- DoAttachMenuL(reader, aMenuResourceId, filtered);
- filtered.Reset();
- CleanupStack::PopAndDestroy(); //reader
- CleanupStack::Pop(&filtered); // filtered
- CleanupStack::Pop(&interest); // interest
- }
-
-void CLiwServiceHandlerImpl::AttachMenuL(RArray<TInt>& aMenuEntries,
- TInt aMenuResourceId,
- RCriteriaArray& aInterest)
- {
- RCriteriaArray filtered;
-
- CleanupStack::PushL( TCleanupItem( FilteredCleanup, &filtered ) );
- FilterInterestListL(aInterest, filtered);
-
- TInt menuCmd;
- TInt count = aMenuEntries.Count();
- TBool bound;
-
- for (TInt i = 0; i < count; i++)
- {
- menuCmd = aMenuEntries[i];
- CLiwMenuBinding* bind = NULL;
- bound = EFalse;
-
- if (!menuCmd)
- continue;
-
- for (TInt j = 0; j < filtered.Count(); j++)
- {
- if (filtered[j]->Id() == menuCmd)
- {
- if (!bind)
- {
- bind = AlreadyBound(aMenuResourceId, menuCmd, i);
- if (!bind)
- {
- bind = CLiwMenuBinding::NewLC(i, aMenuResourceId);
- bind->SetMenuCmd( menuCmd );
- }
- else
- {
- bound = ETrue;
- }
- }
-
- if (bind->HasCriteriaItem(*(filtered[j])) == KErrNotFound)
- {
- ResolveProvidersL(bind, filtered[j],NULL);
- bind->AddCriteriaL(filtered[j]);
- }
- }
- }
-
- // Initialise providers.
- if (bind)
- {
- for (TInt k = 0; k < bind->NumberOfProviders(); k++)
- {
- bind->MenuProvider(k)->InitialiseL(*this, bind->Interest());
- }
- if (!bound)
- {
- User::LeaveIfError(iMenuBindings.Append( bind ));
- CleanupStack::Pop(bind); // bind
- }
- }
- }
-
- filtered.Reset();
- CleanupStack::Pop(&filtered); // filtered
- }
-
-void CLiwServiceHandlerImpl::DoAttachMenuL(TResourceReader& aReader, TInt aMenuId,
- RCriteriaArray& aInterest)
- {
- TInt menuCmd;
- TInt count = aReader.ReadInt16();
- TBool bound;
-
- for (TInt i = 0; i < count; i++)
- {
- menuCmd = aReader.ReadInt32();
- CLiwMenuBinding* bind = NULL;
- bound = EFalse;
-
- for (TInt j = 0; j < aInterest.Count(); j++)
- {
- if (aInterest[j]->Id() == menuCmd)
- {
- if (!bind)
- {
- bind = AlreadyBound(aMenuId, menuCmd, i);
- if (!bind)
- {
- bind = CLiwMenuBinding::NewLC(i, aMenuId);
- bind->SetMenuCmd( menuCmd );
- }
- else
- {
- bound = ETrue;
- }
- }
-
- if (bind->HasCriteriaItem(*(aInterest[j])) == KErrNotFound)
- {
- ResolveProvidersL(bind, aInterest[j],NULL);
- bind->AddCriteriaL(aInterest[j]);
- }
- }
- }
-
- // Initialise providers.
- if (bind)
- {
- for (TInt k = 0; k < bind->NumberOfProviders(); k++)
- {
- TRAPD(err, bind->MenuProvider(k)->InitialiseL(*this, bind->Interest()));
- if(err)
- {
-#ifdef _DEBUG
- RDebug::Print(_L("LIW PROVIDER ERROR: CLiwServiceIfMenu::InitialiseL() failed, leave code:%d"), err);
-#endif
- // The provider failed to initialise.
- // Remove the failed provider from this menu binding.
- CLiwServiceIfMenu* provider = bind->MenuProvider(k);
- TInt implUid = provider->ImplementationUid().iUid;
- bind->RemoveProvider(implUid);
-
- // Remove the failed provider also from other menu bindings.
- for (TInt m = 0; m < iMenuBindings.Count(); m++)
- {
- iMenuBindings[m]->RemoveProvider(implUid);
- }
-
- // Then remove provider from the owner list and delete it.
- for (TInt m = 0; m < iProviders.Count(); m++)
- {
- if (iProviders[m]->ImplementationUid().iUid == implUid)
- {
- delete iProviders[m];
- iProviders.Remove(m);
- m--;
- }
- }
- }
- }
- if (!bound)
- {
- User::LeaveIfError(iMenuBindings.Append( bind ));
- CleanupStack::Pop(bind); // bind
- }
- }
- SkipMenuFields(aReader); // Jump to next menu item
- }
- }
-
-void CLiwServiceHandlerImpl::ReadInterestL(RCriteriaArray& aInterest, TInt aInterestResourceId)
- {
- CleanupStack::PushL( TCleanupItem( InterestCleanup, &aInterest ) );
- TResourceReader reader;
- iCoeEnv->CreateResourceReaderLC(reader, aInterestResourceId);
- ReadInterestListL(reader, aInterest);
- CleanupStack::PopAndDestroy(); //reader
- CleanupStack::Pop(&aInterest);
- }
-
-
-void CLiwServiceHandlerImpl::DetachMenu(TInt aMenuResourceId, TInt aInterestResourceId)
- {
- // If interest resource id is null, then detach all items in the given menu.
- if (!aInterestResourceId)
- {
- DoDetachMenu(aMenuResourceId);
- }
- else
- {
- // CCoeEnv/CEikonEnv needs to be accessible.
- if(!iCoeEnv)
- {
- // We cannot leave because this is a non-leaving method.
- return;
- }
-
- RCriteriaArray interest;
- TRAPD(err, ReadInterestL(interest, aInterestResourceId));
- if (err)
- {
- return;
- }
-
- DoDetachMenu(aMenuResourceId, interest);
-
- interest.ResetAndDestroy();
- }
- }
-
-
-void CLiwServiceHandlerImpl::DoDetachMenu(TInt aMenuResourceId)
- {
- // First, delete the relevant menu bindings.
- for (TInt i = 0; i < iMenuBindings.Count(); i++)
- {
- if (iMenuBindings[i]->MenuId() == aMenuResourceId)
- {
- delete iMenuBindings[i];
- iMenuBindings.Remove(i);
- i--;
- }
- }
-
- // Then check if there were left obselete criteria items and remove them.
- RemoveObsoleteCriteriaItems();
-
- // Finally check if there were left obselete providers and remove them.
- RemoveObsoleteProviders();
- }
-
-
-void CLiwServiceHandlerImpl::DoDetachMenu(TInt aMenuResourceId, RCriteriaArray& aInterest)
- {
- // First, remove relevant criteria items from relevant menu bindings.
- for (TInt i = 0; i < iMenuBindings.Count(); i++)
- {
- if (iMenuBindings[i]->MenuId() == aMenuResourceId)
- {
- for (TInt j = 0; j < aInterest.Count(); j++)
- {
- TInt index = iMenuBindings[i]->HasCriteriaItem(*aInterest[j]);
- if (index != KErrNotFound)
- {
- iMenuBindings[i]->RemoveCriteria(index);
- }
- }
- }
- }
-
- // Second pass removes empty bindings.
- for (TInt i = 0; i < iMenuBindings.Count(); i++)
- {
- if (iMenuBindings[i]->Interest().Count() == 0)
- {
- delete iMenuBindings[i];
- iMenuBindings.Remove(i);
- i--;
- }
- }
-
- // Then check if there were left obselete criteria items and remove them.
- RemoveObsoleteCriteriaItems();
-
- // Finally check if there were left obselete providers and remove them.
- RemoveObsoleteProviders();
- }
-
-
-void CLiwServiceHandlerImpl::RemoveObsoleteCriteriaItems()
- {
- for (TInt i = 0; i < iInterestList.Count(); i++)
- {
- CLiwCriteriaItem* criteria = iInterestList[i];
- TBool found = EFalse;
-
- // Loop through base bindings.
- for (TInt j = 0; j < iBaseBindings.Count(); j++)
- {
- if (iBaseBindings[j]->HasCriteriaItem(*criteria) != KErrNotFound)
- {
- found = ETrue;
- break;
- }
- }
-
- // If still not found, loop through menu bindings.
- if (!found)
- {
- for (TInt j = 0; j < iMenuBindings.Count(); j++)
- {
- if (iMenuBindings[j]->HasCriteriaItem(*criteria) != KErrNotFound)
- {
- found = ETrue;
- break;
- }
- }
- }
-
- // Criteria item can be deleted if it was not found.
- if (!found)
- {
- delete iInterestList[i];
- iInterestList.Remove(i);
- i--;
- }
- }
- }
-
-
-void CLiwServiceHandlerImpl::RemoveObsoleteProviders()
- {
- for (TInt i = 0; i < iProviders.Count(); i++)
- {
- CLiwServiceIfBase* provider = iProviders[i];
- TBool found = EFalse;
-
- // Loop through base bindings.
- for (TInt j = 0; j < iBaseBindings.Count(); j++)
- {
- if (iBaseBindings[j]->HasProvider(provider))
- {
- found = ETrue;
- break;
- }
- }
-
- // If still not found, loop through menu bindings.
- if (!found)
- {
- for (TInt j = 0; j < iMenuBindings.Count(); j++)
- {
- if (iMenuBindings[j]->HasProvider(provider))
- {
- found = ETrue;
- break;
- }
- }
- }
-
- // Criteria item can be deleted if it was not found.
- if (!found)
- {
- delete iProviders[i];
- iProviders.Remove(i);
- i--;
- }
- }
- }
-
-
-TBool CLiwServiceHandlerImpl::IsSubMenuEmpty(TInt aSubMenuId)
- {
- for (TInt i = 0; i < iMenuBindings.Count(); i++)
- {
- if (iMenuBindings[i]->MenuId() == aSubMenuId)
- {
- if (iMenuBindings[i]->NumberOfProviders() > 0)
- {
- return EFalse;
- }
-
- return ETrue;
- }
- }
-
- return EFalse;
- }
-
-
-
-
-CLiwMenuBinding* CLiwServiceHandlerImpl::AlreadyBound(TInt aMenuId, TInt aMenuCmd,
- TInt aMenuItemIndex) const
- {
- for (TInt i = 0; i < iMenuBindings.Count(); i++)
- {
- if ((iMenuBindings[i]->MenuId() == aMenuId) &&
- (iMenuBindings[i]->MenuCmd() == aMenuCmd) &&
- (iMenuBindings[i]->MenuItemIndex() == aMenuItemIndex))
- {
- return iMenuBindings[i];
- }
- }
-
- return NULL;
- }
-
-
-void CLiwServiceHandlerImpl::ExecuteServiceCmdL(
- const TInt& aCmdId,
- const CLiwGenericParamList& aInParamList,
- CLiwGenericParamList& aOutParamList,
- TUint aCmdOptions,
- MLiwNotifyCallback* aCallback)
- {
- for (TInt i = 0; i < iBaseBindings.Count(); i++)
- {
- if(iBaseBindings[i]->HasServiceCmd(aCmdId))
- {
- for (TInt j = 0; j < iBaseBindings[i]->NumberOfProviders(); j++)
- {
- iBaseBindings[i]->BaseProvider(j)->HandleServiceCmdL(aCmdId,
- aInParamList, aOutParamList, aCmdOptions, aCallback);
- }
- }
- }
-}
-
-void CLiwServiceHandlerImpl::ExecuteServiceCmdL(
- const CLiwCriteriaItem& aCmd,
- const CLiwGenericParamList& aInParamList,
- CLiwGenericParamList& aOutParamList,
- TUint aCmdOptions,
- MLiwNotifyCallback* aCallback)
- {
- for (TInt i = 0; i < iBaseBindings.Count(); i++) {
- for (TInt k = 0; k < iBaseBindings[i]->Interest().Count(); k++) {
- if ((iBaseBindings[i]->Interest()[k]->ServiceCmd() == KLiwCmdAsStr) &&
- (aCmd.ServiceCmd() == KLiwCmdAsStr) &&
- (iBaseBindings[i]->Interest()[k]->ServiceCmdStr() == aCmd.ServiceCmdStr()) &&
- (iBaseBindings[i]->Interest()[k]->ContentType() == aCmd.ContentType()))
- {
- //call only one provider
- if (iBaseBindings[i]->NumberOfProviders() > 0) {
- iBaseBindings[i]->BaseProvider(0)->HandleServiceCmdL(aCmd.ServiceCmdStr(),
- aInParamList, aOutParamList, aCmdOptions, aCallback);
- }
- }
- }
- }
- }
-
-void CLiwServiceHandlerImpl::ReadInterestListL(TResourceReader& aReader,
- RPointerArray<CLiwCriteriaItem>& aResult)
- {
- const TInt count = aReader.ReadInt16();
- for (TInt ii = 0; ii < count; ++ii)
- {
- CLiwCriteriaItem* item = CLiwCriteriaItem::NewLC();
- item->ReadFromResoureL( aReader );
- User::LeaveIfError(aResult.Append(item));
- CleanupStack::Pop(item); // item
- }
- }
-
-/* Parses the metadata information stored in the opaque_data field
- * of service provider registration information \c REGISTRY_INFO.
- *
- * The metadata information is seprated from the service command definition
- * in the opaque_data field using a separator "::".
- *
- * @param aOpaque the opaque_data values specified in the registration information
- * @param aMetaData the parsed metadata entries will be stored in this variable
- *
- */
-void CLiwServiceHandlerImpl::ParseMetaData(const TDesC8& aOpaque, TDes8& aMetaData)
- {
-
- _LIT8(serviceCmdSeparator, "::");
- const TInt metaDataStartPos=2;
-
- TInt separatorPos = aOpaque.Find(serviceCmdSeparator);
-
- if (separatorPos != KErrNotFound)
- {
- // Find the first section, up to the separator
- separatorPos += metaDataStartPos;
- aMetaData.Copy(aOpaque.Mid(separatorPos,aOpaque.Length()-separatorPos));
- }
- }
-
-/*
- QueryImplementationL finds the providers that match the given criteria item that is passed as the parameters
-*/
-void CLiwServiceHandlerImpl::QueryImplementationL(CLiwCriteriaItem* aItem, RCriteriaArray& aProviderList)
- {
- RImplInfoPtrArray infoArray;
- _LIT8(KWild,"*");
-
- if(0 == aItem->ContentType().Compare(KNullDesC8))
- aItem->SetContentTypeL(KWild);
-
- if(0 == aItem->ServiceCmdStr().Compare(KNullDesC8))
- aItem->SetServiceCmdL(KWild);
-
- //to fetch the infoArray
- QueryImplementationL(aItem,infoArray);
-
- CLiwXmlHandler* pXmlHandler = CLiwXmlHandler::NewLC();
-
- CLiwServiceData* pServiceData = NULL;
-
- TInt versionCheck = 0;
-
- for (TInt index = 0; index < infoArray.Count(); ++index)
- {
- if ((aItem->Options() & LIW_OPTIONS_ROM_ONLY) && (infoArray[index]->RomBased() == EFalse))
- {
- continue;
- }
-
- CImplementationInformation* pImplInfo = infoArray[index];
- const TInt separatorLength = KDataSeparator().Length();//find "||"
- TInt separatorPos = pImplInfo->OpaqueData().Find(KDataSeparator);
-
- TInt leftExtractPos = 0;
- TBool separatorFound = EFalse;
-
- do
- {
- //Constructing the Criteria Item and appending to providerList
- CLiwCriteriaItem* item = CLiwCriteriaItem::NewLC(); //iCriteriaId & iServiceCmd are ignored...
- item->SetServiceClass(TUid::Uid(KLiwClassBase));
- item->SetContentTypeL(infoArray[index]->DataType());
-
- TBuf8<KMaxLength> sName;
- TBuf8<KMaxLength> opaq;
-
- if(separatorPos != KErrNotFound && (leftExtractPos < separatorPos))
- {
- separatorFound = ETrue;
- sName = pImplInfo->OpaqueData().Mid(leftExtractPos, separatorPos-leftExtractPos); //ServiceName
- leftExtractPos = separatorLength + separatorPos;
- TPtrC8 remainingData = pImplInfo->OpaqueData().Mid(separatorPos + separatorLength);
- separatorPos = remainingData.Find(KDataSeparator) + separatorPos + separatorLength;
- }
- else
- {
- separatorFound = EFalse;
- TInt mDataSepPos = pImplInfo->OpaqueData().Find(serviceCmdSeparator);
- if(mDataSepPos != KErrNotFound)
- sName = pImplInfo->OpaqueData().Mid(leftExtractPos, mDataSepPos - leftExtractPos);
- else
- sName = pImplInfo->OpaqueData().Mid(leftExtractPos);
- }
-
- //check for wildcard character *
- //if yes, return immediatly
- if(0 == aItem->ServiceCmdStr().Compare(sName) || 0 == aItem->ServiceCmdStr().Compare(KWild))
- {
- //parse metadata and if metadata valid,
- //setmetadataoptions to criteriaitem..
- pServiceData = CLiwServiceData::NewLC();
- TInt loadStatus = CLiwXmlHandler::ESrvDataLoadFailed;
-
- ParseMetaData(pImplInfo->OpaqueData(),opaq);
-
- //Inline metadata defined
- if(opaq.Length()>0)
- {
- loadStatus=pXmlHandler->LoadServiceData(opaq,pServiceData);
- }
- else
- {
- //Obtain the capabilities from the metadata
- TUid implUid = pImplInfo->ImplementationUid();
- TUidName srvProvUid = implUid.Name();
-
- TPtrC16 ptrSrv = srvProvUid.Right(srvProvUid.Length()-1);
- TPtrC16 srvFile = ptrSrv.Left(ptrSrv.Length()-1);
- TDriveUnit driveUnit = pImplInfo->Drive();
- TFileName fileName = driveUnit.Name();
- fileName.Append(KDC_RESOURCE_FILES_DIR);
- fileName.Append(srvFile);
- fileName.Append(KPerExtension);
- loadStatus=pXmlHandler->LoadServiceData(fileName,pServiceData);
- }
-
- if(CLiwXmlHandler::ESrvDataLoadSuccess==loadStatus)
- {
- versionCheck = 0;
-
- TReal implVersion(KDefVersion);
- this->ComputeIntfVersion(pServiceData,implVersion); //fetch impl version..
-
- TReal minVer(KDefVersion);
- TReal maxVer(KUnspVersion);
-
- if(this->GetVersionRange(aItem,minVer,maxVer)) //Get version queried by consumer
- {
- if(minVer == KUnspVersion)
- minVer = KDefVersion;
-
- //perform comparison...
- if(maxVer!=KUnspVersion)
- {
- if((implVersion>=minVer) && (implVersion<=maxVer))
- {
- versionCheck = 1;
- //current impl is the best choice..this is THE CHOSEN ONE..
- }
- }
- else
- {
- //means maxVer == KUnspVersion
- if(implVersion>=minVer)
- {
- versionCheck = 1;
-
- //current impl is the best choice..this is THE CHOSEN ONE..
- }
- }
- }
- }
- else //means no metadata information
- {
- versionCheck = 1;
- }
-
- if(versionCheck)
- {
- //Since version matches, this item is appended to the providerList
- //before which the metadata information is SET
- CLiwMap* metadataMap = CLiwDefaultMap::NewLC();
-
- CLiwGenericParamList* pMetaData = pServiceData->GetMetaData();
-
- for(TInt mdataIdx(0); mdataIdx<pMetaData->Count(); ++mdataIdx)
- {
- TLiwGenericParam param;
- pMetaData->AtL(mdataIdx,param);
- metadataMap->InsertL(param.Name(),param.Value());
- param.Reset();
- }
-
- TLiwVariant mdataVar(metadataMap);
- mdataVar.PushL();
-
- item->SetMetaDataOptions(mdataVar);
-
- item->SetServiceCmdL(sName);
- CleanupStack::Pop(&mdataVar);
- mdataVar.Reset();
-
- CleanupStack::Pop(metadataMap);
- metadataMap->DecRef();
-
- User::LeaveIfError(aProviderList.Append(item));
- }
-
- if(pServiceData)
- pServiceData->CleanUpMetaData();
-
- CleanupStack::PopAndDestroy(pServiceData); //pServiceData::CLiwServiceData*
- CleanupStack::Pop(item); //item::CLiwCriteriaItem*
- }
- else
- {
- CleanupStack::PopAndDestroy(item); //item::CLiwCriteriaItem*
- }
- }while(separatorFound);
- }// end of outer for loop
-
- CleanupStack::PopAndDestroy(pXmlHandler); //pXmlHandler::CLiwXMLHandler*
- infoArray.ResetAndDestroy();
- }
-
-
-void CLiwServiceHandlerImpl::QueryImplementationL(CLiwCriteriaItem* aItem, RImplInfoPtrArray& infoArray)
- {
- iEcomMonitor->ListImplemetationsL(infoArray, (CLiwCriteriaItem*)aItem);
- }
-
-
-void CLiwServiceHandlerImpl::FilterInfoArray(RImplInfoPtrArray& aArray,
- RArray<TInt32>& aArrayPlugin,
- CLiwCriteriaItem* aItem)
- {
- if (aItem->MaxProviders() <= 0)
- {
- aArray.ResetAndDestroy();
- aArrayPlugin.Reset();
- }
- else
- {
- while ((aArray.Count() + aArrayPlugin.Count()) > aItem->MaxProviders())
- {
- if (aArrayPlugin.Count() == 0)
- break;
- // Skip default provider.
- if (aArrayPlugin[0] == aItem->DefaultProvider())
- {
- if (aArrayPlugin.Count() == 1)
- break;
- aArrayPlugin.Remove(1);
- }
- else
- {
- aArrayPlugin.Remove(0);
- }
- }
-
- while ((aArray.Count() + aArrayPlugin.Count()) > aItem->MaxProviders())
- {
- // Skip default provider.
- if (aArray[0]->ImplementationUid() == aItem->DefaultProvider())
- {
- delete aArray[1];
- aArray.Remove(1);
- }
- else
- {
- delete aArray[0];
- aArray.Remove(0);
- }
- }
- }
- }
-
-
-
-TBool CLiwServiceHandlerImpl::IsCached(CLiwServiceIfBase* /*aProvider*/)
- {
- return EFalse;
- }
-
-
-CLiwGenericParamList& CLiwServiceHandlerImpl::InParamListL()
- {
- if (!iInParams)
- {
- iInParams = CLiwGenericParamList::NewL();
- }
- iInParams->Reset();
- return *iInParams;
- }
-
-
-
-CLiwGenericParamList& CLiwServiceHandlerImpl::OutParamListL()
- {
- if (!iOutParams)
- {
- iOutParams = CLiwGenericParamList::NewL();
- }
- iOutParams->Reset();
- return *iOutParams;
- }
-
-
-
-TBool CLiwServiceHandlerImpl::IsInLastInitialized(CLiwMenuPane* liwPane) const
- {
- if (liwPane)
- {
- if (iSubmenu == liwPane)
- {
- return ETrue;
- }
-
- for (TInt i = 0; i < iLastInitialized.Count(); i++)
- {
- if (iLastInitialized[i] == liwPane)
- {
- return ETrue;
- }
- }
- }
-
- return EFalse;
- }
-
-
-TInt CLiwServiceHandlerImpl::HandleNotifyL(
- TInt /*aCmdId*/,
- TInt /*aEventId*/,
- CLiwGenericParamList& /*aEventParamList*/,
- const CLiwGenericParamList& /*aInParamList*/)
- {
- return KErrNone;
- }
-
-
-// CEikMenuPane::ConstructFromresourceL is defined as 'protected' so
-// we have to use a wrapper class for accessing it.
-class CLiwMenuResource : public CEikMenuPane
- {
- public:
- CLiwMenuResource() : CEikMenuPane(NULL) {}
- CLiwMenuResource(MEikMenuObserver* aObserver) : CEikMenuPane(aObserver) {}
-
- void CreateL(TResourceReader& aReader)
- {
- ConstructFromResourceL(aReader);
- }
- };
-
-
-CLiwMenuPane* CLiwServiceHandlerImpl::CreateEmptyLiwMenuPaneL(TInt aBaseMenuCmdId,
- TInt aResourceId)
- {
- CLiwMenuPane* result = NULL;
- TResourceReader reader;
-
- TInt id;
- if(aResourceId >= 0)
- {
- // Use existing id.
- id = aResourceId;
- }
- else
- {
- // Create new id.
- id = ResourceIdForNextFreeSlot();
- if (id < 0)
- {
- User::Leave(KErrOverflow);
- }
- }
- iCoeEnv->CreateResourceReaderLC(reader, id);
-
- CLiwMenuResource* pane = new (ELeave) CLiwMenuResource(this);
- CleanupStack::PushL(pane);
- pane->ConstructL(NULL);
- pane->CreateL(reader);
-
- result = new (ELeave) CLiwMenuPane(*pane, aBaseMenuCmdId);
-
- CleanupStack::Pop(pane);
- CleanupStack::PopAndDestroy(); //reader
-
- result->SetResourceSlotId( id );
-
- return result;
- }
-
-
-void CLiwServiceHandlerImpl::DeleteLiwMenuPane(CLiwMenuPane* aLiwPane)
- {
- delete aLiwPane->iMenuPane;
- aLiwPane->iMenuPane = NULL;
-
- // Reset iIdMap and extraText.
- for(TInt i = 0; i < aLiwPane->iIdMap.Count(); i++)
- {
- aLiwPane->iIdMap[i].extraText.Close();
- }
- aLiwPane->iIdMap.Reset();
-
- // Remove the liw menu pane from iMenuPanes array.
- for(TInt i = 0; i < iMenuPanes.Count(); i++)
- {
- if(iMenuPanes[i] == aLiwPane)
- {
- iMenuPanes.Remove(i);
- break;
- }
- }
-
- // Remove the liw menu pane from iMenuLastInitialized array.
- for(TInt i = 0; i < iLastInitialized.Count(); i++)
- {
- if(iLastInitialized[i] == aLiwPane)
- {
- iLastInitialized.Remove(i);
- break;
- }
- }
-
- delete aLiwPane;
- aLiwPane = NULL;
- }
-
-const TInt resourceSlotIds[KMaxMenuResources] =
- {
- R_LIW_EMPTY_MENU_0,
- R_LIW_EMPTY_MENU_1,
- R_LIW_EMPTY_MENU_2,
- R_LIW_EMPTY_MENU_3,
- R_LIW_EMPTY_MENU_4,
- R_LIW_EMPTY_MENU_5,
- R_LIW_EMPTY_MENU_6,
- R_LIW_EMPTY_MENU_7,
- R_LIW_EMPTY_MENU_8,
- R_LIW_EMPTY_MENU_9,
- R_LIW_EMPTY_MENU_10,
- R_LIW_EMPTY_MENU_11,
- R_LIW_EMPTY_MENU_12,
- R_LIW_EMPTY_MENU_13,
- R_LIW_EMPTY_MENU_14,
- R_LIW_EMPTY_MENU_15
- };
-
-
-TInt CLiwServiceHandlerImpl::ResourceIdForNextFreeSlot()
- {
- if (iNextFreeSlot < KMaxMenuResources)
- {
- return resourceSlotIds[iNextFreeSlot++];
- }
-
- return -1;
- }
-
-
-void CLiwServiceHandlerImpl::SetEmphasis(CCoeControl* /*aMenuControl*/,TBool /*aEmphasis*/)
- {
- }
-
-
-void CLiwServiceHandlerImpl::ProcessCommandL(TInt /*aCommandId*/)
- {
- }
-
-
-// Rewrite this method. It doesn't make sense. Variable j is not used at all.
-TInt CLiwServiceHandlerImpl::MenuCmdId(TInt aMenuCmdId) const
- {
- TInt ret( KErrNotFound );
-
- for (TInt i = 0; i < iMenuBindings.Count() && (ret == KErrNotFound); i++)
- {
- for (TInt j = 0; j < iMenuBindings[i]->NumberOfProviders() && (ret == KErrNotFound); j++)
- {
- if ((IsInLastInitialized(iMenuBindings[i]->MenuPane())) &&
- (iMenuBindings[i]->MenuPane()->IsCmdInRange(KPlaceholderCmdIdRange, aMenuCmdId)) &&
- (ret == KErrNotFound ))
- {
- ret = iMenuBindings[i]->MenuPane()->MenuCmdId(aMenuCmdId);
- }
- }
- }
-
- return ret;
- }
-
-
-void Cleanup( TAny* aAny )
- {
- RImplInfoPtrArray* implArray =
- reinterpret_cast< RImplInfoPtrArray*> ( aAny );
- implArray->ResetAndDestroy();
- implArray->Close();
- }
-
-
-void InterestCleanup( TAny* aAny )
- {
- RPointerArray<CLiwCriteriaItem>* interestArray =
- reinterpret_cast<RPointerArray<CLiwCriteriaItem>*> ( aAny );
-
- interestArray->ResetAndDestroy();
- }
-
-void FilteredCleanup( TAny* aAny )
- {
- RPointerArray<CLiwCriteriaItem>* filteredArray =
- reinterpret_cast<RPointerArray<CLiwCriteriaItem>*> ( aAny );
-
- filteredArray->Reset();
- }
-
-
-void IntArrayCleanup(TAny* aAny)
- {
- RArray<TInt>* intArray =
- reinterpret_cast<RArray<TInt>*> ( aAny );
-
- intArray->Close();
- }
-
-void Int32ArrayCleanup(TAny* aAny)
- {
- RArray<TInt32>* intArray =
- reinterpret_cast<RArray<TInt32>*> ( aAny );
-
- intArray->Close();
- }
-
-void InterfaceCleanup( TAny* aAny )
- {
- MLiwInterface* interface = reinterpret_cast<MLiwInterface*>(aAny);
- interface->Close();
- }
-
-void CLiwServiceHandlerImpl::CopyMenuItemsL(CLiwMenuPane* aSource, CEikMenuPane& aDest,
- TInt aStartIndex, TBool aIsSubmenu)
- {
- TInt cmdId;
- TInt inPos = aStartIndex;
-
- for (TInt i = 0; i < aSource->MenuPane().NumberOfItemsInPane(); i++)
- {
- cmdId = aSource->FindCmdId(i);
- if (cmdId >= 0)
- {
- CEikMenuPaneItem::SData itemData = aSource->MenuPane().ItemData(cmdId);
-
- // The menu item might include alternative texts for a main menu level
- // and for submenu. Use submenu string if it is intended so.
- if(aIsSubmenu)
- {
- const TDesC& extraText = aSource->ExtraText(cmdId);
- if(extraText.Length())
- {
- itemData.iText.Zero();
- itemData.iText.Append(extraText);
- }
- }
-
- aDest.InsertMenuItemL(itemData, inPos++);
- }
- }
- }
-
-
-
-TInt CLiwServiceHandlerImpl::SlotItemCmd(CEikMenuPane& aPane)
- {
- TInt index;
-
- for (TInt i = 0; i < KMaxMenuResources; i++)
- {
- if (aPane.MenuItemExists(ELiwMenuSlotBase + i, index))
- {
- return ELiwMenuSlotBase + i;
- }
- }
-
- return -1;
- }
-
-
-
-CLiwMenuPane* CLiwServiceHandlerImpl::MenuPaneForSlotCmd(TInt aCmdId)
- {
- TInt index = aCmdId - ELiwMenuSlotBase;
-
- if (index < KMaxMenuResources)
- {
- TInt resId = resourceSlotIds[index];
- for (TInt i = 0; i < iMenuPanes.Count(); i++)
- {
- if (iMenuPanes[i]->ResourceSlotId() == resId)
- {
- return iMenuPanes[i];
- }
- }
- }
-
- return NULL;
- }
-
-
-
-CLiwServiceHandlerImpl::TLiwPlaceholderType CLiwServiceHandlerImpl::PlaceholderType(
- CEikMenuPane& aPane, TInt aCmd, TBool& aTitleLocked)
- {
- CEikMenuPaneItem::SData& itemData = aPane.ItemData(aCmd);
-
- aTitleLocked = EFalse;
-
- if ((itemData.iCascadeId & LIW_CASCADE_ID) == LIW_CASCADE_ID)
- {
- if (itemData.iCascadeId & LIW_LOCK_SUBMENU_TITLE)
- {
- aTitleLocked = ETrue;
- }
- return ELiwPlaceholderCascade;
- }
- else if ((itemData.iCascadeId & LIW_INTELLIGENT_CASCADE_ID) == LIW_INTELLIGENT_CASCADE_ID)
- {
- if (itemData.iCascadeId & LIW_LOCK_SUBMENU_TITLE)
- {
- aTitleLocked = ETrue;
- }
- return ELiwPlaceholderIntelligentCascade;
- }
-
- return ELiwPlaceholderNormal;
- }
-
-
-
-void CLiwServiceHandlerImpl::ConvertPlaceholderL(CEikMenuPane& aPane, TInt aCmd,
- CLiwMenuPane& aLiwPane, const TDesC& aTitle)
- {
- CEikMenuPaneItem::SData itemData = aPane.ItemData(aCmd);
- TInt index;
-
- // Remenber index.
- aPane.MenuItemExists(aCmd, index);
-
- // Remove placeholder item.
- aPane.DeleteMenuItem(aCmd);
-
- // Replace liw cascade id with actual menu resource id.
- itemData.iCascadeId = aLiwPane.iResourceSlotId;
-
- if (aTitle.Length())
- {
- itemData.iText.Copy(aTitle);
- }
-
- // Set unused dynamic cmd id.
- itemData.iCommandId = iSubmenuCmd++;
-
- // Insert cascade item.
- aPane.InsertMenuItemL(itemData, index);
- }
-
-
-
-void CLiwServiceHandlerImpl::UnCascadeL(CEikMenuPane& aPane, TInt aCmd, CLiwMenuPane& aLiwPane)
- {
- CEikMenuPaneItem::SData itemData = aLiwPane.MenuPane().ItemData(aLiwPane.FindCmdId(0));
- TInt index;
-
- // Remenber index.
- aPane.MenuItemExists(aCmd, index);
-
- // Remove placeholder item.
- aPane.DeleteMenuItem(aCmd);
-
- // Uncascade
- itemData.iCascadeId = 0;
-
- // Insert cascade item.
- aPane.InsertMenuItemL(itemData, index);
- }
-
-
-
-void CLiwServiceHandlerImpl::SkipMenuFields(TResourceReader& aReader)
- {
- aReader.ReadInt32(); // Skip cascade id
- aReader.ReadInt32(); // Skip flags
- aReader.ReadTPtrC(); // Skip text
- aReader.ReadTPtrC(); // Skip extra text
- aReader.ReadTPtrC(); // Skip bmpfile.
- aReader.ReadInt16(); // Skip bmpid.
- aReader.ReadInt16(); // Skip bmpmask.
- aReader.ReadInt32(); // Skip extension.
- }
-
-
-TBool CLiwServiceHandlerImpl::IsLiwMenu(TInt aMenuResourceId)
- {
- TInt index;
-
- // First check if this is liw submenu id
- for (index = 0; index < KMaxMenuResources; index++)
- {
- if (aMenuResourceId == resourceSlotIds[index])
- {
- return ETrue;
- }
- }
-
- // Then check if this menu is among attached menus.
- for (index = 0; index < iMenuBindings.Count(); index++)
- {
- if (iMenuBindings[index]->MenuId() == aMenuResourceId)
- {
- return ETrue;
- }
- }
-
- return EFalse;
- }
-
-
-
-TBool CLiwServiceHandlerImpl::HandleSubmenuL(CEikMenuPane& aPane)
- {
- TInt slotcmd = SlotItemCmd(aPane);
- if (slotcmd >= 0)
- {
- // aPane is liw submenu. At this point it is empty and we must
- // copy provider menu items to it.
- CLiwMenuPane* liwPane = MenuPaneForSlotCmd(slotcmd);
- if (liwPane)
- {
- CopyMenuItemsL(liwPane, aPane, 0, ETrue);
- aPane.DeleteMenuItem(slotcmd);
- iSubmenu = liwPane;
- return ETrue;
- }
- }
-
- return EFalse;
- }
-
-
-
-TBool CLiwServiceHandlerImpl::GetSubmenuTitle(CEikMenuPane& aPane, TDes& aResult)
- {
- TInt index;
-
- aResult.Zero();
- while (aPane.MenuItemExists(LIW_SUBMENU_TITLE, index))
- {
- CEikMenuPaneItem::SData& itemData = aPane.ItemData(LIW_SUBMENU_TITLE);
- if (aResult.Length() == 0)
- {
- aResult.Copy(itemData.iText);
- }
- aPane.DeleteMenuItem(LIW_SUBMENU_TITLE);
- return ETrue;
- }
-
- return EFalse;
- }
-
-
-
-CLiwCriteriaItem* CLiwServiceHandlerImpl::ConvertCriteriaItemPointerL(CLiwCriteriaItem* aCandidate)
- {
- for (TInt index = 0; index < iInterestList.Count(); index++)
- {
- if ((*iInterestList[index]) == (*aCandidate))
- {
- // Already in list, aCandidate is not needed.
- delete aCandidate;
- return iInterestList[index];
- }
- }
-
- CleanupStack::PushL(aCandidate);
- User::LeaveIfError(iInterestList.Append(aCandidate));
- CleanupStack::Pop(aCandidate); // aCandidate
-
- return aCandidate;
- }
-
-
-
-void CLiwServiceHandlerImpl::FilterInterestListL(RPointerArray<CLiwCriteriaItem>& aOrginal,
- RPointerArray<CLiwCriteriaItem>& aFiltered)
- {
- CLiwCriteriaItem* item;
-
- while (aOrginal.Count() > 0)
- {
- item = aOrginal[0];
- aOrginal.Remove(0);
- item = ConvertCriteriaItemPointerL(item);
- User::LeaveIfError(aFiltered.Append(item));
- }
- aOrginal.Reset();
- }
-
-
-
-void CLiwServiceHandlerImpl::RemoveProvider(TInt aImplUid)
- {
- TInt index;
-
- // First go through bindings and remove all the
- // references to given provider.
- for (index = 0; index < iBaseBindings.Count(); index++)
- {
- iBaseBindings[index]->RemoveProvider(aImplUid);
- }
-
- for (index = 0; index < iMenuBindings.Count(); index++)
- {
- iMenuBindings[index]->RemoveProvider(aImplUid);
- }
-
- // Then remove provider from the owner list and delete it.
- for (index = 0; index < iProviders.Count(); index++)
- {
- if (iProviders[index]->ImplementationUid().iUid == aImplUid)
- {
- delete iProviders[index];
- iProviders.Remove(index);
- index--;
- }
- }
- }
-
-
-void CLiwServiceHandlerImpl::AddProviderL(TUid aImplUid, CLiwCriteriaItem* aItem)
- {
- TInt index;
- CLiwServiceIfBase* iface = iEcomMonitor->CreateImplementationL(aImplUid);
-
- if (iface)
- {
- CleanupStack::PushL(iface);
- iface->AddCriteria(aItem);
- User::LeaveIfError(iProviders.Append( iface ));
- CleanupStack::Pop(iface);
-
- for (index = 0; index < iBaseBindings.Count(); index++)
- {
- if (iBaseBindings[index]->HasCriteriaItem(*aItem) != KErrNotFound)
- {
- iBaseBindings[index]->AddProviderL(iface, aImplUid == aItem->DefaultProvider());
- iface->InitialiseL(*this, iBaseBindings[index]->Interest());
- }
- }
-
- for (index = 0; index < iMenuBindings.Count(); index++)
- {
- if (iMenuBindings[index]->HasCriteriaItem(*aItem) != KErrNotFound)
- {
- iMenuBindings[index]->AddProviderL(iface, aImplUid == aItem->DefaultProvider());
- iface->InitialiseL(*this, iMenuBindings[index]->Interest());
- }
- }
- }
- }
-
-
-
-TInt CLiwServiceHandlerImpl::SynchronizeCallBack(TAny* aImpl)
- {
- CLiwServiceHandlerImpl* impl = reinterpret_cast<CLiwServiceHandlerImpl*>(aImpl);
- TRAPD(err, impl->SynchronizeDbL());
- return err;
- }
-
-
-
-void CLiwServiceHandlerImpl::SynchronizeDbL()
- {
- TInt index;
- RArray<TInt> providers;
- RImplInfoPtrArray infoArray;
-
- CleanupStack::PushL( TCleanupItem( IntArrayCleanup, &providers ) );
- CleanupStack::PushL( TCleanupItem( Cleanup, &infoArray ) );
-
- for (index = 0; index < iInterestList.Count(); index++)
- {
- if (iInterestList[index]->RomOnly()) // Rom-only criterias can be skipped.
- {
- continue;
- }
-
- providers.Reset();
- infoArray.ResetAndDestroy();
- ListProvidersForCriteriaL(providers, *(iInterestList[index]));
- iEcomMonitor->ListImplemetationsL(infoArray, iInterestList[index]);
- HandleRemovedProviders(providers, infoArray);
- HandleNewProvidersL(providers, infoArray, iInterestList[index]);
- }
-
- CleanupStack::PopAndDestroy(&infoArray); // providers, infoArray
- CleanupStack::PopAndDestroy(&providers);
- }
-
-
-void CLiwServiceHandlerImpl::HandleRemovedProviders(RArray<TInt>& aInMemory,
- RImplInfoPtrArray& aInSystem)
- {
- TInt index, index2;
-
- for (index = 0; index < aInMemory.Count(); index++)
- {
- for (index2 = 0; index2 < aInSystem.Count(); index2++)
- {
- if (aInSystem[index2]->ImplementationUid().iUid == aInMemory[index])
- {
- break;
- }
- }
- if (index2 >= aInSystem.Count()) // Was removed from system.
- {
- RemoveProvider(aInMemory[index]);
- }
- }
- }
-
-
-void CLiwServiceHandlerImpl::HandleNewProvidersL(RArray<TInt>& aInMemory,
- RImplInfoPtrArray& aInSystem, CLiwCriteriaItem* aItem)
- {
- TInt index;
-
- for (index = 0; index < aInSystem.Count(); index++)
- {
- if (aInMemory.Find(aInSystem[index]->ImplementationUid().iUid) == KErrNotFound)
- {
- AddProviderL(aInSystem[index]->ImplementationUid(), aItem);
- }
- }
- }
-
-void CLiwServiceHandlerImpl::MenuLaunched()
- {
- ClearMenuPaneArray();
- iNextFreeSlot = 0;
- iLastInitialized.Reset();
-
- // Reset the iMenuPane pointers from iMenuBindings.
- for(TInt index = 0; index < iMenuBindings.Count(); index++)
- {
- iMenuBindings[index]->SetMenuPane(NULL);
- }
- }
-
-/* Utility function to get the symbian TCapability enum value
- * from the string defined in the providers xml file
- *
- * @param aCapName name of the capabiility to be converted to \c TCapability enum
- *
- */
-
-TCapability CLiwServiceHandlerImpl::GetServiceCapability(const TDesC& aCapName)
-{
- TCapability cap(ECapability_None);
-
- if(0==aCapName.Compare(KCapabilityCommDD))
- {
- cap=ECapabilityCommDD;
- }
- else if(0==aCapName.Compare(KCapabilityPowerMgmt))
- {
- cap=ECapabilityPowerMgmt;
- }
- else if(0==aCapName.Compare(KCapabilityMultimediaDD))
- {
- cap=ECapabilityMultimediaDD;
- }
- else if(0==aCapName.Compare(KCapabilityReadDeviceData))
- {
- cap=ECapabilityReadDeviceData;
- }
- else if(0==aCapName.Compare(KCapabilityWriteDeviceData))
- {
- cap=ECapabilityWriteDeviceData;
- }
- else if(0==aCapName.Compare(KCapabilityDRM))
- {
- cap=ECapabilityDRM;
- }
- else if(0==aCapName.Compare(KCapabilityTrustedUI))
- {
- cap=ECapabilityTrustedUI;
- }
- else if(0==aCapName.Compare(KCapabilityProtServ))
- {
- cap=ECapabilityProtServ;
- }
- else if(0==aCapName.Compare(KCapabilityDiskAdmin))
- {
- cap=ECapabilityDiskAdmin;
- }
- else if(0==aCapName.Compare(KCapabilityNetworkControl))
- {
- cap=ECapabilityNetworkControl;
- }
- else if(0==aCapName.Compare(KCapabilityAllFiles))
- {
- cap=ECapabilityAllFiles;
- }
- else if(0==aCapName.Compare(KCapabilitySwEvent))
- {
- cap=ECapabilitySwEvent;
- }
- else if(0==aCapName.Compare(KCapabilityNetworkServices))
- {
- cap=ECapabilityNetworkServices;
- }
- else if(0==aCapName.Compare(KCapabilityLocalServices))
- {
- cap=ECapabilityLocalServices;
- }
- else if(0==aCapName.Compare(KCapabilityReadUserData))
- {
- cap=ECapabilityReadUserData;
- }
- else if(0==aCapName.Compare(KCapabilityWriteUserData))
- {
- cap=ECapabilityWriteUserData;
- }
- else if(0==aCapName.Compare(KCapabilityLocation))
- {
- cap=ECapabilityLocation;
- }
- else if(0==aCapName.Compare(KCapabilitySurroundingsDD))
- {
- cap=ECapabilitySurroundingsDD;
- }
- else if(0==aCapName.Compare(KCapabilityUserEnvironment))
- {
- cap=ECapabilityUserEnvironment;
- }
-
- return cap;
-}
-
-
-/**
-* Returns the capability set defined in the service provider
-* metadata information. The capability set is a pre-requisite
-* for the service consumer to load the service provider module.
-*
-* The capability metadata information are defined as XML character
-* data inside the element <capability/>. The capability information
-* are type of metadata information. Hence, the capability element tags
-* should appear as child element of <metadata> element.
-*
-* @param aCapability Capability set that the consumer should posess while
-* loading the service provider
-*
-* @example
-*
-* @code
-* <!-- consumer should posess the following capability set -->
-* <metadata>
-* <capability>CapabilityReadUserData</capability>
-* <capability>CapabilityWriteUserData</capability>
-* <capability>CapabilityDRM</capability>
-* </metadata>
-* @endcode
-*
-*/
-
-void CLiwServiceHandlerImpl::GetCapabilitiesL(RArray<TCapability>& secMgrCapList,CLiwGenericParamList* pMetaData)
-{
- _LIT8(KCapability,"cap");
-
- TInt pos = 0;
- const TLiwGenericParam* pCapData = pMetaData->FindFirst(pos,KCapability);
-
- if(pCapData)
- {
- const CLiwList* pCapList = pCapData->Value().AsList();
- if(pCapList)
- {
- for(TInt idx(0);idx!=pCapList->Count();++idx)
- {
- TLiwVariant capVar;
- capVar.PushL();
- pCapList->AtL(idx, capVar);
- TPtrC capStr = capVar.AsDes();
-
- TCapability cap = this->GetServiceCapability(capStr);
- if( (cap>=ECapabilityTCB) && (cap < ECapability_Limit))
- secMgrCapList.AppendL(cap);
- CleanupStack::Pop(&capVar);
- capVar.Reset();
- }
- }
-
- }
-}
-
-void CLiwServiceHandlerImpl::GetProviderResourceFile(TDes& aFilePath,CLiwGenericParamList* pMetaData)
-{
- _LIT8(KResourceFile,"res");
-
- TInt pos = 0;
- const TLiwGenericParam* pCapData = pMetaData->FindFirst(pos,KResourceFile);
-
- if(pCapData)
- {
- const CLiwList* pCapList = pCapData->Value().AsList();
- if(pCapList)
- {
- for(TInt idx(0);idx!=pCapList->Count();++idx)
- {
- TLiwVariant capVar;
- capVar.PushL();
- pCapList->AtL(idx, capVar);
- aFilePath = capVar.AsDes();
- CleanupStack::Pop(&capVar);
- capVar.Reset();
- }
- }
-
- }
-}
-
-void CLiwServiceHandlerImpl::ComputeIntfVersion(CLiwServiceData* pProvMetaData,TReal& aIntfVersion)
-{
- CLiwGenericParamList* pMetaDataList = pProvMetaData->GetMetaData();
-
- if(pMetaDataList)
- {
- TInt verPos(KErrNone);
- _LIT8(KVer,"ver");
- const TLiwGenericParam* pVerParam = pMetaDataList->FindFirst(verPos,KVer);
- if(pVerParam)
- {
- const CLiwList* pVersionList = pVerParam->Value().AsList();
- if(pVersionList)
- {
- if(pVersionList->Count())
- {
- TLiwVariant verVar;
- verVar.PushL();
- pVersionList->AtL(0,verVar);//pick up the value in 0th index..
- aIntfVersion = verVar.AsTReal();
- CleanupStack::Pop(&verVar);
- verVar.Reset();
- }
- }
- }
- }
-}
-
-
-TInt CLiwServiceHandlerImpl::ResolveProvidersL(CLiwBinding* aBinding,
- CLiwCriteriaItem* aItem,
- CRTSecMgrScriptSession* aScriptSession)
- {
- TInt result = 0;
- TInt status = KLiwUnknown;
-
- // First resolve for providers already in memory.
- TInt index;
- for (index = 0; index < iProviders.Count(); index++)
- {
- if (iProviders[index]->Match(aItem))
- {
- aBinding->AddProviderL((CLiwServiceIfBase*)iProviders[index],
- iProviders[index]->ImplementationUid() == aItem->DefaultProvider());
- result++;
- }
- }
-
-
- // If cached providers were found, then it means that all the matching
- // providers must be already in memory. No need to query from ECom framework.
- if (!result)
- {
- RImplInfoPtrArray infoArray;
- RArray<TInt32> infoArrayPlugin;
-
- CleanupStack::PushL( TCleanupItem( Cleanup, &infoArray ) );
- CleanupStack::PushL( TCleanupItem( Int32ArrayCleanup, &infoArrayPlugin ) );
-
- iEcomMonitor->ListImplemetationsL(infoArray, aItem);
-
- FilterInfoArray(infoArray, infoArrayPlugin, aItem);
-
- CLiwServiceData* pServiceData = NULL;
-
- CLiwServiceData* pPrevSData = NULL;
-
- CImplementationInformation* pChosenImpl = NULL;
-
- TReal currentMax(KDefVersion);
-
- for (index = 0; index < infoArray.Count(); index++)
- {
- TBool stackPop = EFalse;
- if ((aItem->Options() & LIW_OPTIONS_ROM_ONLY) && (infoArray[index]->RomBased() == EFalse))
- {
- continue;
- }
-
- //Check whether consumer has capability
- //mandated by provider
- CImplementationInformation* pImplInfo = infoArray[index];
-
- TBuf8<KMaxLength> opaq;
-
- ParseMetaData(pImplInfo->OpaqueData(),opaq);
-
- CLiwXmlHandler* pXmlHandler = CLiwXmlHandler::NewLC();
-
- pServiceData = CLiwServiceData::NewLC();
-
- TInt loadStatus= CLiwXmlHandler::ESrvDataLoadFailed;
-
- //Inline metadata defined
- if(opaq.Length()>0)
- {
- loadStatus=pXmlHandler->LoadServiceData(opaq,pServiceData);
- }
- else
- {
- //Obtain the capabilities from the metadata
- TUid implUid = pImplInfo->ImplementationUid();
- TUidName srvProvUid = implUid.Name();
-
-
- TPtrC16 ptrSrv = srvProvUid.Right(srvProvUid.Length()-1);
- TPtrC16 srvFile = ptrSrv.Left(ptrSrv.Length()-1);
- TDriveUnit driveUnit = pImplInfo->Drive();
- TFileName fileName = driveUnit.Name();
- fileName.Append(KDC_RESOURCE_FILES_DIR);
- fileName.Append(srvFile);
- fileName.Append(KPerExtension);
- loadStatus=pXmlHandler->LoadServiceData(fileName,pServiceData);
- }
-
- /*
- * - Get version range specified by the consumer
- * - Iterate over the list of intf impl
- *
- * //LOOP:
- * - For each implementation item,
- *
- * - Check if intf impl has version tag from its metadata
- * - Pick up interface impl's version tag
- * - If intf impl has NO specifed version tag
- * - set this intf impl version as DEFAULT VERSION (//pref 1.0)..
- *
- * //CHOOSE LATEST VERSION:
- * - If consumer has specifed version range
- * - CALL COMPARE routine (//To check if this is the latest version so far)
- * - Mark this as the chosen implementation
- * - Else (//This is NOT the latest)
- * - Continue;
- *
- * - Else (//If consumer did not specify version range)
- * - CALL COMPARE routine (//To check if this is the latest version so far)
- * - Mark this as the chosen implementation
- * - Else (//This is NOT the latest)
- * - Continue;
- *
- * //COMPARE (currentMax,implVersion,minVer,maxVer): //default minVer=1.0
- * - if(implVersion>currentMax)
- * - if(implVersion>=minVer && implVersion<=maxVer)
- * - currentMax = implVersion;
- * - return; //mark pServiceData to point to the current impl's service data
- * - else
- * - return; //leave pServiceData as it is
- * - else
- * - return; //leave pServiceData as it is
- *
- */
-
- if(CLiwXmlHandler::ESrvDataLoadSuccess==loadStatus) //metadata is parsed successfully
- {
- TReal implVersion(KDefVersion);
- this->ComputeIntfVersion(pServiceData,implVersion); //fetch impl version..
-
- TReal minVer(KDefVersion);
- TReal maxVer(KUnspVersion);
-
- TBool verChk = this->GetVersionRange(aItem,minVer,maxVer);
-
- if(verChk) //Get version queried by consumer
- {
- if(minVer == KUnspVersion)
- minVer = KDefVersion;
-
- //perform comparison...
- if(implVersion>=currentMax)
- {
- if(maxVer!=KUnspVersion)
- {
- if((implVersion>=minVer) && (implVersion<=maxVer))
- {
- currentMax = implVersion;
- pChosenImpl = infoArray[index];
- //current impl is the best choice..this is THE CHOSEN ONE..
- if(pPrevSData)
- {
- pPrevSData->CleanUpMetaData();
- delete pPrevSData;
-
- }
-
- pPrevSData = pServiceData;
-
- }
- else
- {
- //current impl is NOT THE RIGHT CHOICE.. since not within the range
- if(pServiceData)
- {
- if(!stackPop)
- {
- stackPop = ETrue;
- CleanupStack::Pop(pServiceData);
- }
- pServiceData->CleanUpMetaData();
- delete pServiceData;
- pServiceData = NULL;
- }
- status = KLiwVersionOutOfRange;
- }
- }
- else
- {
- //means maxVer == KUnspVersion
- if(implVersion>=minVer)
- {
- currentMax = implVersion;
- pChosenImpl = infoArray[index];
-
- //current impl is the best choice..this is THE CHOSEN ONE..
- if(pPrevSData)
- {
- pPrevSData->CleanUpMetaData();
- delete pPrevSData;
- }
-
- pPrevSData = pServiceData;
- }
- else
- {
- //current impl is NOT THE RIGHT CHOICE..
- if(pServiceData)
- {
- if(!stackPop)
- {
- stackPop = ETrue;
- CleanupStack::Pop(pServiceData);
- }
- pServiceData->CleanUpMetaData();
- delete pServiceData;
- pServiceData = NULL;
- }
-
- status = KLiwVersionOutOfRange;
- }
- }
- }
- else
- {
- //current impl is NOT THE RIGHT CHOICE..since implVer > maxVer
- if(pServiceData)
- {
- if(!stackPop)
- {
- stackPop = ETrue;
- CleanupStack::Pop(pServiceData);
- }
- pServiceData->CleanUpMetaData();
- delete pServiceData;
- pServiceData = NULL;
- }
-
- status = KLiwVersionOutOfRange;
- }
- }
- else
- {
- //GetVersionRange Fails..
- //abort service resolution process..
- if(pServiceData)
- {
- if(!stackPop)
- {
- stackPop = ETrue;
- CleanupStack::Pop(pServiceData);
- }
- pServiceData->CleanUpMetaData();
- delete pServiceData;
- pServiceData = NULL;
- }
-
- status = KLiwInvalidVersionSpecification;
- }
-
- //other cases like parse error, capability not
- //specified in meta data are handled
-
- if(currentMax == implVersion)
- {
- if(pPrevSData && (pPrevSData!=pServiceData)) //just in case...
- {
- pPrevSData->CleanUpMetaData();
- delete pPrevSData;
- pPrevSData = NULL;
- }
- }
- else
- {
- if(!stackPop)
- {
- stackPop = ETrue;
- CleanupStack::Pop(pServiceData);
- }
- pServiceData = pPrevSData;
- }
- }
- else
- {
- //Metadata specification not found.. Hence Load Fails
- if(CLiwXmlHandler::ESrvDataFileNotFnd==loadStatus)
- {
- pChosenImpl = infoArray[index];
- }
- else //Some error like parse error, capability not specified are handled
- {
- if(pServiceData)
- {
- if(!stackPop)
- {
- stackPop = ETrue;
- CleanupStack::Pop(pServiceData);
- }
- pServiceData->CleanUpMetaData();
- delete pServiceData;
- pServiceData = NULL;
- }
-
- status = KLiwMetaDataInvalidFormat;
- }
- }
-
- for (TInt idx = 0; idx < infoArrayPlugin.Count(); idx++)
- {
- // currently assumed that implementations managed by plugins cannot be in ROM
- if (aItem->Options() & LIW_OPTIONS_ROM_ONLY)
- {
- continue;
- }
- }
-
- if(!stackPop)
- {
- CleanupStack::Pop(pServiceData);
- }
-
- CleanupStack::Pop(pXmlHandler);
-
- if(pXmlHandler)
- {
- delete pXmlHandler;
- }
-
-
- } //end of for loop
-
- if(pChosenImpl)
- {
- RArray<TCapability> provCaps;
- TFileName provResourcePath;
- GetCapabilitiesL(provCaps,pServiceData->GetMetaData());
-
- TInt isAllowed(KErrNone);
-
- if(aScriptSession)
- {
- if(aScriptSession->PromptOption() == RTPROMPTUI_PROVIDER)
- {
- GetProviderResourceFile(provResourcePath, pServiceData->GetMetaData());
- isAllowed = aScriptSession->IsAllowed(provCaps, pChosenImpl->ImplementationUid(), provResourcePath);
- }
- else
- isAllowed = aScriptSession->IsAllowed(provCaps);
- }
-
- if(KErrNone==isAllowed)
- {
- CLiwServiceIfBase* iface = iEcomMonitor->CreateImplementationL(
- pChosenImpl->ImplementationUid());
-
- if (iface)
- {
- if(pServiceData)
- {
- iface->iReserved=pServiceData;
- }
-
-
- if (!IsCached(iface))
- {
- CleanupStack::PushL(iface);
- status = KLiwServiceLoadSuccess;
- iface->AddCriteria(aItem);
- User::LeaveIfError(iProviders.Append( iface ));
- CleanupStack::Pop(iface);
-
- aBinding->AddProviderL(iface,
- pChosenImpl->ImplementationUid() == aItem->DefaultProvider());
- }
- else
- {
- delete iface;
- iface = NULL;
- }
- }
-
- }
- else
- {
- status = KLiwSecurityAccessCheckFailed;
-
- if(pServiceData)
- {
- pServiceData->CleanUpMetaData();
- delete pServiceData;
- pServiceData = NULL;
- }
-
- //enhancement : Should assign this to the previous service data
- }
-
- provCaps.Close();
- }
- else
- {
- //No Chosen implementation..
-
- if(pServiceData) //This should ideally fail always
- {
- pServiceData->CleanUpMetaData();
- delete pServiceData;
- pServiceData = NULL;
- }
- }
-
- if(0 == infoArray.Count())
- status = KLiwUnknown;
-
- CleanupStack::PopAndDestroy(2);//infoArray and infoArrayPlugin
- }
- else
- {
- status = KLiwServiceAlreadyLoaded;
- }
-
- return status;
-
- }
-
-
-TBool CLiwServiceHandlerImpl::GetVersionRange(CLiwCriteriaItem* aItem,TReal& aMinVersion, TReal& aMaxVersion)
-{
- TBool bFailed=EFalse;
- TLiwVariant metaDataVar;
- metaDataVar.PushL();
-
- aItem->GetMetaDataOptions(metaDataVar);
-
- const CLiwMap* metaDataMap = metaDataVar.AsMap();
-
- if(metaDataMap)
- {
- _LIT8(KRangeKey,"range");
- TLiwVariant rangeVar;
- rangeVar.PushL();
-
- if(metaDataMap->FindL(KRangeKey, rangeVar))
- {
- const CLiwList* pRangeList = rangeVar.AsList();
- if(pRangeList)
- {
- TLiwVariant verCheck;
- verCheck.PushL();
- _LIT8(KVersion,"ver");
- pRangeList->AtL(0,verCheck);
-
- if(EVariantTypeDesC8==verCheck.TypeId())
- {
- if(0==KVersion().CompareF(verCheck.AsData()))
- {
- TLiwVariant minVerVar, maxVerVar;
- minVerVar.PushL();
- maxVerVar.PushL();
-
- pRangeList->AtL(1,minVerVar);
- aMinVersion = minVerVar.AsTReal();
-
- if(minVerVar.AsTReal() < KDefVersion)
- bFailed = ETrue;
-
- pRangeList->AtL(2,maxVerVar);
- aMaxVersion = maxVerVar.AsTReal();
-
- if(maxVerVar.AsTReal() < aMinVersion && maxVerVar.AsTReal() != KUnspVersion)
- bFailed = ETrue;
-
- CleanupStack::Pop(&maxVerVar);
- CleanupStack::Pop(&minVerVar);
- minVerVar.Reset();
- maxVerVar.Reset();
- }
- }
- CleanupStack::Pop(&verCheck);
- verCheck.Reset();
- }
- }
- CleanupStack::Pop(&rangeVar);
- rangeVar.Reset();
- }
-
- CleanupStack::Pop(&metaDataVar);
- metaDataVar.Reset();
-
- return !bFailed;
-}
-
-TBool CLiwServiceHandlerImpl::GetVersion(CLiwCriteriaItem* aItem,TReal& aVersion)
-{
- TBool bFailed=EFalse;
- TLiwVariant metaDataVar;
- metaDataVar.PushL();
-
- aItem->GetMetaDataOptions(metaDataVar);
-
- const CLiwMap* metaDataMap = metaDataVar.AsMap();
-
- if(metaDataMap)
- {
- _LIT8(KExactKey,"exact");
- TLiwVariant exactVar;
- exactVar.PushL();
-
- if(metaDataMap->FindL(KExactKey, exactVar))
- {
- const CLiwList* pExactList = exactVar.AsList();
- if(pExactList)
- {
- TLiwVariant verCheck;
- verCheck.PushL();
- _LIT8(KVersion,"ver");
- pExactList->AtL(0,verCheck);
-
- if(EVariantTypeDesC8==verCheck.TypeId())
- {
- if(0==KVersion().CompareF(verCheck.AsData()))
- {
- TLiwVariant versionVar;
- versionVar.PushL();
-
- pExactList->AtL(1,versionVar);
-
- if((versionVar.AsTReal()) < KDefVersion)
- {
- bFailed = ETrue;
- }
-
- aVersion = versionVar.AsTReal();
- CleanupStack::Pop(&versionVar);
- versionVar.Reset();
- }
- }
- CleanupStack::Pop(&verCheck);
- verCheck.Reset();
- }
- }
-
- CleanupStack::Pop(&exactVar);
- exactVar.Reset();
- }
-
- CleanupStack::Pop(&metaDataVar);
- metaDataVar.Reset();
-
- return !bFailed;
-}
-
-// End of file