diff -r 000000000000 -r 1bce908db942 natfw/natfwstunturnclient/src/cstunbindinggetaddress.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/natfw/natfwstunturnclient/src/cstunbindinggetaddress.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,204 @@ +/* +* Copyright (c) 2005-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 "natfwunsaflog.h" +#include "stunassert.h" +#include "cstunbindinggetaddress.h" +#include "natfwbindingimplementationbase.h" +#include "stunutils.h" +#include "stunturnclientlogs.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSTUNBindingGetAddress::CSTUNBindingGetAddress +// --------------------------------------------------------------------------- +// +CSTUNBindingGetAddress::CSTUNBindingGetAddress() + { + } + +// --------------------------------------------------------------------------- +// CSTUNBindingGetAddress::CSTUNBindingGetAddress +// Dummy implementation, as copy constructor is declared private and not used. +// --------------------------------------------------------------------------- +// +CSTUNBindingGetAddress::CSTUNBindingGetAddress( + const CSTUNBindingGetAddress& /*aGetAddress*/ ) : + CSTUNBindingState() + { + } + +// --------------------------------------------------------------------------- +// CSTUNBindingGetAddress::~CSTUNBindingGetAddress +// --------------------------------------------------------------------------- +// +CSTUNBindingGetAddress::~CSTUNBindingGetAddress() + { + iErrorBuffer.Close(); + } + +// --------------------------------------------------------------------------- +// CSTUNBindingGetAddress::PublicAddressReceivedL +// --------------------------------------------------------------------------- +// +void CSTUNBindingGetAddress::PublicAddressReceivedL( + CBindingImplementation& aContext, + const TInetAddr& aPublicAddress ) const + { + NATFWUNSAF_ADDRLOG( "STUNBinding public addr", aPublicAddress ) + + aContext.StoreAddressL( aPublicAddress ); + aContext.ChangeState( *iActive ); + } + +// --------------------------------------------------------------------------- +// CSTUNBindingGetAddress::PublicAddressReceivedL - overloaded for stun relay +// --------------------------------------------------------------------------- +// +void CSTUNBindingGetAddress::PublicAddressReceivedL( + CBindingImplementation& aContext, + const TInetAddr& aReflexiveAddr, + const TInetAddr& aRelayAddr ) const + { + NATFWUNSAF_ADDRLOG( "STUNRelayBinding public addr", aReflexiveAddr ) + NATFWUNSAF_ADDRLOG( "STUNRelayBinding relay addr", aRelayAddr ) + + aContext.StoreAddressL( aReflexiveAddr, aRelayAddr ); + aContext.ChangeState( *iActive ); + } + +// --------------------------------------------------------------------------- +// CSTUNBindingGetAddress::TransactionError +// --------------------------------------------------------------------------- +// +void +CSTUNBindingGetAddress::TransactionError( CBindingImplementation& aContext, + TInt aError ) + { + __STUNTURNCLIENT_INT1( + "CSTUNBindingGetAddress::TransactionError Error: ", aError ) + __STUN_ASSERT_RETURN( aError != KErrNone, KErrArgument ); + + TInt error( KErrNone ); + TInt found( KErrNotFound ); + if ( iErrorBuffer.Count() > 0 ) + { + found = iErrorBuffer.Find( aError ); + if ( KErrNotFound != found ) + { + // Same error happened again, stop error handling + __STUNTURNCLIENT( + "Same error happened again, end processing" ) + aContext.Terminate( aError ); + return; + } + } + + if ( iErrorBuffer.Count() == 0 || KErrNotFound == found ) + { + iErrorBuffer.Append( aError ); + } + + if ( aContext.HandleTransactionError( aError ) ) + { + if ( STUNUtils::Is5xxResponse( aError ) ) + { + __STUNTURNCLIENT( "Is5xxResponse" ) + aContext.WaitBeforeRetrying(); + aContext.ChangeState( *iWaitToRetry ); + } + + if ( E430StaleCredentials == aError || E436UnknownUsername == aError || + E432MissingUsername == aError || E434MissingRealm == aError ) + { + aContext.ChangeState( *iGetSharedSecret ); + TRAP( error, aContext.ClientL().BindingErrorL( + aContext.Binding(), aError, EFalse ) ); + + if ( KErrNone != error ) + { + __STUNTURNCLIENT_INT1( "TransactionError leave ", error ) + aContext.Terminate( error ); + } + } + + if ( E401Unauthorized == aError ) + { + aContext.ChangeState( *iGetSharedSecret ); + + TRAP( error, aContext.ClientL().BindingErrorL( + aContext.Binding(), aError, EFalse ) ); + if ( error != KErrNone ) + { + __STUNTURNCLIENT_INT1( "TransactionError 401 LEAVED: ", error ) + aContext.Terminate( error ); + } + } + + if ( E300TryAlternate == aError ) + { + // last argument is true, because binding cannot be destroyed + // before alternate server is read from it. + TRAP_IGNORE( aContext.ClientL().BindingErrorL( + aContext.Binding(), aError, ETrue ) ); + } + + else + { + // this branch will send new request + aContext.ChangeState( *iGetSharedSecret ); + TRAP( error, aContext.GetSharedSecretL() ); + if ( error != KErrNone ) + { + aContext.Terminate( error ); + } + } + } + + else + { + aContext.Terminate( aError ); + } + } + +// --------------------------------------------------------------------------- +// CSTUNBindingGetAddress::SendRequestL +// No action, since obtaining a binding is already in progress. +// --------------------------------------------------------------------------- +// +void CSTUNBindingGetAddress::SendRequestL( + CBindingImplementation& /*aContext*/ ) const + { + } + +// --------------------------------------------------------------------------- +// CSTUNBindingGetAddress::SetNeighbourStates +// --------------------------------------------------------------------------- +// +void CSTUNBindingGetAddress::SetNeighbourStates( + CSTUNBindingState& aGetSharedSecret, + CSTUNBindingState& aWaitToRetry, + CSTUNBindingState& aActive ) + { + iGetSharedSecret = &aGetSharedSecret; + iWaitToRetry = &aWaitToRetry; + iActive = &aActive; + }