voipplugins/voipadapters/voipxmlprovisioning/voipxmlprocessor/src/voipxmlvoiphandler.cpp
changeset 2 7b872347d83b
child 8 7117cbf1600a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/voipadapters/voipxmlprovisioning/voipxmlprocessor/src/voipxmlvoiphandler.cpp	Tue Feb 02 00:05:57 2010 +0200
@@ -0,0 +1,1289 @@
+/*
+* Copyright (c) 2009-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:  VoIP settings handler
+*
+*/
+
+
+#include <crcseaudiocodecregistry.h>
+#include <crcseprofileregistry.h>
+#include <spsettings.h>
+#include <spproperty.h>
+#include <spdefinitions.h>
+#include <sipmanagedprofile.h>
+#include <sipmanagedprofileregistry.h>
+#include <cipappphoneutils.h> // SIP User-Agent header info.
+#include <cipapputilsaddressresolver.h> // SIP User-Agent header info.
+#include <pathinfo.h> // For getting phone rom root path.
+#include <cvimpstsettingsstore.h> // For IM tone path
+
+#include "voipxmlvoiphandler.h"
+#include "voipxmlprocessorlogger.h"
+#include "voipxmlprocessordefaults.h"
+#include "voipxmlutils.h"
+
+const TInt32 KCCHPresenceSubServicePlugId = 0x1027545A;
+// IM related constants.
+const TUint32 KIMSubServicePluginId = 0x1027545A;
+const TUint32 KIMLaunchUid          = 0x200255D0;
+const TInt    KIMSettingsId         = 1;
+// Default IM message tone
+_LIT( KDefaultTone,       "Message 2.aac" );
+// Brand related constants.
+const TInt KBrandVersion = 1;
+
+// ---------------------------------------------------------------------------
+// Default constructor.
+// ---------------------------------------------------------------------------
+//
+CVoipXmlVoipHandler::CVoipXmlVoipHandler()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::ConstructL()
+    {
+    DBG_PRINT( "CVoipXmlVoipHandler::ConstructL begin" );
+    iRegistry      = CRCSEProfileRegistry::NewL();
+    iCodecRegistry = CRCSEAudioCodecRegistry::NewL();
+    iEntry         = CRCSEProfileEntry::NewL();
+    ResetTempCodec();
+    ResetTempSpSettings();
+    iSettingsSet = EFalse;
+    DBG_PRINT( "CVoipXmlVoipHandler::ConstructL end" );
+    }
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CVoipXmlVoipHandler* CVoipXmlVoipHandler::NewL()
+    {
+    DBG_PRINT( "CVoipXmlVoipHandler::NewL begin" );
+    CVoipXmlVoipHandler* self = new ( ELeave ) CVoipXmlVoipHandler;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    DBG_PRINT( "CVoipXmlVoipHandler::NewL end" );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CVoipXmlVoipHandler::~CVoipXmlVoipHandler()
+    {
+    DBG_PRINT( "CVoipXmlVoipHandler::~CVoipXmlVoipHandler begin" );
+    delete iRegistry;
+    delete iCodecRegistry;
+    delete iEntry;
+    ResetTempCodec( ETrue );
+    ResetTempSpSettings();
+    DBG_PRINT( "CVoipXmlVoipHandler::~CVoipXmlVoipHandler end" );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets VoIP setting.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::SetSetting( TInt aType, TInt aParam, 
+    const TDesC& aValue )
+    {
+    // Ignore too long descriptors.
+    if ( KMaxNodeValueLength < aValue.Length() )
+        {
+        return;
+        }
+
+    switch ( aType )
+        {
+        case EVoip:
+            TRAP_IGNORE( SetCoreSettingL( aParam, aValue ) );
+            break;
+        case ECodec:
+            TRAP_IGNORE( SetCodecSettingL( aParam, aValue ) );
+            break;
+        case EVmbx:
+            TRAP_IGNORE( SetVmbxSettingL( aParam, aValue ) );
+            break;
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Stores settings to RCSE.
+// ---------------------------------------------------------------------------
+//
+TInt CVoipXmlVoipHandler::StoreSettings()
+    {
+    TInt err( KErrNone );
+    TBool ok( ETrue );
+
+    if ( !iSettingsSet )
+        {
+        // No settings to be stored => method not supported.
+        err = KErrNotSupported;
+        ok = EFalse;
+        }
+    else
+        {
+        TUint32 profileId( KErrNone );
+        // Add default codec set if no codecs defined.
+        if ( 0 == iEntry->iPreferredCodecs.Count() )
+            {
+            TRAP_IGNORE( AddDefaultCodecsL() );
+            }
+        TRAP( err, profileId = iRegistry->AddL( *iEntry ) );
+        if ( KErrNone == err )
+            {
+            // Adding profile entry to registry OK. Let's load the profile
+            // from registry so that we'll get all the values registry has
+            // added to the entry (AddL takes entry as const reference).
+            TRAP_IGNORE( iRegistry->FindL( profileId, *iEntry ) );
+            }
+        else
+            {
+            err = KErrCompletion;
+            ok = EFalse;
+            }
+        }
+    if ( !ok )
+        {
+        const TInt count = iEntry->iPreferredCodecs.Count();
+        for ( TInt counter = 0; counter < count; counter++ )
+            {
+            TRAP_IGNORE( iCodecRegistry->DeleteL( 
+                iEntry->iPreferredCodecs[counter] ) );
+            }
+        }
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// Returns the service ID.
+// ---------------------------------------------------------------------------
+//
+TUint32 CVoipXmlVoipHandler::SettingsId()
+    {
+    return iServiceId;
+    }
+
+// ---------------------------------------------------------------------------
+// Sets a codec to RCSE and resets the temp codec.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::SettingsEnd( TInt aType )
+    {
+    if ( ECodec == aType )
+        {
+        TRAP_IGNORE( SetCodecToRcseL() );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Saves linkage information.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::LinkSettings( TInt aType, TUint32 aSettingsId )
+    {
+    switch ( aType )
+        {
+        case ESip:
+            {
+            TRAP_IGNORE( SetSipInfoL( aSettingsId ) );
+            break;
+            }
+        case EPresence:
+            {
+            iPresenceId = aSettingsId;
+            break;
+            }
+        case EDestination:
+            {
+            iDestinationId = aSettingsId;
+            break;
+            }
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Finalizes settings saving.
+// ---------------------------------------------------------------------------
+//
+TInt CVoipXmlVoipHandler::FinalizeSettings()
+    {
+    TInt err( KErrNone );
+    TRAP( err, SetSpSettingsL() );
+    if ( KErrNone != err )
+        {
+        // ParamHandler is only intrested in KErrNone and KErrCompletion.
+        err = KErrCompletion;
+        }
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// Returns the service tab ID of this VoIP service.
+// ---------------------------------------------------------------------------
+//
+TUint32 CVoipXmlVoipHandler::ServiceTabIdL()
+    {
+    DBG_PRINT( "CVoipXmlVoipHandler::ServiceTabIdL begin" );
+    TInt tabId( KErrNone );
+    CSPSettings* spSettings = CSPSettings::NewLC(); // CS:1
+    CSPProperty* property = CSPProperty::NewLC(); // CS:2
+    TInt err = spSettings->FindPropertyL( 
+        iServiceId, EPropertyContactViewId, *property );
+    User::LeaveIfError( property->GetValue( tabId ) );
+    CleanupStack::PopAndDestroy( 2, spSettings ); // CS:0
+    DBG_PRINT2( "CVoipXmlVoipHandler::ServiceTabIdL end (return %d)", tabId );
+    return (TUint32)tabId;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MSIPProfileRegistryObserver.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::ProfileRegistryEventOccurred( 
+    TUint32 /*aSIPProfileId*/, TEvent /*aEvent*/ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// From class MSIPProfileRegistryObserver. 
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::ProfileRegistryErrorOccurred( 
+    TUint32 /*aSIPProfileId*/, TInt /*aError*/ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Sets VoIP core setting to temporary storage.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::SetCoreSettingL( TInt aParam, const TDesC& aValue )
+    {
+    TInt intValue( KErrNotFound );
+    switch ( aParam )
+        {
+        case EName:
+            {
+            TBuf<KMaxSettingsNameLength> name( KNullDesC );
+            name.Copy( aValue );
+            TRAP_IGNORE( ValidateProfileNameL( name ) );
+            iEntry->iProviderName.Copy( name );
+            iEntry->iSettingsName.Copy( name );
+            iSettingsSet = ETrue;
+            break;
+            }
+        case EStartPort:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iStartMediaPort = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EEndPort:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iEndMediaPort = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EMediaQos:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iMediaQOS = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EDtmfInband:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                TEntryOnOff value;
+                if ( !intValue )
+                    {
+                    value = CRCSEProfileEntry::EOff;
+                    }
+                else if ( KNotSet == intValue )
+                    {
+                    value = CRCSEProfileEntry::EOONotSet;
+                    }
+                else
+                    {
+                    value = CRCSEProfileEntry::EOn;
+                    }
+                iEntry->iInbandDTMF = value;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EDtmfOutband:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                TEntryOnOff value;
+                if ( !intValue )
+                    {
+                    value = CRCSEProfileEntry::EOff;
+                    }
+                else if ( KErrNotFound == intValue )
+                    {
+                    value = CRCSEProfileEntry::EOONotSet;
+                    }
+                else
+                    {
+                    value = CRCSEProfileEntry::EOn;
+                    }
+                iEntry->iOutbandDTMF = value;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case ESecureCallPreference:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iSecureCallPreference = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EAllowVoipOverWcdma:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                TEntryOnOff value;
+                if ( !intValue )
+                    {
+                    value = CRCSEProfileEntry::EOff;
+                    }
+                else if ( KErrNotFound == intValue )
+                    {
+                    value = CRCSEProfileEntry::EOONotSet;
+                    }
+                else
+                    {
+                    value = CRCSEProfileEntry::EOn;
+                    }
+                iEntry->iAllowVoIPoverWCDMA = value;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case ERtcp:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iRTCP = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EUserAgentHeaderTerminalType:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iSIPVoIPUAHTerminalType = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EUserAgentHeaderWlanMac:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iSIPVoIPUAHeaderWLANMAC = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EUserAgentHeaderFreeString:
+            {
+            if ( KMaxSettingsLength32 >= aValue.Length() )
+                {
+                iEntry->iSIPVoIPUAHeaderString.Copy( aValue );
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case ECallerIdDigits:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iMeanCountOfVoIPDigits = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EIgnoreDomainPart:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iIgnoreAddrDomainPart = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EAutoAcceptBuddyRequests:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iSpSettings.iAutoAcceptBuddies = (TBool)intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EAddUserPhone:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                TEntryOnOff value;
+                if ( !intValue )
+                    {
+                    value = CRCSEProfileEntry::EOff;
+                    }
+                else if ( KErrNotFound == intValue )
+                    {
+                    value = CRCSEProfileEntry::EOONotSet;
+                    }
+                else
+                    {
+                    value = CRCSEProfileEntry::EOn;
+                    }
+                iEntry->iUserPhoneUriParameter = value;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EProviderUrl:
+            {
+            if ( !iSpSettings.iProviderUrl )
+                {
+                iSpSettings.iProviderUrl = aValue.AllocL();
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EMinSessionInterval:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iSIPMinSE = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case ESessionInterval:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iEntry->iSIPSessionExpires = intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EBrandingUri:
+            {
+            if ( !iSpSettings.iBrandingUri )
+                {
+                iSpSettings.iBrandingUri = aValue.AllocL();
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EAutoEnable:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iSpSettings.iAutoEnable = (TBool)intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EEnableSipIm:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iSpSettings.iEnableSipIm = (TBool)intValue;
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        case EBrandId:
+            {
+            if ( !iSpSettings.iBrandId )
+                {
+                iSpSettings.iBrandId = aValue.AllocL();
+                iSettingsSet = ETrue;
+                }
+            break;
+            }
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Sets codec setting to temporary storage.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::SetCodecSettingL( TInt aParam, const TDesC& aValue )
+    {
+    TInt intValue;
+    switch ( aParam )
+        {
+        // Codec parameters
+        case EName:
+            {
+            if ( iCurrentCodec.iName )
+                {
+                break;
+                }
+            TBuf<KMaxNodeValueLength> value;
+            value.Copy( aValue );
+            value.UpperCase();
+            if ( 0 == value.Compare( KILbc ) )
+                {
+                value.Copy( KAudioCodeciLBC );
+                }
+            iCurrentCodec.iName = value.AllocL();
+            break;
+            }
+        case EJitterBuffer:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iCurrentCodec.iJitterBuffer = intValue;
+                }
+            break;
+            }
+        case EOctetAlign:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                if ( !intValue )
+                    {
+                    iCurrentCodec.iOctetAlign = CRCSEAudioCodecEntry::EOff;
+                    }
+                else if ( KErrNotFound == intValue )
+                    {
+                    iCurrentCodec.iOctetAlign = 
+                        CRCSEAudioCodecEntry::EOONotSet;
+                    }
+                else
+                    {
+                    iCurrentCodec.iOctetAlign = CRCSEAudioCodecEntry::EOn;
+                    }
+                }
+            break;
+            }
+        case EPTime:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iCurrentCodec.iPtime = intValue;
+                }
+            break;
+            }
+        case EMaxPTime:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iCurrentCodec.iMaxPtime = intValue;
+                }
+            break;
+            }
+        case EModeSet:
+            {
+            TBuf<KMaxNodeNameLength> string;
+            string.Copy( aValue );
+            while ( string.Length() )
+                {
+                TInt offset = string.Locate( KComma );
+                TBuf<KMaxNodeNameLength> helpString( KNullDesC );
+                if ( KErrNotFound == offset )
+                    {
+                    if ( KErrNone == VoipXmlUtils::DesToInt( 
+                        string, intValue ) )
+                        {
+                        iCurrentCodec.iModeSet.AppendL( intValue );
+                        }
+                    string.Zero();
+                    }
+                else if ( !offset )
+                    {
+                    string.Delete( 0, 1 );
+                    }
+                else
+                    {
+                    helpString.Copy( string.Left( offset ) );
+                    if ( KErrNone == VoipXmlUtils::DesToInt( helpString,
+                        intValue ) )
+                        {
+                        iCurrentCodec.iModeSet.AppendL( intValue );
+                        }
+                    offset++;
+                    string.Delete( 0, offset );
+                    }
+                }
+            break;
+            }
+        case EModeChangePeriod:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iCurrentCodec.iModeChangePeriod = intValue;
+                }
+            break;
+            }
+        case EModeChangeNeighbor:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                if ( !intValue )
+                    {
+                    iCurrentCodec.iModeChangeNeighbor = 
+                        CRCSEAudioCodecEntry::EOff;
+                    }
+                else if ( KErrNotFound == intValue )
+                    {
+                    iCurrentCodec.iModeChangeNeighbor = 
+                        CRCSEAudioCodecEntry::EOONotSet;
+                    }
+                else
+                    {
+                    iCurrentCodec.iModeChangeNeighbor = 
+                        CRCSEAudioCodecEntry::EOn;
+                    }
+                }
+            break;
+            }
+        case EMaxRed:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iCurrentCodec.iMaxRed = intValue;
+                }
+            break;
+            }
+        case EVad:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                if ( !intValue )
+                    {
+                    iCurrentCodec.iVad = CRCSEAudioCodecEntry::EOff;
+                    }
+                else if ( KErrNotFound == intValue )
+                    {
+                    iCurrentCodec.iVad = CRCSEAudioCodecEntry::EOONotSet;
+                    }
+                else
+                    {
+                    iCurrentCodec.iVad = CRCSEAudioCodecEntry::EOn;
+                    }
+                }
+            break;
+            }
+        case EAnnexb:
+            {
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                if ( !intValue )
+                    {
+                    iCurrentCodec.iAnnexb = CRCSEAudioCodecEntry::EOff;
+                    }
+                else if ( KErrNotFound == intValue )
+                    {
+                    iCurrentCodec.iAnnexb = CRCSEAudioCodecEntry::EOONotSet;
+                    }
+                else
+                    {
+                    iCurrentCodec.iAnnexb = CRCSEAudioCodecEntry::EOn;
+                    }
+                }
+            break;
+            }
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Sets voice mailbox setting to temporary storage.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::SetVmbxSettingL( TInt aParam, const TDesC& aValue )
+    {
+    switch ( aParam )
+        {
+        case EMwiUri:
+            {
+            if ( !iSpSettings.iMwiUri )
+                {
+                iSpSettings.iMwiUri = aValue.AllocL();
+                }
+            break;
+            }
+        case EListeningUri:
+            {
+            if ( !iSpSettings.iListeningUri )
+                {
+                iSpSettings.iListeningUri = aValue.AllocL();
+                }
+            break;
+            }
+        case EReSubscribeInterval:
+            {
+            TInt intValue;
+            if ( KErrNone == VoipXmlUtils::DesToInt( aValue, intValue ) )
+                {
+                iSpSettings.iResubrcribe = intValue;
+                }
+            break;
+            }
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Checks if name is unique and modifies if needed.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::ValidateProfileNameL( TDes& aName )
+    {
+    const TInt maxModifyLength = 
+        KMaxSettingsNameLength - KMaxProfileNameAppendLength;
+
+    RArray<TUint32> voipIds;
+    CleanupClosePushL( voipIds ); // CS:1
+    iRegistry->GetAllIdsL( voipIds );
+
+    const TInt count( voipIds.Count() );
+
+    HBufC* newName = HBufC::NewLC( KMaxSettingsNameLength ); // CS:2
+    newName->Des().Copy( aName.Left( maxModifyLength ) );
+
+    TUint i( 1 ); // Add number to the name if name already in use.
+    TBool changed( EFalse );
+
+    // Go through each profile and see if the name of the new profile    
+    // matches one of the existing names. If it does change it and
+    // check the new name again.
+    for ( TInt index = 0; index < count; index++ )
+        {
+        CRCSEProfileEntry* profile = CRCSEProfileEntry::NewLC(); // CS:3
+        TBuf<KMaxSettingsNameLength> loadedName;
+        iRegistry->FindL( voipIds[index], *profile );
+        loadedName.Copy( profile->iSettingsName );
+        if ( 0 == newName->Des().Compare( loadedName ) )
+            {
+            // If the name is changed we need to begin the comparison
+            // again from the first profile.
+            newName->Des().Copy( aName.Left( maxModifyLength ) );
+            newName->Des().Append( KOpenParenthesis() );
+            newName->Des().AppendNum( i );
+            newName->Des().Append( KClosedParenthesis() );  
+            index = 0;
+            i++;
+            if ( KMaxProfileNames < i )
+                {
+                User::Leave( KErrBadName );
+                }
+            changed = ETrue;
+            }
+        CleanupStack::PopAndDestroy( profile ); // CS:2
+        }
+
+    // Change setting only if it was changed.
+    if ( changed )
+        {
+        aName.Copy( newName->Des() );
+        }
+
+    // newName, &voipIds
+    CleanupStack::PopAndDestroy( 2, &voipIds ); // CS:0
+    }
+
+// ---------------------------------------------------------------------------
+// Sets temporary codec to RCSE.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::SetCodecToRcseL()
+    {
+    // Nameless codecs are not supported.
+    if ( !iCurrentCodec.iName )
+        {
+        ResetTempCodec();
+        return;
+        }
+
+    CRCSEAudioCodecEntry* entry = CRCSEAudioCodecEntry::NewLC();
+    // First set default values...
+    entry->SetDefaultCodecValueSet( iCurrentCodec.iName->Des() );
+    // ...and then replace them with the ones defined in settings XML.
+    if ( KErrNotFound != iCurrentCodec.iJitterBuffer )
+        {
+        entry->iJitterBufferSize = iCurrentCodec.iJitterBuffer;
+        }
+    if ( KErrNotFound != iCurrentCodec.iPtime )
+        {
+        entry->iPtime = iCurrentCodec.iPtime;
+        }
+    if ( KErrNotFound != iCurrentCodec.iMaxPtime )
+        {
+        entry->iMaxptime = iCurrentCodec.iMaxPtime;
+        }
+    if ( CRCSEAudioCodecEntry::EOONotSet != iCurrentCodec.iOctetAlign )
+        {
+        entry->iOctetAlign = iCurrentCodec.iOctetAlign;
+        }
+    if ( CRCSEAudioCodecEntry::EOONotSet != 
+        iCurrentCodec.iModeChangeNeighbor )
+        {
+        entry->iModeChangeNeighbor = iCurrentCodec.iModeChangeNeighbor;
+        }
+    if ( KErrNotFound != iCurrentCodec.iModeChangePeriod )
+        {
+        entry->iModeChangePeriod = iCurrentCodec.iModeChangePeriod;
+        }
+    if ( KErrNotFound != iCurrentCodec.iMaxRed )
+        {
+        entry->iMaxRed = iCurrentCodec.iMaxRed;
+        }
+    if ( CRCSEAudioCodecEntry::EOONotSet != iCurrentCodec.iVad )
+        {
+        entry->iVAD = iCurrentCodec.iVad;
+        }
+    if ( CRCSEAudioCodecEntry::EOONotSet != iCurrentCodec.iAnnexb )
+        {
+        entry->iAnnexb = iCurrentCodec.iAnnexb;
+        }
+    if ( iCurrentCodec.iModeSet.Count() )
+        {
+        entry->iModeSet.Reset();
+        const TInt count = iCurrentCodec.iModeSet.Count();
+        for ( TInt counter = 0; counter < count; counter++ )
+            {
+            entry->iModeSet.AppendL( iCurrentCodec.iModeSet[counter] );
+            }
+        }
+
+    TUint32 codecId = iCodecRegistry->AddL( *entry );
+    CleanupStack::PopAndDestroy( entry );
+    iEntry->iPreferredCodecs.AppendL( codecId );
+    ResetTempCodec();
+    }
+
+// ---------------------------------------------------------------------------
+// Resets temporary codec settings.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::ResetTempCodec( TBool aCloseArray )
+    {
+    if ( iCurrentCodec.iName )
+        {
+        delete iCurrentCodec.iName;
+        iCurrentCodec.iName = NULL;
+        }
+    iCurrentCodec.iJitterBuffer       = KErrNotFound;
+    iCurrentCodec.iOctetAlign         = CRCSEAudioCodecEntry::EOONotSet;
+    iCurrentCodec.iPtime              = KErrNotFound;
+    iCurrentCodec.iMaxPtime           = KErrNotFound;
+    iCurrentCodec.iModeChangePeriod   = KErrNotFound;
+    iCurrentCodec.iModeChangeNeighbor = CRCSEAudioCodecEntry::EOONotSet;
+    iCurrentCodec.iMaxRed             = KErrNotFound;
+    iCurrentCodec.iVad                = CRCSEAudioCodecEntry::EOONotSet;
+    iCurrentCodec.iAnnexb             = CRCSEAudioCodecEntry::EOONotSet;
+    iCurrentCodec.iModeSet.Reset();
+    if ( aCloseArray )
+        {
+        iCurrentCodec.iModeSet.Close();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Resets temporary service provider settings.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::ResetTempSpSettings()
+    {
+    iSpSettings.iAutoAcceptBuddies = EFalse;
+    iSpSettings.iAutoEnable        = EFalse;
+    iSpSettings.iResubrcribe = KErrNotFound;
+    if ( iSpSettings.iBrandingUri )
+        {
+        delete iSpSettings.iBrandingUri;
+        iSpSettings.iBrandingUri = NULL;
+        }
+    if ( iSpSettings.iListeningUri )
+        {
+        delete iSpSettings.iListeningUri;
+        iSpSettings.iListeningUri = NULL;
+        }
+    if ( iSpSettings.iMwiUri )
+        {
+        delete iSpSettings.iMwiUri;
+        iSpSettings.iMwiUri = NULL;
+        }
+    if ( iSpSettings.iProviderUrl )
+        {
+        delete iSpSettings.iProviderUrl;
+        iSpSettings.iProviderUrl = NULL;
+        }
+    if ( iSpSettings.iBrandId )
+        {
+        delete iSpSettings.iBrandId;
+        iSpSettings.iBrandId = NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Sets SIP related VoIP settings.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::SetSipInfoL( TUint32 aSipId )
+    {
+    // First set SIP information to RCSE so that
+    // an entry in service table will be created.
+    TSettingIds settingIds;
+    settingIds.iProfileType = CRCSEProfileEntry::EProtocolSIP; // SIP.
+    settingIds.iProfileId = aSipId;
+    // Never reference to profile specific settings.
+    settingIds.iProfileSpecificSettingId = KNotSet;
+    iEntry->iIds.AppendL( settingIds );
+    iRegistry->UpdateL( iEntry->iId, *iEntry );
+
+    // After update, we'll need to load the profile again from registry
+    // so that we'll get all the values registry has added to the entry
+    // (UpdateL takes entry as const reference).
+    TUint32 profileId = iEntry->iId;
+    iRegistry->FindL( profileId, *iEntry );
+    iServiceId = iEntry->iServiceProviderId;
+
+    // Compile and set User-Agent header.
+    CSIPManagedProfileRegistry* sipReg = CSIPManagedProfileRegistry::NewLC( 
+        *this ); // CS:1
+    CSIPManagedProfile* sipProf = static_cast<CSIPManagedProfile*>( 
+        sipReg->ProfileL( aSipId ) );
+
+    if ( sipProf )
+        {
+        CleanupStack::PushL( sipProf ); // CS:2
+
+        TBuf8<KMaxUserAgentHeaderLength> userAgentString( KNullDesC8 );
+
+        if ( iEntry->iSIPVoIPUAHTerminalType || 
+            iEntry->iSIPVoIPUAHeaderWLANMAC || 
+            iEntry->iSIPVoIPUAHeaderString.Length() != 0 )
+            {
+            // Set this to be an user-agent param.
+            userAgentString.Append( KUserAgent );
+            userAgentString.Append( KColon );
+            userAgentString.Append( KSpace );
+
+            // Set terminal type if eanbled.
+            if ( iEntry->iSIPVoIPUAHTerminalType )
+                {
+                CIpAppPhoneUtils* util = CIpAppPhoneUtils::NewLC(); // CS:3
+                TBuf<KMaxTerminalTypeLength> terminalType( KNullDesC );
+                util->GetTerminalTypeL( terminalType );
+                userAgentString.Append( terminalType );
+                userAgentString.Append( KSpace );
+                CleanupStack::PopAndDestroy( util ); // CS:2
+                }
+
+            // Set WLAN MAC address if enabled.
+            if ( iEntry->iSIPVoIPUAHeaderWLANMAC )
+                {
+                CIPAppUtilsAddressResolver* resolver = 
+                    CIPAppUtilsAddressResolver::NewLC(); // CS:3
+                _LIT8( KFormatType, "-" );
+                TBuf8<KMaxWlanMacAddressLength> wlanMACAddress( KNullDesC8 );
+                resolver->GetWlanMACAddress( wlanMACAddress, KFormatType );
+                userAgentString.Append( wlanMACAddress );
+                userAgentString.Append( KSpace );
+                CleanupStack::PopAndDestroy( resolver ); // CS:2
+                }
+
+            // Set free string if enabled.
+            if ( iEntry->iSIPVoIPUAHeaderString.Length() )
+                {
+                userAgentString.Append( iEntry->iSIPVoIPUAHeaderString );
+                }
+            }
+
+        // Set new user agent header data to profile.
+        CDesC8ArrayFlat* array = new ( ELeave ) 
+            CDesC8ArrayFlat( KUserAgentHeaderDataArrayInitSize );
+        CleanupStack::PushL( array ); // CS:3
+        array->AppendL( userAgentString );
+        sipProf->SetParameter( KSIPHeaders, *array );
+        sipReg->SaveL( *sipProf );
+        // array, profile
+        CleanupStack::PopAndDestroy( 2, sipProf ); // CS:1
+        }
+    CleanupStack::PopAndDestroy( sipReg ); // CS:0
+    }
+
+// ---------------------------------------------------------------------------
+// Sets SPSettings to service table.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::SetSpSettingsL()
+    {
+    TInt serviceId = iEntry->iServiceProviderId;
+    if ( 0 == serviceId || !iEntry->iIds.Count() )
+        {
+        return;
+        }
+    CSPSettings* spSettings = CSPSettings::NewLC(); // CS:1
+    CSPProperty* property = CSPProperty::NewLC(); // CS:2
+
+    // ==============================
+    // Voice mailbox settings.
+    // ==============================
+    //
+
+    TBool vmbx( EFalse );
+
+    // Set MWI URI if present.
+    if ( iSpSettings.iMwiUri )
+        {
+        property->SetName( ESubPropertyVMBXMWIAddress );
+        property->SetValue( iSpSettings.iMwiUri->Des() );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        // Set the same value to Listening URI if it has no value.
+        if ( !iSpSettings.iListeningUri )
+            {
+            iSpSettings.iListeningUri = iSpSettings.iMwiUri->Des().AllocL();
+            }
+        vmbx = ETrue;
+        }
+    // If there is no MWI URI but listening URI is present, set it as MWI URI.
+    else if ( iSpSettings.iListeningUri )
+        {
+        property->SetName( ESubPropertyVMBXMWIAddress );
+        property->SetValue( iSpSettings.iListeningUri->Des() );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        vmbx = ETrue;
+        }
+
+    // Set Listening URI if present. This is a separate statement since 
+    // the Listening URI may have been configured when setting MWI URI.
+    if ( iSpSettings.iListeningUri )
+        {
+        property->SetName( ESubPropertyVMBXListenAddress );
+        property->SetValue( iSpSettings.iListeningUri->Des() );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        vmbx = ETrue;
+        }
+
+    if ( KErrNotFound != iSpSettings.iResubrcribe )
+        {
+        property->SetName( ESubPropertyVMBXMWISubscribeInterval );
+        property->SetValue( iSpSettings.iResubrcribe );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        }
+    if ( vmbx )
+        {
+        property->SetName( ESubPropertyVMBXSettingsId );
+        property->SetValue( iEntry->iIds[0].iProfileId );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        }
+
+    // ==============================
+    // "Core" Service Provider Settings.
+    // ==============================
+    //
+
+    if ( iSpSettings.iProviderUrl )
+        {
+        property->SetName( EPropertyServiceBookmarkUri );
+        property->SetValue( iSpSettings.iProviderUrl->Des() );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        }
+
+    if ( iSpSettings.iBrandingUri )
+        {
+        property->SetName( ESubPropertyVoIPBrandDataUri );
+        property->SetValue( iSpSettings.iBrandingUri->Des() );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        }
+
+    if ( iPresenceId )
+        {
+        property->SetName( ESubPropertyPresenceSettingsId );
+        property->SetValue( iPresenceId );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+
+        // Converged Connection Handler (CCH) Presence Subservice plug-in UID
+        property->SetName( EPropertyPresenceSubServicePluginId );
+        property->SetValue( KCCHPresenceSubServicePlugId );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+
+        // SIP IM enabled
+        if ( iSpSettings.iEnableSipIm )
+            {
+            // Set IM as enabled.
+            property->SetName( ESubPropertyIMEnabled );
+            property->SetValue( EOn );
+            spSettings->AddOrUpdatePropertyL( serviceId, *property );
+            // Set IM launch UID.
+            property->SetName( ESubPropertyIMLaunchUid );
+            property->SetValue( KIMLaunchUid );
+            spSettings->AddOrUpdatePropertyL( serviceId, *property );
+            // The value only needs to be different from 0,
+            // no-one actually uses it.
+            property->SetName( ESubPropertyIMSettingsId );
+            property->SetValue( KIMSettingsId );
+            spSettings->AddOrUpdatePropertyL( serviceId, *property );
+            // Set IM plugin UID.
+            property->SetName( EPropertyIMSubServicePluginId );
+            property->SetValue( KIMSubServicePluginId );
+            spSettings->AddOrUpdatePropertyL( serviceId, *property );
+            // Set default IM tone.
+            TFileName toneFile;
+            toneFile.Copy( PathInfo::RomRootPath() );
+            toneFile.Append( PathInfo::DigitalSoundsPath() );
+            toneFile.Append( KDefaultTone );
+            MVIMPSTSettingsStore* vimpStSettings =
+                CVIMPSTSettingsStore::NewLC(); // CS:3
+            vimpStSettings->SetL( serviceId,
+                EServiceToneFileName, toneFile );
+            // Pop vimpStSettings (can't use M object as argument).
+            CleanupStack::PopAndDestroy(); // CS:2
+            }
+        }
+
+    if ( iSpSettings.iAutoAcceptBuddies )
+        {
+        property->SetName( ESubPropertyPresenceRequestPreference );
+        property->SetValue( EOn );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        }
+
+    if ( iDestinationId )
+        {
+        property->SetName( ESubPropertyVoIPPreferredSNAPId );
+        property->SetValue( iDestinationId );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        if ( iSpSettings.iEnableSipIm )
+            {
+            property->SetName( ESubPropertyIMPreferredSNAPId );
+            property->SetValue( iDestinationId );
+            spSettings->AddOrUpdatePropertyL( serviceId, *property );
+            }
+        }
+
+    if ( iSpSettings.iBrandId )
+        {
+        // Brand version.
+        property->SetName( EPropertyBrandVersion );
+        property->SetValue( KBrandVersion );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        // Brand language.
+        property->SetName( EPropertyBrandLanguage );
+        property->SetValue( ELangInternationalEnglish );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        // Brand ID.
+        property->SetName( EPropertyBrandId );
+        property->SetValue( iSpSettings.iBrandId->Des() );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        }
+
+    if ( iSpSettings.iAutoEnable )
+        {
+        property->SetName( ESubPropertyVoIPEnabled );
+        property->SetValue( EOn );
+        spSettings->AddOrUpdatePropertyL( serviceId, *property );
+        // Also set voicemailbox on if it's defined.
+        if ( vmbx )
+            {
+            property->SetName( ESubPropertyVMBXEnabled );
+            property->SetValue( EOn );
+            spSettings->AddOrUpdatePropertyL( serviceId, *property );
+            }
+        // Also set presence on if there is a presence link.
+        if ( iPresenceId )
+            {
+            property->SetName( ESubPropertyPresenceEnabled );
+            property->SetValue( EOn );
+            spSettings->AddOrUpdatePropertyL( serviceId, *property );
+            }
+        }
+
+    // property, spSettings
+    CleanupStack::PopAndDestroy( 2, spSettings ); // CS:0
+    }
+
+// ---------------------------------------------------------------------------
+// Creates default codecs.
+// ---------------------------------------------------------------------------
+//
+void CVoipXmlVoipHandler::AddDefaultCodecsL()
+    {
+    CRCSEAudioCodecEntry* codec = CRCSEAudioCodecEntry::NewLC();
+
+    TUint32 codecId( KErrNone );
+
+    codec->SetDefaultCodecValueSet( KAudioCodecAMRWB() );
+    codecId = iCodecRegistry->AddL( *codec );
+    iEntry->iPreferredCodecs.AppendL( codecId );
+
+    codec->SetDefaultCodecValueSet( KAudioCodecAMR() );
+    codecId = iCodecRegistry->AddL( *codec );
+    iEntry->iPreferredCodecs.AppendL( codecId );
+
+    codec->SetDefaultCodecValueSet( KAudioCodecPCMU() );
+    codecId = iCodecRegistry->AddL( *codec );
+    iEntry->iPreferredCodecs.AppendL( codecId );
+
+    codec->SetDefaultCodecValueSet( KAudioCodecPCMA() );
+    codecId = iCodecRegistry->AddL( *codec );
+    iEntry->iPreferredCodecs.AppendL( codecId );
+
+    codec->SetDefaultCodecValueSet( KAudioCodeciLBC() );
+    codecId = iCodecRegistry->AddL( *codec );
+    iEntry->iPreferredCodecs.AppendL( codecId );
+
+    codec->SetDefaultCodecValueSet( KAudioCodecG729() );
+    codecId = iCodecRegistry->AddL( *codec );
+    iEntry->iPreferredCodecs.AppendL( codecId );
+
+    codec->SetDefaultCodecValueSet( KAudioCodecCN() );
+    codecId = iCodecRegistry->AddL( *codec );
+    iEntry->iPreferredCodecs.AppendL( codecId );
+
+    CleanupStack::PopAndDestroy( codec );
+    }
+
+//  End of File