multimediacommsengine/mmcesrv/mmceserver/src/mcesipconnection.cpp
changeset 0 1bce908db942
child 39 7ef91bf0eaa2
--- /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 <badesca.h>
+#include <in_pkt.h>
+#include <sip.h>
+#include <sipprofile.h>
+#include <sipdialog.h>
+#include <sipinvitedialogassoc.h>
+#include <sipcontactheader.h>
+#include <sipprofileregistry.h>
+#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<CMceSipSession*>( 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