applicationinterworkingfw/ServiceHandler/inc/AiwServiceHandlerImpl.h
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applicationinterworkingfw/ServiceHandler/inc/AiwServiceHandlerImpl.h	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,360 @@
+/*
+* 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 "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 CAiwServiceHandler. 
+*                See also AiwServiceHandler.h.
+*
+*/
+
+
+
+
+
+#ifndef AIW_SERVICE_HANDLER_IMPL_H
+#define AIW_SERVICE_HANDLER_IMPL_H
+
+// INCLUDES
+#include <ecom/ecom.h>
+#include <barsread.h> 
+#include <AiwCommon.h>
+#include "AiwTlsData.h"
+#include <eikmobs.h> 
+
+// CONSTANTS
+
+// MACROS
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class CAiwMenuBinding;
+class CAiwMenuPane;
+class CAiwServiceIfMenu;
+class CAiwServiceIfBase;
+class CAiwEcomMonitor;
+
+// CLASS DECLARATION
+
+/**
+* Internal implementation class for CAiwServiceHandler. 
+*
+* Contains the actual implementation logic for Service Handler, whereas the
+* CAiwServiceHandler class provides only the public API. 
+*
+* @see CAiwServiceHandler for API documentation.
+* @since Series 60 2.6
+*/
+NONSHARABLE_CLASS(CAiwServiceHandlerImpl) :
+    public CBase,
+    public MAiwNotifyCallback,
+    public MEikMenuObserver,
+    public MAiwMenuLaunchObserver
+    {
+    public:  // Construction & destruction
+        /**
+        * Constructs CAiwServiceHandlerImpl instance.
+        *
+        * @return Pointer to the new instance.
+        */
+        static CAiwServiceHandlerImpl* NewL();
+
+        /** 
+        * Destructor.
+        */
+        virtual ~CAiwServiceHandlerImpl();
+        
+    public:  // Management
+        /**
+        * @see CAiwServiceHandler::Reset()
+        */
+        void Reset();
+
+        /**
+        * @see CAiwServiceHandler::NbrOfProviders() 
+        */
+        TInt NbrOfProviders(const CAiwCriteriaItem* aCriteria);
+        
+    public:  // Interest handling
+        /**
+        * @see CAiwServiceHandler::AttachL() 
+        */
+        void AttachL(TInt aInterestResourceId);
+
+        /**
+        * @see CAiwServiceHandler::AttachL() 
+        */
+        void AttachL(const RCriteriaArray& aInterest);
+
+        /**
+        * @see CAiwServiceHandler::GetInterest()
+        */
+        void GetInterest(RCriteriaArray& aInterest);
+
+        /**
+        * @see CAiwServiceHandler::DetachL()
+        */
+        void DetachL(const RCriteriaArray& aInterest);
+
+        /**
+        * @see CAiwServiceHandler::DetachL()
+        */
+        void DetachL(TInt aInterestResourceId); 
+        
+        /**
+        * @see CAiwServiceHandler::GetCriteria()
+        */
+        const CAiwCriteriaItem* GetCriteria(TInt aId);
+
+        /**
+        * @see CAiwServiceHandler::InParamListL()
+        */
+        CAiwGenericParamList& InParamListL();
+
+        /**
+        * @see CAiwServiceHandler::OutParamListL()
+        */
+        CAiwGenericParamList& OutParamListL();
+        
+    public:  // Menu handling
+        /**
+        * @see CAiwServiceHandler::InitializeMenuPaneL()
+        */
+        void InitializeMenuPaneL(
+            CEikMenuPane& aMenuPane,
+            TInt aMenuResourceId,
+            TInt aBaseMenuCmdId,
+            const CAiwGenericParamList& aInParamList);
+            
+        /**
+        * @see CAiwServiceHandler::InitializeMenuPaneL()
+        */
+        void InitializeMenuPaneL(
+            CEikMenuPane& aMenuPane,
+            TInt aMenuResourceId,
+            TInt aBaseMenuCmdId,
+            const CAiwGenericParamList& aInParamList,
+            TBool aUseSubmenuTextsIfAvailable);            
+
+        /**
+        * @see CAiwServiceHandler::InitializeMenuPaneL()
+        */
+        void InitializeMenuPaneL(
+            CEikMenuPane& aMenuPane,
+            TInt aMenuResourceId,
+            TInt aBaseMenuCmdId,
+            const CAiwGenericParamList& aInParamList,
+            TBool aUseSubmenuTextsIfAvailable,
+            TBool aSetAsItemSpecific );
+        
+        /**
+        * @see CAiwServiceHandler::ServiceCmdByMenuCmd()
+        */
+        TInt ServiceCmdByMenuCmd(TInt aMenuCmdId) const;
+
+        /**
+        * @see CAiwServiceHandler::ExecuteMenuCmdL()
+        */
+        void ExecuteMenuCmdL(
+            TInt aMenuCmdId,
+            const CAiwGenericParamList& aInParamList,
+            CAiwGenericParamList& aOutParamList,
+            TUint aCmdOptions = 0,
+            MAiwNotifyCallback* aCallback= NULL);
+
+        /**
+        * @see CAiwServiceHandler::AttachMenuL()
+        */
+        void AttachMenuL(TInt aMenuResourceId, TInt aInterestResourceId);
+
+        /**
+        * @see CAiwServiceHandler::AttachMenuL()
+        */
+        void AttachMenuL(TInt aMenuResourceId, TResourceReader& aReader);
+        
+        /**
+        * @see CAiwServiceHandler::AttachMenuL()
+        */
+        void AttachMenuL(TInt aMenuResourceId, const RCriteriaArray& aInterest);           
+        
+        /**
+        * @see CAiwServiceHandler::DetachMenu()
+        */
+        void DetachMenu(TInt aMenuResourceId, TInt aInterestResourceId);
+
+        /**
+        * @see CAiwServiceHandler::IsSubMenuEmpty()
+        */
+        TBool IsSubMenuEmpty(TInt aSubMenuId);
+
+        /**
+        * @see CAiwServiceHandler::IsAiwMenu()
+        */
+        TBool IsAiwMenu(TInt aMenuResourceId);
+
+        /**
+        * @see CAiwServiceHandler::HandleSubmenuL()
+        */
+        TBool HandleSubmenuL(CEikMenuPane& aPane);
+
+    public:  // Generic service command handling
+        /**
+        * @see CAiwServiceHandler::ExecuteServiceCmdL()
+        */
+        void ExecuteServiceCmdL(
+            const TInt& aCmdId,
+            const CAiwGenericParamList& aInParamList,
+            CAiwGenericParamList& aOutParamList,
+            TUint aCmdOptions = 0,
+            MAiwNotifyCallback* aCallback = 0);
+
+    public:  // Other new methods
+        /** 
+        * Called by CAiwEcomMonitor.
+        *
+        * @param aImpl An object representing this class.
+        * @return An error code. KErrNone if successful.
+        */ 
+        static TInt SynchronizeCallBack(TAny* aImpl);
+        
+    public: // From MAiwNotifyCallback
+        TInt HandleNotifyL(
+            TInt aCmdId,
+            TInt aEventId,
+            CAiwGenericParamList& aEventParamList,
+            const CAiwGenericParamList& aInParamList);
+
+    public: // From MEikMenuObserver
+        void SetEmphasis(CCoeControl* aMenuControl,TBool aEmphasis);
+
+    public: // From MEikCommandObserver (via MEikMenuObserver)
+        void ProcessCommandL(TInt aCommandId);
+
+    private: // From MAiwMenuLaunchObserver
+        void MenuLaunched();
+
+    private:
+        // Possible placeholder types.
+        enum TAiwPlaceholderType
+            {
+            EAiwPlaceholderNormal,
+            EAiwPlaceholderCascade,     
+            EAiwPlaceholderIntelligentCascade
+            };
+
+    private:
+        CAiwServiceHandlerImpl();
+        void ConstructL();
+
+        // Attach menu related criteria items to given menu. 
+        void DoAttachMenuL(TResourceReader& aReader, TInt aMenuId, RCriteriaArray& aInterest);
+
+        void DoAttachL(const RCriteriaArray& aInterest);
+        void ReadInterestListL(TResourceReader& aReader, RPointerArray<CAiwCriteriaItem>& aResult);
+        TInt ResolveProvidersL(CAiwBinding* aBinding, CAiwCriteriaItem* aItem);
+        TBool IsCached(CAiwServiceIfBase* aProvider);
+        
+        CAiwMenuPane* CreateEmptyAiwMenuPaneL(TInt aBaseMenuCmdId, TInt aResourceId);
+        void DeleteAiwMenuPane(CAiwMenuPane* aAiwPane);
+        
+        TInt ResourceIdForNextFreeSlot();
+        void CopyMenuItemsL(CAiwMenuPane* aSource, CEikMenuPane& aDest, TInt aStartIndex, 
+            TBool aIsSubmenu, TBool aSetAsItemSpecific);
+        TInt SlotItemCmd(CEikMenuPane& aPane);
+        CAiwMenuPane* MenuPaneForSlotCmd(TInt aCmdId);
+        TAiwPlaceholderType PlaceholderType(CEikMenuPane& aPane, TInt aCmd, TBool& aTitleLocked);
+        void ConvertPlaceholderL(CEikMenuPane& aPane, TInt aCmd, CAiwMenuPane& aAiwPane, 
+            const TDesC& aTitle, TBool aSetAsItemSpecific);
+        void UnCascadeL(CEikMenuPane& aPane, TInt aCmd, CAiwMenuPane& aAiwPane,
+            TBool aSetAsItemSpecific);
+        void SkipMenuFields(TResourceReader& aReader);
+        TBool IsInLastInitialized(CAiwMenuPane* aiwPane) const;
+        TBool GetSubmenuTitle(CEikMenuPane& aPane, TDes& aResult);
+        TBool IsCriteriaAlreadyInInterest(CAiwCriteriaItem& aItem, 
+            RPointerArray<CAiwCriteriaItem>& aInterest) const;
+        CAiwCriteriaItem* ConvertCriteriaItemPointerL(CAiwCriteriaItem* aCandidate);
+        void FilterInterestListL(RPointerArray<CAiwCriteriaItem>& aOriginal,
+            RPointerArray<CAiwCriteriaItem>& aFiltered);
+        void FilterInfoArray(RImplInfoPtrArray& aArray, CAiwCriteriaItem* aItem);
+        CAiwMenuBinding* AlreadyBound(TInt aMenuId, TInt aMenuCmd, TInt aMenuItemIndex) const;
+        void SynchronizeDbL();
+        void ListProvidersForCriteriaL(RArray<TInt>& aResult, CAiwCriteriaItem& aItem);
+        void HandleRemovedProviders(RArray<TInt>& aInMemory, RImplInfoPtrArray& aOnSystem);
+        void HandleNewProvidersL(RArray<TInt>& aInMemory, RImplInfoPtrArray& aOnSystem, 
+            CAiwCriteriaItem* aItem);
+        void RemoveProvider(TInt aImplUid);
+        void AddProviderL(TUid aImplUid, CAiwCriteriaItem* aItem);
+        inline void ClearMenuPaneArray();
+        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();
+
+    private:
+        // Pointer to the control environment.
+        CCoeEnv* iCoeEnv;
+        
+        // Owns all the attached criteria items.
+        RPointerArray<CAiwCriteriaItem> iInterestList;  
+        
+        // Criteria -> provider bindings for base service providers.
+        RPointerArray<CAiwBinding>      iBaseBindings;  
+        
+        // Criteria -> provider bindings for menu service providers.
+        RPointerArray<CAiwMenuBinding>  iMenuBindings;  
+        
+        // Contains the AIW menu panes.
+        RPointerArray<CAiwMenuPane>     iMenuPanes;     
+
+        // Input parameter list which can be given to the consumer application.
+        CAiwGenericParamList* iInParams;
+        
+        // Output parameter list which can be given to the consumer application.
+        CAiwGenericParamList* iOutParams; 
+        
+        // Resource offset for AiwServiceHandler.rsc.
+        TInt iResourceOffset;
+        
+        // Owns all the providers currently in memory.
+        RPointerArray<CAiwServiceIfBase> iProviders;  
+          
+        TInt                             iNextFreeSlot;
+        RPointerArray<CAiwMenuPane>      iLastInitialized;
+        CAiwMenuPane*                    iSubmenu;
+        TInt                             iSubmenuCmd;
+        CAiwEcomMonitor*                 iEcomMonitor;
+        TBool                            iTlsDataOpened;
+    };
+
+
+inline void CAiwServiceHandlerImpl::ClearMenuPaneArray()
+    {
+    iMenuPanes.ResetAndDestroy();
+    }
+
+#endif // AIW_SERVICE_HANDLER_IMPL_H
+
+// END of File
+
+