multimediacommscontroller/mmccsubcontroller/src/mccrtpkeepalivecontainer.cpp
changeset 0 1bce908db942
child 32 f2ed1fc4c163
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccsubcontroller/src/mccrtpkeepalivecontainer.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,279 @@
+/*
+* Copyright (c) 2002-2008 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:    RTP Keepalive mechanism
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <e32math.h>
+#include "mccrtpkeepalivecontainer.h"
+#include "mccrtpkeepalive.h"
+#include "mccdef.h"
+#include "mccinternaldef.h"
+#include "mccsubcontrollerlogs.h"
+#include "mccinternalevents.h"
+#include "mccrtpinterface.h"
+
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+
+// ============================= LOCAL FUNCTIONS =============================
+
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// CMccRtpKeepaliveContainer::NewL
+// ---------------------------------------------------------------------------
+//
+CMccRtpKeepaliveContainer* CMccRtpKeepaliveContainer::NewL( 
+    MAsyncEventHandler& aEventHandler,
+    CRtpAPI& aRtpAPI,
+    TRtpId aRtpSessionId )
+    {
+    CMccRtpKeepaliveContainer* self = 
+        new ( ELeave ) CMccRtpKeepaliveContainer( aEventHandler,
+                                                  aRtpAPI,
+                                                  aRtpSessionId );
+                                                  
+    return self;  
+    }
+
+// ---------------------------------------------------------------------------
+// CMccRtpKeepaliveContainer::~CMccRtpKeepaliveContainer
+// ---------------------------------------------------------------------------
+//        
+CMccRtpKeepaliveContainer::~CMccRtpKeepaliveContainer()
+    {
+    iKeepaliveHandlers.ResetAndDestroy();
+    }
+
+// ---------------------------------------------------------------------------
+// CMccRtpKeepaliveContainer::StartKeepaliveL
+// ---------------------------------------------------------------------------
+//
+void CMccRtpKeepaliveContainer::StartKeepaliveL( 
+    MMccRtpInterface& aUser, 
+    TMccCodecInfo& aCodecInfo,
+    CMccRtpMediaClock& aRtpMediaClock )
+    {
+    __SUBCONTROLLER( "CMccRtpKeepaliveContainer::StartKeepaliveL(), Entry" )
+    
+    if ( aUser.IsSink() )
+        {
+        iRtpSinkExist = ETrue;
+        }  
+            
+    if ( ( aCodecInfo.iKeepaliveInterval > 0 && !iStopped ) && 
+            ( aUser.IsSink() ||
+            ( !aUser.IsSink() && EFalse == iRtpSinkExist ) ) )
+        {
+        __SUBCONTROLLER( "CMccRtpKeepaliveContainer::StartKeepaliveL(),\
+        interval defined" )
+
+        CMccRtpKeepalive* handler = FindKeepaliveHandler( 
+            aCodecInfo.iKeepalivePT, aUser );
+        if ( !handler )
+            {
+            handler = CMccRtpKeepalive::NewL( iEventHandler, 
+                                              iRtpAPI, 
+                                              iRtpSessionId, 
+                                              aCodecInfo.iKeepalivePT,
+                                              aCodecInfo.iKeepaliveInterval,
+                                              aCodecInfo.iKeepaliveData,
+                                              iRemoteAddressSet );
+            CleanupStack::PushL( handler );
+            iKeepaliveHandlers.AppendL( handler ); 
+            CleanupStack::Pop( handler );
+            }
+        handler->StartKeepaliveL( aUser, aRtpMediaClock );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMccRtpKeepaliveContainer::StopKeepalive
+// ---------------------------------------------------------------------------
+//        
+TInt CMccRtpKeepaliveContainer::StopKeepalive( 
+    MMccRtpInterface& aUser, 
+    const TMccCodecInfo& aCodecInfo )
+    {
+    __SUBCONTROLLER( "CMccRtpKeepaliveContainer::StopKeepalive(), Entry" )
+    TInt err( KErrNotFound );
+    CMccRtpKeepalive* handler = FindKeepaliveHandler(
+        aCodecInfo.iKeepalivePT, aUser );
+    if ( handler )
+        {
+        TInt refCount( 0 );
+        err = handler->StopKeepalive( aUser, refCount );
+        if ( !refCount )
+            {
+            // No more users, can be removed
+            TInt index = iKeepaliveHandlers.Find( handler );
+            if ( index != KErrNotFound )
+                {
+                __SUBCONTROLLER( "CMccRtpKeepaliveContainer::StopKeepalive(),\
+                delete Handler" )
+                delete iKeepaliveHandlers[ index ];
+                iKeepaliveHandlers.Remove( index );
+                }
+            }
+        if ( iRtpSinkExist )
+            {
+            iRtpSinkExist = EFalse;            
+            TInt count = iKeepaliveHandlers.Count();
+            for ( TInt i = 0; i < count && !iRtpSinkExist; i++ )
+                {
+                iRtpSinkExist = iKeepaliveHandlers[ i ]->IsForSink();
+                }
+            }    
+        }
+    return err;
+    }
+    
+// ---------------------------------------------------------------------------
+// CMccRtpKeepaliveContainer::ResetKeepAliveTimer
+// ---------------------------------------------------------------------------
+//    
+void CMccRtpKeepaliveContainer::ResetKeepaliveTimer()
+    {
+    TInt count = iKeepaliveHandlers.Count();        
+    for ( TInt i = 0; i < count; i++ )
+        {
+        iKeepaliveHandlers[ i ]->ResetKeepaliveTimer();
+        }        
+    }    
+
+// ---------------------------------------------------------------------------
+// CMccRtpKeepaliveContainer::UpdateParamsL
+// ---------------------------------------------------------------------------
+//  
+void CMccRtpKeepaliveContainer::UpdateParamsL( MMccRtpInterface& aUser,
+    const TMccCodecInfo& aCodecInfo )
+    {
+    __SUBCONTROLLER( "CMccRtpKeepaliveContainer::UpdateParamsL(), Entry" )
+    
+    CMccRtpKeepalive* handler = 
+        FindKeepaliveHandler( aCodecInfo.iKeepalivePT, aUser );
+    
+    if ( handler )
+        {
+        // Deactivate handler because update invalidates references to the
+        // previous keep-alive data.
+        handler->Cancel();
+        handler->UpdateParamsL( aCodecInfo.iKeepalivePT, 
+            aCodecInfo.iKeepaliveInterval, aCodecInfo.iKeepaliveData );
+        
+        if ( aCodecInfo.iKeepaliveInterval > 0 && !handler->IsActive() )
+            {
+            handler->ResetKeepaliveTimer();
+            }
+        }
+    
+    __SUBCONTROLLER( "CMccRtpKeepaliveContainer::UpdateParamsL(), exit" )
+    }
+
+// ---------------------------------------------------------------------------
+// CMccRtpKeepaliveContainer::StopAll
+// ---------------------------------------------------------------------------
+//    
+void CMccRtpKeepaliveContainer::StopAll()
+    {
+    iKeepaliveHandlers.ResetAndDestroy();
+    iStopped = ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CMccRtpKeepaliveContainer::RemoteAddressSet
+// ---------------------------------------------------------------------------
+//   
+TInt CMccRtpKeepaliveContainer::RemoteAddressSet()
+    {
+    TInt err( KErrNotReady );
+    iRemoteAddressSet = ETrue;
+    if ( !iStopped )
+        {
+        err = KErrNone;
+        for ( TInt i = 0; i < iKeepaliveHandlers.Count(); i++ )
+            {
+            err |= iKeepaliveHandlers[ i ]->RemoteAddressSet();
+            }
+        }
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// CMccRtpKeepaliveContainer::FindKeepaliveHandler
+// ---------------------------------------------------------------------------
+//   
+CMccRtpKeepalive* CMccRtpKeepaliveContainer::FindKeepaliveHandler( 
+    TUint8 aKeepAlivePT, MMccRtpInterface& aUser )
+    {
+    CMccRtpKeepalive* handler = NULL;
+    for ( TInt i = 0; i < iKeepaliveHandlers.Count() && !handler; i++ )
+        {
+        if ( aUser.IsSink() )
+            {
+            if ( iKeepaliveHandlers[ i ]->StreamId() == aUser.RtpStreamId() )
+                {
+                handler = iKeepaliveHandlers[ i ];
+                }
+            }
+        else
+            {
+            if ( iKeepaliveHandlers[ i ]->PayloadType() == aKeepAlivePT )
+                {
+                handler = iKeepaliveHandlers[ i ];
+                }
+            }
+        }
+    return handler;
+    }
+    
+// ---------------------------------------------------------------------------
+// CMccRtpKeepaliveContainer::CMccRtpKeepaliveContainer
+// ---------------------------------------------------------------------------
+//        
+CMccRtpKeepaliveContainer::CMccRtpKeepaliveContainer( 
+    MAsyncEventHandler& aEventHandler,
+    CRtpAPI& aRtpAPI,
+    TRtpId aRtpSessionId ) :
+    iEventHandler( aEventHandler ), 
+    iRtpAPI( aRtpAPI ),
+    iRtpSessionId( aRtpSessionId )
+    {
+    }      
+
+       
+// ========================== OTHER EXPORTED FUNCTIONS =======================
+
+//  End of File