upnp/upnpstack/upnpconnmanager/inc/upnpconnmanagerengine.h
author Stefan Karlsson <stefan.karlsson@nokia.com>
Sun, 28 Mar 2010 16:38:08 +0100
branchCompilerCompatibility
changeset 8 92b4d337bbaf
parent 0 f5a58ecadc66
permissions -rw-r--r--
Fixed "extra qualification" syntax errors.

/** @file
* Copyright (c) 2005-2006 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:  CUpnpConnManagerEngine
*
*/

#ifndef C_CUPNPCONNMANAGERENGINE_H
#define C_CUPNPCONNMANAGERENGINE_H

// INCLUDES

#include <e32base.h>
#include <es_sock.h>
#include <commdbconnpref.h>

#include "upnpnotifytimer.h"
#include "upnpconninterfacewatcher.h"

// FORWARD DECLARATIONS
class CUpnpConnManagerSession;

/**
 * Class used to wrap Symbian RConnection class.
 * Fixes performance problem when RConnection::Start() used symultanously by
 * two or more processes/threads.
 * @see CUpnpConnectionManagerProxy for more information.
 * @since S60 5.0
 */
class CUpnpConnManagerEngine : public CBase, public MUpnpNotifyTimerObserver,
                               public MUpnpConnInterfaceWatcherObserver
    {
public:

    /**
     * A two-phased constructor function
     * @param aIterator sessions iterator
     * @result A new instance of CUpnpConnManagerEngine
     */
    static CUpnpConnManagerEngine* NewL( TDblQueIter<CSession2>& aIterator );

    /**
     * Destructor function
     */
    virtual ~CUpnpConnManagerEngine();

public:

    /**
     * After call of this method the caller is sure that
     * RConnection was started.
     * @param aAccessPoint id of current accessPoint on which RConnection was started
     * @return starting error
     */
    TInt EnsureStart( TInt& aAccessPoint );

    /**
     * @since Series60 5.0 HN
     * @return indicates whether RConnection is started.
     */
    TBool IsStarted();

    /**
     * @since Series60 5.0 HN
     * @return active iap
     */
    TInt ActiveIap();
    
    /**
     * Returns inet address
     * @since Series60 5.0 HN
     * @return local IP address
     */
    const TInetAddr& LocalAddress();
    
    /**
     * Checks if left any session which called EnsureStart(), 
     * when not then RConnection is closed
     * @since Series60 5.0 HN
     * @param Session wich call this function
     * @return None
     */
    void CheckAndCloseConnection( CUpnpConnManagerSession* aSession );
    
private:
    /**
     * Default constructor.
     */
    CUpnpConnManagerEngine( TDblQueIter<CSession2>& aIterator );

    /**
     * 2nd phase constructor.
     */
    void ConstructL();

    /**
     * Opens and connects RConnection, subscribes for IP event notyfications 
     * (for address change) and Connection closed notyfication. In case of error
     * Leaves.
     * @since Series60 5.0 HN
     * @return None
     */
    void EnsureStartL();

    /**
     * Set state that one attempt to start the RConnection
     * @param aError error code of starting
     * @param aUSec microsecond for timeout
     */
    void SetStartAttemptStatus( TInt aError, TTimeIntervalMicroSeconds32 aUSec );

    /**
     * Reset state. One will be able to attempt to start RConnection again
     * @since Series60 5.0 HN
     * @return None
     */
    void ClearStartAttemptStatus();
    
    /**
     * Cancel all subscription to network event
     * @since Series60 5.0 HN
     * @return None
     */
    void CancelAllSubscription();
    
    /**
     * Notify all clients about wlan lost event
     * @since Series60 5.0 HN
     * @return None
     */                                 
    void NotifyAllAboutWlanLost();
            
    /**
     * Notify all clients about address change event
     * @since Series60 5.0 HN
     * @return None
     */                                 
    void NotifyAllAboutAddressChange( TInetAddr& aAddr );

    /**
     * Notify all clients about connection closed event
     * @since Series60 5.0 HN
     * @return None
     */                                 
    void NotifyAllAboutConnectionClosed();

    /**
     * Closes RConnection
     * @since Series60 5.0 HN
     * @return None
     */                                 
    void CloseConnection();

    /**
     * Gets Iap from central repository and sets iCommDbConnPref.
     * @since Series60 5.0 HN
     * @return None
     */                                 
    void SetupConnectionPreferencesL();
            
private: // from MUpnpConnInterfaceWatcherObserver    
        
    /**
     * Marks connection interface as not vaild
     */
    void WlanNetworkLost();

    /**
     * Invoked when address changes
     * @param new address
     */
    void InterfaceAddressChange( TInetAddr& aAddr );
        
private: // from MUpnpNotifyTimerObserver

    void TimerEventL( CUpnpNotifyTimer* aTimer );

private:
    // Connection preferences
    TCommDbConnPref iCommDbConnPref;

    // Connection
    RConnection iConnection;

    // SocketServer
    RSocketServ iSocketServ;

    // have we tried to start the interface
    TInt iStartAttemptDone;

    // error code of starting
    TInt iCachedStartError;

    // hysteresis timer preventing double asking 
    // when first attempt fails e.g. when user cancels starting of IAP
    CUpnpNotifyTimer* iUnsuccesfulStartCacheTimer;
    
    // it is needed only for "always ask" case
    TInt iActiveIap;

    // connection interface watcher
    CUpnpConnInterfaceWatcher* iIfWatcher;
    
    // session iterator
    TDblQueIter<CSession2>& iSessionIter;
    
    };


#endif // C_CUPNPCONNMANAGERENGINE_H