videoconnutility/connutility/inc/vcxconnutilimpl.h
author hgs
Fri, 28 May 2010 09:48:00 +0300
changeset 31 07dea94512a2
parent 0 822a42b6c3f1
permissions -rw-r--r--
201021

/*
* 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