voipplugins/sipconnectionprovider/src/scpprofilehandler.cpp
branchRCL_3
changeset 21 f742655b05bf
parent 20 65a3ef1d5bd0
child 22 d38647835c2e
--- a/voipplugins/sipconnectionprovider/src/scpprofilehandler.cpp	Thu Aug 19 09:45:22 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1010 +0,0 @@
-/*
-* Copyright (c) 2007-2010 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 <sip.h>
-#include <sipprofileregistry.h>
-#include <sipprofilealrcontroller.h>
-#include <sipprofile.h>
-#include <sipmanagedprofile.h>
-#include <sipmanagedprofileregistry.h>
-#include <ctsydomainpskeys.h>
-#include <bamdesca.h>
-#include <sipprofileregistryobserver.h> 
-#include "ipvmbxinterface.h"
-#include "scpprofilehandler.h"
-#include "scplogger.h"
-#include "scpsipconnection.h"
-#include "cipappphoneutils.h"
-#include "cipapputilsaddressresolver.h"
-
-#include "scputility.h"
-
-const TInt KTempStringlength = 200;
-const TUint KSCPUserAgentStringLength = 12;
-const TUint KSCPWlanMacAddressLength = 50;
-const TUint KSCPMaxTerminalTypeLength = 64;
-_LIT( KScpUserAgentString, "User-Agent: " );
-_LIT8 ( KSCPWlanMacAddressFrmt, "-" );
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::CScpProfileHandler
-// -----------------------------------------------------------------------------
-//
-CScpProfileHandler::CScpProfileHandler()
-    {
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::ConstructL
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::ConstructL()
-    {
-    SCPLOGSTRING( "CScpProfileHandler::ConstructL" );
-
-    iSip = CSIP::NewL( TUid::Null(), *this );
-    iProfileRegistry = CSIPProfileRegistry::NewL( *iSip, *this );
-    iManagedProfileRegistry = CSIPManagedProfileRegistry::NewL( *this );
-    iAlrController = CSipProfileAlrController::NewL( *iProfileRegistry,
-                                                     *this );
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::NewL
-// -----------------------------------------------------------------------------
-//
-CScpProfileHandler* CScpProfileHandler::NewL()
-    {
-    CScpProfileHandler* self =  new ( ELeave ) CScpProfileHandler();
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-    return self;
-    }
- 
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::~CScpProfileHandler
-// -----------------------------------------------------------------------------
-//
-CScpProfileHandler::~CScpProfileHandler()
-    {  
-    SCPLOGSTRING( "CScpProfileHandler::~CScpProfileHandler" );
-
-    iObservers.Close();
-    iSipConnections.ResetAndDestroy();
-    iSipConnections.Close();
-
-    delete iVmbxInterface;
-    delete iAlrController;
-    delete iManagedProfileRegistry;
-    delete iProfileRegistry;    
-    delete iSip;
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::AddObserverL
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::AddObserverL( MScpSipConnectionObserver& aObserver )
-    {
-    SCPLOGSTRING2( "CScpProfileHandler::AddObserverL: 0x%x", &aObserver );
-
-    TInt result = iObservers.Find( &aObserver );
-
-    if ( result == KErrNotFound )
-        {
-        iObservers.AppendL( &aObserver );
-        }
-    else
-        {
-        User::Leave( KErrAlreadyExists );
-        }
-    }
-    
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::RemoveObserver
-// -----------------------------------------------------------------------------
-//
-TInt CScpProfileHandler::RemoveObserver( MScpSipConnectionObserver& aObserver )
-    {
-    SCPLOGSTRING2( "CScpProfileHandler::RemoveObserver: 0x%x", &aObserver );
-
-    TInt result = iObservers.Find( &aObserver );
-    
-    if ( result != KErrNotFound )
-        {
-        iObservers.Remove( result );
-        return KErrNone;
-        }
-
-    return KErrNotFound;
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::GetCurrentState
-// -----------------------------------------------------------------------------
-//
-TInt CScpProfileHandler::GetCurrentState( TUint32 aProfileId, 
-    CScpSipConnection::TConnectionState& aState,
-    TInt& aError ) const
-    {
-    SCPLOGSTRING( "CScpProfileHandler::GetCurrentState" );
-
-    TInt result( KErrNone );
-
-    // Go through own sip profiles and check state
-    // If not found, create SipConnection and check state
-    CScpSipConnection* sipConnection = GetSipConnection( aProfileId );
-
-    TBool sipConnectionCreated = EFalse;
-
-    if( !sipConnection )
-        {
-        sipConnectionCreated = ETrue;
-        TRAP( result, sipConnection = CreateSipConnectionL( aProfileId ) );
-        }
-
-    if( result == KErrNone && sipConnection )
-        {
-        sipConnection->GetState( aState, aError );
-        }
-
-    if( sipConnectionCreated )
-        {
-        delete sipConnection;
-        }
-       
-    return result;
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::RegisterProfileL
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::RegisterProfileL( TUint32 aProfileId )
-    {
-    SCPLOGSTRING2("CScpProfileHandler::RegisterProfileL profile id: %d", aProfileId );
-
-    // Check if sip connection already exists
-    TBool found( EFalse );
-    CScpSipConnection* sipConnection( NULL );
-    
-    for( TInt i=0; i<iSipConnections.Count(); i++ )
-        {
-        sipConnection = iSipConnections[ i ];
-
-        if( sipConnection->ProfileId() == aProfileId )
-            {
-            found = ETrue;
-            sipConnection->EnableL();
-            break;
-            }    
-        }
-
-    // Otherwise create it
-    if( !found )
-        {
-        sipConnection = CreateSipConnectionL( aProfileId );
-        CleanupStack::PushL( sipConnection );        
-        // try enabling
-        sipConnection->AddObserver( *this );
-        sipConnection->EnableL();
-        // add to array
-        iSipConnections.AppendL( sipConnection );
-        CleanupStack::Pop( sipConnection );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::SipConnectionExists
-// -----------------------------------------------------------------------------
-//
-TBool CScpProfileHandler::SipConnectionExists( TUint32 aProfileId ) const
-    {
-    SCPLOGSTRING2("CScpProfileHandler::SipConnectionExists profile id: %d", aProfileId );
-
-    return ( GetSipConnection( aProfileId ) != NULL );
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::GetSipConnection
-// -----------------------------------------------------------------------------
-//
-CScpSipConnection* CScpProfileHandler::GetSipConnection( TUint32 aProfileId ) const
-    {
-    SCPLOGSTRING2("CScpProfileHandler::GetSipConnection profile id: %d", aProfileId );
-
-    CScpSipConnection* sipConnection( NULL );
-    
-    for( TInt i=0; i<iSipConnections.Count(); i++ )
-        {
-        sipConnection = iSipConnections[ i ];
-
-        if( sipConnection->ProfileId() == aProfileId )
-            {
-            return sipConnection;
-            }    
-        }
-
-    return NULL;
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::CreateSipConnectionL
-// -----------------------------------------------------------------------------
-//
-CScpSipConnection* CScpProfileHandler::CreateSipConnectionL( TUint32 aProfileId ) const
-    {
-    SCPLOGSTRING2("CScpProfileHandler::CreateSipConnectionL profile: %d", aProfileId);
-
-    return CScpSipConnection::NewL( aProfileId,
-                                    *iProfileRegistry,
-                                    *iManagedProfileRegistry,
-                                    *iSip );
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::UnRegisterProfile
-// -----------------------------------------------------------------------------
-//
-TInt CScpProfileHandler::UnregisterProfile( TUint32 aProfileId )
-    {
-    SCPLOGSTRING2("CScpProfileHandler::UnregisterProfile id: %d", aProfileId );
-
-    CScpSipConnection* sipConnection( NULL );    
-
-    for( TInt i=0; i<iSipConnections.Count(); i++ )
-        {
-        sipConnection = iSipConnections[ i ];
-
-        if( sipConnection->ProfileId() == aProfileId )
-            {
-            return sipConnection->Disable();
-            }
-        }
-
-    return KErrNotFound;
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::CancelRegistration
-// -----------------------------------------------------------------------------
-//
-TInt CScpProfileHandler::CancelRegistration( TUint32 aProfileId )
-    {
-    SCPLOGSTRING2("CScpProfileHandler::UnregisterProfile id: %d", aProfileId );
-
-    TInt result = UnregisterProfile( aProfileId );
-
-    if( result == KErrNone ||
-        result == KErrNotFound || 
-        result == KErrArgument )
-        {
-        result = RemoveSipConnection( aProfileId );
-        }
-
-    return result;
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::IncomingRequest
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::IncomingRequest( TUint32 /*aIapId*/,
-                                          CSIPServerTransaction* /*aTransaction*/ )
-    {
-    SCPLOGSTRING( "CScpProfileHandler::IncomingRequest" );
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::TimedOut
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::TimedOut(
-    CSIPServerTransaction& /*aTransaction*/ )
-    {
-    SCPLOGSTRING( "CScpProfileHandler::TimedOut" );
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::RemoveSipConnection
-// -----------------------------------------------------------------------------
-//
-TInt CScpProfileHandler::RemoveSipConnection( TUint32 aProfileId )
-    {
-    SCPLOGSTRING2( "CScpProfileHandler::RemoveSipConnection id: %i", 
-                   aProfileId );
-
-    TInt ret = ( KErrNotFound );
-    CScpSipConnection* sipConnection( NULL );
-    
-    sipConnection = GetSipConnection( aProfileId );
-    
-    if ( sipConnection )
-        {
-        TInt index = iSipConnections.Find( sipConnection );
-        iSipConnections.Remove( index );
-        delete sipConnection;
-        ret = KErrNone;
-        }
-    return ret;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::ProfileRegistryEventOccurred
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::ProfileRegistryEventOccurred(
-    TUint32 aProfileId,
-    MSIPProfileRegistryObserver::TEvent aEvent )
-    {
-    SCPLOGSTRING3( "CScpProfileHandler::ProfileRegistryEventOccurred id: %i event: %d", 
-                   aProfileId, aEvent );
-
-    CScpSipConnection* sipConnection = GetSipConnection( aProfileId );
-    
-    if( sipConnection )
-        {
-        sipConnection->ProfileRegistryEventOccurred( aEvent );
-        
-        // Deal with sip profile removals
-        switch ( aEvent )
-            {
-            case EProfileDeregistered:
-                {
-                // Remove sip connection only if user has requested deregistration
-                CScpSipConnection::TRegistrationRequestState state =
-                    sipConnection->RegistrationRequestState();
-
-                if( state == CScpSipConnection::EDeregistrationRequested )
-                    {
-                    RemoveSipConnection( aProfileId );
-                    }
-                }
-                break;
-
-            case EProfileDestroyed:
-                {
-                RemoveSipConnection( aProfileId );
-                }
-                break;
-               
-            default:
-                break;
-            }
-        }      
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::ProfileRegistryErrorOccurred
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::ProfileRegistryErrorOccurred( TUint32 aProfileId,
-                                                       TInt aError )
-    {
-    SCPLOGSTRING3( "CScpProfileHandler::ProfileRegistryErrorOccurred profile:%i error: %d", 
-                   aProfileId, aError );
-
-    CScpSipConnection* sipConnection = GetSipConnection( aProfileId );
-    
-    if( sipConnection )
-        {
-        sipConnection->ProfileRegistryErrorOccurred( aError );
-        }
-    }
-      
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::ProfileExist
-// -----------------------------------------------------------------------------
-//
-TBool CScpProfileHandler::ProfileExists( TUint32 aProfileId ) const
-    {    
-    SCPLOGSTRING2( "CScpProfileHandler::ProfileExists id: %d", aProfileId );
-
-    CSIPProfile* profile( NULL );
-    TRAPD( result, profile = iProfileRegistry->ProfileL( aProfileId ) );
-
-    if( result == KErrNone && profile )
-        {
-        delete profile;
-        return ETrue;
-        }
-
-    return EFalse;             
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::SetSipProfileReserved
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::SetSipProfileReserved( TUint32 aProfileId, TBool aReserved )
-    {
-    SCPLOGSTRING3( "CScpProfileHandler::SetSipProfileReserved id: %d reserved: %d", 
-                   aProfileId, aReserved );
-
-    CScpSipConnection* sipConnection = GetSipConnection( aProfileId );
-    
-    if( sipConnection )
-        {
-        sipConnection->SetReserved( aReserved );
-
-        // If profile was freed and iap availability alr event had come
-        // before, let ALR controller to know that the profile is up
-        // for ALR
-        if( aReserved == EFalse && 
-            sipConnection->IapAvailableOffered() )
-            {
-            TRAP_IGNORE( iAlrController->RefreshIapAvailabilityL( aProfileId ) );
-    
-            // Reset the iap availability offered flag
-            sipConnection->SetIapAvailableOffered( EFalse );
-            }
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::StartAlrMigration
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::StartAlrMigration( TUint32 aProfileId )
-    {
-    SCPLOGSTRING2( "CScpProfileHandler::StartMigrtion profile: %i", aProfileId );
-    SCPLOGSTRING2( "CScpProfileHandler::StartMigrtion iNewAlrIapId: %i", iNewAlrIapId );
-    
-    TRAP_IGNORE(
-       iAlrController->AllowMigrationL( aProfileId, iNewAlrIapId ) );
-    
-    CScpSipConnection* sipConnection( NULL );
-    sipConnection = GetSipConnection( aProfileId );
-    
-    if ( sipConnection )
-        {
-        sipConnection->SetProfileCurrentlyRoaming();
-        }
-    
-    SCPLOGSTRING( "CScpProfileHandler::StartMigrtion -exit" );
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::AlrEvent
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::AlrEvent( MSipProfileAlrObserver::TEvent aEvent,
-                                   TUint32 aProfileId,
-#ifdef _DEBUG
-                                   TUint32 aSnapId,
-#else
-                                   TUint32 /*aSnapId*/,
-#endif
-                                   TUint32 aIapId )
-    {
-    SCPLOGSTRING2("CScpProfileHandler::AlrEvent profile:%i", aProfileId);
-    SCPLOGSTRING2("CScpProfileHandler::AlrEvent aEvent:%i", (TInt)aEvent);
-    SCPLOGSTRING2("CScpProfileHandler::AlrEvent aSnapId:%i", aSnapId);
-    SCPLOGSTRING2("CScpProfileHandler::AlrEvent aIapId:%i", aIapId);
-
-    CScpSipConnection* sipConnection( NULL );
-    
-    switch( aEvent )
-        {
-        case MSipProfileAlrObserver::EIapAvailable:
-            {
-            TBool reserved( EFalse );
-            sipConnection = GetSipConnection( aProfileId );
-    
-            if( sipConnection )
-                {
-                reserved = sipConnection->Reserved();
-
-                if( reserved )
-                    {
-                    TRAPD( result, 
-                        iAlrController->DisallowMigrationL( aProfileId, aIapId ) );
-
-                    if( result == KErrNone )
-                        {
-                        // Raise the iap availability offered flag
-                        sipConnection->SetIapAvailableOffered( ETrue );
-                        }
-                    }
-                else
-                    {
-                    iAlrAllowedToStartImmediately = ETrue;
-
-                    for ( TInt i = 0; i < iObservers.Count(); i++ )
-                        {
-                        if ( !iObservers[ i ]->IsSipProfileAllowedToStartAlr() )
-                            {
-                            iAlrAllowedToStartImmediately = EFalse;
-                            break;
-                            }
-                        }
-                    if ( iAlrAllowedToStartImmediately )
-                        {
-                        TRAP_IGNORE(
-                            iAlrController->AllowMigrationL( aProfileId, aIapId ) );
-                        sipConnection->SetProfileCurrentlyRoaming();
-                        }
-                    else
-                        {
-                        iNewAlrIapId = aIapId;
-                        sipConnection->HandleMigrationStarted();
-                        }
-                    }
-                }
-            break;
-            }
-
-        // For possible beyond use (E.g. Maybe we should change CHH state
-        // during iap migration -> VoIP call not possible if iap migration
-        // ongoing.)
-        case MSipProfileAlrObserver::EMigrationStarted:
-            {
-            sipConnection = GetSipConnection( aProfileId );
-            
-            if( sipConnection && iAlrAllowedToStartImmediately )
-                {
-                sipConnection->HandleMigrationStarted();
-                }
-            break;
-            }
-        
-        case MSipProfileAlrObserver::EMigrationCompleted:
-        default:
-            {
-            break;
-            }            
-        }
-    }
-    
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::AlrError
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::AlrError( 
-    TInt aError,
-    TUint32 aProfileId,
-    TUint32 aSnapId,
-    TUint32 aIapId )
-    {
-    SCPLOGSTRING("CScpProfileHandler::AlrError");
-    SCPLOGSTRING2("     profile id: %d", aProfileId);
-    SCPLOGSTRING2("     error:      %d", aError);
-    
-    CScpSipConnection* sipConnection = GetSipConnection( aProfileId );
-    if( sipConnection )
-        {
-        sipConnection->HandleMigrationError( 
-            aError, aProfileId, aSnapId, aIapId );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::HandleSipConnectionEvent
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::HandleSipConnectionEvent( TUint32 aProfileId,
-                                                   TScpConnectionEvent aSipEvent )
-    {
-    SCPLOGSTRING3( 
-        "CScpProfileHandler::HandleSipConnectionEvent profile id: %d sip event: %d",
-        aProfileId, aSipEvent );
-
-    // Make a copy of the observers array, since observers
-    // may be removed during the event handling
-    RPointerArray< MScpSipConnectionObserver > observers;
-    
-    for ( TInt i=0; i < iObservers.Count(); i++ )
-        {      
-        observers.Append( iObservers[ i ] );
-        }
-
-    // Send notify to observers
-    for( TInt i=0; i < observers.Count(); i++ )
-        {
-        //check that the observer is still valid before triggering notify
-        if ( KErrNotFound != iObservers.Find( observers[ i ] ) )
-            {
-            observers[ i ]->HandleSipConnectionEvent( aProfileId, aSipEvent );
-            }
-        }
-
-    observers.Close();
-        
-    // if registration failed, time to delete connection
-    if ( aSipEvent == EScpRegistrationFailed )
-        {
-        RemoveSipConnection( aProfileId );        
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::IsSipProfileAllowedToStartAlr
-// -----------------------------------------------------------------------------
-//
-TBool CScpProfileHandler::IsSipProfileAllowedToStartAlr()
-    {
-    return ETrue;
-    }
-    
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::VmbxInterfaceL
-// -----------------------------------------------------------------------------
-//
-CIpVmbxInterface& CScpProfileHandler::VmbxInterfaceL( MIpVmbxObserver& aObserver )
-    {
-    SCPLOGSTRING( "CScpProfileHandler::VmbxInterfaceL" );
-
-    // Todo: save observer and set MIpVmbxObserver to this class
-	// problem when several vmbx services, current observer logic isn't work
-    
-    if( !iVmbxInterface )
-        {
-        iVmbxInterface = CIpVmbxInterface::NewL( aObserver );
-        }
-
-    return *iVmbxInterface;
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::DeleteVmbxInterface
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::DeleteVmbxInterface()
-    {
-    SCPLOGSTRING( "CScpProfileHandler::DeleteVmbxInterface" );
-
-    if( iVmbxInterface )
-        {
-        delete iVmbxInterface;
-        iVmbxInterface = NULL;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::UpdateSipProfile
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::UpdateSipProfileL( 
-    TUint32 aProfileId,
-    TBool aTerminalType,
-    TBool aWlanMac,
-    TInt aStringLength )
-    {
-    SCPLOGSTRING( "CScpProfileHandler::UpdateSipProfileL IN" );
-    SCPLOGSTRING2( " profile id:    %d", aProfileId );
-    SCPLOGSTRING2( " terminal type: %d", aTerminalType );
-    SCPLOGSTRING2( " wlan mac:      %d", aWlanMac );
-    SCPLOGSTRING2( " string length: %d", aStringLength );
-    
-    // Do not update, if terminal type is not defined in user agent header
-    if ( !aTerminalType )
-        {
-        return;
-        }
-    
-    const MDesC8Array* array;
-    CSIPProfile* sipProfile = iProfileRegistry->ProfileL( aProfileId );
-    CleanupStack::PushL( sipProfile );
-    User::LeaveIfError( sipProfile->GetParameter( KSIPHeaders, array ) );
-
-    TBuf<KSCPMaxTerminalTypeLength> terminalType( KNullDesC );
-    TBuf<KTempStringlength> tempHeader( KNullDesC );
-    
-    // 1. Get the terminal type and seek is user agent header's 
-    // terminal type same, if so no need to continue
-    CIpAppPhoneUtils* libIpAppPhoneUtils = CIpAppPhoneUtils::NewLC();
-    libIpAppPhoneUtils->GetTerminalTypeL( terminalType );   
-    CleanupStack::PopAndDestroy( libIpAppPhoneUtils );
-    
-    for( TInt t( 0 ); t < array->MdcaCount(); t++ )
-        {
-        tempHeader.Copy( array->MdcaPoint( t ) );
-        if( tempHeader.Find( terminalType ) != KErrNotFound )
-            {
-            SCPLOGSTRING(" terminal type found");
-            CleanupStack::PopAndDestroy( sipProfile );
-            return;
-            }
-        }
-    
-    // 2. If appropriate terminal type not found, we need to update it
-    if ( array->MdcaCount() )
-        {
-        TBuf8<KTempStringlength> userAgentHeader;
-        CDesC8ArrayFlat* uahArray = new ( ELeave ) CDesC8ArrayFlat( 1 );
-        CleanupStack::PushL( uahArray );
-        //Find the User-Agent string
-        for( TInt t( 0 ); t < array->MdcaCount(); t++ )
-            {
-            tempHeader.Copy( array->MdcaPoint( t ) );
-            // user-Agent found, now change it
-            if( tempHeader.Find( KScpUserAgentString ) != KErrNotFound )
-                {
-                // 3. now we have the right user agent header which is not correct
-                // replace the old terminal type 
-                TInt len( KErrNone );
-                // Get mac if defined
-                if ( aWlanMac )
-                    {
-                    TBuf8<KSCPWlanMacAddressLength> wlanMacAddress( KNullDesC8 );
-                    TBuf<KSCPWlanMacAddressLength>  tempAddr( KNullDesC );
-                    CIPAppUtilsAddressResolver* addressResolver = 
-                        CIPAppUtilsAddressResolver::NewLC();    
-                    User::LeaveIfError( addressResolver->GetWlanMACAddress( 
-                        wlanMacAddress, KSCPWlanMacAddressFrmt ) );
-                    CleanupStack::PopAndDestroy( addressResolver );
-                    tempAddr.Copy( wlanMacAddress );
-                    
-                    // leave the space before MAC ADDR (-1)
-                    len = tempHeader.Find( tempAddr ) - KSCPUserAgentStringLength - 1;
-                    }
-                else
-                    {
-                    // leave the space before free string (-1)
-                    len = tempHeader.Length() - KSCPUserAgentStringLength - aStringLength - 1;
-                    }
-                // make sure that the len is correct value(not below zero)
-                if ( 0 >= len )
-                    {
-                    User::Leave( KErrGeneral );
-                    }
-                tempHeader.Replace( KSCPUserAgentStringLength, len, terminalType );
-                SCPLOGSTRING2(" header:        %S", &tempHeader);
-                userAgentHeader.Append( tempHeader );
-                uahArray->AppendL( userAgentHeader );
-                }
-            else
-                {
-                //if this entry is not user agent, leave it untouched
-                uahArray->AppendL( array->MdcaPoint( t ) );    
-                }
-            }
-
-        CSIPManagedProfile* managedProfile = static_cast<CSIPManagedProfile*>( 
-            iProfileRegistry->ProfileL( aProfileId ) );
-        CleanupStack::PushL( managedProfile );
-        //Update the new user-agent to sipprofile
-        User::LeaveIfError( 
-            managedProfile->SetParameter( KSIPHeaders, *uahArray ) );
-        iManagedProfileRegistry->SaveL( *managedProfile );
-        CleanupStack::PopAndDestroy( managedProfile );
-        CleanupStack::PopAndDestroy( uahArray );
-        }        
-    CleanupStack::PopAndDestroy( sipProfile );    
-    SCPLOGSTRING( "CScpProfileHandler::UpdateSipProfileL OUT" );
-    }
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::SetUsernameAndPasswordL
-// -----------------------------------------------------------------------------
-//
-void CScpProfileHandler::SetUsernameAndPasswordL( TUint32 aProfileId,
-                                                  const TDesC8& aUsername,
-                                                  TBool aSetUsername,
-                                                  const TDesC8& aPassword,
-                                                  TBool aSetPassword )
-    {
-    SCPLOGSTRING( "CScpProfileHandler::SetUsernameAndPasswordL" );
-
-    CSIPManagedProfile* profile = static_cast<CSIPManagedProfile*>
-                         (iProfileRegistry->ProfileL( aProfileId ));
-    CleanupStack::PushL( profile );
-
-    SCPLOGSTRING( "CScpProfileHandler::SetUsernameAndPasswordL sip profile availble" );
-    
-    if( aSetUsername )
-        {
-        RBuf8 formattedUsername;
-        CleanupClosePushL( formattedUsername );
-        
-        if( !TScpUtility::CheckSipUsername( aUsername ) )
-            {
-            // Since username is returned with prefix and domain, it needs
-            // to be possible to also set it with prefix and domain. 
-            // Strip prefix and domain from user aor if found.
-            // Prefix might be sip or sips so search by colon.
-            // If username is empty, leave with KErrArgument
-            if ( aUsername == KNullDesC8 )
-                {
-                User::Leave( KErrArgument );
-                }
-            else
-                {
-                User::LeaveIfError( TScpUtility::RemovePrefixAndDomain( 
-                    aUsername, formattedUsername ) );
-                }
-            }
-        else
-            {
-            formattedUsername.CreateL( aUsername.Length() );
-            formattedUsername.Copy( aUsername );
-            }
-        
-        TBool validAorExists( EFalse );       
-        const TDesC8* aorPtr( NULL );
-        
-        TInt err = profile->GetParameter( KSIPUserAor, aorPtr );
-        
-        TInt loc( KErrNotFound );
-        if ( !err && aorPtr->Length() )
-            {
-            loc = aorPtr->Find( KAt() );
-            
-            if ( KErrNotFound != loc )
-                {         
-                TPtrC8 ptr = aorPtr->Right( 1 );
-                
-                if ( ptr.Compare( KAt ) != 0 )
-                    {                    
-                    // @ is found and there is something in domain part
-                    validAorExists = ETrue;
-                    }              
-                }
-            }
-       
-       HBufC8* newAor = NULL;
-       TBuf8<KSipSchemeMaxLength> prefix;
-       TScpUtility::GetValidPrefix( aUsername, prefix );
-       
-       if ( validAorExists )
-           {           
-           SCPLOGSTRING( "CScpProfileHandler::SetUsernameAndPasswordL valid aor" );
-           TPtrC8 domainPart = aorPtr->Mid( loc );
-           
-           newAor = HBufC8::NewLC( prefix.Length() + 
-                                   domainPart.Length() + 
-                                   formattedUsername.Length() );
-           newAor->Des().Append( prefix );
-           newAor->Des().Append( formattedUsername );
-           newAor->Des().Append( domainPart );
-           }
-       else
-           {         
-           SCPLOGSTRING( "CScpProfileHandler::SetUsernameAndPasswordL no valid aor" );
-           // Check if given username contains valid aor
-           TInt loc = aUsername.Find( KAt() );
-           
-           if ( KErrNotFound != loc )
-               {               
-               TPtrC8 ptrRight = aorPtr->Right( 1 );
-               TPtrC8 ptrLeft = aorPtr->Left( 1 );
-               
-               if ( ( ptrRight.Compare( KAt ) != 0 ) && 
-                   ( ptrLeft.Compare( KAt ) != 0 ) )
-                   {                   
-                   // both sides of @ have data --> aor is valid
-                   newAor = HBufC8::NewLC( aUsername.Length() );
-                   newAor->Des().Copy( aUsername );
-                   }
-               else
-                   {
-                   User::Leave( KErrArgument );
-                   }
-               }
-           else
-               {               
-               User::Leave( KErrArgument );
-               }    
-           }
-
-        SCPLOGSTRING( "CScpProfileHandler::SetUsernameAndPasswordL set new aor value" );
-        
-        User::LeaveIfError( profile->SetParameter( KSIPUserAor, newAor->Des() ) );
-        CleanupStack::PopAndDestroy( newAor );
-        
-        // Add digest username & password
-        SCPLOGSTRING( "CScpProfileHandler:SetUsernameAndPasswordL outbound & digest username" );
-        User::LeaveIfError( profile->SetParameter( KSIPOutboundProxy,
-                                                   KSIPDigestUserName,
-                                                   formattedUsername ) );
-
-
-        SCPLOGSTRING( "CScpProfileHandler:SetUsernameAndPasswordL registrar & digest username" );
-        User::LeaveIfError( profile->SetParameter( KSIPRegistrar,
-                                                   KSIPDigestUserName,
-                                                   formattedUsername ) );
-        CleanupStack::PopAndDestroy( &formattedUsername );                                                   
-        }
-
-    if( aSetPassword )
-        {
-        if( !TScpUtility::CheckSipPassword( aPassword ) )
-            {
-            User::Leave( KErrArgument );
-            }
-        SCPLOGSTRING( "CScpProfileHandler:SetUsernameAndPasswordL outbound & digest pwd" );
-        User::LeaveIfError( profile->SetParameter( KSIPOutboundProxy,
-                                                   KSIPDigestPassword,
-                                                   aPassword ) );    
-        SCPLOGSTRING( "CScpProfileHandler:SetUsernameAndPasswordL registrar & digest pwd" );
-        User::LeaveIfError( profile->SetParameter( KSIPRegistrar,
-                                                   KSIPDigestPassword,
-                                                   aPassword ) );
-        }
-    
-    SCPLOGSTRING( "CScpProfileHandler:SetUsernameAndPasswordL save sip changes" );
-
-    // Save changes
-    TRAPD( err, iManagedProfileRegistry->SaveL( *profile ) );
-
-    CleanupStack::PopAndDestroy( profile );    
-    
-    SCPLOGSTRING2( "CScpProfileHandler:SetUsernameAndPasswordL save sip err: %d", err );
-    User::LeaveIfError( err );
-    }
-
-
-
-// -----------------------------------------------------------------------------
-// CScpProfileHandler::GetDebugInfo
-// -----------------------------------------------------------------------------
-//
-#ifdef _DEBUG
-void CScpProfileHandler::GetDebugInfo( TDes& aInfo ) const
-    {
-    TInt connections = iSipConnections.Count();
-    TInt registeredConnections( 0 );
-    TInt registeringConnections( 0 );
-    TInt unregisteringConnections( 0 );
-    TInt unregisteredConnections( 0 );
-    
-    for( TInt i=0; i<iSipConnections.Count(); i++ )
-        {
-        CScpSipConnection* sipConnection = iSipConnections[ i ];
-        CScpSipConnection::TConnectionState state;
-        TInt error;
-
-        sipConnection->GetState( state, error );
-
-        switch( state )
-            {
-            case CScpSipConnection::ERegistered:
-                registeredConnections++;
-                break;
-
-            case CScpSipConnection::ERegistering:
-                registeringConnections++;
-                break;
-
-            case CScpSipConnection::EDeregistering:
-                unregisteringConnections++;
-                break;
-
-            case CScpSipConnection::EDeregistered:
-                unregisteredConnections++;
-                break;
-
-            default:
-                break;
-            }
-        }
-
-    TBuf< 255 > buffer;
-    buffer.Format( _L( "Connections: %d\n Registered: %d\n Registering: %d\n Unregistering: %d\n Unregistered: %d\n" ),
-                        connections, registeredConnections, registeringConnections,
-                        unregisteringConnections, unregisteredConnections );
-
-    aInfo.Append( buffer );
-    }
-#endif
-            
-// ========================== OTHER EXPORTED FUNCTIONS =========================
-
-//  End of File