videofeeds/server/IptvNetworkSelection/inc/CIptvNetworkSelection.h
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/server/IptvNetworkSelection/inc/CIptvNetworkSelection.h	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,481 @@
+/*
+* Copyright (c) 2006-2008 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:    Header file for CIptvNetworkSelection.h class*
+*/
+
+
+
+#ifndef __CIPTVNETWORKSELECTION_H__
+#define __CIPTVNETWORKSELECTION_H__
+
+#include <e32base.h>
+//#include <cdbcols.h>
+#include <wlanmgmtclient.h>
+#include <wlanscaninfo.h>
+#include "TIptvIap.h"
+#include "MIptvTimerObserver.h"
+#include <rconnmon.h>
+#include <MProfileChangeObserver.h> //profile change notifier
+#include "IptvDebug.h"
+#include "TIptvGetUsedIapReq.h"
+#include "MIptvNetworkSelectionObserver.h"
+
+//#define ISIAIMATCH_USED
+#define ICISIMATCH_USED
+
+class CIptvServer;
+class CIptvIapList;
+class CIptvService;
+class CIptvTimer;
+class CProfileChangeNotifyHandler;
+
+// CLASS DECLARATION
+
+/**
+* CIptvServer owned class. This class is used to find out correct IAP for accessing
+* a Video Center service. This class also keeps track of connection permissions to
+* different type networks.
+*/
+class CIptvNetworkSelection : public CActive,
+                              public MIptvTimerObserver,
+                              public MProfileChangeObserver
+
+    {
+    
+    public: // Enumerations
+
+        /**
+        * Response statuses.
+        */
+        enum TRespStatus
+            {
+            EProcessing,
+            ESucceeded,
+            EGeneralError,
+            /**
+            * Service IAP list didn't contain any IAP which could be used for
+            * connecting at the moment and no currect IAP set.
+            */
+            ENoSuitableIapFound,
+            
+            /**
+            * Couldn't get IAP without WLAN scan,
+            * calls TIptvGetUsedIapReq->iNsObserver->GetUsedIapResp()
+            * when WLAN scan has finished.
+            */
+            EDoingWlanScan,
+            EServiceNotFound,
+            ECancelled,
+            EFailedAlwaysAskSelected
+            };
+
+        enum TConnectionPermission
+            {
+            EAllowed,
+            ENotAllowed,
+            EMustAskConfirmation
+            };
+                    
+    public:
+        /**
+        * Constructor.
+        */
+        static CIptvNetworkSelection* NewL(CIptvServer& aServer);
+        
+        /**
+        * Destructor.
+        */
+        virtual ~CIptvNetworkSelection();
+
+    private:
+        CIptvNetworkSelection(CIptvServer& aServer);
+        
+    public:
+
+        /* Network selection API */
+
+        /**
+        * Sets IAP aIapId to be used as a default untill server is shutdown
+        * or value is changed.
+        * I.e this setting is valid for the server lifetime.
+        * @param aIapId
+        * @param aServiceId.
+        * @param aSetToDefaultForService if True, the IAP is set to all services
+        *        to service db (current implementation ignores aServiceId).
+        * @param aRespStatus
+        */   
+        void SetUsedIapL(TUint32 aIapId,
+                         TUint32 aServiceId,
+                         TBool aSetToDefaultForService,
+                         TRespStatus& aRespStatus);
+        /**
+        * Gets IAP which is used for connecting to aGetUsedIapReq->iServiceId.
+        * Function is synchronous if IAP can be retrieved without wlan scan.
+        * If wlan scan is needed aGetUsedIapReq->iRespStatus will contain EDoingWlanScan
+        * value, in that case GetUsedIapResp() is called from aGetUsedIapReq->iNsObserver
+        * when operation is completed.
+        * Caller must inherit MIptvNetworkSelectionObserver class and implement callback
+        * functions from there.
+        * Caller keeps ownership to aGetUsedIapReq.
+        * @param aGetUsedIapReq->iNsObserver pointer to object which issued the request. 
+        * @param aGetUsedIapReq->iServiceId
+        * @param aGetUsedIapReq->iIapId will contain IAP ID.
+        * @param aGetUsedIapReq->iIapName will contain IAP name.
+        * @param aGetUsedIapReq->iConnectionPermission will contain connection permission.
+        * @param aGetUsedIapReq->iRespStatus will contain resp status.
+        */
+        void GetUsedIapReqL(TIptvGetUsedIapReq* aGetUsedIapReq);
+        
+        /**
+        * Cancels all GetUsedIapReqs for aObserver.
+        * WLAN scan is not cancelled (it is not possible). On WINSCW the WLAN simulation timer is cancelled.
+        * @param aObserver
+        */                                 
+        TInt CancelGetUsedIapReq(MIptvNetworkSelectionObserver* aObserver);
+                 
+        /**
+        * Sets connection allowed for connection type aIapId represents.
+        * See TConnectionType for possible types.
+        * @param aConnectionAllowed
+        * @param aIapId
+        * @param aRespStatus
+        */
+        void SetConnectionAllowedL(TBool aConnectionAllowed,
+                                   TUint32 aIapId,
+                                   TRespStatus& aRespStatus);
+
+        /**
+        * @param aIapId Iap ID which connection permission is queryed.
+        * @return Connection permission
+        */
+        TConnectionPermission IsConnectionAllowedL(TUint32 aIapId);
+
+        /**
+        * From MIptvTimerObserver.
+        * @param aTimer pointer to timer which expired.
+        */
+        void TimerExpired(CIptvTimer* aTimer);
+
+        /**
+        * ClearUsedIap.
+        */
+        void ClearUsedIap();
+        
+    private:
+        void ConstructL();
+
+        /**
+        * Gets used IAP for aServiceId. This is called after wlan scan.
+        * @param aGetUsedIapReq request message from the client.
+        */        
+        void GetUsedIapAfterWlanScanL(TIptvGetUsedIapReq& aGetUsedIapReq);
+
+        /**
+        * GetActiveIapsL.
+        * Gets currently active IAPS in the system.
+        * Used by UpdateActiveIapsL method.
+        */        
+        CIptvIapList* GetActiveIapsL();
+
+        /**
+        * UpdateActiveIapsL.
+        * Updates iActiveIaps member variable.
+        */                                         
+        void UpdateActiveIapsL();
+        
+        /**
+        * UpdateWlanScannedIapsL.
+        * Performs Wlan scan and updates iWlanScannedIaps member variable.
+        */                                 
+        void UpdateWlanScannedIapsL();
+
+        /**
+        * FindCommonIapFromLists.
+        * Picks the highest priority IAP from aServiceIaps list which is also
+        * on aCompare list.
+        * @param aServiceIaps
+        * @param aCompareIaps
+        * @param aIap The found iap is written here.
+        * @return System-wide error code. aIap will contain valid value only
+        *         if this is KErrNone.
+        */
+        TInt FindCommonIapFromListsL(CIptvIapList& aServiceIaps,
+                                     CIptvIapList& aCompareIaps,
+                                     TIptvIap& aIap);
+
+        /**
+        * CreateFilteredIapListL
+        * Picks IAPs from aIapList which have matching connection type
+        * with aConnectionTypeMask.
+        * @param aIapList list to be filtered
+        * @param aConnectionTypeMask
+        * @return filtered IAP list, ownership moves to caller.
+        */
+        CIptvIapList* CreateFilteredIapListL(CIptvIapList& aIapList,
+                                            TUint32 aConnectionTypeMask);
+
+#ifdef ISIAIMATCH_USED   
+        /**
+        * Updates iSiAiMatch member variable.
+        */
+        void UpdateSiAiMatchL();
+#endif
+
+        /**
+        * Updates iSiSwiMatch member variable.
+        */
+        void UpdateSiSwiMatchL();
+
+#ifdef ICISIMATCH_USED
+        /**
+        * Updates iCiSiMatch member variable.
+        */
+        void UpdateCiSiMatch();
+#endif
+
+        /**
+        * Updates iCiAiMatch member variable.
+        */
+        void UpdateCiAiMatch();
+
+        /**
+        * Updates iCiSwiMatch member variable.
+        */
+        void UpdateCiSwiMatchL();
+
+        /**
+        * Handles all pending GetUsedIapRequests from clients.
+        * This is called after WLAN scan.
+        */
+        void HandleGetUsedIapRequests();
+
+        /**
+        * 
+        */
+        void GetWlanIapFromAiL(TIptvIap& aIap);
+
+        /**
+        * Gets IAP name, if empty, tries to find SSID. Leaves with KErrNotFound
+        * if not found.
+        * @param aIapId IAP to get
+        * @param aIapName IAP name or SSID is written here.
+        */
+        void GetIapNameL(TUint32 aIapId, TDes& aIapName);
+        
+        /**
+         * Gets the first IAP ID with matching IAP name from commsdb.
+         * @param aIapId   The found IAP ID.
+         * @param aIapName The IAP name used in comparasion.
+         * @return         KErrNone if IAP was found, KErrNotFound if no matching IAP name was found.
+         */
+        TInt GetIapIdL(TUint32& aIapId, const TDesC& aIapName);
+
+        /**
+        * Gets SSID from commsdb using wlan service id.
+        * @param aWlanServiceId
+        * @param aSsid
+        */
+        TInt GetSsidL(TUint32 aWlanServiceId, TDes& aSsid);
+
+        /**
+        * Current IAP selected, fills aGetUsedIapReq accordingly.
+        * @param aGetUsedIapReq
+        */
+        void SelectCiL(TIptvGetUsedIapReq& aGetUsedIapReq);
+
+        /**
+        * aIapId selected, fills aGetUsedIapReq accordingly.
+        * @param aGetUsedIapReq
+        * @param aIapId
+        */
+        void SelectL(TIptvGetUsedIapReq& aGetUsedIapReq, TUint32 aIapId);
+
+        /**
+        * Updates all IAP lists except iCiSwiMatch which requires wlan scan.
+        */
+        void UpdateAllButWlanListsL(TIptvGetUsedIapReq& aGetUsedIapReq);
+
+        /**
+        * Updates iService by getting new value from Service Manager. If service has IAP name field set,
+        * it is tried to convert into an IAP ID. Conversion is stored to Service Manager.
+        */
+        void UpdateServiceL(TUint32 aServiceId);
+
+#if IPTV_LOGGING_METHOD != 0
+        void PrintIapList(CIptvIapList& aIapList);
+#endif
+
+        /**
+        * Adds all hidden WLAN IAPs from iService to iScannedWlanIaps.
+        */
+        void AddHiddenWlanSiIapsToSwiL();
+        
+        /**
+        * Clears iCurrent IAP if it is EGPRS or ECSD type.
+        * Clears all EGPRS and ECSD type IAPs from iService IAPs.
+        * This function is used in offline mode to ignore GPRS and CSD
+        * type IAPs.
+        */
+        void ClearGprsAndCsdIapsL();
+
+    public: //From MProfileChangeObserver
+
+        /**
+        * Callback function which is called when an active profile event
+        * completes. 
+        * @param aProfileEvent Profile event
+        * @param aProfileId Active profile id
+        */
+        void HandleActiveProfileEventL( TProfileEvent aProfileEvent, TInt aProfileId ); 
+
+    private:
+
+#if IPTV_LOGGING_METHOD != 0
+        const TDesC& ConnectionTypeDes( CIptvUtil::TConnectionType aConnectionType );
+#endif
+
+    protected: // Functions from base classes
+
+        /**
+        * From CActive, RunL.
+        * Callback function.
+        * Invoked to handle responses from the server.
+        */
+        void RunL();
+
+        /**
+        * From CActive, DoCancel.
+        * Cancels any outstanding operation.
+        */
+        void DoCancel();
+        
+        /**
+        * From CActive, RunError.
+        * Handles possible leaves during RunL.
+        */
+        TInt RunError( TInt aError );
+
+    private:
+        
+        /**
+        * System has these IAPs active at the moment
+        */
+        CIptvIapList*      iActiveIaps;
+        
+        /**
+        * These IAPs have been scanned from the neighborhood.
+        */
+        CIptvIapList*      iScannedWlanIaps;
+
+        /**
+        * Working iaplist, used when calculating IAP to select
+        */
+        CIptvIapList*      iAvailableIaps;
+                
+        /**
+        * Currently used IAP, set with SetUsedIap() method.
+        */
+        TIptvIap           iCurrentIap;
+
+#ifdef ISIAIMATCH_USED        
+        /**
+        * Contains the highest priority IAP from iService IAPs which is also
+        * in iActiveIaps.
+        */
+        TIptvIap           iSiAiMatch;
+#endif        
+        
+        /**
+        * The highest priority service IAP which is also found from scanned WLAN IAPs.
+        */
+        TIptvIap           iSiSwiMatch;
+
+#ifdef ICISIMATCH_USED        
+        /**
+        * Contains iCurrentIap if it is found from iService IAP list. 
+        */
+        TIptvIap           iCiSiMatch;
+#endif
+
+        /**
+        * Contains current IAP if it is found from active IAPs.
+        */
+        TIptvIap           iCiAiMatch;
+        
+        /**
+        * Contains current IAP if it is found from scanned WLAN IAPs.
+        */
+        TIptvIap           iCiSwiMatch;
+        
+        /**
+        * Service object, IAP list is fetched from it.
+        */
+        CIptvService*      iService;
+        
+        /**
+        * A mask defining which connection types are allowed for connection.
+        * Bit values from TConnectionType are used.
+        */        
+        TUint32            iConnectionAllowedMask;
+                        
+        /**
+        * The owner of this class
+        */
+        CIptvServer&                 iServer;        
+        
+        /**
+        * All GetUsedIap requests are stored here and a single
+        * WLAN scan is performed for them all.
+        */
+        RArray<TIptvGetUsedIapReq*>  iGetUsedIapReqs;
+
+#ifdef __WINSCW__
+        CIptvTimer*                  iWlanScanSimulationTimer;
+#endif
+
+        /**
+        * Used to perform WLAN scan.
+        */
+        RConnectionMonitor           iConnMon;
+        
+        /**
+        * Contains WLAN scan result.
+        */
+        TConnMonIapInfoBuf           iIapInfoBuf;
+        
+        /**
+        * Used to scan offline state, iOffline is updated accordingly.
+        */
+        CProfileChangeNotifyHandler* iProfChangeHandler;
+        
+        /**
+        * ETrue if phone is in offline mode, if phone is in offline mode
+        * then GPRS IAPS are not used.
+        */
+        TBool                        iOffline;
+        
+        /**
+        * Used to store iCurrentIap feasiblity status in GetUsedIap procedure.
+        */
+        TBool                        iCurrentIapIsFeasible;
+
+        /**
+        * Used to store if WLAN iap available in other snap when GPRS iap selected.
+        */
+        TBool                       iWlanWhenGPRS;
+
+    };
+
+#endif // __CIPTVNETWORKSELECTION_H__
+