diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmceserver/src/mcesipconnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcesrv/mmceserver/src/mcesipconnection.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,790 @@ +/* +* Copyright (c) 2005 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: +* +*/ + + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include "mcesip.h" +#include "mcesrvlogs.h" + +#include "mcesipconnection.h" +#include "mcesipmanager.h" +#include "mcesipsession.h" +#include "mcecssessionimplementation.h" +#include "mcelocaladdrresolver.h" + +//const TInt KMaxAddressLength = 256; + +// ----------------------------------------------------------------------------- +// CMceSipConnection::NewLC +// ----------------------------------------------------------------------------- +// + +CMceSipConnection* CMceSipConnection::NewLC( + CMceSipManager& aSessionManager, + CSIPProfile& aProfile, + CSIPProfileRegistry& aProfileRegistry ) + { + CMceSipConnection* self = new (ELeave) CMceSipConnection( aSessionManager, + aProfile ); + CleanupStack::PushL( self ); + self->ConstructL( aProfile, aProfileRegistry ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::NewLC +// ----------------------------------------------------------------------------- +// + +CMceSipConnection* CMceSipConnection::NewLC( CMceSipManager& aSessionManager, + TUint32 aIAPId ) + { + CMceSipConnection* self = new (ELeave) CMceSipConnection( aSessionManager, + aIAPId ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +#define MCE_SIP_CONNECTION_UNUSABLE( connection )\ + (connection->State() == CSIPConnection::EInactive ||\ + connection->State() == CSIPConnection::EUnavailable ) + +// ----------------------------------------------------------------------------- +// CMceSipConnection::~CMceSipConnection +// ----------------------------------------------------------------------------- +// +CMceSipConnection::~CMceSipConnection() + { + MCESRV_DEBUG("CMceSipConnection::CMceSipConnection, Entry") + + delete iClientConnection; + iSessions.Reset(); + iSessions.Close(); + + delete iLocalAddrResolver; + MCESRV_DEBUG("CMceSipConnection::CMceSipConnection, Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::Connection +// ----------------------------------------------------------------------------- +// +CSIPConnection& CMceSipConnection::Connection() const + { + return *iClientConnection; + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::State +// ----------------------------------------------------------------------------- +// +CSIPConnection::TState CMceSipConnection::State() const + { + return iClientConnection->State(); + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::AccessPointId +// ----------------------------------------------------------------------------- +// +TUint32 CMceSipConnection::AccessPointId() const + { + return iIAPId; + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::AttachL +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::AttachL( CMceCsSubSession& aSession ) + { + User::LeaveIfError( MCE_SIP_CONNECTION_UNUSABLE( iClientConnection ) ? + KErrNotReady : KErrNone ); + User::LeaveIfError( + iSessions.Find( &aSession ) < 0 ? KErrNone : KErrArgument ); + + iSessions.AppendL( &aSession ); + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::Detach +// ----------------------------------------------------------------------------- +// +TInt CMceSipConnection::Detach( CMceCsSubSession& aSession ) + { + + TInt index = iSessions.Find( &aSession ); + + if ( index >= KErrNone ) + { + iSessions.Remove( index ); + } + + return iSessions.Count(); + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::CMceSipConnection +// ----------------------------------------------------------------------------- +// + +CMceSipConnection::CMceSipConnection ( CMceSipManager& aSessionManager, + CSIPProfile& aProfile ) + : iIAPId( (TUint32)KErrNotFound ), + iSessionManager( aSessionManager ) + { + aProfile.GetParameter( KSIPAccessPointId, iIAPId ); + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::CMceSipConnection +// ----------------------------------------------------------------------------- +// +CMceSipConnection::CMceSipConnection ( CMceSipManager& aSessionManager, + TUint32 aIAPId ) + : iIAPId( aIAPId ), + iSessionManager( aSessionManager ) + { + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::ConstructL +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::ConstructL( CSIPProfile& aProfile, + CSIPProfileRegistry& aProfileRegistry ) + { + MCESRV_DEBUG("CMceSipConnection::ConstructL, Entry") + + if ( !aProfileRegistry.IsEnabled( aProfile ) ) + { + MCESRV_DEBUG("CMceSipConnection::ConstructL, enabling profile") + aProfileRegistry.EnableL( aProfile, *this ); + } + + iClientConnection = aProfileRegistry.ConnectionL( aProfile ); + + iLocalAddrResolver = + CMceLocalAddrResolver::NewL( + iSessionManager.SocketServ(), + AccessPointId() ); + + MCESRV_DEBUG("CMceSipConnection::ConstructL, Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::ConstructL +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::ConstructL( ) + { + MCESRV_DEBUG("CMceSipConnection::ConstructL, Entry") + + MCESRV_DEBUG("CMceSipConnection::ConstructL, new connection") + + iClientConnection = + CSIPConnection::NewL( iSessionManager.SIPClient(), + AccessPointId(), + *this ); + + iLocalAddrResolver = + CMceLocalAddrResolver::NewL( + iSessionManager.SocketServ(), + AccessPointId() ); + + MCESRV_DEBUG("CMceSipConnection::ConstructL, Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::IncomingRequest +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::IncomingRequest( + CSIPServerTransaction* aTransaction ) + { + MCESRV_DEBUG("CMceSipConnection::IncomingRequest( sa ), Entry") + MCESRV_DEBUG_SVALUE("request", MceSip::Method( *aTransaction ).DesC() ) + TInt error = KErrNone; + TBool sessionConsumed = EFalse; + TBool requestConsumed = EFalse; + + sessionConsumed = iSessionManager.Consumes( *aTransaction ); + if ( sessionConsumed ) + { + TRAP( error, iSessionManager.CreateSubSessionL( aTransaction, *this ) ); + requestConsumed = error ? EFalse : ETrue; + } + else + { + CMceCsSubSession* session = NULL; + TInt index = 0; + while ( !requestConsumed && index < iSessions.Count() ) + { + session = iSessions[ index++ ]; + sessionConsumed = session->Consumes( *aTransaction ); + if ( sessionConsumed ) + { + requestConsumed = session->MessageRequestReceived( aTransaction ); + } + } + } + + if ( !sessionConsumed ) + { + MCESRV_DEBUG("IncomingRequest( sa ): not consumed ->discard") + MceSip::DiscardRequest( aTransaction, KMceSipNotImplemented ); + } + else if ( !requestConsumed || error ) + { + MCESRV_DEBUG("IncomingRequest( sa ): error->discard") + MceSip::DiscardRequest( aTransaction ); + } + else + { + // NOP + } + + iSessionManager.Cleanup(); + + MCESRV_DEBUG("CMceSipConnection::IncomingRequest( sa ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::IncomingRequest +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::IncomingRequest ( + CSIPServerTransaction* aTransaction, + CSIPDialog& aDialog ) + { + MCESRV_DEBUG("CMceSipConnection::IncomingRequest( inside dialog ), Entry") + MCESRV_DEBUG_SVALUE("request", MceSip::Method( *aTransaction ).DesC() ) + CMceCsSubSession* session = NULL; + CMceCsSubSession* assocSession = NULL; + TBool sessionConsumed = EFalse; + TBool requestConsumed = EFalse; + TInt index = 0; + + while ( !requestConsumed && index < iSessions.Count() ) + { + TBool assocDialog( EFalse ); + session = iSessions[ index++ ]; + + sessionConsumed = session->Consumes( aDialog, *aTransaction, assocDialog ); + if ( sessionConsumed ) + { + requestConsumed = session->DialogRequestReceived( aTransaction, aDialog ); + } + + if ( assocDialog && !assocSession ) + { + assocSession = session; + } + } + + TInt error = KErrNone; + if( !requestConsumed ) + { + index = 0; + while ( !requestConsumed && index < iSessions.Count() ) + { + session = iSessions[ index++ ]; + if ( !session->Client().IsOrphan() && + session->Dialog()->Dialog() == aDialog ) + { + TRAP( error, iSessionManager.CreateSubSessionL( + aTransaction, + session->Client().ClientSession(), + *this, + assocSession ) ); + sessionConsumed = error ? EFalse : ETrue; + requestConsumed = sessionConsumed; + } + } + } + + if ( !sessionConsumed ) + { + // Unknown method + MCESRV_DEBUG("IncomingRequest: not consumed -> discard") + MceSip::DiscardRequest( aTransaction, KMceSipNotImplemented ); + } + else if ( !requestConsumed || error ) + { + MCESRV_DEBUG("IncomingRequest: error -> discard") + MceSip::DiscardRequest( aTransaction ); + } + else + { + // NOP + } + iSessionManager.Cleanup(); + + MCESRV_DEBUG("CMceSipConnection::IncomingRequest( inside dialog ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::IncomingResponse +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::IncomingResponse( + CSIPClientTransaction& aTransaction ) + { + MCESRV_DEBUG("CMceSipConnection::IncomingResponse( standalone ), Entry") + MCESRV_DEBUG_DVALUE("response", MceSip::ResponseCode( aTransaction ) ) + MCESRV_DEBUG_SVALUE("to", aTransaction.Type().DesC() ) + CMceCsSubSession* session = NULL; + TBool consumed = EFalse; + TInt index = 0; + + while ( !consumed && index < iSessions.Count() ) + { + session = iSessions[ index++ ]; + consumed = session->Consumes( aTransaction ); + if ( consumed ) + { + session->MessageResponseReceived( aTransaction ); + } + } + + iSessionManager.Cleanup(); + + MCESRV_DEBUG("CMceSipConnection::IncomingResponse( standalone ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::IncomingResponse +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::IncomingResponse( + CSIPClientTransaction& aTransaction, + CSIPDialogAssocBase& aDialogAssoc ) + { + MCESRV_DEBUG("CMceSipConnection::IncomingResponse( inside dialog ), Entry") + MCESRV_DEBUG_DVALUE("response", MceSip::ResponseCode( aTransaction ) ) + MCESRV_DEBUG_SVALUE("to", aTransaction.Type().DesC() ) + CMceCsSubSession* session = NULL; + TBool consumed = EFalse; + TInt index = 0; + + while ( !consumed && index < iSessions.Count() ) + { + session = iSessions[ index++ ]; + if ( session->Consumes( aTransaction ) ) + { + consumed = ETrue; + session->ResponseReceivedWithinDialog( aTransaction, aDialogAssoc ); + } + } + + iSessionManager.Cleanup(); + + MCESRV_DEBUG("CMceSipConnection::IncomingResponse( inside dialog ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::IncomingResponse +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::IncomingResponse ( + CSIPClientTransaction& aTransaction, + CSIPInviteDialogAssoc* aDialogAssoc ) + { + MCESRV_DEBUG("CMceSipConnection::IncomingResponse( forked ), Entry") + MCESRV_DEBUG_DVALUE("response", MceSip::ResponseCode( aTransaction ) ) + MCESRV_DEBUG_SVALUE("to", aTransaction.Type().DesC() ) + + // Find the session + CMceCsSubSession* session = NULL; + TBool consumed = EFalse; + TInt index = 0; + TInt error = KErrNone; + + while ( !consumed && index < iSessions.Count() ) + { + session = iSessions[ index++ ]; + if ( session->Consumes( aTransaction ) && + session->Type() == CMceCsSubSession::EOutSIPSession ) + { + consumed = ETrue; + TRAP( error, static_cast( session )-> + InviteForkedL( aTransaction, aDialogAssoc ) ); + } + } + + if ( error != KErrNone || !consumed ) + { + Reject( aDialogAssoc ); + } + + iSessionManager.Cleanup(); + + MCESRV_DEBUG("CMceSipConnection::IncomingResponse( forked ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::IncomingResponse +// ----------------------------------------------------------------------------- +// +void +CMceSipConnection::IncomingResponse( + CSIPClientTransaction& /*aTransaction*/, + CSIPRegistrationBinding& /*aRegistration*/ ) + { + MCESRV_DEBUG("CMceSipConnection::IncomingResponse( reg ), Entry") + MCESRV_DEBUG("CMceSipConnection::IncomingResponse( reg ), NOT IMPLEMENTED") + //NOT IMPLEMENTED + MCESRV_DEBUG("CMceSipConnection::IncomingResponse( reg ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::ErrorOccured +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::ErrorOccured( + TInt aError, + CSIPTransactionBase& aTransaction ) + { + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( standalone ), Entry") + MCESRV_DEBUG_DVALUE("error", aError ) + + CMceCsSubSession* session = NULL; + TBool consumed = EFalse; + TInt index = 0; + + while ( !consumed && index < iSessions.Count() ) + { + session = iSessions[ index++ ]; + consumed = session->Consumes( aTransaction ); + if ( consumed ) + { + session->ErrorOccured( aError, aTransaction ); + } + } + + iSessionManager.Cleanup(); + + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( standalone ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::ErrorOccured +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::ErrorOccured ( + TInt aError, + CSIPTransactionBase& aTransaction, + CSIPDialogAssocBase& aDialogAssoc) + { + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( inside dialog ), Entry") + MCESRV_DEBUG_DVALUE("error", aError ) + + CMceCsSubSession* session = NULL; + TBool consumed = EFalse; + TInt index = 0; + + while ( !consumed && index < iSessions.Count() ) + { + session = iSessions[ index++ ]; + if ( session->Dialog() == &aDialogAssoc && + session->Consumes( aTransaction ) ) + { + consumed = ETrue; + session->ErrorOccured( aError, aTransaction ); + } + } + + iSessionManager.Cleanup(); + + MCESRV_DEBUG("CMceSipConnection::ErrorOccured(inside dialog ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::ErrorOccured +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::ErrorOccured( + TInt aError, + CSIPDialogAssocBase& aDialogAssoc ) + { + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( dialog ), Entry") + MCESRV_DEBUG_DVALUE("error", aError ) + + CMceCsSubSession* session = NULL; + TBool consumed = EFalse; + TInt index = 0; + + while ( !consumed && index < iSessions.Count() ) + { + session = iSessions[ index++ ]; + if ( session->Dialog() == &aDialogAssoc ) + { + session->ErrorOccured( aError ); + consumed = ETrue; + } + } + + iSessionManager.Cleanup(); + + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( dialog ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::InviteCompleted +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::InviteCompleted( + CSIPClientTransaction& aTransaction ) + { + MCESRV_DEBUG("CMceSipConnection::InviteCompleted, Entry") + CMceCsSubSession* session = NULL; + TBool consumed = EFalse; + TInt index = 0; + + while ( !consumed && index < iSessions.Count() ) + { + session = iSessions[ index++ ]; + consumed = session->Consumes( aTransaction ); + if ( consumed ) + { + session->InviteCompleted( aTransaction ); + } + } + + MCESRV_DEBUG("CMceSipConnection::InviteCompleted, Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::InviteCanceled +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::InviteCanceled( + CSIPServerTransaction& aTransaction ) + { + MCESRV_DEBUG("CMceSipConnection::InviteCanceled, Entry") + CMceCsSubSession* session = NULL; + TBool consumed = EFalse; + TInt index = 0; + + while ( !consumed && index < iSessions.Count() ) + { + session = iSessions[ index++ ]; + consumed = session->Consumes( aTransaction ); + if ( consumed ) + { + session->Canceled(); + } + } + MCESRV_DEBUG("CMceSipConnection::InviteCanceled, Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::ConnectionStateChanged +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::ConnectionStateChanged( + CSIPConnection::TState aState ) + { + MCESRV_DEBUG("CMceSipConnection::ConnectionStateChanged, Entry") + MCESRV_DEBUG_DVALUE("state", aState ) + + TInt index = 0; + while ( index < iSessions.Count() ) + { + CMceCsSubSession* session = iSessions[ index++ ]; + session->ConnectionStateChanged( aState ); + + if ( MCE_SIP_CONNECTION_UNUSABLE( iClientConnection ) ) + { + session->Canceled(); + } + } + MCESRV_DEBUG("CMceSipConnection::ConnectionStateChanged, Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::ErrorOccured +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::ErrorOccured( + TInt /*aError*/, + CSIPClientTransaction& /*aTransaction*/, + CSIPRegistrationBinding& /*aRegistration*/) + { + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( reg ), Entry") + MCESRV_DEBUG("NOT IMPLEMENTED") + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( reg ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::ErrorOccured +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::ErrorOccured( + TInt /*aError*/, + CSIPRefresh& /*aSIPRefresh*/ ) + { + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( refresh ), Entry") + MCESRV_DEBUG("NOT IMPLEMENTED") + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( refresh ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::ErrorOccured +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::ErrorOccured( + TInt /*aError*/, + CSIPRegistrationBinding& /*aRegistration*/ ) + { + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( sa reg ), Entry") + MCESRV_DEBUG("NOT IMPLEMENTED") + MCESRV_DEBUG("CMceSipConnection::ErrorOccured( sa reg ), Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::Reject +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::Reject( CSIPInviteDialogAssoc* aDialogAssoc ) + { + MCESRV_DEBUG("CMceSipConnection::Reject( assoc ), Entry") + + delete aDialogAssoc; + + MCESRV_DEBUG("CMceSipConnection::Reject( assoc ), Entry") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::LocalIPAddressL +// ----------------------------------------------------------------------------- +// +TInetAddr CMceSipConnection::LocalIPAddressL( TInetAddr* aNextHop ) + { + MCESRV_DEBUG("CMceSipConnection::LocalIPAddressL, Entry") + TInetAddr localIpAddress; + iLocalAddrResolver->RefreshLocalAddressesL(); + FillWithMatchingAddrFamily( localIpAddress, aNextHop ); + MCESRV_DEBUG("CMceSipConnection::LocalIPAddressL, Exit") + return localIpAddress; + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::UpdateConnectionL +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::UpdateConnectionL( TUint aSignallingTypeOfService ) + { + if ( aSignallingTypeOfService != iCurrentSignallingTypeOfService ) + { + MCESRV_DEBUG_DVALUE( "CMceSipConnection::UpdateConnectionL, tos", + aSignallingTypeOfService ) + + iClientConnection->SetOptL( KSoIpTOS, + KProtocolInetIp, + aSignallingTypeOfService ); + + iCurrentSignallingTypeOfService = aSignallingTypeOfService; + + MCESRV_DEBUG("CMceSipConnection::UpdateConnectionL, tos set") + } + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::FillWithMatchingAddrFamily +// ----------------------------------------------------------------------------- +// +void CMceSipConnection::FillWithMatchingAddrFamily( TInetAddr& aAddr, + const TInetAddr* aNextHop ) + { + MCESRV_DEBUG("CMceSipConnection::FillWithMatchingAddrFamily, Entry") + + MCESRV_DEBUG_ADDRVALUE( + "CMceSipConnection::FillWithMatchingAddrFamily: local IP addr", + iLocalAddrResolver->Addr() ) + + MCESRV_DEBUG_ADDRVALUE( + "CMceSipConnection::FillWithMatchingAddrFamily: local IPv4 addr", + iLocalAddrResolver->IPv4Addr() ) + + if ( iLocalAddrResolver->HasIPv4Addr() ) + { + aAddr = iLocalAddrResolver->IPv4Addr(); + } + else + { + aAddr = iLocalAddrResolver->Addr(); + } + + if ( aNextHop ) + { + MCESRV_DEBUG_ADDRVALUE( + "CMceSipConnection::FillWithMatchingAddrFamily: next hop", + *aNextHop ) + + MCESRV_DEBUG_DVALUE( + "CMceSipConnection::FillWithMatchingAddrFamily: next hop family", + aNextHop->Family() ) + + if ( aNextHop->Family() == KAfInet ) + { + if ( !iLocalAddrResolver->HasIPv4Addr() && + ( aAddr.IsV4Compat() || aAddr.IsV4Mapped() ) ) + { + aAddr.ConvertToV4(); + } + } + else + { + aAddr = iLocalAddrResolver->Addr(); + if ( aAddr.Family() == KAfInet ) + { + aAddr.ConvertToV4Compat(); + } + } + } + MCESRV_DEBUG_ADDRVALUE( + "CMceSipConnection::FillWithMatchingAddrFamily returns", aAddr ) + + MCESRV_DEBUG("CMceSipConnection::FillWithMatchingAddrFamily, Exit") + } + +// ----------------------------------------------------------------------------- +// CMceSipConnection::IsProfileUsedInSession +// ----------------------------------------------------------------------------- +// +TBool CMceSipConnection::IsProfileUsedInSession( CSIPProfile& aProfile ) + { + TBool result = EFalse; + for( TInt i = 0; i < iSessions.Count() && !result; i++ ) + { + result = ( &aProfile == &iSessions[ i ]->Profile() ); + } + return result; + } + +//EOF