natfw/natfwstunturnclient/src/cstunbindinggetaddress.cpp
changeset 0 1bce908db942
--- /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;
+    }