diff -r 000000000000 -r 1bce908db942 natfw/natfwicecandidatehandler/inc/ciceconnectionhandler.h --- /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 +#include +#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 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