--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwicecandidatehandler/inc/ciceconnectionhandler.h Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,437 @@
+/*
+* Copyright (c) 2006-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:
+*
+*/
+
+
+
+
+
+#ifndef CNATFWCONNECTIONHANDLER_H
+#define CNATFWCONNECTIONHANDLER_H
+
+
+#include <e32base.h>
+#include <in_sock.h>
+#include "mncmconnectionobserver.h"
+#include "natfwstunclientobserver.h"
+#include "mncmincomingconnectionobserver.h"
+#include "micenatplugineventobs.h"
+#include "icecandidatehandlerdefs.h"
+#include "natfwcandidate.h"
+#include "natfwinternaldefs.h" //UNIT_TEST
+
+class TInetAddr;
+class CSTUNClient;
+class CSTUNBinding;
+class MNcmConnectionMultiplexer;
+class CIceSessionData;
+class MIceConnCheckObserver;
+class MIceConnHandlerObserver;
+class TBindingData;
+class CIceNatPluginContainer;
+class CNATFWCandidatePair;
+
+/**
+ * Hides connection handling related tasks from rest of ICE plugin.
+ *
+ * @lib icecandidatehandler.dll
+ * @since S60 v3.2
+ */
+class CIceConnectionHandler : public CBase,
+ public MSTUNClientObserver,
+ public MNcmIncomingConnectionObserver,
+ public MNcmConnectionObserver,
+ public MIceNatPluginEventObs
+ {
+
+ UNIT_TEST( UT_CIceConnectionHandler )
+
+public:
+
+ /** ICE connection type */
+ enum TIceConnectionType
+ {
+ EIceConnTypeHost = 1,
+ EIceConnTypeTurn = 2
+ };
+
+ /**
+ * Two-phased constructor.
+ * @param aMultiplexer Multiplexer
+ * @param aEventObserver Observer for events
+ * @param aSessionData Session data
+ * @param aPluginContainer Plugin container
+ * @param aConnHandlerObs Observer for the connection handler
+ */
+ static CIceConnectionHandler* NewL(
+ MNcmConnectionMultiplexer& aMultiplexer,
+ MIceNatPluginEventObs& aEventObserver,
+ CIceSessionData& aSessionData,
+ CIceNatPluginContainer& aPluginContainer,
+ MIceConnHandlerObserver& aConnHandlerObs );
+
+ /**
+ * Two-phased constructor.
+ * @param aMultiplexer Multiplexer
+ * @param aEventObserver Observer for events
+ * @param aSessionData Session data
+ * @param aPluginContainer Plugin container
+ * @param aConnHandlerObs Observer for the connection handler
+ */
+ static CIceConnectionHandler* NewLC(
+ MNcmConnectionMultiplexer& aMultiplexer,
+ MIceNatPluginEventObs& aEventObserver,
+ CIceSessionData& aSessionData,
+ CIceNatPluginContainer& aPluginContainer,
+ MIceConnHandlerObserver& aConnHandlerObs );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CIceConnectionHandler();
+
+ /**
+ * Enables/disables media receiving for the specified local candidate.
+ *
+ * @since S60 v3.2
+ * @param aLocalCandidate The local end point for a media
+ * @param aState The receiving state
+ */
+ void SetReceivingStateL( const CNATFWCandidate& aLocalCandidate,
+ TNATFWStreamingState aState );
+
+ /**
+ * Enables/disables media sending from the specified local candidate.
+ *
+ * @since S60 v3.2
+ * @param aLocalCandidate The local end point for a media
+ * @param aState The sending state
+ * @param aDestAddr The remote end point for a media
+ */
+ void SetSendingStateL( const CNATFWCandidate& aLocalCandidate,
+ TNATFWStreamingState aState, const TInetAddr& aDestAddr );
+
+ /**
+ * Gets identifier for a connection that is associated with the
+ * given local end point.
+ *
+ * @since S60 v3.2
+ * @param aLocalCandidate The local end point for a media
+ * @param aConnectionId Reference to found id
+ */
+ void GetConnectionIdL( const CNATFWCandidate& aLocalCandidate,
+ TUint& aConnectionId );
+
+ /**
+ * Creates a new connection for the specified candidate pair.
+ *
+ * @since S60 3.2
+ * @param aPair The candidate pair
+ * @return Connection identifier
+ */
+ TUint CreateConnectionL( const CNATFWCandidatePair& aPair );
+
+ /**
+ * Removes specified connection.
+ *
+ * @since S60 3.2
+ * @param aStreamId The stream identifier
+ * @param aConnectionId The connection identifier
+ */
+ void RemoveConnection( TUint aStreamId, TUint aConnectionId );
+
+ /**
+ * Performs connectivity check using specified connection.
+ * MIceConnectionHandlerObserver::ConnCheckCompleted is
+ * called after completion of check.
+ *
+ * @since S60 3.2
+ * @param aStreamId The stream identifier
+ * @param aConnectionId The connection identifier
+ * @param aPriority The value of PRIORITY attribute
+ * @param aUseCandidate Whether to put USE-CANDIDATE to request
+ * @param aRtoValue The retransmission timeout value in ms
+ * @param aDestAddr The remote address where to send check
+ * @param aObserver Connectivity check observer
+ */
+ void PerformConnCheckL( TUint aStreamId, TUint aConnectionId,
+ TUint aPriority, TBool aUseCandidate, TUint aRtoValue,
+ const TInetAddr& aDestAddr,
+ MIceConnCheckObserver& aObserver );
+
+ /**
+ * Cancels ongoing connectivity check.
+ *
+ * @since S60 3.2
+ * @param aStreamId The stream identifier
+ * @param aConnectionId The connection identifier
+ * @param aDestAddr Destination address of the check
+ */
+ void CancelCheck( TUint aStreamId, TUint aConnectionId,
+ const TInetAddr& aDestAddr );
+
+ /**
+ * Starts fetching local(host, server reflexive, relay) candidates.
+ *
+ * @since S60 3.2
+ * @param aStreamCollectionId Stream collection identifier
+ * @param aStreamId Stream identifier
+ * @param aComponentId Stream collection identifier
+ */
+ void FetchCandidatesL( TUint aStreamCollectionId, TUint aStreamId,
+ TUint aComponentId );
+
+ /**
+ * Releases plugins.
+ *
+ * @since S60 3.2
+ * @param aRetainRelay Whether relay should be kept up
+ */
+ void ReleasePlugins( TBool aRetainRelay );
+
+// from base class MSTUNClientObserver
+
+ /**
+ * From MSTUNClientObserver.
+ * Indicates that asynchronous initialization of the related
+ * CSTUNClient has been completed and it can be used
+ * for creating CSTUNBinding(s) or CSTUNRelayBinding(s).
+ *
+ * @param aClient the client for which the initialization
+ * was completed.
+ * @param aCompletionCode value KErrNone indicates that
+ * the client instance is ready for creating CSTUNBinding(s).
+ * Any other completion code indicates that
+ * the client instance cannot be used and should be deleted.
+ */
+ void STUNClientInitCompleted(
+ const CSTUNClient& aClient,
+ TInt aCompletionCode );
+
+ /**
+ * From MSTUNClientObserver.
+ * A STUN/STUN Relay binding related event occurred. After this callback
+ * the aBinding can be used again by calling its SendRequestL or
+ * AllocateRequestL function.
+ *
+ * @param aEvent the STUN binding related event
+ * @param aBinding the STUN binding that is the target for the event.
+ */
+ void STUNBindingEventOccurredL(
+ TSTUNBindingEvent aEvent,
+ const CBinding& aBinding );
+
+ /**
+ * From MSTUNClientObserver.
+ * Error occurred during IP address resolution.
+ * This callback will also be called if STUNBindingEventOccuredL leaves.
+ *
+ * @param aBinding a binding for which the error occured
+ * @param aError error code.
+ */
+ void STUNBindingErrorOccurred(
+ const CBinding& aBinding,
+ TInt aError );
+
+// from base class MNcmConnectionObserver
+
+ void ConnectionNotify( TUint aStreamId, TUint aConnectionId,
+ MNcmConnectionObserver::TConnectionNotifyType aType, TInt aError );
+
+// from base class MNcmIncomingConnectionObserver
+
+ void IncomingMessageL( TUint aStreamId, const TDesC8& aMessage,
+ const TInetAddr& aLocalAddr, const TInetAddr& aFromAddr,
+ const TInetAddr& aPeerRemoteAddress, TBool& aConsumed );
+
+// from base class MIceNatPluginEventObs
+
+ void PluginEventOccured( const CNATFWPluginApi* aPlugin,
+ TUint aStreamId, TNatPluginEvent aEventCode,
+ TInt aErrorCode, TAny* aEventData, TUint aStreamConnectionId = 0,
+ TUint aComponentId = 0, TBool aIPv6After = EFalse );
+
+private:
+
+ CIceConnectionHandler(
+ MNcmConnectionMultiplexer& aMultiplexer,
+ MIceNatPluginEventObs& aEventObserver,
+ CIceSessionData& aSessionData,
+ CIceNatPluginContainer& aPluginContainer,
+ MIceConnHandlerObserver& aConnHandlerObs );
+
+ void ConstructL();
+
+ TInt FindBindingIndex( TUint aStreamId, TUint aConnectionId ) const;
+
+ TInt FindBindingIndex( const CBinding& aBinding ) const;
+
+ TInt FindBindingIndex( TUint aStreamId, TUint aConnectionId,
+ const TInetAddr& aDestAddr ) const;
+
+ CNATFWPluginApi* SolvePluginL( const CNATFWCandidate& aLocalCandidate );
+
+ void FreeResources();
+
+ void ExecuteCallbackL( TInt aIndex, TInt aError );
+
+ void DoRemoveConnection( TUint aStreamId, TUint aConnectionId,
+ TBool aRemoveMuxConn );
+
+private: // data
+
+ /**
+ * Multiplexer
+ * Not own.
+ */
+ MNcmConnectionMultiplexer& iMultiplexer;
+
+ /**
+ * ICE plugin observer
+ * Not own.
+ */
+ MIceNatPluginEventObs& iEventObserver;
+
+ /**
+ * The session data
+ */
+ CIceSessionData& iSessionData;
+
+ /**
+ * NAT protocol plugin container
+ * Not own.
+ */
+ CIceNatPluginContainer& iPluginContainer;
+
+ /**
+ * Notifies about closed streams
+ */
+ MIceConnHandlerObserver& iConnHandlerObs;
+
+ /**
+ * Stun client.
+ * Own.
+ */
+ CSTUNClient* iStunClient;
+
+ /**
+ * Instance for timer services.
+ * Own.
+ */
+ CDeltaTimer* iTimerServices;
+
+ /**
+ * Binding data array
+ */
+ RArray<TBindingData> iBindings;
+ };
+
+class TBindingData
+ {
+public:
+// parametrized ctor
+ inline TBindingData( CSTUNBinding* aBinding,
+ CIceConnectionHandler::TIceConnectionType aConnType,
+ TUint aStreamId, TUint aConnectionId,
+ const TInetAddr& aDestAddr ) :
+ iBinding( aBinding ),
+ iConnType( aConnType ),
+ iStreamId( aStreamId ),
+ iConnectionId( aConnectionId ), iDestAddr( aDestAddr ),
+ iObserver( NULL ),
+ iStreamingStatus( EStreamingStatePassive ),
+ iLocalAddr( KAFUnspec ), iFromAddr( KAFUnspec ),
+ iPeerAddr( KAFUnspec ), iMappedAddr( KAFUnspec ),
+ iCheckOngoing( EFalse ), iRtoValue( 0 ), iCancelled( EFalse )
+ {
+ }
+
+public:
+
+ /**
+ * Stun binding instance.
+ * Own.
+ */
+ CSTUNBinding* iBinding;
+
+ /**
+ * Connection type.
+ */
+ CIceConnectionHandler::TIceConnectionType iConnType;
+
+ /**
+ * ID of used stream.
+ */
+ TUint iStreamId;
+
+ /**
+ * ID of used connection.
+ */
+ TUint iConnectionId;
+
+ /**
+ * Destination address, where to send.
+ */
+ TInetAddr iDestAddr;
+
+ /**
+ * For notifying client.
+ */
+ MIceConnCheckObserver* iObserver;
+
+ /**
+ * Stream status.
+ */
+ TNATFWStreamingState iStreamingStatus;
+
+ /**
+ * local address.
+ */
+ TInetAddr iLocalAddr;
+
+ /**
+ * Where message came from ( can be relay address ).
+ */
+ TInetAddr iFromAddr;
+
+ /**
+ * Peer address ( not relay, but real peer address ).
+ */
+ TInetAddr iPeerAddr;
+
+ /**
+ * Result of binding request, public ip address.
+ */
+ TInetAddr iMappedAddr;
+
+ /**
+ * Indicates whether check is in progress for this binding.
+ */
+ TBool iCheckOngoing;
+
+ /**
+ * Retransmission timeout for the binding.
+ */
+ TUint iRtoValue;
+
+ /**
+ * Indicates that check is cancelled.
+ */
+ TBool iCancelled;
+ };
+
+
+#endif // CNATFWCONNECTIONHANDLER_H