--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwconnectionmultiplexer/src/cncmstream.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,375 @@
+/*
+* 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: Connection multiplexer stream abstraction.
+*
+*/
+
+
+
+
+#include "cncmstream.h"
+#include "ncmconnectionmultiplexerlogs.h"
+#include "ncmconnectionmultiplexerassert.h"
+#include "natfwmediawrapper.h"
+#include "cncmconnectionobserverhandler.h"
+#include "cncmconnection.h"
+
+const TUint KFirstConnectionId = 1;
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::CNcmStream
+// ---------------------------------------------------------------------------
+//
+CNcmStream::CNcmStream( TUint aSessionId,
+ TUint aStreamId, TInt aQos, TUint aProtocol ):
+ iSessionId( aSessionId ), iStreamId( aStreamId ), iQos( aQos ),
+ iStreamProtocol( aProtocol ),
+ iNextConnectionId( KFirstConnectionId ),
+ iMediaConnectionId( 0 )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::NewL
+// ---------------------------------------------------------------------------
+//
+CNcmStream* CNcmStream::NewL( TUint aSessionId,
+ TUint aStreamId, TInt aQos, TUint aProtocol )
+ {
+ __CONNECTIONMULTIPLEXER( "CNcmStream::NewL" )
+
+ CNcmStream* self =
+ CNcmStream::NewLC( aSessionId, aStreamId, aQos, aProtocol );
+
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::NewLC
+// ---------------------------------------------------------------------------
+//
+CNcmStream* CNcmStream::NewLC( TUint aSessionId,
+ TUint aStreamId, TInt aQos, TUint aProtocol )
+ {
+ __CONNECTIONMULTIPLEXER( "CNcmStream::NewLC" )
+
+ CNcmStream* self =
+ new( ELeave ) CNcmStream( aSessionId, aStreamId, aQos, aProtocol );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CNcmStream::ConstructL()
+ {
+ iConnectionObserverHandler = CNcmConnectionObserverHandler::NewL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::~CNcmStream
+// ---------------------------------------------------------------------------
+//
+CNcmStream::~CNcmStream()
+ {
+ __CONNECTIONMULTIPLEXER_INT1( "CNcmStream::~CNcmStream, CONN_COUNT: ",
+ iConnections.Count() )
+
+ TInt ind( KErrNotFound );
+ while ( KErrNotFound != ( ind = iConnections.Count() - 1 ) )
+ {
+ TUint connectionId = iConnections[ind]->ConnectionId();
+
+ delete iConnections[ind];
+ iConnections.Remove( ind );
+
+ if ( iConnectionObserverHandler )
+ {
+ iConnectionObserverHandler->ConnectionNotify( iStreamId,
+ connectionId, EMultiplexerConnectionRemoved, KErrNone );
+ }
+ }
+
+ iConnections.Close();
+
+ if ( iWrapper )
+ {
+ iWrapper->Close();
+ }
+
+ iWrapper = NULL;
+ delete iConnectionObserverHandler;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::CreateConnectionL
+// ---------------------------------------------------------------------------
+//
+TUint CNcmStream::CreateConnectionL(
+ MNcmMultiplexerConnectionObserver& aObserver,
+ CNcmConnectionObserverHandler& aConnectionObserverHandler,
+ RSocketServ& aSocketServ,
+ RConnection& aConnection,
+ const TInetAddr& aLocalAddress,
+ TBool aReuseAddress )
+ {
+ CNcmConnection* connection(
+ CNcmConnection::NewLC( iSessionId, iStreamId,
+ iNextConnectionId, aLocalAddress, aObserver,
+ aConnectionObserverHandler, iQos,
+ aSocketServ, aConnection, iStreamProtocol, aReuseAddress ) );
+
+ iConnections.AppendL( connection );
+
+ iNextConnectionId++;
+ CleanupStack::Pop( connection );
+ return connection->ConnectionId();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::RemoveConnectionL
+// ---------------------------------------------------------------------------
+//
+void CNcmStream::RemoveConnectionL( TUint aConnectionId )
+ {
+ __CONNECTIONMULTIPLEXER_INT1(
+ "CNcmStream::Remove - RemoveConnectionL: ", aConnectionId )
+
+ TInt count( iConnections.Count() );
+ TBool found( EFalse );
+
+ for ( TInt i = 0; i < count; i++ )
+ {
+ if ( iConnections[i]->ConnectionId() == aConnectionId )
+ {
+ delete iConnections[i];
+ iConnections.Remove( i );
+ found = ETrue;
+ break;
+ }
+ }
+
+ if ( !found )
+ {
+ User::Leave( KErrNotFound );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::StreamId
+// ---------------------------------------------------------------------------
+//
+TUint CNcmStream::StreamId() const
+ {
+ return iStreamId;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::Qos
+// ---------------------------------------------------------------------------
+//
+TInt CNcmStream::Qos() const
+ {
+ return iQos;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::SetQos
+// ---------------------------------------------------------------------------
+//
+void CNcmStream::SetQos( TInt aQos )
+ {
+ __CONNECTIONMULTIPLEXER_INT1( "CNcmStream::SetQos - aQos: ", aQos )
+
+ iQos = aQos;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::ConnectionL
+// ---------------------------------------------------------------------------
+//
+CNcmConnection* CNcmStream::ConnectionL(
+ TUint aConnectionId )
+ {
+ __CONNECTIONMULTIPLEXER_INT1(
+ "CNcmStream::ConnectionL - aConnectionId: ", aConnectionId )
+
+ TInt count( iConnections.Count() );
+
+ for ( TInt i = 0; i < count; i++ )
+ {
+ if ( iConnections[i]->ConnectionId() == aConnectionId )
+ {
+ return iConnections[i];
+ }
+ }
+ User::Leave( KErrNotFound );
+#ifndef _DEBUG_EUNIT
+ return NULL;
+#endif
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::RegisterWrapperL
+// ---------------------------------------------------------------------------
+//
+void CNcmStream::RegisterWrapperL(
+ MNATFWMediaWrapper* aWrapper )
+ {
+ __CONNECTIONMULTIPLEXER(
+ "CNcmStream::RegisterWrapperL" )
+ __CONNECTIONMULTIPLEXER_ASSERT_L( NULL != aWrapper, KErrArgument );
+ __CONNECTIONMULTIPLEXER_ASSERT_L( NULL == iWrapper, KErrAlreadyExists );
+
+ iWrapper = aWrapper;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::WrapperL
+// ---------------------------------------------------------------------------
+//
+MNATFWMediaWrapper* CNcmStream::WrapperL()
+ {
+ __CONNECTIONMULTIPLEXER( "CNcmStream::WrapperL" )
+ __CONNECTIONMULTIPLEXER_ASSERT_L( NULL != iWrapper, KErrNotReady );
+
+ return iWrapper;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::StreamProtocol
+// ---------------------------------------------------------------------------
+//
+TUint CNcmStream::StreamProtocol() const
+ {
+ __CONNECTIONMULTIPLEXER( "CNcmStream::StreamProtocol" )
+
+ return iStreamProtocol;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::SetStreamProtocol
+// ---------------------------------------------------------------------------
+//
+void CNcmStream::SetStreamProtocol(
+ TUint aProtocol )
+ {
+ __CONNECTIONMULTIPLEXER( "CNcmStream::SetStreamProtocol" )
+
+ iStreamProtocol = aProtocol;
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::MediaConnectionId
+// ---------------------------------------------------------------------------
+//
+TUint CNcmStream::MediaConnectionId() const
+ {
+ __CONNECTIONMULTIPLEXER( "CNcmStream::MediaConnectionId ")
+
+ return iMediaConnectionId;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::SetMediaConnectionId
+// ---------------------------------------------------------------------------
+//
+void CNcmStream::SetMediaConnectionId( TUint aMediaConnectionId )
+ {
+ __CONNECTIONMULTIPLEXER( "CNcmStream::SetMediaConnectionId ")
+
+ iMediaConnectionId = aMediaConnectionId;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CNcmStream::ConnectionObserverHandler
+// -----------------------------------------------------------------------------
+//
+CNcmConnectionObserverHandler& CNcmStream::ConnectionObserverHandler()
+ {
+ return *iConnectionObserverHandler;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::ConnectionIdByDestinationAddressL(
+// ---------------------------------------------------------------------------
+//
+CNcmConnection* CNcmStream::ConnectionByDestinationAddressL(
+ const TInetAddr& aDestinationAddress )
+ {
+ __CONNECTIONMULTIPLEXER( "CNcmStream::ConnectionByDestinationAddressL" )
+
+ TInt ind( iConnections.Count() );
+ TInt genericConnectionInd( KErrNotFound );
+
+ while ( ind-- )
+ {
+ if ( iConnections[ind]->IsGenericDestination() )
+ {
+ genericConnectionInd = ind;
+ }
+
+ if ( iConnections[ind]->
+ CheckSenderValidityToSending( aDestinationAddress ) )
+ {
+ return iConnections[ind];
+ }
+ }
+
+ // as a last resort generic connection can be used if one exists
+ if ( KErrNotFound != genericConnectionInd )
+ {
+ return iConnections[genericConnectionInd];
+ }
+
+ User::Leave( KErrNotFound );
+#ifndef _DEBUG_EUNIT
+ return NULL;
+#endif
+ }
+
+
+// ---------------------------------------------------------------------------
+// CNcmStream::RegisterMediaSourceL
+// ---------------------------------------------------------------------------
+//
+void CNcmStream::RegisterMediaSourceL( CNcmMediaSource* aMediaSource )
+ {
+ iConnectionObserverHandler->RegisterMediaSourceL( aMediaSource );
+ }