diff -r 000000000000 -r 1bce908db942 natfw/natfwicecandidatehandler/src/cicehostresolver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/natfw/natfwicecandidatehandler/src/cicehostresolver.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,424 @@ +/* +* 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: Resolves host candidates for the streams. +* +*/ + + + + +#include "mncmconnectionmultiplexer.h" +#include "natfwcandidate.h" +#include "mnatfwpluginobserver.h" +#include "cicehostresolver.h" +#include "ciceconnection.h" +#include "cicecallbackexecuter.h" +#include "icecandidatehandlerdefs.h" +#include "icecandidatehandlerlogs.h" + + +// ======== MEMBER FUNCTIONS ======== + +CIceHostResolver::CIceHostResolver() + { + + } + + +void CIceHostResolver::ConstructL( TAny* aInitParams ) + { + __ICEDP( "CIceHostResolver::ConstructL" ) + __ASSERT_ALWAYS( aInitParams, User::Leave( KErrArgument ) ); + + iPluginId = KNatPluginIdNokiaHost().AllocL(); + + CNATFWPluginApi::TNATFWPluginInitParams* initParams = + static_cast + ( aInitParams ); + + iPluginObserver = &(initParams->iObserver); + iMultiplexer = &initParams->iMultiplexer; + iCallBackExecuter + = CIceCallBackExecuter::NewL( CActive::EPriorityStandard ); + } + + +CIceHostResolver* CIceHostResolver::NewL( TAny* aInitParams ) + { + CIceHostResolver* self = new( ELeave ) CIceHostResolver(); + CleanupStack::PushL( self ); + self->ConstructL( aInitParams ); + CleanupStack::Pop( self ); + return self; + } + + +CIceHostResolver::~CIceHostResolver() + { + __ICEDP( "CIceHostResolver::~CIceHostResolver" ) + + delete iPluginId; + iPluginObserver = NULL; + iMultiplexer = NULL; + iHostCandidates.ResetAndDestroy(); + delete iCallBackExecuter; + + iConnections.ResetAndDestroy(); + } + + +// --------------------------------------------------------------------------- +// CIceHostResolver::HandleCallBack +// --------------------------------------------------------------------------- +// +void CIceHostResolver::HandleCallBack( CBase& aObject, TInt aCallBackType ) + { + __ICEDP( "CIceHostResolver::HandleCallBack" ) + + CIceHostResolver& plugin( static_cast( aObject ) ); + plugin.DoHandleCallBack( aCallBackType ); + } + + +// --------------------------------------------------------------------------- +// CIceHostResolver::LocalAddress +// --------------------------------------------------------------------------- +// +TInetAddr CIceHostResolver::LocalAddress( + TUint aStreamId, TUint aAddrFamily ) const + { + __ICEDP( "CIceHostResolver::LocalAddress" ) + + TInt count( iConnections.Count() ); + ASSERT( count ); + + for ( TInt i( 0 ); i < count; i++ ) + { + if ( iConnections[i]->StreamId() == aStreamId && + iConnections[i]->LocalAddress().Family() == aAddrFamily ) + { + return iConnections[i]->LocalAddress(); + } + } + + return TInetAddr(); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// --------------------------------------------------------------------------- +// +void CIceHostResolver::ConnectServerL( const RSocketServ& /*aSocketServ*/, + const TName& /*aConnectionName*/ ) + { + __ICEDP( "CIceHostResolver::ConnectServerL" ) + + TIceCallBack callback( + HandleCallBack, *this, ECallBackServerConnected, 0 ); + iCallBackExecuter->AddCallBackL( callback ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// --------------------------------------------------------------------------- +// +void CIceHostResolver::FetchCandidateL( TUint aStreamId, TUint /*aRtoValue*/, + TUint aAddrFamily ) + { + __ICEDP( "CIceHostResolver::FetchCandidateL" ) + + CIceConnection* connection = CIceConnection::NewLC( + aStreamId, aAddrFamily, *iMultiplexer, *this ); + iConnections.AppendL( connection ); + CleanupStack::Pop( connection ); + + // Host connections are used to receive checks from peer when local agent + // has not yet started ICE processing. + connection->SetReceivingStateL( EStreamingStateActive, + CIceConnection::ENotifyStateDisabled ); + + // Unspecified destination allows STUN server response sending to + // arbitrary address. + TInetAddr unspecDestination; + connection->SetSendingStateL( EStreamingStateActive, + CIceConnection::ENotifyStateDisabled, unspecDestination ); + + // setup host candidate + const TInetAddr& addr( connection->LocalAddress() ); + CNATFWCandidate* hostCandidate = CNATFWCandidate::NewLC(); + hostCandidate->SetStreamId( aStreamId ); + hostCandidate->SetType( CNATFWCandidate::EHost ); + hostCandidate->SetTransportAddrL( addr ); + hostCandidate->SetBase( addr ); + TUint protocol = connection->TransportProtocol(); + hostCandidate->SetTransportProtocol( protocol ); + + iHostCandidates.AppendL( hostCandidate ); + CleanupStack::Pop( hostCandidate ); + connection->BindWithCandidateL( *hostCandidate ); + + TIceCallBack callback( HandleCallBack, *this, ECallBackCandidateFound, 0 ); + iCallBackExecuter->AddCallBackL( callback ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// --------------------------------------------------------------------------- +// +void CIceHostResolver::SetReceivingStateL( + const CNATFWCandidate& aLocalCandidate, TNATFWStreamingState aState ) + { + __ICEDP( "CIceHostResolver::SetReceivingStateL" ) + __ASSERT_ALWAYS( IsOwnedCandidate( aLocalCandidate ), + User::Leave( KErrNotFound ) ); + + // find connection bound to the candidate + CIceConnection* connection = FindConnection( aLocalCandidate ); + if ( NULL == connection && + CNATFWCandidate::EPeerReflexive == aLocalCandidate.Type() ) + { + // Bind new peer-reflexive candidate with the corresponding host + // connection. Peer-reflexive candidate has same base than host + // candidate. + connection = FindConnection( aLocalCandidate.Base() ); + if ( connection ) + { + connection->BindWithCandidateL( aLocalCandidate ); + } + } + + __ASSERT_ALWAYS( NULL != connection, User::Leave( KErrNotFound ) ); + connection->SetReceivingStateL( aState, + CIceConnection::ENotifyStateEnabled ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// --------------------------------------------------------------------------- +// +void CIceHostResolver::SetSendingStateL( + const CNATFWCandidate& aLocalCandidate, + TNATFWStreamingState aState, const TInetAddr& aDestAddr ) + { + __ICEDP( "CIceHostResolver::SetSendingStateL" ) + __ASSERT_ALWAYS( IsOwnedCandidate( aLocalCandidate ), + User::Leave( KErrNotFound ) ); + + // find connection bound to the candidate + CIceConnection* connection = FindConnection( aLocalCandidate ); + if ( NULL == connection && + CNATFWCandidate::EPeerReflexive == aLocalCandidate.Type() ) + { + // Bind new peer-reflexive candidate with the corresponding host + // connection. Peer-reflexive candidate has same base than host + // candidate. + connection = FindConnection( aLocalCandidate.Base() ); + if ( connection ) + { + connection->BindWithCandidateL( aLocalCandidate ); + } + } + + __ASSERT_ALWAYS( NULL != connection, User::Leave( KErrNotFound ) ); + connection->SetSendingStateL( aState, + CIceConnection::ENotifyStateEnabled, aDestAddr ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// --------------------------------------------------------------------------- +// +void CIceHostResolver::GetConnectionIdL( + const CNATFWCandidate& aLocalCandidate, + TUint& aConnectionId ) + { + __ICEDP( "CIceHostResolver::GetConnectionIdL" ) + __ASSERT_ALWAYS( IsOwnedCandidate( aLocalCandidate ), + User::Leave( KErrNotFound ) ); + + // find connection bound to the candidate + CIceConnection* connection = FindConnection( aLocalCandidate ); + if ( NULL == connection && + CNATFWCandidate::EPeerReflexive == aLocalCandidate.Type() ) + { + // Bind new peer-reflexive candidate with the corresponding host + // connection. Peer-reflexive candidate has same base than host + // candidate. + connection = FindConnection( aLocalCandidate.Base() ); + if ( connection ) + { + connection->BindWithCandidateL( aLocalCandidate ); + } + } + + __ASSERT_ALWAYS( NULL != connection, User::Leave( KErrNotFound ) ); + aConnectionId = connection->ConnectionId(); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// --------------------------------------------------------------------------- +// +const TDesC8& CIceHostResolver::PluginIdentifier() const + { + return *iPluginId; + } + + +// --------------------------------------------------------------------------- +// CIceHostResolver::ConnectionNotify +// Passes media connection related events to the client. +// --------------------------------------------------------------------------- +// +void CIceHostResolver::ConnectionNotify( CIceConnection& aConnection, + MIceConnectionObserver::TNotifyType aType, TInt aError ) + { + __ICEDP( "CIceHostResolver::ConnectionNotify" ) + + TInt connectionIndex( iConnections.Find( &aConnection ) ); + ASSERT( KErrNotFound != connectionIndex ); + if ( KErrNotFound != connectionIndex ) + { + switch ( aType ) + { + case MIceConnectionObserver::ENotifyConnectionRemoved: + delete iConnections[connectionIndex]; + iConnections.Remove( connectionIndex ); + break; + + case MIceConnectionObserver::ENotifyConnectionError: + iPluginObserver->Error( *this, aConnection.StreamId(), + aError ); + break; + + case MIceConnectionObserver::ENotifyRecvActivated: + iPluginObserver->Notify( *this, aConnection.StreamId(), + MNATFWPluginObserver::EReceivingActivated, aError ); + break; + + case MIceConnectionObserver::ENotifyRecvDeactivated: + iPluginObserver->Notify( *this, aConnection.StreamId(), + MNATFWPluginObserver::EReceivingDeactivated, aError ); + break; + + case MIceConnectionObserver::ENotifySendActivated: + iPluginObserver->Notify( *this, aConnection.StreamId(), + MNATFWPluginObserver::ESendingActivated, aError ); + break; + + case MIceConnectionObserver::ENotifySendDeactivated: + iPluginObserver->Notify( *this, aConnection.StreamId(), + MNATFWPluginObserver::ESendingDeactivated, aError ); + break; + + default: + ASSERT( EFalse ); + } + } + } + + +// --------------------------------------------------------------------------- +// CIceHostResolver::DoHandleCallBack +// --------------------------------------------------------------------------- +// +void CIceHostResolver::DoHandleCallBack( TInt aCallBackType ) + { + __ICEDP( "CIceHostResolver::DoHandleCallBack" ) + + if ( ECallBackServerConnected == aCallBackType ) + { + iPluginObserver->Notify( *this, 0, + MNATFWPluginObserver::EServerConnected, KErrNone ); + } + else if ( ECallBackCandidateFound == aCallBackType ) + { + ASSERT( iHostCandidates.Count() ); + TUint streamId( iHostCandidates[0]->StreamId() ); + iPluginObserver->NewLocalCandidateFound( *this, iHostCandidates[0] ); + iHostCandidates.Remove( 0 ); + iPluginObserver->Notify( *this, streamId, + MNATFWPluginObserver::EFetchingCompleted, KErrNone ); + } + else + { + __ICEDP( "CIceHostResolver::DoHandleCallBack, ELSE" ) + ASSERT( EFalse ); + } + } + + +// --------------------------------------------------------------------------- +// CIceHostResolver::FindConnection +// --------------------------------------------------------------------------- +// +CIceConnection* CIceHostResolver::FindConnection( + const CNATFWCandidate& aLocalCandidate ) + { + CIceConnection* foundConnection( NULL ); + TInt index( iConnections.Count() - 1 ); + while ( NULL == foundConnection && 0 <= index ) + { + if ( iConnections[index]->IsBoundToCandidate( aLocalCandidate ) ) + { + foundConnection = iConnections[index]; + } + + index--; + } + + return foundConnection; + } + + +// --------------------------------------------------------------------------- +// CIceHostResolver::FindConnection +// --------------------------------------------------------------------------- +// +CIceConnection* CIceHostResolver::FindConnection( + const TInetAddr& aLocalAddr ) + { + CIceConnection* foundConnection( NULL ); + TInt index( iConnections.Count() - 1 ); + while ( NULL == foundConnection && 0 <= index ) + { + if ( TIceUtils::MatchAddresses( + iConnections[index]->LocalAddress(), aLocalAddr ) ) + { + foundConnection = iConnections[index]; + } + + index--; + } + + return foundConnection; + } + + +// --------------------------------------------------------------------------- +// CIceHostResolver::IsOwnedCandidate +// --------------------------------------------------------------------------- +// +TBool CIceHostResolver::IsOwnedCandidate( + const CNATFWCandidate& aLocalCandidate ) const + { + return ( CNATFWCandidate::EHost == aLocalCandidate.Type() || + CNATFWCandidate::EPeerReflexive == aLocalCandidate.Type() ); + }