sipplugins/sippsipadapter/src/CWPSIPItem.cpp
changeset 0 307788aac0a8
child 37 0295359a7673
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sipplugins/sippsipadapter/src/CWPSIPItem.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,1262 @@
+/*
+* Copyright (c) 2002-2008 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:  Settings item for SIP settings, handles also the saving of
+*                settings item. 
+*
+*/
+
+
+// INCLUDE FILES
+#include <wpsipadapter.rsg>
+#include <charconv.h>
+#include <sipprofile.h>
+#include <sipprofiletypeinfo.h>
+#include <sipmanagedprofileregistry.h>
+#include <sipprofileregistry.h>
+#include <sipmanagedprofile.h>
+#include <in_sock.h>                // TInetAddr, TSockAddr
+#include <sip.h>
+#include <WPAdapterUtil.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+
+#include "CWPSIPItem.h"
+#include "CSIPProfileRegistryObserver.h"
+#include "CWPSIPAdapter.h"
+#include "wpsipadapterdebug.h"
+
+#include <cmmanagerext.h>
+#include <cmdestinationext.h>
+#include <cmmanagerdef.h>
+#include <escapeutils.h>
+
+// CONSTANTS
+const TInt KMaxCharsInTUint32     = 10;
+const TInt KMaxProviderNameLength = 100;
+_LIT8( KPTypeIMS,           "IMS" ); // w9010.txt
+_LIT8( KImsPlugInName,      "ims" ); // SIP Profile Plugin name
+_LIT8( KPTypeNokiapreR5Ims, "NokiapreR5Ims" ); // for backward compatibility
+_LIT8( KPTypeIETF,          "IETF" ); // w9010.txt
+_LIT8( KColon,              ":" );
+_LIT8( KTransport,          ";transport=" ); // IETF RFC 3261
+_LIT8( KSip,                "sip:" ); // IETF RFC 3261
+_LIT8( KLr,                 ";lr" ); // IETF RFC 3261
+_LIT8( KOpenParenthesis,    "(" );
+_LIT8( KClosedParenthesis,  ")" );
+_LIT8( KSips,               "sips:" ); // IETF RFC 3261
+_LIT8( KEscaped,            "%" );
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::NewL
+//
+// ---------------------------------------------------------------------------
+//
+CWPSIPItem* CWPSIPItem::NewL()
+    {
+    CWPSIPItem* self = new ( ELeave ) CWPSIPItem();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::CWPSIPItem
+//
+// ---------------------------------------------------------------------------
+//
+CWPSIPItem::CWPSIPItem()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::~CWPSIPItem
+//
+// ---------------------------------------------------------------------------
+//
+CWPSIPItem::~CWPSIPItem()
+    {
+    DBG_PRINT( "CWPSIPItem::~CWPSIPItem - begin" );
+    delete iProviderId;
+    delete iName;
+    delete iAppRef;
+    delete iAOR;
+    delete iProtocolForOutboundConnection;
+    delete iNapDefName;
+    delete iOutboundAddr;
+    delete iPortNumberForOutboundConnection;
+    delete iAuthenticationTypeForOutbound;
+    delete iUsernameForOutbound;
+    delete iPasswordForOutbound;
+    delete iRealmForOutbound;
+    delete iRegistrarAddr;
+    delete iAuthenticationTypeForRegistrar;
+    delete iUsernameForRegistrar;
+    delete iPasswordForRegistrar;
+    delete iRealmForRegistrar;
+    delete iSavedProfileId;
+    delete iToAppRef;
+    delete iNetwork;
+    DBG_PRINT( "CWPSIPItem::~CWPSIPItem - end" );
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPSAPItem::ConstructL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::ConstructL()
+    { 
+    DBG_PRINT( "CWPSIPItem::ConstructL - begin" );
+    iProviderId                               = HBufC8::NewL( 0 );
+    iName                                     = HBufC::NewL( 0 );
+    iAppRef                                   = HBufC8::NewL( 0 );
+    iAOR                                      = HBufC8::NewL( 0 );
+    iProtocolForOutboundConnection            = HBufC8::NewL( 0 );
+    iNapDefName                               = HBufC8::NewL( 0 );
+    iSignalCompressionEnabled                 = EFalse;
+    iSecurityNegotiationEnabled               = EFalse;
+    iLooseRoutingForOutboundConnectionEnabled = EFalse;
+    iOutboundAddr                             = HBufC8::NewL( 0 );
+    iPortNumberForOutboundConnection          = HBufC8::NewL( 0 );
+    iAuthenticationTypeForOutbound            = HBufC8::NewL( 0 );
+    iUsernameForOutbound                      = HBufC8::NewL( 0 );
+    iPasswordForOutbound                      = HBufC8::NewL( 0 );
+    iRealmForOutbound                         = HBufC8::NewL( 0 );
+    iRegistrarAddr                            = HBufC8::NewL( 0 );
+    iAuthenticationTypeForRegistrar           = HBufC8::NewL( 0 );
+    iUsernameForRegistrar                     = HBufC8::NewL( 0 );
+    iPasswordForRegistrar                     = HBufC8::NewL( 0 );
+    iRealmForRegistrar                        = HBufC8::NewL( 0 );
+    iNapDef                                   = NULL;
+    iSetAsDefault                             = EFalse;
+    iSavedProfileId                           = HBufC8::NewL( 0 );
+    iProfileId                                = 0;
+    iProfileLockEnabled                       = EFalse;
+    iToAppRef                                 = HBufC8::NewL( 0 );
+    iNetwork                                  = HBufC::NewL( 0 );
+    iSnapId                                   = KErrNotFound;
+    SetSigQos( 40 );
+    DBG_PRINT( "CWPSIPItem::ConstructL - end" );
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetProfileTypeL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetProfileTypeL( const TDesC8& aPTYPE )
+    {
+    HBufC8* tmpProfileType = aPTYPE.AllocL();
+    CleanupStack::PushL( tmpProfileType ); // CS:1
+    // Map the profile type name used in message to SIP stack internal type.
+    if ( ( ( tmpProfileType->Compare( KPTypeIMS() ) ) == 0 ) ||
+        ( tmpProfileType->Compare( KPTypeNokiapreR5Ims ) == 0 ) )
+        {
+        iSIPProfileTypeInfo.iSIPProfileClass = TSIPProfileTypeInfo::EIms;
+        iSIPProfileTypeInfo.iSIPProfileName.Insert( 0, KImsPlugInName() );
+        }
+    else if ( ( tmpProfileType->Compare( KPTypeIETF() ) ) == 0 )
+        {
+        iSIPProfileTypeInfo.iSIPProfileClass = TSIPProfileTypeInfo::EInternet;
+        iSIPProfileTypeInfo.iSIPProfileName.Insert( 0,tmpProfileType->Des() );
+        }
+    else
+        {
+        iSIPProfileTypeInfo.iSIPProfileClass = TSIPProfileTypeInfo::EOther;
+        iSIPProfileTypeInfo.iSIPProfileName.Insert( 0,tmpProfileType->Des() );
+        }
+    CleanupStack::PopAndDestroy( tmpProfileType ); // CS:0
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetAppRefL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetAppRefL( const TDesC8& aAPPREF )
+    {
+    HBufC8* temp = aAPPREF.AllocL();
+    delete iAppRef;
+    iAppRef = NULL;
+    iAppRef = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetAORL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetAORL( const TDesC8& aPUID )
+    {
+    HBufC8* temp( NULL );
+    
+    if ( KErrNotFound == aPUID.Find( KEscaped() ) )
+        {
+        temp = EscapeUtils::EscapeEncodeL( aPUID,
+            EscapeUtils::EEscapeNormal );
+        }
+    else
+        {
+        temp = aPUID.AllocL();
+        }
+    
+    delete iAOR;
+    iAOR = NULL;
+    
+    // If the PUID starts with sip: or sips:
+    if ( KErrNone == temp->Find( KSip() ) ||
+         KErrNone == temp->Find( KSips() ) )
+        {
+        iAOR = temp;
+        }
+    else
+        {
+        CleanupStack::PushL( temp ); // CS: 1
+        
+        iAOR = HBufC8::NewL( KSip().Length() + temp->Length() );
+        iAOR->Des().Copy( KSip() );
+        iAOR->Des().Append( *temp );
+        
+        CleanupStack::PopAndDestroy( temp );  // CS: 0
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetNameL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetNameL( const TDesC& aNAME )
+    {
+    HBufC* temp = aNAME.AllocL();
+    delete iName;
+    iName = NULL;
+    iName = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetProviderIdL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetProviderIdL( const TDesC8& aPROVIDERID )
+    {
+    HBufC8* temp = aPROVIDERID.AllocL();
+    delete iProviderId;
+    iProviderId = NULL;
+    iProviderId = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetProtocolForOutboundConnectionL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetProtocolForOutboundConnectionL( const TDesC8& aAPROTOCOL )
+    {
+    HBufC8* temp = aAPROTOCOL.AllocL();
+    delete iProtocolForOutboundConnection;
+    iProtocolForOutboundConnection = NULL;
+    iProtocolForOutboundConnection = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetNapDefNameL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetNapDefNameL( const TDesC8& aTONAPID )
+    {
+    HBufC8* temp = aTONAPID.AllocL();
+    delete iNapDefName;
+    iNapDefName = NULL;
+    iNapDefName = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetSignalCompressionEnabled
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetSignalCompressionEnabled( TBool aEnabled )
+    {
+    iSignalCompressionEnabled = aEnabled;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetSecurityNegotiationEnabled
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetSecurityNegotiationEnabled( TBool aEnabled )
+    {
+    iSecurityNegotiationEnabled = aEnabled;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetLooseRoutingForOutboundConnectionEnabled
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetLooseRoutingForOutboundConnectionEnabled( TBool aEnabled )
+    {
+    iLooseRoutingForOutboundConnectionEnabled = aEnabled;
+    }
+    
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetProfileLockEnabled
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetProfileLockEnabled( TBool aEnabled )
+    {
+    iProfileLockEnabled = aEnabled;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetOutboundAddrL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetOutboundAddrL( const TDesC8& aOutboundAddr )
+    {
+    // If the parameter is empty, do not add prefix.
+    if ( !aOutboundAddr.Length() )
+        {
+        return;
+        }
+
+    delete iOutboundAddr;
+    iOutboundAddr = NULL;
+    // Check if the address starts with sip: or sips:
+    if ( KErrNone == aOutboundAddr.Find( KSip() ) ||
+         KErrNone == aOutboundAddr.Find( KSips() ) )
+        {
+        iOutboundAddr = aOutboundAddr.AllocL();
+        }
+    else
+        {
+        iOutboundAddr = HBufC8::NewL( KSip().Length() + 
+            aOutboundAddr.Length() );
+        iOutboundAddr->Des().Copy( KSip() );
+        iOutboundAddr->Des().Append( aOutboundAddr );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetPortNumberForOutboundConnectionL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetPortNumberForOutboundConnectionL( const TDesC8& aPORT )
+    {
+    HBufC8* temp = aPORT.AllocL();
+    delete iPortNumberForOutboundConnection;
+    iPortNumberForOutboundConnection = NULL;
+    iPortNumberForOutboundConnection = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetAuthenticationTypeForOutboundL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetAuthenticationTypeForOutboundL( const TDesC8& aAAUTHTYPE )
+    {
+    HBufC8* temp = aAAUTHTYPE.AllocL();
+    delete iAuthenticationTypeForOutbound;
+    iAuthenticationTypeForOutbound = NULL;
+    iAuthenticationTypeForOutbound = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetUsernameForOutboundL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetUsernameForOutboundL( const TDesC8& aAAUTHNAME )
+    {
+    HBufC8* temp( NULL );
+    
+    if ( KErrNotFound == aAAUTHNAME.Find( KEscaped() ) )
+        {
+        temp = EscapeUtils::EscapeEncodeL( aAAUTHNAME,
+            EscapeUtils::EEscapeNormal );
+        }
+    else
+        {
+        temp = aAAUTHNAME.AllocL();
+        }
+    
+    delete iUsernameForOutbound;
+    iUsernameForOutbound = NULL;
+    iUsernameForOutbound = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetPasswordForOutboundL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetPasswordForOutboundL( const TDesC8& aAAUTHSECRET )
+    {
+    HBufC8* temp = aAAUTHSECRET.AllocL();
+    delete iPasswordForOutbound;
+    iPasswordForOutbound = NULL;
+    iPasswordForOutbound = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetRealmForOutboundL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetRealmForOutboundL( const TDesC8& aAAUTHDATA )
+    {
+    HBufC8* temp = aAAUTHDATA.AllocL();
+    delete iRealmForOutbound;
+    iRealmForOutbound = NULL;
+    iRealmForOutbound = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetRegistrarAddrL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetRegistrarAddrL( const TDesC8& aRegistrarAddr )
+    {
+    // If the paremeter is empty, do not add prefix.
+    if ( !aRegistrarAddr.Length() )
+        {
+        return;
+        }
+
+    delete iRegistrarAddr;
+    iRegistrarAddr = NULL;
+    // Check if the address starts with sip: or sips:
+    if ( KErrNone == aRegistrarAddr.Find( KSip() ) ||
+         KErrNone == aRegistrarAddr.Find( KSips() ) )
+        {
+        iRegistrarAddr = aRegistrarAddr.AllocL();
+        }
+    else
+        {
+        iRegistrarAddr = HBufC8::NewL( KSip().Length() + 
+            aRegistrarAddr.Length() );
+        iRegistrarAddr->Des().Copy( KSip() );
+        iRegistrarAddr->Des().Append( aRegistrarAddr );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetAuthenticationTypeForRegistrarL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetAuthenticationTypeForRegistrarL( const TDesC8& 
+    aAAUTHTYPE )
+    {
+    HBufC8* temp = aAAUTHTYPE.AllocL();
+    delete iAuthenticationTypeForRegistrar;
+    iAuthenticationTypeForRegistrar = NULL;
+    iAuthenticationTypeForRegistrar = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetUsernameForRegistrarL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetUsernameForRegistrarL( const TDesC8& aAAUTHNAME )
+    {
+    HBufC8* temp( NULL );
+    
+    if ( KErrNotFound == aAAUTHNAME.Find( KEscaped() ) )
+        {
+        temp = EscapeUtils::EscapeEncodeL( aAAUTHNAME,
+            EscapeUtils::EEscapeNormal );
+        }
+    else
+        {
+        temp = aAAUTHNAME.AllocL();
+        }
+    
+    delete iUsernameForRegistrar;
+    iUsernameForRegistrar = NULL;
+    iUsernameForRegistrar = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetPasswordForRegistrarL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetPasswordForRegistrarL( const TDesC8& aAAUTHSECRET )
+    {
+    HBufC8* temp = aAAUTHSECRET.AllocL();
+    delete iPasswordForRegistrar;
+    iPasswordForRegistrar = NULL;
+    iPasswordForRegistrar = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetRealmForRegistrarL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetRealmForRegistrarL( const TDesC8& aAAUTHDATA )
+    {
+    HBufC8* temp = aAAUTHDATA.AllocL();
+    delete iRealmForRegistrar;
+    iRealmForRegistrar = NULL;
+    iRealmForRegistrar = temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetNapDef
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetNapDef( CWPCharacteristic* aNapDef )
+    {
+    iNapDef = aNapDef;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetAsDefaultL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetAsDefaultL()
+    {
+    iSetAsDefault = ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPSAPItem::SetIAPId
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetIAPId( TUint32 aUid )
+    {
+    iIAPId = aUid;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPSAPItem::SetAutomaticRegistrationEnabled
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetAutomaticRegistrationEnabled( 
+    TBool aAutomaticRegistrationEnabled )
+    {
+    iAutomaticRegistrationEnabled = aAutomaticRegistrationEnabled;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetAOR
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetAOR()
+    {
+    return *iAOR;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetProviderId
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetProviderId()
+    {
+    return *iProviderId;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetName
+//
+// ---------------------------------------------------------------------------
+//
+TDesC& CWPSIPItem::GetName()
+    {
+    return *iName;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetProtocolForOutboundConnection
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetProtocolForOutboundConnection()
+    {
+    return *iProtocolForOutboundConnection;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetNapDefName
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetNapDefName()
+    {
+    return *iNapDefName;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetSignalCompressionEnabled
+//
+// ---------------------------------------------------------------------------
+//
+TBool CWPSIPItem::GetSignalCompressionEnabled()
+    {
+    return iSignalCompressionEnabled;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetSecurityNegotiationEnabled
+//
+// ---------------------------------------------------------------------------
+//
+TBool CWPSIPItem::GetSecurityNegotiationEnabled()
+    {
+    return iSecurityNegotiationEnabled;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetLooseRoutingForOutboundConnectionEnabled
+//
+// ---------------------------------------------------------------------------
+//
+TBool CWPSIPItem::GetLooseRoutingForOutboundConnectionEnabled()
+    {
+    return iLooseRoutingForOutboundConnectionEnabled;
+    }
+    
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetAutomaticRegistrationEnabled
+//
+// ---------------------------------------------------------------------------
+//
+TBool CWPSIPItem::GetAutomaticRegistrationEnabled()
+    {
+    return iAutomaticRegistrationEnabled;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetProfileLockEnabled
+//
+// ---------------------------------------------------------------------------
+//
+TBool CWPSIPItem::GetProfileLockEnabled()
+    {
+    return iProfileLockEnabled;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetOutboundAddr
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetOutboundAddr()
+    {
+    return *iOutboundAddr;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetPortNumberForOutboundConnection
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetPortNumberForOutboundConnection()
+    {
+    return *iPortNumberForOutboundConnection;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetAuthenticationTypeForOutbound
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetAuthenticationTypeForOutbound()
+    {
+    return *iAuthenticationTypeForOutbound;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetUsernameForOutbound
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetUsernameForOutbound()
+    {
+    return *iUsernameForOutbound;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetPasswordForOutbound
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetPasswordForOutbound()
+    {
+    return *iPasswordForOutbound;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetRealmForOutbound
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetRealmForOutbound()
+    {
+    return *iRealmForOutbound;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetRegistrarAddr
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetRegistrarAddr()
+    {
+    return *iRegistrarAddr;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetAuthenticationTypeForRegistrar
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetAuthenticationTypeForRegistrar()
+    {
+    return *iAuthenticationTypeForRegistrar;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetUsernameForRegistrar
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetUsernameForRegistrar()
+    {
+    return *iUsernameForRegistrar;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetPasswordForRegistrar
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetPasswordForRegistrar()
+    {
+    return *iPasswordForRegistrar;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetRealmForRegistrar
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetRealmForRegistrar()
+    {
+    return *iRealmForRegistrar;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetNapDef
+//
+// ---------------------------------------------------------------------------
+//
+CWPCharacteristic* CWPSIPItem::GetNapDef()
+    {
+    return iNapDef;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetProfileId
+//
+// ---------------------------------------------------------------------------
+//
+TUint32 CWPSIPItem::GetProfileId()
+    {
+    return iProfileId;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::GetRefId
+//
+// ---------------------------------------------------------------------------
+//
+TDesC8& CWPSIPItem::GetAppRef()
+    {
+    return *iAppRef;
+    }
+    
+// ---------------------------------------------------------------------------
+// CWPSIPSAPItem::GetIAPId
+//
+// ---------------------------------------------------------------------------
+//
+TUint32 CWPSIPItem::GetIAPId()
+    {
+    return iIAPId;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::StoreL()
+// Saves the SIP settings by using SIP Profile API and SIP API. 
+// ---------------------------------------------------------------------------
+//
+TUint32 CWPSIPItem::StoreL()
+    {
+    // __UHEAP_MARK; // For testing.
+    DBG_PRINT( "CWPSIPItem::StoreL - begin" );
+
+    CSIPProfile* tmpProfile = NULL;
+    CSIPProfileRegistryObserver* cSIPProfileRegistryObserver = 
+        CSIPProfileRegistryObserver::NewLC(); // CS:1
+    CSIPManagedProfileRegistry* cSIPManagedProfileRegistry = 
+        CSIPManagedProfileRegistry::NewLC( *cSIPProfileRegistryObserver );
+        // CS:2
+
+    // Preparing persistent managed profile for saving the SIP settings of the
+    CSIPManagedProfile* cSIPManagedProfile = cSIPManagedProfileRegistry->
+        CreateL( iSIPProfileTypeInfo ); 
+           
+    // Load existing profile if we are trying to set as default    
+    if ( iProfileId && iSetAsDefault )
+        {
+        // Delete current profilecontent and load already saved profile.
+        delete cSIPManagedProfile;
+        tmpProfile = cSIPManagedProfileRegistry->ProfileL( iProfileId );
+        cSIPManagedProfile = static_cast<CSIPManagedProfile*> ( tmpProfile );
+        }
+    CleanupStack::PushL( cSIPManagedProfile );// CS:3 
+
+    // Skip setting providername if we are setting profile as default,
+    // no need to check duplicate providers again.
+    if ( !iSetAsDefault )
+        {
+        // Provider.
+        cSIPManagedProfile->SetParameter( KSIPProviderName, 
+            iProviderId->Des() );
+
+        // For adding numbering to providername shown in settings UI.
+        CheckDuplicateNameL( *cSIPManagedProfile, KErrNotFound );
+        }
+
+    if ( iNetwork->Des().Length() )
+        {
+        iSnapId = NetworkIdL( iNetwork->Des() );
+        if ( KErrNotFound < iSnapId )
+            {
+            // Set SNAP ID.
+            TInt err = cSIPManagedProfile->SetParameter( 
+                KSIPSnapId, (TUint32)iSnapId );
+            }
+        else
+            {
+            // Set IAP ID.
+            cSIPManagedProfile->SetParameter( KSIPAccessPointId, iIAPId );
+            }
+        }
+    else
+        {
+        if ( KErrNotFound < iSnapId )
+            {
+            // Set SNAP ID.
+            TInt err = cSIPManagedProfile->SetParameter( KSIPSnapId, 
+                (TUint32)iSnapId );
+            }
+        else
+            {
+            // Set IAP ID.
+            cSIPManagedProfile->SetParameter( KSIPAccessPointId, iIAPId );
+            }
+        }
+
+    // Setting SIP Address-Of-Record/Public User Identity. There is only one 
+    // AOR via OMA Client Provisioning.
+    cSIPManagedProfile->SetParameter( KSIPUserAor, iAOR->Des() );
+
+    // Set outbound proxy URI only if address part is present.
+    if ( iOutboundAddr->Length() )
+        {
+        // Outbound proxy SIP-URI. The size of the final SIP-URI is calculated
+        // with the maximum possible size. sip:host:port;transport
+        HBufC8* bufURI = HBufC8::NewLC( 
+            iOutboundAddr->Length()                    +
+            KColon().Length()                          +
+            iPortNumberForOutboundConnection->Length() +
+            KTransport().Length()                      +
+            iProtocolForOutboundConnection->Length()   +
+            KLr().Length()
+            ); // CS:4
+
+        TPtr8 ptrBufURI( bufURI->Des() );
+
+        // Outbound/P-CSCF proxy address;domain name or IP address.
+        ptrBufURI.Copy( iOutboundAddr->Des() ); 
+        // If the port number was received,
+        // it is appended into the Request-URI.
+        if ( iPortNumberForOutboundConnection->Length() > 0 ) // :port
+            {
+            ptrBufURI.Append( KColon );
+            ptrBufURI.Append( iPortNumberForOutboundConnection->Des() );
+            }
+        // If the transport protocol was received, it is appended into the 
+        // Request-URI.
+        if ( iProtocolForOutboundConnection->Length() > 0 )
+            {
+            ptrBufURI.Append( KTransport );
+            ptrBufURI.Append( iProtocolForOutboundConnection->Des() );
+            }
+
+        // Check if the loose routing parameter ";lr" should be
+        // placed into the Request-URI.
+        if ( iLooseRoutingForOutboundConnectionEnabled )
+            {
+            ptrBufURI.Append( KLr );
+            }
+        // Set outbound proxy/P-CSCF address.
+        cSIPManagedProfile->SetParameter( 
+            KSIPOutboundProxy, KSIPServerAddress, bufURI->Des() );
+        CleanupStack::PopAndDestroy( bufURI ); // CS:3
+        bufURI = NULL;
+        }
+
+    // Set signal compression enabled value.
+    cSIPManagedProfile->SetParameter( KSIPSigComp, 
+        iSignalCompressionEnabled );
+
+    // Set security negotiation enabled value.
+    cSIPManagedProfile->SetParameter( KSIPSecurityNegotiation,
+        iSecurityNegotiationEnabled );
+ 
+     if ( iSIPProfileTypeInfo.iSIPProfileClass == TSIPProfileTypeInfo::EOther
+        || iSIPProfileTypeInfo.iSIPProfileClass == TSIPProfileTypeInfo::EIms )
+        {
+        cSIPManagedProfile->SetParameter( KSIPPrivateIdentity, 
+            iUsernameForOutbound->Des() );
+        }
+    else
+        {
+        // Set outbound proxy username. Digest username.
+        cSIPManagedProfile->SetParameter( KSIPOutboundProxy, 
+            KSIPDigestUserName, iUsernameForOutbound->Des() );
+        }
+
+    // Set outbound proxy password. Digest password.
+    cSIPManagedProfile->SetParameter( KSIPOutboundProxy, KSIPDigestPassword,
+        iPasswordForOutbound->Des() );
+ 
+    // Set realm for outbound.
+    cSIPManagedProfile->SetParameter( KSIPOutboundProxy, KSIPDigestRealm,
+        iRealmForOutbound->Des() );
+
+    // Registrar SIP-URI.
+    cSIPManagedProfile->SetParameter( KSIPRegistrar, KSIPServerAddress, 
+        iRegistrarAddr->Des() );
+
+    if ( iSIPProfileTypeInfo.iSIPProfileClass == TSIPProfileTypeInfo::EOther
+        || iSIPProfileTypeInfo.iSIPProfileClass == TSIPProfileTypeInfo::EIms )
+        {
+        cSIPManagedProfile->SetParameter( KSIPPrivateIdentity, 
+            iUsernameForRegistrar->Des() );
+        }
+    else
+        {
+        // Set registrar username. Digest username.
+        cSIPManagedProfile->SetParameter( KSIPRegistrar, KSIPDigestUserName,
+            iUsernameForRegistrar->Des() );
+        }
+
+    // Set registrar password. Digest password.
+    cSIPManagedProfile->SetParameter( KSIPRegistrar, KSIPDigestPassword,
+        iPasswordForRegistrar->Des() );
+
+    // Set realm for registrar.
+    cSIPManagedProfile->SetParameter( KSIPRegistrar, KSIPDigestRealm,
+        iRealmForRegistrar->Des() );
+
+    // Default parameter
+    if ( iSetAsDefault )   
+        {
+        cSIPManagedProfile->SetParameter( KSIPDefaultProfile, ETrue );
+        cSIPManagedProfile->SetParameter( KSIPProfileId, iProfileId );
+        }
+
+    // Profile lock parameter
+    if ( iProfileLockEnabled )
+        {
+        cSIPManagedProfile->SetParameter( KSIPProfileLocked, ETrue );
+        }
+
+    // Signalling QoS parameter.
+    cSIPManagedProfile->SetParameter( KSIPSoIpTOS, iSigQos );
+
+    // Stores SIP profile to permanent storage
+    cSIPManagedProfileRegistry->SaveL( *cSIPManagedProfile );
+
+    // get saved profile id
+    cSIPManagedProfile->GetParameter( KSIPProfileId, iProfileId );
+    CleanupStack::PopAndDestroy( cSIPManagedProfile );    
+    CleanupStack::PopAndDestroy( cSIPManagedProfileRegistry );
+    CleanupStack::PopAndDestroy( cSIPProfileRegistryObserver );
+    cSIPManagedProfile = NULL;
+
+    // for testing
+    //__UHEAP_MARKEND;
+
+    HBufC8* tmpId = HBufC8::NewL( KMaxCharsInTUint32 );
+    _LIT8( KFormatTxt,"%u" );
+    tmpId->Des().Format( KFormatTxt, iProfileId );
+    delete iSavedProfileId;
+    iSavedProfileId = NULL;
+    iSetAsDefault = EFalse;
+    iSavedProfileId = tmpId;
+    tmpId = NULL;
+    DBG_PRINT( "CWPSIPItem::StoreL - end" );
+    return iProfileId;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SaveData
+//
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CWPSIPItem::SaveData()
+    {
+    return *iSavedProfileId;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::CheckDuplicateNameL
+// Checks if duplicate named sip profiles. Renames if same.
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::CheckDuplicateNameL( CSIPManagedProfile& aProfile, 
+    const TInt& aProfileId )
+    {
+    // Array of pointers to all loaded SIP profiles.
+    CArrayPtrFlat<CSIPManagedProfile>* profiles;
+    CSIPProfileRegistryObserver* cSIPProfileRegistryObserver = 
+        CSIPProfileRegistryObserver::NewLC(); // CS:1
+    CSIPManagedProfileRegistry*  cSIPManagedProfileRegistry = 
+        CSIPManagedProfileRegistry::NewLC( *cSIPProfileRegistryObserver );
+        // CS:2
+
+    RArray<TSIPProfileTypeInfo> profileTypes;
+    CleanupClosePushL( profileTypes ); // CS:3
+
+     // Get the supported profile types.
+    cSIPManagedProfileRegistry->SupportedProfileTypesL( profileTypes );
+
+    // Create profile pointer array.
+    profiles = new ( ELeave ) CArrayPtrFlat<CSIPManagedProfile>( 5 );
+    TCleanupItem cleanupItem( CWPSIPItem::CleanupArrayItem, profiles );
+    CleanupStack::PushL( cleanupItem ); // CS:4
+
+    RPointerArray<CSIPProfile> profilePointerArray;
+    CleanupResetAndDestroyPushL( profilePointerArray ); // CS:5
+
+    // Get all profiles based on profile types.
+    const TInt profileTypeCount = profileTypes.Count();
+    for ( TInt i = 0; i < profileTypeCount; i++ )
+        {        
+        cSIPManagedProfileRegistry->ProfilesL( profileTypes[i], 
+            profilePointerArray );
+        const TInt profileCount = profilePointerArray.Count();
+        for ( TInt j = 0; j < profileCount; j++ )
+            {
+            CSIPManagedProfile* profile = 
+                static_cast<CSIPManagedProfile*>( profilePointerArray[j] );
+            profiles->AppendL( profile );
+            }                    
+        profilePointerArray.Reset();
+        }
+    CleanupStack::PopAndDestroy( &profilePointerArray ); // CS:4
+
+    // Go through loaded profiles and check for name duplicates.
+    const TDesC8* name;
+    aProfile.GetParameter( KSIPProviderName, name );
+    HBufC8* newName = HBufC8::NewLC( KMaxProviderNameLength ); // CS:5
+    newName->Des().Copy( *name );
+    const TInt count( profiles->Count() );
+    for ( TInt n = 0; n < count; n++ )
+        {
+        // Skip profile currently being checked.
+        if ( aProfileId != n )
+            {
+            const TDesC8* existingName;
+            profiles->At( n )->GetParameter( KSIPProviderName, existingName );
+            if ( existingName->Compare( *name )  == 0 )
+                {
+                TBool isUnique( EFalse );
+                for ( TInt i = 1; !isUnique; i++ )
+                    {
+                    TBool found( EFalse );
+                    newName->Des().Zero();
+                    newName->Des().Append( *name );
+                    newName->Des().Append( KOpenParenthesis() );
+                    newName->Des().AppendNum( i );
+                    newName->Des().Append( KClosedParenthesis() );
+                    for ( TInt m = 0; m < count; m++ )
+                        {
+                        profiles->At( m )->GetParameter( KSIPProviderName, 
+                            existingName );
+                        if ( existingName->Compare( newName->Des() ) == 0 )
+                            {
+                            found = ETrue;
+                            }
+                        }
+                    if ( !found )
+                        {
+                        isUnique = ETrue;
+                        }
+                    }
+                }
+            }
+        }
+    aProfile.SetParameter( KSIPProviderName, newName->Des() );
+    // newName, profiles, &profileTypes, cSIPManagedProfileRegistry
+    CleanupStack::PopAndDestroy( 5, cSIPProfileRegistryObserver ); // CS:0
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::CleanupArrayItem
+// Cleans up an array.
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::CleanupArrayItem( TAny* aArray )
+    {
+    CArrayPtrFlat<CSIPManagedProfile>* tempArray = 
+        static_cast<CArrayPtrFlat<CSIPManagedProfile>*>( aArray );
+    if ( tempArray )
+        {
+        tempArray->ResetAndDestroy();
+        }
+    delete tempArray;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetToAppRefL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetToAppRefL( const TDesC8& aToAppRef )
+    {
+    delete iToAppRef;
+    iToAppRef = NULL;
+    iToAppRef = aToAppRef.AllocL();
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::ToAppRef
+//
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CWPSIPItem::ToAppRef() const
+    {
+    return *iToAppRef;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetNetworkL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetNetworkL( const TDesC& aNetwork )
+    {
+    delete iNetwork;
+    iNetwork = NULL;
+    iNetwork = aNetwork.AllocL();
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::Network
+//
+// ---------------------------------------------------------------------------
+//
+const TDesC& CWPSIPItem::Network() const
+    {
+    return *iNetwork;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetSnapId
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetSnapId( TInt aSnapId )
+    {
+    iSnapId = aSnapId;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::NetworkIdL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CWPSIPItem::NetworkIdL( const TDesC& aName )
+    {
+    DBG_PRINT( "CWPSIPItem::NetworkIdL - begin" );
+    TInt networkId( KErrNotFound );
+    RCmManagerExt cmManager;
+    cmManager.OpenL();
+    CleanupClosePushL( cmManager ); // CS:1
+    RArray<TUint32> destinations;
+    CleanupClosePushL( destinations ); // CS:2
+    cmManager.AllDestinationsL( destinations );
+    const TInt destCount = destinations.Count();
+    for ( TInt counter = 0; counter < destCount; counter++ )
+        {
+        RCmDestinationExt destination = cmManager.DestinationL( 
+            destinations[counter] );
+        CleanupClosePushL( destination ); // CS:3
+        HBufC* destName = destination.NameLC(); // CS:4
+        if ( 0 == aName.Compare( destName->Des() ) )
+            {
+            networkId = destinations[counter];
+            CleanupStack::PopAndDestroy( 2, &destination ); // CS:2
+            break;
+            }
+        CleanupStack::PopAndDestroy( 2, &destination ); // CS:2
+        }
+    CleanupStack::PopAndDestroy( 2, &cmManager ); // CS:0
+    destinations.Close();
+    DBG_PRINT( "CWPSIPItem::NetworkIdL - end" );
+    return networkId;
+    }
+
+// ---------------------------------------------------------------------------
+// CWPSIPItem::SetSigQos
+//
+// ---------------------------------------------------------------------------
+//
+void CWPSIPItem::SetSigQos( TUint32 aSigQos )
+    {
+    // We need to do bitshifting on the IP TOS, because it's the upper 6 bits
+    // that are set and settings provide us the IP TOS as the lower 6 bits.
+    // The lower 2 bits are reserver for explicit congestion notification.
+    // See also more from:
+    // Symbian Developer Library / in_sock.h Global variables / KSoIpTOS
+    const TInt ipTosShift( 2 );
+    const TUint32 tosBits( aSigQos << ipTosShift );
+    iSigQos = tosBits;
+    }
+
+// End of file.