diff -r 000000000000 -r 1bce908db942 natfw/natfwicecandidatehandler/src/ciceplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/natfw/natfwicecandidatehandler/src/ciceplugin.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,476 @@ +/* +* 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: +* +*/ + + + + +#include +#include "natfwcandidate.h" +#include "ciceplugin.h" +#include "cicesessiondata.h" +#include "cicelocalcandidatefinder.h" +#include "ciceconnectionhandler.h" +#include "cicecheckhandler.h" +#include "cicestreamcollection.h" +#include "cicenatplugincontainer.h" +#include "icecandidatehandlerlogs.h" + +// ======== MEMBER FUNCTIONS ======== + +CIcePlugin::CIcePlugin() + { + __ICEDP( "CIcePlugin::CIcePlugin" ) + } + + +void CIcePlugin::ConstructL( TAny* aInitParams ) + { + __ICEDP( "CIcePlugin::ConstructL" ) + __ASSERT_ALWAYS( aInitParams, User::Leave( KErrArgument ) ); + + iPluginId = KNatPluginIdNokiaIce().AllocL(); + + CNATFWPluginApi::TNATFWPluginInitParams* initParams = + static_cast + ( aInitParams ); + + iPluginObserver = &(initParams->iObserver); + + iSessionData = CIceSessionData::NewL( + initParams->iDomain, initParams->iIapId ); + + iPluginContainer = CIceNatPluginContainer::NewL( + *iSessionData, initParams->iMultiplexer ); + + iPluginContainer->RegObserverForEventL( *this, + MIceNatPluginEventObs::EGeneralError ); + iPluginContainer->RegObserverForEventL( *this, + MIceNatPluginEventObs::EServerConnected ); + + iCandidateFinder = CIceLocalCandidateFinder::NewL( + *this, *iSessionData, *iPluginContainer ); + + iConnectionHandler = CIceConnectionHandler::NewL( + initParams->iMultiplexer, *this, *iSessionData, + *iPluginContainer, *this ); + + iCheckHandler = CIceCheckHandler::NewL( *iSessionData, + initParams->iMultiplexer, *iConnectionHandler, *this ); + } + + +CIcePlugin* CIcePlugin::NewL( TAny* aInitParams ) + { + __ICEDP( "CIcePlugin::NewL" ) + + CIcePlugin* self = new ( ELeave ) CIcePlugin(); + CleanupStack::PushL(self); + self->ConstructL( aInitParams ); + CleanupStack::Pop(self); + + return self; + } + + +CIcePlugin::~CIcePlugin() + { + __ICEDP( "CIcePlugin::~CIcePlugin" ) + + delete iPluginId; + delete iCheckHandler; + delete iSessionData; + + if ( iPluginContainer ) + { + iPluginContainer->UnregObserver( *this ); + delete iPluginContainer; + } + + delete iCandidateFinder; + delete iConnectionHandler; + + iPluginObserver = NULL; + } + + +// From CNATFWPluginApi + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// --------------------------------------------------------------------------- +// +void CIcePlugin::ConnectServerL( const RSocketServ& aSocketServ, + const TName& aConnectionName ) + { + __ICEDP( "CIcePlugin::ConnectServerL start" ) + iPluginContainer->ConnectPluginsL( aSocketServ, aConnectionName ); + __ICEDP( "CIcePlugin::ConnectServerL end" ) + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// --------------------------------------------------------------------------- +// +void CIcePlugin::FetchCandidatesL( TUint aStreamCollectionId, + TUint aStreamId, TUint aComponentId, TUint aAddrFamily ) + { + __ICEDP( "CIcePlugin::FetchCandidatesL" ) + + // Save collection identifiers + iSessionData->CreateCollectionL( aStreamCollectionId ); + iSessionData->CollectionL( aStreamCollectionId ) + ->AddMediaComponentL( aStreamId, aComponentId ); + + const TInt KTaTimerValue( 20 ); + iSessionData->SetTaTimerValue( KTaTimerValue ); + + // Both ipv4 and ipv6 candidates will be fetched. Ipv6 candidates will be + // fetched after ipv4 candidate fetching has completed + if ( KAFUnspec == aAddrFamily ) + { + TRAPD( err, iCandidateFinder->FetchCandidatesL( + aStreamCollectionId, aStreamId, aComponentId, KAfInet, ETrue ) ); + if ( KErrNone != err ) + { + iCandidateFinder->FetchCandidatesL( aStreamCollectionId, + aStreamId, aComponentId, KAfInet6, EFalse ); + } + } + + // Desired address family only + else + { + iCandidateFinder->FetchCandidatesL( + aStreamCollectionId, aStreamId, aComponentId, aAddrFamily, EFalse ); + } + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// --------------------------------------------------------------------------- +// +void CIcePlugin::SetRoleL( TNATFWIceRole aRole ) + { + __ICEDP( "CIcePlugin::SetRoleL" ) + __ASSERT_ALWAYS( + EIceRoleControlling == aRole || EIceRoleControlled == aRole, + User::Leave( KErrArgument ) ); + + iSessionData->SetRole( aRole ); + iSessionData->SetTieBreaker( + TUint64( Math::Random() ) + TUint64( Math::Random() ) ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// Set credentials for message signing and authentication. +// This plugin supports only stream specific credentials. +// --------------------------------------------------------------------------- +// +void CIcePlugin::SetCredentialsL( const CNATFWCandidate& aCandidate, + const CNATFWCredentials& aCredentials ) + { + __ICEDP( "CIcePlugin::SetCredentialsL" ) + + const_cast( aCredentials ) + .SetStreamId( aCandidate.StreamId() ); + + iSessionData->AddCredentialsL( aCredentials ); + iCheckHandler->SetCredentialsL( aCredentials ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// Credentials must be set before starting connectivity checks. +// --------------------------------------------------------------------------- +// +void CIcePlugin::PerformConnectivityChecksL( + RPointerArray& aRemoteCandidates ) + { + __ICEDP( "CIcePlugin::PerformConnectivityChecksL" ) + + iSessionData->RemoveRemoteCandidates(); + iSessionData->AddRemoteCandidatesL( aRemoteCandidates ); + + const TInt KTaTimerValue( 20 ); + iSessionData->SetTaTimerValue( KTaTimerValue ); + + iCheckHandler->PerformConnectivityChecksL(); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// Peer selected pairs should be known by local agent. Peer reflexive remote +// candidate is added to the known remote candidate list when receiving check +// from peer. Peer MUST not include new candidates when it has completed +// ICE processing. +// --------------------------------------------------------------------------- +// +void CIcePlugin::UpdateIceProcessingL( + RPointerArray& aPeerSelectedPairs ) + { + __ICEDP( "CIcePlugin::UpdateIceProcessingL, PEERSELECTEDPAIRS" ) + __ASSERT_ALWAYS( 0 != aPeerSelectedPairs.Count(), + User::Leave( KErrArgument ) ); + + iCheckHandler->UpdateIceProcessingL( aPeerSelectedPairs ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// CIcePlugin::UpdateIceProcessingL +// --------------------------------------------------------------------------- +// +void CIcePlugin::UpdateIceProcessingL( + RPointerArray& aRemoteCands ) + { + __ICEDP( "CIcePlugin::UpdateIceProcessingL, REMOTECANDS" ) + __ASSERT_ALWAYS( 0 != aRemoteCands.Count(), + User::Leave( KErrArgument ) ); + + iSessionData->AddRemoteCandidatesL( aRemoteCands ); + iCheckHandler->UpdateIceProcessingL( aRemoteCands ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// CIcePlugin::SetReceivingStateL +// --------------------------------------------------------------------------- +// +void CIcePlugin::SetReceivingStateL( + const CNATFWCandidate& aLocalCandidate, + TNATFWStreamingState aState ) + { + iConnectionHandler->SetReceivingStateL( aLocalCandidate, aState ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// CIcePlugin::SetSendingStateL +// --------------------------------------------------------------------------- +// +void CIcePlugin::SetSendingStateL( + const CNATFWCandidate& aLocalCandidate, + TNATFWStreamingState aState, const TInetAddr& aDestAddr ) + { + iConnectionHandler->SetSendingStateL( aLocalCandidate, aState, aDestAddr ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// CIcePlugin::GetConnectionIdL +// --------------------------------------------------------------------------- +// +void CIcePlugin::GetConnectionIdL( + const CNATFWCandidate& aLocalCandidate, + TUint& aConnectionId ) + { + iConnectionHandler->GetConnectionIdL( aLocalCandidate, aConnectionId ); + } + + +// --------------------------------------------------------------------------- +// From class CNATFWPluginApi. +// CIcePlugin::PluginIdentifier +// --------------------------------------------------------------------------- +// +const TDesC8& CIcePlugin::PluginIdentifier() const + { + return *iPluginId; + } + + +// --------------------------------------------------------------------------- +// CIcePlugin::StreamClosed +// Stream collection can be deleted right away, when one media component has +// been removed. +// --------------------------------------------------------------------------- +// +void CIcePlugin::StreamClosed( TUint aStreamId ) + { + TUint collectionId( 0 ); + TInt err = iSessionData->GetCollectionIdForComponent( + aStreamId, collectionId ); + + if ( KErrNone == err ) + { + iSessionData->CleanupStreamData( aStreamId ); + iCheckHandler->CleanupCollectionData( collectionId ); + iSessionData->DeleteCollection( collectionId ); + } + } + +// --------------------------------------------------------------------------- +// From class MIceNatPluginEventObs. +// Dispatches events from specialized event listeners to the ICE-plugin user. +// +// Listens to general errors on real NAT-plugins. If unexpected error within +// a stream in some plugin occurs, we cannot do anything but close the stream. +// --------------------------------------------------------------------------- +// +void CIcePlugin::PluginEventOccured( + #ifdef _DEBUG + const CNATFWPluginApi* aPlugin, + #else + const CNATFWPluginApi* /*aPlugin*/, + #endif + TUint aStreamId, + MIceNatPluginEventObs::TNatPluginEvent aEventCode, + TInt aErrorCode, TAny* aEventData, TUint aStreamConnectionId, + TUint aComponentId, TBool aIPv6After ) + { + __ICEDP( "CIcePlugin::PluginEventOccured" ) + + switch ( aEventCode ) + { + case MIceNatPluginEventObs::EServerConnected: + { + ASSERT( NULL != aPlugin ); + + iConnectedServerCount++; + if ( iConnectedServerCount == iPluginContainer->Count() ) + { + iPluginObserver->Notify( *this, aStreamId, + MNATFWPluginObserver::EServerConnected, KErrNone ); + } + } + break; + + case MIceNatPluginEventObs::ELocalCandidateFound: + { + ASSERT( NULL == aPlugin && NULL != aEventData ); + + iPluginObserver->NewLocalCandidateFound( *this, + reinterpret_cast( aEventData ) ); + } + break; + + case MIceNatPluginEventObs::EFetchingCompleted: + { + ASSERT( NULL == aPlugin ); + + if ( aIPv6After ) + { + if ( KErrNone == aErrorCode ) + { + iIpv4Succeeded = ETrue; + } + + TRAPD( err, iCandidateFinder->FetchCandidatesL( + aStreamConnectionId, aStreamId, aComponentId, + KAfInet6, EFalse ) ); + + if ( KErrNone != err ) + { + iPluginObserver->Notify( *this, aStreamId, + MNATFWPluginObserver::EFetchingCompleted, aErrorCode ); + } + } + + else + { + if ( iIpv4Succeeded ) + { + aErrorCode = KErrNone; + iIpv4Succeeded = EFalse; + } + + iPluginObserver->Notify( *this, aStreamId, + MNATFWPluginObserver::EFetchingCompleted, aErrorCode ); + } + } + break; + + case MIceNatPluginEventObs::EReceivingActivated: + { + ASSERT( NULL == aPlugin ); + + iPluginObserver->Notify( *this, aStreamId, + MNATFWPluginObserver::EReceivingActivated, aErrorCode ); + } + break; + + case MIceNatPluginEventObs::EReceivingDeactivated: + { + ASSERT( NULL == aPlugin ); + + iPluginObserver->Notify( *this, aStreamId, + MNATFWPluginObserver::EReceivingDeactivated, aErrorCode ); + } + break; + + case MIceNatPluginEventObs::ESendingActivated: + { + ASSERT( NULL == aPlugin ); + + iPluginObserver->Notify( *this, aStreamId, + MNATFWPluginObserver::ESendingActivated, aErrorCode ); + } + break; + + case MIceNatPluginEventObs::ESendingDeactivated: + { + ASSERT( NULL == aPlugin ); + + iPluginObserver->Notify( *this, aStreamId, + MNATFWPluginObserver::ESendingDeactivated, aErrorCode ); + } + break; + + case MIceNatPluginEventObs::ECandidatePairFound: + { + ASSERT( NULL == aPlugin && NULL != aEventData ); + + iPluginObserver->NewCandidatePairFound( *this, + reinterpret_cast( aEventData ) ); + } + break; + + case MIceNatPluginEventObs::EConnChecksCompleted: + { + ASSERT( NULL == aPlugin ); + + iPluginObserver->Notify( *this, aStreamId, + MNATFWPluginObserver::EConnChecksCompleted, aErrorCode ); + } + break; + + case MIceNatPluginEventObs::EGeneralError: + { + // this is only event from real NAT-plugin + ASSERT( NULL != aPlugin ); + ASSERT( KErrNone != aErrorCode ); + + iPluginObserver->Error( *this, aStreamId, aErrorCode ); + } + break; + + default: + + __ICEDP( "CIcePlugin::PluginEventOccured, DEFAULT" ) + ASSERT( EFalse ); + } + }