--- /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