diff -r 000000000000 -r 1bce908db942 natfw/natfwconnectionmultiplexer/src/cncmstream.cpp --- /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 ); + }