natfw/natfwclient/inc/natfwsession.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwclient/inc/natfwsession.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,434 @@
+/*
+* Copyright (c) 2007 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:    NAT FW session abstraction
+*
+*/
+
+
+
+
+#ifndef C_CNATFWSESSION_H
+#define C_CNATFWSESSION_H
+
+#include <e32base.h>
+#include "natfwconnectivityapidefs.h"
+#include "mnatfwpluginobserver.h"
+
+class CNATFWCandidate;
+class CNATFWCandidatePair;
+class CNATFWStream;
+class CNcmConnectionMultiplexer;
+class MNATFWConnectivityObserver;
+class MNATFWRegistrationController;
+class CNATFWPluginApi;
+class CNATFWNatSettingsApi;
+class CNATFWPluginApi;
+class CDesC8Array;
+class CNatFwAsyncCallback;
+
+/**
+ *  NAT FW session abstraction.
+ *
+ *  Provides network connection layer and operation context for
+ *  the NAT FW streams. Can be mapped e.g. to the SDP-session.
+ *
+ *  @lib natconfw.lib
+ *  @since S60 v3.2
+ */
+NONSHARABLE_CLASS( CNATFWSession ) : public CBase, public MNATFWPluginObserver
+    {
+
+    friend class UT_CNATFWClient;
+
+public:
+
+    static CNATFWSession* NewL(
+        CNcmConnectionMultiplexer& aMultiplexer,
+        MNATFWRegistrationController& aController,
+        CNatFwAsyncCallback& aAsyncCallback,
+        const TDesC8& aDomain,
+        TUint32 aIapId );
+
+    static CNATFWSession* NewLC(
+        CNcmConnectionMultiplexer& aMultiplexer,
+        MNATFWRegistrationController& aController,
+        CNatFwAsyncCallback& aAsyncCallback,
+        const TDesC8& aDomain,
+        TUint32 aIapId );
+
+    virtual ~CNATFWSession();
+
+    /**
+     * Returns the session identifier.
+     *
+     * @since   S60 v3.2
+     * @return  The session identifier
+     */
+    TUint SessionId() const;
+
+    /**
+     * Loads a NAT protocol plugin to the session. Old plugin is destroyed if
+     * it exists. In this case NAT operations for the session must be started
+     * anew ( FetchCandidate(s) and possible ICE processing ).
+     *
+     * Given NAT protocol plugins are tried to be loaded in order until a
+     * working one is found.
+     *
+     * @since   S60 v3.2
+     * @param   aPlugins        Array containing identifiers for available
+     *          NAT-protocol plugins in preferred order. E.g.
+     *          "exampleprovider.stun".
+     * @param   aLoadedPluginInd Index to the aPlugins array telling actually
+     *          loaded plugin.
+     * @leave   KErrNotFound NAT-plugin was not found
+     */
+    void LoadPluginL( const CDesC8Array& aPlugins, TInt& aLoadedPluginInd );
+
+
+    /**
+     * Resolves public IP address to be used in the communication between
+     * peers. MNATFWConnectivityObserver::NewLocalCandidateFound
+     * is called when a public IP has been resolved.
+     *
+     * @since   S60 v3.2
+     * @param   aStreamId       The ID identifying stream
+     * @param   aAddrFamily     KAFUnspec / KAfInet / KAfInet6
+     */
+    void FetchCandidateL( TUint aStreamId, TUint aAddrFamily );
+    
+    /**
+     * ICE spesific function. Fetches IP address candidates for the
+     * communication between peers. Client is responsible for providing a
+     * mapping between components of media stream through the collection ID
+     * parameter. MNATFWConnectivityObserver::NewLocalCandidateFound
+     * is called whenever a new candidate has been found.
+     *
+     * @since   S60 v3.2
+     * @param   aStreamId       The ID identifying stream
+     * @param   aCollectionId   The stream collection identifier
+     * @param   aComponentId    The media component identifier
+     * @param   aAddrFamily     KAFUnspec / KAfInet / KAfInet6
+     */
+    void FetchCandidatesL( TUint aStreamId, TUint aCollectionId,
+        TUint aComponentId, TUint aAddrFamily );
+           
+    /**
+     * Creates a new stream for the client. On return the client receives a
+     * stream identifier.
+     *
+     * @since   S60 v3.2
+     * @param   aProtocol       KProtocolInetUdp / KProtocolInetTcp
+     * @param   aQoS            The desired quality of service.
+     * @return  The ID for the created stream
+     */
+    TUint CreateStreamL( TUint aProtocol, TInt aQoS );
+
+    /**
+     * ICE specific function.
+     * Sets the role of local ICE agent. In role-conflict situation given role
+     * will be silently changed.
+     *
+     * @since   S60 v3.2
+     * @param   aRole           The role
+     */
+    void SetRoleL( TNATFWIceRole aRole );
+
+    /**
+     * ICE specific function.
+     * Performs connectivity checks between the local candidates and the
+     * remote candidates. MNATFWConnectivityObserver::NewCandidatePairFound
+     * is called whenever working connection between local and remote
+     * candidate is found.
+     *
+     * @since   S60 v3.2
+     * @param   aRemoteCandidates   The remote candidate array
+     */
+    void PerformConnectivityChecksL(
+        RPointerArray<CNATFWCandidate>& aRemoteCandidates );
+
+    /**
+     * ICE specific function.
+     * Updates ICE processing for a session with the candidate pairs selected
+     * by the controlling peer. If ICE processing for a stream is completed,
+     * update for that is silently ignored.
+     *
+     * ICE restart is handled by setting new role and credentials and
+     * re-starting connectivity checks with PerformCandidateChecksL.
+     *
+     * Adding new streams does not differ from initial operation.
+     * Removing of streams is handled with CloseStreamL.
+     *
+     * @since   S60 v3.2
+     * @pre     ICE processing is started with PerformConnectivityChecksL
+     * @param   aPeerSelectedPairs  Peer selected candidate pairs
+     * @leave   KErrNotSupported Loaded NAT Protocol plugin does not support
+     * operation.
+     * @post    ICE processing is continued with new parameters
+     */
+    void UpdateIceProcessingL(
+        RPointerArray<CNATFWCandidatePair>& aPeerSelectedPairs );
+
+    /**
+     * ICE specific function.
+     * Updates ICE processing for a session with an updated set of remote
+     * candidates. If ICE processing for a stream is completed, update for
+     * that is silently ignored. New remote candidates will be included in
+     * connectivity tests from this point onwards.
+     *
+     * ICE restart is handled by setting new role and credentials and
+     * re-starting connectivity checks with PerformCandidateChecksL.
+     *
+     * Adding new streams does not differ from initial operation.
+     * Removing of streams is handled with CloseStreamL.
+     *
+     * @since   S60 v3.2
+     * @pre     ICE processing is started with PerformConnectivityChecksL
+     * @param   aRemoteCands        All remote candidates known currently
+     * @leave   KErrNotSupported Loaded NAT Protocol plugin does not support
+     * operation.
+     * @post    ICE processing is continued with new parameters
+     */
+    void UpdateIceProcessingL(
+        RPointerArray<CNATFWCandidate>& aRemoteCands );
+
+    /**
+     * Closes the stream from the session.
+     *
+     * @since   S60 v3.2
+     * @pre     Streaming is disabled with SetReceivingStateL/SetSendingStateL
+     * @param   aStreamId           The ID identifying stream
+     */
+    void CloseStreamL( TUint aStreamId );
+
+    /**
+     * Returns stream by identifier.
+     *
+     * @since   S60 v3.2
+     * @param   aStreamId           The ID identifying stream
+     * @return  Stream or NULL if not found
+     */
+    CNATFWStream* StreamById( TUint aStreamId );
+
+    /**
+     * Returns stream by identifier. Leaves with KErrNotFound if stream
+     * isn't found.
+     *
+     * @since   S60 v3.2
+     * @param   aStreamId           The ID identifying stream
+     * @return  Stream
+     */
+    CNATFWStream* StreamByIdL( TUint aStreamId );
+
+    /**
+     * From MNATFWPluginObserver.
+     * Called when an error within a stream has occured.
+     *
+     * @since   S60 v3.2
+     * @param   aPlugin         The plugin raising event
+     * @param   aStreamId       The ID identifying stream
+     * @param   aErrorCode      Standard system wide error code
+     */
+    void Error( const CNATFWPluginApi& aPlugin,
+        TUint aStreamId, TInt aErrorCode );
+
+    /**
+     * From MNATFWPluginObserver.
+     * Notifies the client of plugin events.
+     *
+     * @since   S60 v3.2
+     * @param   aPlugin         The plugin raising event
+     * @param   aStreamId       The ID identifying stream
+     * @param   aEvent          The event
+     * @param   aErrCode        Standard system wide error code
+     */
+    void Notify( const CNATFWPluginApi& aPlugin,
+        TUint aStreamId, TNATFWPluginEvent aEvent, TInt aErrCode );
+
+    /**
+     * From MNATFWPluginObserver.
+     * Called when working candidate pair has been found. Ownership of
+     * the candidate pair is trasferred.
+     *
+     * @since   S60 v3.2
+     * @param   aPlugin         The plugin raising event
+     * @param   aCandidatePair  The candidate pair which was found
+     */
+    void NewCandidatePairFound(
+        const CNATFWPluginApi& aPlugin,
+        CNATFWCandidatePair* aCandidatePair );
+
+    /**
+     * From MNATFWPluginObserver.
+     * Called when a new local candidate has been found. Ownership of the
+     * candidate is trasferred.
+     *
+     * @since   S60 v3.2
+     * @param   aPlugin         The plugin raising event
+     * @param   aCandidate      The local candidate that was found
+     */
+    void NewLocalCandidateFound(
+        const CNATFWPluginApi& aPlugin,
+        CNATFWCandidate* aCandidate );
+
+private:
+
+    CNATFWSession(
+        CNcmConnectionMultiplexer& aMultiplexer,
+        MNATFWRegistrationController& aController,
+        CNatFwAsyncCallback& aAsyncCallback,
+        TUint32 aIapId );
+
+    void ConstructL( const TDesC8& aDomain );
+
+    void HandleQueuedItems();
+
+    void DoNotify(
+        TUint aStreamId,
+        MNATFWConnectivityObserver::TNATFWConnectivityEvent aEvent,
+        TInt aErrCode,
+        TAny* aEventData );
+
+private:
+
+    /** Identifies states for Server connection  **/
+    enum TServerConnectionState
+        {
+        EConnectionUnspecified    =   1,
+        EConnectionInProgress     =   2,
+        EConnectionConnected      =   3,
+        EConnectionFailed         =   4
+        };
+
+    class TStatusCounter
+        {
+    public: // Constructors and destructor
+
+    inline TStatusCounter() :
+        iActivatedCount( 0 ),
+        iStreamId( 0 ),
+        iErrorOccurred( EFalse )
+        {};
+
+    public: // Data
+
+        TUint iActivatedCount;
+
+        TUint iStreamId;
+
+        TBool iErrorOccurred;
+        };
+
+
+    class TFetchingData
+        {
+    public: // Constructors and destructor
+
+    inline TFetchingData( TUint aStreamId, TUint aCollectionId,
+            TUint aComponentId, TUint aAddrFamily, TBool aICESpecific ) :
+        iStreamId( aStreamId ),
+        iCollectionId( aCollectionId ),
+        iComponentId( aComponentId ),
+        iAddrFamily( aAddrFamily ),
+        iICESpecific( aICESpecific )
+        {};
+
+    public: // Data
+
+        TUint iStreamId;
+        TUint iCollectionId;
+        TUint iComponentId;
+        TUint iAddrFamily;
+        TBool iICESpecific;
+        };
+
+private: // data
+
+    /**
+     * Used to keep track ongoing sending status requests on stream basis.
+     * Own.
+     */
+    RArray<TStatusCounter> iSendingStatusCounts;
+
+    /**
+     * Used to keep track ongoing receiving status requests on stream basis.
+     * Own.
+     */
+    RArray<TStatusCounter> iReceivingStatusCounts;
+
+    /**
+     * Unique session identifier
+     */
+    TUint iSessionId;
+
+    /**
+     * Internet access point identifier
+     */
+    TUint32 iIapId;
+
+    /**
+     * Domain for settings querying
+     * Own.
+     */
+    HBufC8* iDomain;
+
+    /**
+     * NAT FW Registration controller
+     * Not own.
+     */
+    MNATFWRegistrationController& iController;
+
+    /**
+     * The multiplexer
+     * Not own.
+     */
+    CNcmConnectionMultiplexer& iMultiplexer;
+
+    /**
+     * Async callback handler
+     * Not own.
+     */
+    CNatFwAsyncCallback& iAsyncCallback;
+
+    /**
+     * NAT-settings
+     * Own.
+     */
+    CNATFWNatSettingsApi* iNatSettings;
+
+    /**
+     * NAT-protocol plugin used in the session
+     * Own.
+     */
+    CNATFWPluginApi* iPlugin;
+
+    /**
+     * Streams created into the session
+     * Own.
+     */
+    RPointerArray<CNATFWStream> iStreams;
+
+    /**
+     * Server connection process state
+     */
+    TServerConnectionState iServerConnectionState;
+
+    /**
+     * FetchCandidate(s) queue
+     * Own.
+     */
+    RArray<TFetchingData> iFetchCandidateQueue;
+
+    };
+
+#endif // C_CNATFWSESSION_H