videoconnutility/connutility/inc/vcxconnutilimpl.h
branchRCL_3
changeset 23 13a33d82ad98
parent 0 822a42b6c3f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/inc/vcxconnutilimpl.h	Wed Sep 01 12:20:37 2010 +0100
@@ -0,0 +1,373 @@
+/*
+* Copyright (c) 2006 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 to handle connection creation.*
+*/
+
+
+
+
+#ifndef __VCX_CONNUTILIMPL_H_
+#define __VCX_CONNUTILIMPL_H_
+
+// INCLUDES
+#include <e32base.h>
+#include <e32property.h>
+
+#include <agentdialog.h>  
+
+#include "vcxconnutilpubsubobserver.h"
+#include "vcxconnutilextengineobserver.h"
+
+// FORWARD DECLARATIONS
+class CRepository;
+class CVcxConnUtilEngine;
+class CVcxConnUtilPubSub;
+class CVcxConnectionUtility;
+class CVcxConnUtilWaitSch;
+
+
+// CLASS DECLARATION
+
+/**
+* This class defines operations for handling the networking notifications
+* from the engine class, notifications from the PS and provides a functionality
+* for those.
+*
+*/
+NONSHARABLE_CLASS( CVcxConnUtilImpl) : public CBase, 
+                                       public MConnUtilPubsubObserver,
+                                       public MConnUtilExtEngineObserver
+    {
+
+    public: // Constructors and destructor
+        
+        /**
+         * Construction.
+         * 
+         * @param CVcxConnectionUtility* pointer to main interface class for
+         *                               for showing dialogs
+         * @return The newly constructed CVcxConnUtilEngine
+         */
+        static CVcxConnUtilImpl* NewL( CVcxConnectionUtility* aUiInterface );
+    
+        /**
+         * Construction. Object left to cleanupstack
+         * 
+         * @param CVcxConnectionUtility* pointer to main interface class for
+         *                               for showing dialogs
+         * @return The newly constructed CVcxConnUtilEngine
+         */
+        static CVcxConnUtilImpl* NewLC( CVcxConnectionUtility* aUiInterface );
+        
+        /**
+         * Destructor.
+         */
+        virtual ~CVcxConnUtilImpl();
+
+    private:
+                
+        /**
+         * constructor.
+         *
+         * @param CVcxConnectionUtility* pointer to main interface class for
+         *                               for showing dialogs
+         */
+        CVcxConnUtilImpl( CVcxConnectionUtility* aUiInterface  );
+
+        /**
+         * default constructor definition.
+         *
+         */
+        CVcxConnUtilImpl( );
+        
+        /**
+         * Private 2nd phase construction.
+         */
+        void ConstructL();
+                 
+    public: // New functions
+       
+        
+        /**
+        * Returns open IAP, If connection is not opened it will be created
+        *
+        * @param aIapId     On return, IAP ID.
+        * @param aSilent    If ETrue, tries to open connection silently (without dialogs)
+        *                    
+        * @return KErrNone or one of the system wide error codes.
+        */
+        TInt GetIap( TUint32& aIapId, TBool aSilent );
+
+        /**
+        * Closes open connection.
+        */
+        void DisconnectL();
+        
+        /**
+         * Registers observer
+         * 
+         * @param MConnUtilEngineObserver
+         */
+        void RegisterObserverL( MConnUtilEngineObserver* aObserver );
+        
+        /**
+         * Removes observer from the array of observers
+         * 
+         * @param MConnUtilEngineObserver 
+         */
+        void RemoveObserver( MConnUtilEngineObserver* aObserver );
+        
+        /**
+         * Returns current connection status
+         *  
+         * @return TVCxConnectionStatus
+         */
+        TVCxConnectionStatus EngineConnectionStatus();
+        
+        /**
+         * Gets WAP id from IAP id. Leaves with KErrNotFound if no record with given 
+         * IAP id is found.
+         * 
+         * @return WAP id matching the given IAP id.
+         */
+        TUint32 WapIdFromIapIdL( TUint32 aIapId );
+
+    private: // from MConUtilPubsubObserver
+          
+        /**
+         * Notification about pubsub key (integer) value change 
+         *  
+         * @param aKey   PS key informing the change
+         * @param aValue a new value           
+         */
+        void ValueChangedL(const TUint32& aKey, const TInt&  aValue);
+          
+    private: // from MConnUtilExtEngineObserver
+         
+        /**
+         * Engine has gotten mobility event about preferred IAP. Utility must requets permission
+         * from it's clients before connection changing can be done.
+         *  
+         * @return TBool  ETrue if roaming can be allowed from the applicatin.            
+         */
+        TBool RequestIsRoamingAllowedL();
+          
+        /**
+         * Notification about IAP change due roaming. If this instance
+         * is master, it should change the IAP to Pubsub
+         *              
+         */
+        void IapChangedL();
+        
+        /**
+         * Method calls video connection utility's wait scheduler to
+         * put current active object to wait with given id.
+         * 
+         * @param aWaitId  id for the wait
+         */
+        void WaitL( TUint32 aWaitId );
+      
+        /**
+         * Method calls video connection utility's wait scheduler to
+         * end wait for given id
+         * 
+         * @param aWaitId  id for the wait
+         */
+        void EndWait( TUint32 aWaitId ); 
+        
+        /**
+         * Method return ETrue, if this instance is  master
+         * 
+         * @return TBool ETrue if is master, EFalse if not master
+         */
+        TBool IsMaster();
+        
+    private: // New functions
+        
+        /**
+         * Method reads Video center's connection related settings
+         * from the cenrep. Method also tries to reinit details inside
+         * conn util engine, if it fails, "always ask" is saved to VC settings
+         *              
+         * @return KErrNone or one of the system wide error codes. Method can also leave.
+         */
+        TInt PrepareConnSettings();
+       
+        /**
+         * Setups the connection creation prefs for "always ask" situation, and calls engine
+         * to start connection or calls DoCreateConnectionL for other cases.
+         *   
+         * @param aSilent    If ETrue, tries to open connection silently (without dialogs) 
+         *           
+         * @return KErrNone or one of the system wide error codes. Method can also leave.
+         */        
+        TInt CreateConnection( TBool aSilent );
+        
+        /**
+         * Setups and tries to open connection via SNAP.
+         *  
+         * @param aSilent         If ETrue, tries to open connection silently (without dialogs) 
+         * @param aSnapId         snap (destination) id to use in connection
+         * @param aMasterConnect  If true, mobility object needs to be created for receiving events
+         *                        from network.  
+         *           
+         * @return KErrNone or one of the system wide error codes. Method can also leave.
+         */   
+        TInt DoCreateConnection( TBool aSilent, TInt32 aSnapId, TBool aMasterConnect );       
+        
+        /**
+         * After connection staring is finished by the engine, this method is to be called.
+         * Method first checks is connection is ne for this inctance and if it is, 
+         * utility's internal connection information is setted up. Method also
+         * calls CheckAndChangeSlaveToMaster to setup this inctance to be master if 
+         * one does not yet exist. If this inctance is to be master, connection info
+         * is updated to PS as well. 
+         *   
+         *           
+         * @return KErrNone if connection data filled ok and we are connected.
+         */
+        TInt HandleFinalizeConnection();
+        
+        /**
+         * Displays a wait note
+         *   
+         * @param aConnectionName name of connection to show on the dialog          
+         */ 
+        void DisplayWaitNote( const TDesC& aConnectionName = KNullDesC );
+        
+        /**
+         * closes a wait note
+         *           
+         */
+        void CloseWaitNote();
+        
+        /**
+         * Method queries all observers and requests roaming status from them.
+         * If all observers accept or there is not observers, PS key EVCxPSNbRoamAccepted
+         * is increased by one. After method ends, PS key EVCxPSNbrRoamResp is increased by 
+         * one to notify that one response is ready.  
+         *   
+         * @return TBool    ETrue if roaming is allowed        
+         */ 
+        TBool DoRequestClientRoamingL();
+        
+        /**
+         * Method saves iap id and name, snap id and name and connection state
+         * to pubsub.  
+         *           
+         */ 
+        void SaveConnectionToPubSubL();
+        
+        /**
+         * Method handles changing of slave to master when existing 
+         * master is diconnecting. If change has occured, reinits
+         * the connection to be used via snap instead of IAP
+         *            
+         */
+        void HandleMasterChangeL();
+        
+        /**
+         * Method handles the actual change of this instance to be 
+         * master if there is not yet any. 
+         * 
+         * Changing is protected by semaphore, so only one existing
+         * slave instance can check and possible change it's status
+         * at the time.  
+         * 
+         * Note that KErrNone does not indicate succesfull status 
+         * chenge. Caller should also check if iMaster -value has changed.
+         * 
+         * @return TInt  KErrNone or one of the system wide error codes,               
+         */
+        TInt CheckAndChangeSlaveToMaster();
+        
+        /**
+         * Method changes slave instance connection status
+         * based on given value.  
+         * 
+         * @param aNewStatus new status from master  
+         *           
+         */
+        void HandleSlaveConnectionStatusL( const TInt& aNewStatus );
+        
+        /**
+         * Method checks whether there are enough responses for the roaming 
+         * request. If there is sets roaming acceptance status to PS.   
+         * 
+         * @param aNbrOfResps number of responces received so far  
+         *           
+         */
+        void HandleRoamingReponsesL( const TInt& aNbrOfResps );
+        
+        /**
+         * Method notifies observers about IAP changed event  
+         *           
+         */
+        void NotifyObserversIAPChanged();
+                                      
+    private: // Data
+        
+        
+        /**
+         * Interface for UI related functions for connecting utility:
+         * Showing and hiding connection -dialog
+         */
+        CVcxConnectionUtility* iUIInterface;
+        
+        /**
+         * Connection utility engine. Handles connection creation, disconnecting and
+         * connection meta data
+         */
+        CVcxConnUtilEngine* iEngine; 
+        
+        /**
+         * pubsub engine, listens pubsub keys
+         * and notify chenges 
+         */
+        CVcxConnUtilPubSub* iPubsub;
+
+        /**
+         * Wait handler for managing all CactiveSchedulerWaits
+         * used by video connection utility
+         */
+        CVcxConnUtilWaitSch* iWaitHandler;
+                               
+        /**
+         * Array of external network observers. 
+         */
+        RArray<MConnUtilEngineObserver*> iObservers;
+        
+        /**
+         * Is this instance the master
+         */
+        TBool iMaster;
+                
+        /**
+         * Semaphore to prevent concurrency in master / slave switch
+         */
+        RSemaphore iSemaSwitchRole;
+        
+        /**
+         * Semaphore to prevent concurrency connection creation
+         */
+        RSemaphore iSemaCreateConn;
+
+        /**
+         * Used curing connection creation to tell active objects
+         * that current connection is new.
+         */
+        TBool iNewConnection;
+    };
+#endif // __VCX_CONNUTILIMPL_H_
+// End of File