natplugins/natpnatfwsdpprovider/inc/nspmediastreamcontainer.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natplugins/natpnatfwsdpprovider/inc/nspmediastreamcontainer.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,391 @@
+/*
+* 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:  Container for NAT FW streams, class description.
+*
+*/
+
+#ifndef NSPMEDIASTREAMCONTAINER_H
+#define NSPMEDIASTREAMCONTAINER_H
+
+#include <e32base.h>
+#include <badesca.h> 
+#include "nsppluginreturndef.h"
+#include "mnatfwconnectivityobserver.h"
+#include "natfwconnectivityapidefs.h"
+#include "nsputdefinitions.h"
+
+class TInetAddr;
+class CSdpDocument;
+class CSdpMediaField;
+class CNATFWCredentials;
+class MNSPControllerIF;
+class CNSPContentParser;
+class CNSPMediaStream;
+class CNSPMediaStreamComponent;
+
+/**
+ *  Objects created from this class contain all NATFW related objects.
+ *
+ *  These objects work as all around interface for all NATFW prosessing.    
+ *  State machine uses this object to initiate async calls for NATFW, 
+ *  which then causes NATFW callbacks are sent to here.
+ *	
+ *  @lib natfwsdpprovider.dll
+ *  @since S60 3.2
+ */
+class CNSPMediaStreamContainer : public CBase
+    {
+public: // Constructors and destructor
+    
+    /**
+     * A two-phase constructor.
+     */
+    static CNSPMediaStreamContainer* NewL( MNSPControllerIF& aController,
+            TUint aSessionId, TUint aProtocol );
+    
+    /**
+     * A two-phase constructor.
+     */
+    static CNSPMediaStreamContainer* NewLC( MNSPControllerIF& aController,
+            TUint aSessionId, TUint aProtocol );
+    
+    /**
+     * Destructor.
+     */
+    virtual ~CNSPMediaStreamContainer();
+
+
+private: // Constructors and destructor
+
+    CNSPMediaStreamContainer( MNSPControllerIF& aController,
+            TUint aSessionId, TUint aProtocol );
+
+    
+public: // New functions
+	
+	/**
+	 * Notifies media stream about NATFW event.
+	 *
+	 * @since       S60 3.2
+	 * @param       aStreamId           The ID identifying stream.
+	 * @param       aEvent              The event.
+	 * @param       aError              The completion code of the operation.
+	 * @param		aData				Event specific data.
+	 * @return      Returns status code, i.e. global error code,
+	 * 				KNatReady or KNatAsync.
+	 */
+	TNatReturnStatus ControlMediaL( TUint aStreamId,
+			MNATFWConnectivityObserver::TNATFWConnectivityEvent aEvent,
+			TInt aError, TAny* aData );
+    
+    /**
+     * This method is used to update host-peer candidate pairs while 
+     * candidate checks are ongoing.
+     *
+     * @since       S60 3.2
+     * @param       aLocalCands         Sdp document containing local candidates.
+     * @param       aRemoteCands        Sdp document containing remote candidates.
+     */
+    void UpdateL( RPointerArray<CNATFWCandidate>& aRemoteCands );
+    
+    /**
+     * This method is used to setup ICE role to NATFW. Role is
+     * stream specific, hence it is handled as FetchCandidates, but without
+     * state transitions. This method is ICE specific.
+     * 
+     * @since       S60 3.2
+     * @param       aRole               Role enumeration.
+     */
+    void SetRoleL( TNATFWIceRole aRole );
+    
+    /**
+     * This method is used to setup inbound ICE credentials to NATFW. Credentials are
+     * stream specific. This method is ICE specific.
+     * 
+     * @since       S60 3.2
+     */
+    void SetInboundCredentialsL();
+    
+    /**
+     * This method is used to setup outbound ICE credentials to NATFW. Credentials are
+     * stream specific. This method is ICE specific.
+     * 
+     * @since       S60 3.2
+     */
+    void SetOutboundCredentialsL();
+    
+    /**
+     * This method is used to Reset and Destroy local candidates from
+     * individual stream components.
+     * 
+     * @since       S60 3.2
+     */
+    void ResetAndDestroyCandidates();
+    
+    /**
+     * This method is used to load approriate plugin in NATFW.
+     * 
+     * @since       S60 3.2
+     * @param       aPlugins            Array containing protocol strings.
+     * @param       aPluginIndex        Reference that is used to return
+     *                                  loaded plugin index.
+     */
+    void LoadPluginL( CDesC8Array& aPlugins, TInt& aPluginIndex );
+    
+    /**
+     * This method is part of services that are given for session state machine.
+     * Method initiates local candidate solving, by FetchCandidate(s)L call.
+     * This method is STUN specific.
+     * 
+     * @since       S60 3.2
+     */
+    void FetchCandidateL();
+    
+    /**
+     * This method is part of services that are given for session state machine.
+     * Method initiates local candidate solving, by FetchCandidates call.
+     * This method is ICE specific.
+     * 
+     * @since       S60 3.2
+     */
+    void FetchCandidatesL();
+    
+    /**
+     * This method is part of services that are given for session state machine.
+     * Method initiates candidate pair resolving. This method is ICE specific.
+     * 
+     * @since       S60 3.2
+     * @param       aRemoteCandidates   Remote candidates object array.
+     */
+    void PerformCandidateChecksL(
+            RPointerArray<CNATFWCandidate>& aRemoteCandidates );
+    
+    /**
+     * This method is part of services that are given for session state machine.
+     * Method initiates stream activation for NATFW. This method is STUN specific.
+     * 
+     * @since       S60 3.2
+     * @param       aDocument           Sdp document object, connection info in this
+     *                                  object is used as peer transport address.
+     */
+    void ActivateL( CSdpDocument& aDocument );
+    
+    /**
+     * This method is part of services that are given for session state machine.
+     * Method initiates stream activation for NATFW. This method is ICE specific.
+     * Peer transport address in ICE situation is received from NATFW.
+     * 
+     * @since       S60 3.2
+     */
+    void ActivateL();
+    
+    /**
+     * This method is used to initiate SetReceiving/SendingStatus - calls
+     * to NATFW, to deactivate sending/receiving.
+     * 
+     * @since       S60 3.2
+     */
+    void DeActivateL();
+    
+    /**
+     * This method is used to create media streams from media field
+     * streams in given SDP.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Sdp document reference.
+     */
+    TNatReturnStatus CreateStreamsL( CSdpDocument& aDoc );
+    
+    /**
+     * This method is used to remove existing media streams.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Sdp document reference.
+     */
+    TNatReturnStatus RemoveStreamsL( CSdpDocument& aDoc );
+    
+     /**
+     * This method is used to remove existing media streams.
+     * 
+     * @since       S60 3.2
+     * @param       aStream                nspmediastream.
+     */
+    TInt  RemoveStream(CNSPMediaStream* aStream);
+    
+    /**
+     * This method is used to modify Sdp document so that Mobile originating
+     * data from NATFW is changed to m/c - lines.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Session Sdp document object.
+     */
+    void ModStunSolvedL( CSdpDocument& aDoc );
+    
+    /**
+     * This method is used to modify Sdp document so that Mobile originating
+     * data from NATFW is changed to m/c - lines.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Session Sdp document object.
+     */
+    void ModIceSolvedL( CSdpDocument& aDoc );
+    
+    /**
+     * This method is used to modify Sdp document so that Mobile terminating
+     * data from NATFW is changed to m/c - lines.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Session Sdp document object.
+     */
+    void ModLocalSolvedL( CSdpDocument& aDoc );
+    
+    /**
+     * This method is used to add ICE specific attributes to media field.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Session Sdp document object.
+     */
+    void AddIceContentL( CSdpDocument& aDoc );
+    
+    /**
+     * This method is used to add ICE specific remote-candidates - attribute
+     * to media field. Used only in final updated offer.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Session Sdp document object.
+     */
+    void AddRemoteCandidatesL( CSdpDocument& aDoc );
+    
+    /**
+     * This method is used to get ICE candidates from media field.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Session Sdp document object.
+     * @param       aRemoteCandidates   Array where received candidates are inserted.
+     * @return      Nat status, if asynchronous processing needed,
+     *              KNatAsync is returned. Otherwise KNatReady, or error code.
+     */
+    TNatReturnStatus GetCandidatesL( CSdpDocument& aDoc,
+            RPointerArray<CNATFWCandidate>& aRemoteCandidates );
+    
+    /**
+     * This method is used to get ICE identification from media field, or
+     * from session level.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Session Sdp document object.
+     * @param       aSessionlevel       Reference to a credentials object.
+     * @return      Nat status, if asynchronous processing needed,
+     *              KNatAsync is returned. Otherwise KNatReady.
+     */
+    TNatReturnStatus GetCredentialsL( CSdpDocument& aDoc,
+            CNATFWCredentials& aSessionlevel );
+    
+    /**
+     * This method is used to check whether peers remote transport address
+     * has changed in latter O/A exchange.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Session Sdp document object.
+     * @return      Nat status, if asynchronous processing needed,
+     *              KNatAsync is returned. Otherwise KNatReady.
+     */
+    TNatReturnStatus GetSessionConnInfoL( CSdpDocument& aDoc );
+    
+    /**
+     * This method is used to check if the initial Offer must be updated,
+     * since Ice concluded on different transport addresses than DEFAULT
+     * values in initial Offer.
+     * 
+     * @since       S60 3.2
+     * @param       aDoc                Session Sdp document object.
+     * @return      New sdp document if update is needed, else NULL.
+     */
+    CSdpDocument* CheckUpdateL( CSdpDocument& aDoc );
+    
+    /**
+     * This method is used to setup Type-of-service field for media sockets.
+     * Parameter is given to the NATFW in stream creation.
+     * 
+     * @since       S60 3.2
+     * @param       aMediaTos           Type-of-service value, valid range [0,63].
+     * @return      KErrArgument returned if argument was not in valid range.
+     *              Otherwise KErrNone returned.
+     */
+    TInt SetMediaTos( TUint aMediaTos );
+    
+    /**
+     * This method is used to get Type-of-service field value.
+     * 
+     * @since       S60 3.2
+     * @return      Type-of-service value, valid range [0,63].
+     */
+    TUint MediaTos() const;
+
+
+private: // New functions
+    
+    TNatReturnStatus RemovePending( TUint aComponentId, TBool aRemove );
+    
+    TInt FindMediaStream( TUint aStreamId );
+    
+    TInt FindCollection( TUint aCollectionId );
+
+
+private: // data
+
+    /**
+     * Reference to a Ice Sdp Controller, a wrapper for NATFW API.
+     * Not own.
+     */ 
+    MNSPControllerIF& iController;
+    
+    /**
+     * Session unique identifier.
+     */
+    TUint iSessionId;
+
+    /**
+     * Used protocol.
+     */
+    TUint iProtocol;
+
+    /**
+     * Media type-of-service
+     */
+    TInt iMediaTos;
+
+    /**
+     * Array containing media streams collection Ids, that are pending for
+     * NATFW event.
+     * Own.
+     */
+    RArray<TUint> iPendingArray;
+
+    /**
+     * Array containing Media streams.
+     * Own.
+     */
+    RPointerArray<CNSPMediaStream> iStreamArray;
+
+    /**
+     * Definitions for unit testing.
+     */
+    NSP_UT_DEFINITIONS
+    
+    };
+
+#endif // NSPMEDIASTREAMCONTAINER_H
+
+// end of file