natfw/natfwicecandidatehandler/src/cicecheckprioritizer.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwicecandidatehandler/src/cicecheckprioritizer.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,160 @@
+/*
+* 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 "natfwcandidate.h"
+#include "natfwcandidatepair.h"
+#include "cicecheckprioritizer.h"
+#include "ciceconnectivitycheck.h"
+#include "icecandidatehandlerlogs.h"
+
+/** variables used in priority calculation */
+const TUint64 K2ToPowerOf32 = 2^32;
+const TUint64 KNumValTwo = 2;
+
+// ======== MEMBER FUNCTIONS ========
+
+
+CIceCheckPrioritizer::CIceCheckPrioritizer()
+    {
+    __ICEDP( "CIceCheckPrioritizer::CIceCheckPrioritizer" )
+    }
+
+
+CIceCheckPrioritizer* CIceCheckPrioritizer::NewL()
+    {
+    __ICEDP( "CIceCheckPrioritizer::NewL" )
+
+    CIceCheckPrioritizer* self = CIceCheckPrioritizer::NewLC();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+
+CIceCheckPrioritizer* CIceCheckPrioritizer::NewLC()
+    {
+    __ICEDP( "CIceCheckPrioritizer::NewLC" )
+
+    CIceCheckPrioritizer* self = new( ELeave ) CIceCheckPrioritizer();
+    CleanupStack::PushL( self );
+    
+    return self;
+    }
+
+
+CIceCheckPrioritizer::~CIceCheckPrioritizer()
+    {  
+    __ICEDP( "CIceCheckPrioritizer::~CIceCheckPrioritizer" )
+    }   
+
+
+// ---------------------------------------------------------------------------
+// CIceCheckPrioritizer::PrioritizePair
+// ---------------------------------------------------------------------------
+//  
+void CIceCheckPrioritizer::PrioritizePair( CNATFWCandidatePair& aPair,
+        TNATFWIceRole aCurrentRole ) const
+    {
+    __ICEDP( "CIceCheckPrioritizer::PrioritizePair" )
+    
+    /*
+    ICE-17, section 5.7.2.
+    Let G be the priority for the candidate provided by the controlling
+    agent. Let D be the priority for the candidate provided by the
+    controlled agent. The priority for a pair is computed as:
+
+      pair priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0)
+
+    Where G>D?1:0 is an expression whose value is 1 if G is greater than
+    D, and 0 otherwise.  This formula ensures a unique priority for each
+    pair.
+    */
+    TUint64 controllingPri( 0 );
+    TUint64 controlledPri( 0 );
+    if ( EIceRoleControlling == aCurrentRole )
+        {
+        controllingPri = aPair.LocalCandidate().Priority();
+        controlledPri = aPair.RemoteCandidate().Priority();
+        }
+    else
+        {
+        controlledPri = aPair.LocalCandidate().Priority();
+        controllingPri = aPair.RemoteCandidate().Priority();
+        }
+    
+    TUint64 pairPri = K2ToPowerOf32 * Min( controllingPri, controlledPri )
+        + KNumValTwo * Max( controllingPri, controlledPri )
+        + ( 
+            ( controllingPri > controlledPri ) ? TUint64( 1 ) : TUint64( 0 )
+          );
+    
+    aPair.SetPriority( pairPri );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CIceCheckPrioritizer::PrioritizePairs
+// ---------------------------------------------------------------------------
+//  
+void CIceCheckPrioritizer::PrioritizePairs( 
+        RPointerArray<CNATFWCandidatePair>& aPairs,
+        TNATFWIceRole aCurrentRole ) const
+    {
+    __ICEDP( "CIceCheckPrioritizer::PrioritizePairs" )
+    
+    TInt ind( aPairs.Count() );
+    while ( ind-- )
+        {
+        PrioritizePair( *aPairs[ind], aCurrentRole );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CIceCheckPrioritizer::PrioritizeCheck
+// ---------------------------------------------------------------------------
+//  
+void CIceCheckPrioritizer::PrioritizeCheck( 
+        CIceConnectivityCheck& aCheck, TNATFWIceRole aCurrentRole ) const
+    {
+    __ICEDP( "CIceCheckPrioritizer::PrioritizeCheck" )
+    
+    PrioritizePair( 
+        const_cast<CNATFWCandidatePair&>( aCheck.CandidatePair() ), 
+        aCurrentRole );
+    }
+
+   
+// ---------------------------------------------------------------------------
+// CIceCheckPrioritizer::PrioritizeChecks
+// ---------------------------------------------------------------------------
+//  
+void CIceCheckPrioritizer::PrioritizeChecks( 
+        RPointerArray<CIceConnectivityCheck>& aChecks,
+        TNATFWIceRole aCurrentRole ) const
+    {
+    __ICEDP( "CIceCheckPrioritizer::PrioritizeChecks" )
+    
+    TInt ind( aChecks.Count() );
+    while ( ind-- )
+        {
+        PrioritizeCheck( *aChecks[ind], aCurrentRole );
+        }
+    }