languageinterworkingfw/servicehandler/inc/liwservicehandlerimpl.h
changeset 0 99ef825efeca
child 18 a7062f7f0b79
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/languageinterworkingfw/servicehandler/inc/liwservicehandlerimpl.h	Mon Mar 30 12:51:20 2009 +0300
@@ -0,0 +1,431 @@
+/*
+* 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:       Implementation class for CLiwServiceHandler. 
+*                See also LiwServiceHandler.h.
+*
+*/
+
+
+
+
+
+
+
+#ifndef LIW_SERVICE_HANDLER_IMPL_H
+#define LIW_SERVICE_HANDLER_IMPL_H
+
+// INCLUDES
+#include <ecom/ecom.h>
+#include <barsread.h> 
+#include <liwcommon.h>
+#include "liwtlsdata.h"
+#include <eikmobs.h> 
+#include <e32capability.h>
+
+// CONSTANTS
+
+// MACROS
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class CLiwMenuBinding;
+class CLiwMenuPane;
+class CLiwServiceIfMenu;
+class CLiwServiceIfBase;
+class CLiwEcomMonitor;
+class CRTSecMgrScriptSession;
+
+// CLASS DECLARATION
+
+/**
+* Internal implementation class for CLiwServiceHandler. 
+*
+* Contains the actual implementation logic for Service Handler, whereas the
+* CLiwServiceHandler class provides only the public API. 
+*
+* @see CLiwServiceHandler for API documentation.
+* @since Series 60 2.6
+*/
+NONSHARABLE_CLASS(CLiwServiceHandlerImpl) :
+    public CBase,
+    public MLiwNotifyCallback,
+    public MEikMenuObserver,
+    public MLiwMenuLaunchObserver
+    {
+    public:  // Construction & destruction
+        /**
+        * Constructs CLiwServiceHandlerImpl instance.
+        *
+        * @return Pointer to the new instance.
+        */
+        static CLiwServiceHandlerImpl* NewL();
+
+        /** 
+        * Destructor.
+        */
+        virtual ~CLiwServiceHandlerImpl();
+        
+    public:  // Management
+        /**
+        * @see CLiwServiceHandler::Reset()
+        */
+        void Reset();
+
+        /**
+        * @see CLiwServiceHandler::NbrOfProviders() 
+        */
+        TInt NbrOfProviders(const CLiwCriteriaItem* aCriteria);
+        
+        
+        
+    public:  // Interest handling
+        /**
+        * @see CLiwServiceHandler::AttachL() 
+        */
+        void AttachL(TInt aInterestResourceId);
+
+        /**
+        * @see CLiwServiceHandler::AttachL() 
+        */
+        TInt AttachL(const RCriteriaArray& aInterest);
+        
+        TInt AttachL(const RCriteriaArray& aInterest,CRTSecMgrScriptSession* aSecMgrScriptSession);
+        /**
+        * @see CLiwServiceHandler::QueryImplementationL() 
+        */
+        void QueryImplementationL(CLiwCriteriaItem* aItem, RCriteriaArray& aProviderList);
+		void GetCapabilitiesL(RArray<TCapability>& secMgrCapList,CLiwGenericParamList* pMetaData);
+        
+        /**
+        * @see CLiwServiceHandler::GetInterest()
+        */
+        void GetInterest(RCriteriaArray& aInterest);
+
+        /**
+        * @see CLiwServiceHandler::DetachL()
+        */
+        void DetachL(const RCriteriaArray& aInterest);
+
+        /**
+        * @see CLiwServiceHandler::DetachL()
+        */
+        void DetachL(TInt aInterestResourceId); 
+        
+        /**
+        * @see CLiwServiceHandler::GetCriteria()
+        */
+        const CLiwCriteriaItem* GetCriteria(TInt aId);
+
+        /**
+        * @see CLiwServiceHandler::InParamListL()
+        */
+        CLiwGenericParamList& InParamListL();
+
+        /**
+        * @see CLiwServiceHandler::OutParamListL()
+        */
+        CLiwGenericParamList& OutParamListL();
+        
+    public:  // Menu handling
+        /**
+        * @see CLiwServiceHandler::InitializeMenuPaneL()
+        */
+        void InitializeMenuPaneL(
+            CEikMenuPane& aMenuPane,
+            TInt aMenuResourceId,
+            TInt aBaseMenuCmdId,
+            const CLiwGenericParamList& aInParamList);
+        /**
+        * @see CLiwServiceHandler::InitializeMenuPaneL()
+        */
+        void InitializeMenuPaneL(
+            CEikMenuPane& aMenuPane,
+            TInt aMenuResourceId,
+            TInt aBaseMenuCmdId,
+            const CLiwGenericParamList& aInParamList,
+            TBool aUseSubmenuTextsIfAvailable);            
+        
+        /**
+        * @see CLiwServiceHandler::ServiceCmdByMenuCmd()
+        */
+        TInt ServiceCmdByMenuCmd(TInt aMenuCmdId) const;
+
+        /**
+        * @see CLiwServiceHandler::ExecuteMenuCmdL()
+        */
+        void ExecuteMenuCmdL(
+            TInt aMenuCmdId,
+            const CLiwGenericParamList& aInParamList,
+            CLiwGenericParamList& aOutParamList,
+            TUint aCmdOptions = 0,
+            MLiwNotifyCallback* aCallback= NULL);
+
+        /**
+        * @see CLiwServiceHandler::AttachMenuL()
+        */
+        void AttachMenuL(TInt aMenuResourceId, TInt aInterestResourceId);
+
+        /**
+        * @see CLiwServiceHandler::AttachMenuL()
+        */
+        void AttachMenuL(TInt aMenuResourceId, TResourceReader& aReader);
+        
+        /**
+        * @see CLiwServiceHandler::AttachMenuL()
+        */
+        void AttachMenuL(TInt aMenuResourceId, const RCriteriaArray& aInterest);
+        
+        /**
+        * Attach menu related criteria items to given menu.
+        *
+        * @param aMenuEntries     List of menu command ids.
+        * @param aMenuResourceId  Menu to be attached.
+        * @param aInterest        Interest list.
+        */
+        void AttachMenuL(RArray<TInt>& aMenuEntries, TInt aMenuResourceId, RCriteriaArray& aInterest);        
+
+        /**
+        * Attach menu related criteria items to given menu.
+        *
+        * @param aMenuResourceId    Resource reader pointing
+        *                           to menu to be attached.
+        */
+        
+        //void AttachMenuL(TResourceReader& aReader, TInt aMenuId, RCriteriaArray& aInterest);
+
+        /**
+        * @see CLiwServiceHandler::DetachMenu()
+        */
+        void DetachMenu(TInt aMenuResourceId, TInt aInterestResourceId);
+
+        /**
+        * @see CLiwServiceHandler::IsSubMenuEmpty()
+        */
+        TBool IsSubMenuEmpty(TInt aSubMenuId);
+
+        /**
+        * @see CLiwServiceHandler::IsLiwMenu()
+        */
+        TBool IsLiwMenu(TInt aMenuResourceId);
+
+        /**
+        * @see CLiwServiceHandler::HandleSubmenuL()
+        */
+        TBool HandleSubmenuL(CEikMenuPane& aPane);
+
+    public:  // Generic service command handling
+        /**
+        * @see CLiwServiceHandler::ExecuteServiceCmdL()
+        */
+        void ExecuteServiceCmdL(
+            const TInt& aCmdId,
+            const CLiwGenericParamList& aInParamList,
+            CLiwGenericParamList& aOutParamList,
+            TUint aCmdOptions = 0,
+            MLiwNotifyCallback* aCallback = 0);
+        
+        /**
+        * @see CLiwServiceHandler::ExecuteServiceCmdL()
+        */
+        void ExecuteServiceCmdL(                        
+            const CLiwCriteriaItem& aCmd,
+            const CLiwGenericParamList& aInParamList,
+            CLiwGenericParamList& aOutParamList,
+            TUint aCmdOptions = 0,
+            MLiwNotifyCallback* aCallback = 0);
+
+        /**
+        * @see CLiwServiceHandler::MenuCmdId()
+        */
+        TInt MenuCmdId(TInt aMenuCmdId) const;            
+
+    public:  // Other new methods
+        /** 
+        * Called by CLiwEcomMonitor.
+        *
+        * @param aImpl An object representing this class.
+        * @return An error code. KErrNone if successful.
+        */ 
+        static TInt SynchronizeCallBack(TAny* aImpl);
+        
+    public: // From MLiwNotifyCallback
+        TInt HandleNotifyL(
+            TInt aCmdId,
+            TInt aEventId,
+            CLiwGenericParamList& aEventParamList,
+            const CLiwGenericParamList& aInParamList);
+
+    public: // From MEikMenuObserver
+        void SetEmphasis(CCoeControl* aMenuControl,TBool aEmphasis);
+
+    public: // From MEikCommandObserver (via MEikMenuObserver)
+        void ProcessCommandL(TInt aCommandId);
+
+	    void GetProviderCapability(CLiwCriteriaItem* aItem,RCriteriaArray& aOutItem);
+	
+    private: // From MLiwMenuLaunchObserver
+        void MenuLaunched();
+
+    private:
+        // Possible placeholder types.
+        enum TLiwPlaceholderType
+            {
+            ELiwPlaceholderNormal,
+            ELiwPlaceholderCascade,     
+            ELiwPlaceholderIntelligentCascade
+            };
+
+    private:
+        CLiwServiceHandlerImpl();
+        void ConstructL();
+
+        // Attach menu related criteria items to given menu. 
+        void DoAttachMenuL(TResourceReader& aReader, TInt aMenuId, RCriteriaArray& aInterest);
+
+        TInt DoAttachL(const RCriteriaArray& aInterest,CRTSecMgrScriptSession* aScriptSession);
+        void DoAttachL(const RCriteriaArray& aInterest);
+        
+        void ReadInterestListL(TResourceReader& aReader, RPointerArray<CLiwCriteriaItem>& aResult);
+        TInt ResolveProvidersL(CLiwBinding* aBinding, CLiwCriteriaItem* aItem, CRTSecMgrScriptSession* aScriptSession);
+        TInt ResolveProvidersL(CLiwBinding* aBinding, CLiwCriteriaItem* aItem);
+        
+        TBool IsCached(CLiwServiceIfBase* aProvider);
+        
+        CLiwMenuPane* CreateEmptyLiwMenuPaneL(TInt aBaseMenuCmdId, TInt aResourceId);
+        void DeleteLiwMenuPane(CLiwMenuPane* aLiwPane);
+        
+        TInt ResourceIdForNextFreeSlot();
+        void CopyMenuItemsL(CLiwMenuPane* aSource, CEikMenuPane& aDest, TInt aStartIndex, 
+            TBool aIsSubmenu);
+        TInt SlotItemCmd(CEikMenuPane& aPane);
+        CLiwMenuPane* MenuPaneForSlotCmd(TInt aCmdId);
+        TLiwPlaceholderType PlaceholderType(CEikMenuPane& aPane, TInt aCmd, TBool& aTitleLocked);
+        void ConvertPlaceholderL(CEikMenuPane& aPane, TInt aCmd, CLiwMenuPane& aLiwPane, 
+            const TDesC& aTitle);
+        void UnCascadeL(CEikMenuPane& aPane, TInt aCmd, CLiwMenuPane& aLiwPane);
+        void SkipMenuFields(TResourceReader& aReader);
+        TBool IsInLastInitialized(CLiwMenuPane* liwPane) const;
+        TBool GetSubmenuTitle(CEikMenuPane& aPane, TDes& aResult);
+        TBool IsCriteriaAlreadyInInterest(CLiwCriteriaItem& aItem, 
+            RPointerArray<CLiwCriteriaItem>& aInterest) const;
+        CLiwCriteriaItem* ConvertCriteriaItemPointerL(CLiwCriteriaItem* aCandidate);
+        void FilterInterestListL(RPointerArray<CLiwCriteriaItem>& aOrginal,
+            RPointerArray<CLiwCriteriaItem>& aFiltered);
+        void FilterInfoArray(RImplInfoPtrArray& aArray, RArray<TInt32>& aArrayPlugin,
+            CLiwCriteriaItem* aItem);   
+        CLiwMenuBinding* AlreadyBound(TInt aMenuId, TInt aMenuCmd, TInt aMenuItemIndex) const;
+        void SynchronizeDbL();
+        void ListProvidersForCriteriaL(RArray<TInt>& aResult, CLiwCriteriaItem& aItem);
+        void HandleRemovedProviders(RArray<TInt>& aInMemory, RImplInfoPtrArray& aOnSystem);
+        void HandleNewProvidersL(RArray<TInt>& aInMemory, RImplInfoPtrArray& aOnSystem, 
+            CLiwCriteriaItem* aItem);
+        void RemoveProvider(TInt aImplUid);
+        void AddProviderL(TUid aImplUid, CLiwCriteriaItem* aItem);
+        inline void ClearMenuPaneArray();
+        void AttachServiceManagerPluginsL();
+        void ServiceManagerPlugin_ListImplementationsL(RArray<TInt32>& aArray, CLiwCriteriaItem* aItem);
+        CLiwServiceIfBase* ServiceManagerPlugin_CreateImplementationL(TInt32 aImplUid);
+        TInt NumAlreadyInitializedPaneIdsL() const;
+
+        // Leaving helper method. Handler cleanupstack issues and calls ReadInterestListL().
+        void ReadInterestL(RCriteriaArray& aInterest, TInt aInterestResourceId);
+
+        // Detaches all items from given menu.        
+        void DoDetachMenu(TInt aMenuResourceId);
+
+        // Detaches only those items from a given menu, which match the given interest.
+
+
+        void DoDetachMenu(TInt aMenuResourceId, RCriteriaArray& aInterest);
+        
+        // Removes unnecessary criteria items from Service Handler.
+        void RemoveObsoleteCriteriaItems();
+        
+        // Removes unnecessary providers from Service Handler.
+        void RemoveObsoleteProviders();
+        
+        /* 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 ParseMetaData(const TDesC8& aOpaque, TDes8& aMetaData);
+		
+		//To fetch the infoArray
+        void QueryImplementationL(CLiwCriteriaItem* aItem, RImplInfoPtrArray& aInfoArray);
+
+  		TCapability GetServiceCapability(const TDesC& aCapName);
+		
+		//To fetch the version range specified by the consumer while creating Criteria
+		TBool GetVersionRange(CLiwCriteriaItem* aItem,TReal& aMinVersion, TReal& aMaxVersion);
+		
+		//To fetch the version range specified by the consumer while creating Criteria
+		TBool GetVersion (CLiwCriteriaItem* aItem,TReal& aVersion);
+		
+		//To fetch the implementation version specified in provider metadata
+		void ComputeIntfVersion(CLiwServiceData* pProvMetaData,TReal& aIntfVersion);
+		
+    private:
+        // Pointer to the control environment.
+        CCoeEnv* iCoeEnv;
+        
+        // Owns all the attached criteria items.
+        RPointerArray<CLiwCriteriaItem> iInterestList;  
+        
+        // Criteria -> provider bindings for base service providers.
+        RPointerArray<CLiwBinding>      iBaseBindings;  
+        
+        // Criteria -> provider bindings for menu service providers.
+        RPointerArray<CLiwMenuBinding>  iMenuBindings;  
+        
+        // Contains the LIW menu panes.
+        RPointerArray<CLiwMenuPane>     iMenuPanes;     
+
+        // Input parameter list which can be given to the consumer application.
+        CLiwGenericParamList* iInParams;
+        
+        // Output parameter list which can be given to the consumer application.
+        CLiwGenericParamList* iOutParams; 
+        
+        // Resource offset for LiwServiceHandler.rsc.
+        TInt iResourceOffset;
+        
+        // Owns all the providers currently in memory.
+        RPointerArray<CLiwServiceIfBase> iProviders;  
+          
+        TInt                             iNextFreeSlot;
+        RPointerArray<CLiwMenuPane>      iLastInitialized;
+        CLiwMenuPane*                    iSubmenu;
+        TInt                             iSubmenuCmd;
+        CLiwEcomMonitor*                 iEcomMonitor;
+        TBool                            iTlsDataOpened;
+    };
+
+
+inline void CLiwServiceHandlerImpl::ClearMenuPaneArray()
+    {
+    iMenuPanes.ResetAndDestroy();
+    }
+
+#endif // LIW_SERVICE_HANDLER_IMPL_H
+
+// END of File
+
+