natfw/natfwicecandidatehandler/inc/cicechecklist.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwicecandidatehandler/inc/cicechecklist.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,388 @@
+/*
+* 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:    
+*
+*/
+
+
+
+
+#ifndef C_CICECHECKLIST_H
+#define C_CICECHECKLIST_H
+
+#include <e32base.h>
+#include <badesca.h>
+#include "miceconnchecklistener.h"
+#include "ticecheckqueitem.h"
+#include "natfwinternaldefs.h"    //UNIT_TEST
+
+class CIceConnectivityCheck;
+class CIceCheckPrioritizer;
+class CIceSessionData;
+class CNATFWCandidate;
+class CNATFWCandidatePair;
+class CIceCandidatePrioritizer;
+class MIceChecklistObserver;
+class CIceConnectionHandler;
+class TInetAddr;
+class CIceValidList;
+
+/**
+ *  ICE check list for a stream collection (e.g. SDP media stream).
+ *
+ *  @lib icecandidatehandler.dll
+ *  @since S60 v3.2
+ */
+class CIceCheckList : public CBase, public MIceConnCheckListener
+    {
+
+    UNIT_TEST( UT_CIceCheckList )
+    UNIT_TEST( UT_CIceCheckHandler )
+    
+public:
+
+    /**  ICE check list states */
+    enum TIceCheckListState
+        {
+        EIceCheckListRunning        = 1,
+        EIceCheckListCompleted      = 2,
+        EIceCheckListFailed         = 3
+        };
+
+    /**
+     * Two-phased constructor.
+     * @param   aClient                 The client
+     * @param   aStreamCollectionId     The stream collection
+     * @param   aSessionData            The session data
+     * @param   aConnHandler            The connection handler
+     */
+    static CIceCheckList* NewL( 
+        MIceChecklistObserver& aClient,
+        TUint aStreamCollectionId,
+        CIceSessionData& aSessionData,
+        CIceConnectionHandler& aConnHandler );
+
+    /**
+     * Two-phased constructor.
+     * @param   aClient                 The client
+     * @param   aStreamCollectionId     The stream collection
+     * @param   aSessionData            The session data
+     * @param   aConnHandler            The connection handler
+     */
+    static CIceCheckList* NewLC( 
+        MIceChecklistObserver& aClient,
+        TUint aStreamCollectionId,
+        CIceSessionData& aSessionData,
+        CIceConnectionHandler& aConnHandler );
+
+    /**
+     * Destructor.
+     */
+    virtual ~CIceCheckList();
+
+    /**
+     * For usage with CPeriodic.
+     */
+    static TInt TimerFired( TAny* aObject );
+
+    /**
+     * Return state of the checklist.
+     * 
+     * @since   S60 v3.2
+     * @return  Sate of the checklist
+     */
+    TIceCheckListState State() const;
+
+    /**
+     * Returns stream collection id for the check list.
+     * 
+     * @since   S60 v3.2
+     * @return  Stream collection identifier
+     */
+    TUint StreamCollectionId() const;
+
+    /**
+     * Prepares check list before candidate pair checks are started.
+     * Used with check list corresponding first SDP media line (ICE 5.7 )
+     *
+     * @since   S60 v3.2
+     */
+    void InitializeCheckListL();
+
+    /**
+     * Prepares check list before candidate pair checks are started.
+     * Used for activation after check list for first media line has
+     * completed first check for the last media component.
+     *
+     * @since   S60 v3.2
+     * @param   aFoundation     The foundation to match
+     */
+    void InitializeCheckListL( const TDesC8& aFoundation );
+
+    /**
+     * Starts perform periodic connectivity checks.
+     *
+     * @since   S60 v3.2
+     * @param   anInterval      The time interval for pacing checks
+     */
+    void StartPerformChecksL( 
+        const TTimeIntervalMicroSeconds32& anInterval );
+    
+    /**
+     * Restarts check list (due to ICE restart).
+     *
+     * @since   S60 v3.2
+     * @param   anInterval      The time interval for pacing checks     
+     */
+    void RestartCheckListL( const TTimeIntervalMicroSeconds32& anInterval );
+     
+    /**
+     * Updates check list with peer selected candidate pairs. ICE processing
+     * is completed with help of new information.
+     * 
+     * @since   S60 v3.2
+     * @param   aPeerSelectedPairs  Peer selected candidate pairs
+     */
+    void UpdateCheckListL( 
+        RPointerArray<CNATFWCandidatePair>& aPeerSelectedPairs );
+    
+    /**
+     * Updates check list with updated set of remote candidates. 
+     * ICE processing is completed with help of new information.
+     * 
+     * @since   S60 v3.2
+     * @param   aRemoteCands        All remote candidates known currently
+     */
+    void UpdateCheckListL( 
+        RPointerArray<CNATFWCandidate>& aRemoteCands );
+    
+    /**
+     * Called when incoming STUN request has come.
+     * If aFromAddr == aPeerAddr relay isn't used.
+     *
+     * @since   S60 v3.2
+     * @param   aLocalAddr          To which local address request came
+     * @param   aFromAddr           Where request came from as seen by socket
+     * @param   aPeerAddr           Real remote address where request came from
+     * @param   aPriority           Priority from request
+     * @param   aRemoteFavored      Whether candidate pair checked is favored
+                                    by remote peer
+     */
+    void STUNRequestReceivedL( const TInetAddr& aLocalAddr,
+        const TInetAddr& aFromAddr, const TInetAddr& aPeerAddr,
+        TUint aPriority, TBool aRemoteFavored );
+    
+    /**
+     * Indicates whether relay is used for some selected pair.
+     *
+     * @since   S60 v3.2
+     * @return  ETrue if relay is used
+     */
+    TBool RelayUsedForSelectedPairL() const;
+    
+    /**
+     * Recomputes pair priorities according to the new role.
+     *
+     * @since   S60 v3.2
+     */
+    void RecomputePairPriorities();
+
+// from base class MIceConnCheckListener
+
+    /**
+     * From MIceConnCheckListener.
+     * Notifies result of a check.
+     *
+     * @since   S60 v3.2
+     * @param   aCompletionCode     The completion code
+     * @param   aCheck              The check which was completed
+     * @param   aValidatedPair      Candidate pair validated by the check
+     */
+    void CheckCompletedL( 
+        TInt aCompletionCode,
+        const CIceConnectivityCheck& aCheck,
+        CNATFWCandidatePair* aValidatedPair );
+
+    /**
+     * From MIceConnCheckListener.
+     * Notifies result of a nomination check.
+     *
+     * @since   S60 v3.2
+     * @param   aCompletionCode     The completion code
+     * @param   aCheck              The check
+     * @param   aValidatedPair      Candidate pair validated by the check
+     */
+    void NominationCompletedL( 
+        TInt aCompletionCode,
+        const CIceConnectivityCheck& aCheck,
+        const CNATFWCandidatePair& aValidatedPair );
+    
+private:
+
+    CIceCheckList(
+        MIceChecklistObserver& aClient,
+        TUint aStreamCollectionId,
+        CIceSessionData& aSessionData,
+        CIceConnectionHandler& aConnHandler );
+
+    void ConstructL();
+
+    void GenerateCheckListL( 
+        RPointerArray<CIceConnectivityCheck>& aCheckList );
+    
+    void PairCandidatesL(
+        RPointerArray<CIceConnectivityCheck>& aCheckList,
+        RPointerArray<CNATFWCandidate>& aLocalCandidates,
+        RPointerArray<CNATFWCandidate>& aRemoteCandidates );
+    
+    TBool CompatibleCandidates( const CNATFWCandidate& aCand1, 
+        const CNATFWCandidate& aCand2 ) const;
+    
+    void PruneChecksL( RPointerArray<CIceConnectivityCheck>& aChecks );
+    
+    void ReplaceReflexiveCandidatesWithBaseL( 
+        RPointerArray<CIceConnectivityCheck>& aChecks );
+    
+    void OnTimerFiredL();
+    
+    TUint PriorityForPeerReflCandL( 
+        const CNATFWCandidate& aLocalCandidate ) const;
+        
+    void HandleTriggeredCheckL( const CNATFWCandidatePair& aPair );
+    
+    void UpdateCheckListStateL();
+    
+    void RemovePendingChecks( TUint aComponentId );
+    
+    void GetComponentIdsL( RArray<TUint>& aComponentIds ) const;
+    
+    TInt FindCheckInState( TInt aStateMask );
+    
+    TInt FindCheckInState( TInt aStateMask, TUint aComponentId );
+    
+    TInt FindCheckInState( TInt aStateMask, const TInetAddr& aRemoteAddr );
+    
+    TInt FindCheck( const CNATFWCandidatePair& aPair );
+    
+    void SetStateL( TIceCheckListState aState );
+    
+    void DoLosingPairProcessingL( 
+        const RPointerArray<CNATFWCandidatePair>& aSelectedPairs );
+    
+    void NominateCandidatePairsL();
+    
+    TBool CheckListFrozen();
+    
+    void EnqueueCheckL( CIceConnectivityCheck& aCheck,
+        CIceConnectivityCheck::TIceCheckType aType, TUint aLocalPriority );
+    
+    TBool DequeueCheckL();
+    
+    TUint RetransmissionTimeOut() const;
+
+    CDesC8ArrayFlat* FoundationsForCollectionL( TUint aStreamCollectionId ) const;
+    
+    TUint LowestComponentId( RArray<TUint>& aComponentIds ) const;
+    
+    TBool NominationExecuted() const;
+    
+    void InitializeCheckList( const TDesC8& aFoundation, 
+        TInt aExcludedComponentId );
+        
+private: // data
+
+    /**
+     * ICE check list state.
+     */
+    TIceCheckListState iState;
+
+    /**
+     * Stream collection for which this check list is.
+     */
+    TUint iStreamCollectionId;
+    
+    /**
+     * Timer interval for pacing checks.
+     */
+    TTimeIntervalMicroSeconds32 iInterval;
+    
+    /**
+     * Client notified about a result of the check.
+     * Not own.
+     */
+    MIceChecklistObserver& iClient;
+    
+    /**
+     * The session data.
+     * Not own.
+     */
+    CIceSessionData& iSessionData;
+    
+    /**
+     * Connection handler.
+     * Not own.
+     */
+    CIceConnectionHandler& iConnHandler;
+
+    /**
+     * Ordered list of checks to be executed.
+     * Own.
+     */
+    RPointerArray<CIceConnectivityCheck> iChecks;
+    
+    /**
+     * Check queue for congestion control purposes.
+     * Own.
+     */
+    RArray<TIceCheckQueItem> iCheckQue;
+    
+    /**
+     * Prioritizer for the checks.
+     * Own.
+     */
+    CIceCheckPrioritizer* iCheckPrioritizer;
+    
+    /**
+     * Prioritizer for the local candidates.
+     * Own.
+     */
+    CIceCandidatePrioritizer* iCandPrioritizer;
+
+    /**
+     * Timer for connectivity check triggering.
+     * Own.
+     */
+    CPeriodic* iTimer;
+    
+    /**
+     * Valid list.
+     * Own.
+     */
+    CIceValidList* iValidList;
+
+    /**
+     * Component identifiers.
+     * Own.
+     */
+    RArray<TUint> iComponentIds;
+
+    /**
+     * Remote selected candidate pairs.
+     * Own.
+     */
+    RPointerArray<CNATFWCandidatePair> iSelectedPairs;
+    };
+
+
+#endif // C_CICECHECKLIST_H