realtimenetprots/sipfw/ProfileAgent/Profile/Src/sipconcreteprofile.cpp
changeset 0 307788aac0a8
child 6 43c4dec3cb1f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/Profile/Src/sipconcreteprofile.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,2261 @@
+// Copyright (c) 2007-2009 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:
+// Name        : sipconcreteprofile.cpp
+// Part of     : SIP / SIP Profile Agent / SIP Concrete Profile
+// Implementation
+// Version     : %version: 3.1.1 %
+//
+
+
+
+//  INCLUDE FILES
+#include "sipconcreteprofile.h"
+#include "sipprofileparameter.h"
+#include "sipprofile.h"
+#include "sipmanagedprofile.h"
+#include "extensionintparam.h"
+#include "extensionboolparam.h"
+#include "extensiondescrparam.h"
+#include "extensiondescrarrayparam.h"
+#include <random.h>
+#include <utf.h>
+#include <commsdattypesv1_1.h>
+#include <commsdat.h>
+#include <e32const.h>
+#include "SipProfileLog.h"
+
+const TInt KBitsInByte = 8;
+const TInt KContactUserNameLength = 20;
+const TUint KParameterLength = 25;
+const TUint32 KDefaultSNAPIdentifier = KMaxTUint32;
+_LIT8(KSIPProfileParameter, "%u");
+
+using namespace CommsDat;
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPConcreteProfile* CSIPConcreteProfile::NewL()
+	{
+	CSIPConcreteProfile* self = CSIPConcreteProfile::NewLC();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPConcreteProfile* CSIPConcreteProfile::NewLC()
+	{
+	CSIPConcreteProfile* self = new (ELeave) CSIPConcreteProfile();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::CSIPConcreteProfile
+// -----------------------------------------------------------------------------
+//
+CSIPConcreteProfile::CSIPConcreteProfile()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ConstructL
+// -----------------------------------------------------------------------------
+//	
+void CSIPConcreteProfile::ConstructL()
+	{
+	iSIPAORUri8 = CUri8::NewL();
+	iSIPRegistrar = HBufC8::NewL(0);
+	iSIPProviderName = HBufC8::NewL(0);
+	iSIPPrivateIdentity = HBufC8::NewL(0);
+	iSIPOutboundProxy = HBufC8::NewL(0);
+		
+	iSIPSigComp = EFalse;
+	iSecurityNegotiation = EFalse;
+	iSIPAutoRegistered = EFalse;
+
+	iStatus = EUnregistered;
+	iDefaultProfile = EFalse;
+
+	iDynamicProxyResolving = EFalse;
+	iDynamicProxy = HBufC8::NewL(0);
+
+	iSIPContactHeaderParams = new (ELeave) CDesC8ArrayFlat(1);
+
+	iSIPRegisteredAORs = new (ELeave) CDesC8ArrayFlat(1);
+	iSIPNegotiatedSecurityMechanism = HBufC8::NewL(0);
+	
+	iSIPHeaders = new (ELeave) CDesC8ArrayFlat(1);
+	
+	HBufC8* username = CreateContactUserNameLC();
+	SetExtensionParameterL(KSIPContactHeaderUser,*username);
+	CleanupStack::PopAndDestroy(username);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::CloneL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C CSIPConcreteProfile* CSIPConcreteProfile::CloneL() const
+	{
+	return CloneL(EFalse);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::CloneWithDynamicValuesL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C CSIPConcreteProfile* CSIPConcreteProfile::CloneWithDynamicValuesL() const
+	{
+	return CloneL(ETrue);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::CloneL(TBool)
+// -----------------------------------------------------------------------------
+//
+CSIPConcreteProfile* CSIPConcreteProfile::CloneL(TBool aWithDynamicValues) const
+	{
+	CSIPConcreteProfile* newCopy = CSIPConcreteProfile::NewLC();
+
+	newCopy->SetIapId(IapId());
+	newCopy->SetProfileType(ProfileType());
+	newCopy->SetRegistrarL(*iSIPRegistrar);
+	newCopy->SetOutboundProxyL(*iSIPOutboundProxy);
+	newCopy->SetPrivateIdentityL(PrivateIdentity());
+	newCopy->SetProviderNameL(ProviderName());
+
+
+	newCopy->SetServerParameterL(KSIPRegistrar, KSIPDigestRealm,
+		ServerParameter(KSIPRegistrar, KSIPDigestRealm));
+
+	newCopy->SetServerParameterL(KSIPRegistrar, KSIPDigestUserName,
+		ServerParameter(KSIPRegistrar, KSIPDigestUserName));
+
+	newCopy->SetServerParameterL(KSIPRegistrar, KSIPDigestPassword,
+		ServerParameter(KSIPRegistrar, KSIPDigestPassword));
+
+	TInt i = 0;
+	for (i = 0; i < iSIPRegistrarExtParameter.Count(); i++)
+		{
+		CSIPProfileParameter* param = iSIPRegistrarExtParameter[i];
+		newCopy->SetServerExtensionParameterL(KSIPRegistrar, param->Key(), param->ValueL());
+		}
+
+	newCopy->SetServerParameterL(KSIPOutboundProxy, KSIPDigestRealm,
+		ServerParameter(KSIPOutboundProxy, KSIPDigestRealm));
+
+	newCopy->SetServerParameterL(KSIPOutboundProxy, KSIPDigestUserName,
+		ServerParameter(KSIPOutboundProxy, KSIPDigestUserName));
+
+	newCopy->SetServerParameterL(KSIPOutboundProxy, KSIPDigestPassword,
+		ServerParameter(KSIPOutboundProxy, KSIPDigestPassword));
+
+	for (i = 0; i < iSIPOutboundProxyExtParameter.Count(); i++)
+		{
+		CSIPProfileParameter* param = iSIPOutboundProxyExtParameter[i];
+		newCopy->SetServerExtensionParameterL(KSIPOutboundProxy, param->Key(), param->ValueL());
+		}
+
+	newCopy->SetAORL(AOR());
+
+	newCopy->EnableSigComp(IsSigCompEnabled());
+	newCopy->EnableSecurityNegotiation(IsSecurityNegotiationEnabled());
+	newCopy->SetAutoRegistrationEnabled(IsAutoRegistrationEnabled());
+	newCopy->SetDynamicProxyL(DynamicProxy());
+
+	newCopy->SetContactHeaderParamsL(ContactHeaderParams());
+
+	newCopy->SetSIPHeadersL(SIPHeaders());
+
+	newCopy->SetStatus(EUnregistered);
+	newCopy->SetContextId(0);
+	newCopy->SetDefault(EFalse);
+	newCopy->SetLastRegistrationError(KErrNone);
+
+	CloneExtensionParamsL(*newCopy);
+
+	if (aWithDynamicValues) // All vales are copied
+		{
+		newCopy->SetId(Id());
+		newCopy->SetStatus(Status());
+		newCopy->SetContextId(ContextId());
+		newCopy->SetDefault(IsDefault());
+		newCopy->SetLastRegistrationError(LastRegistrationError());				
+		}
+	else
+		{
+		newCopy->SetStatus(EUnregistered);
+		newCopy->SetContextId(0);
+		newCopy->SetDefault(EFalse);
+		newCopy->SetLastRegistrationError(KErrNone);
+
+	    // The Contact-header's user-part must be unique. 
+	    // It is stored in the extension parameters to preserve data compatibility.
+		HBufC8* username = CreateContactUserNameLC();
+		newCopy->SetExtensionParameterL(KSIPContactHeaderUser,*username);
+		CleanupStack::PopAndDestroy(username);			
+		}
+
+	CleanupStack::Pop(newCopy);
+	return newCopy;
+	}		
+
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::~CSIPConcreteProfile
+// Destructor.
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C CSIPConcreteProfile::~CSIPConcreteProfile()
+	{
+	if (iSIPHeaders)
+	    {
+	    iSIPHeaders->Reset();   
+	    }
+	delete iSIPHeaders;
+	
+	delete iSIPNegotiatedSecurityMechanism;
+	
+	if (iSIPRegisteredAORs)
+	    {
+	    iSIPRegisteredAORs->Reset();
+	    }
+	delete iSIPRegisteredAORs;
+    
+    if (iSIPContactHeaderParams)
+        {
+        iSIPContactHeaderParams->Reset();
+        }
+	delete iSIPContactHeaderParams;
+	
+	iSIPOutboundProxyParameter.ResetAndDestroy();
+	iSIPOutboundProxyExtParameter.ResetAndDestroy();
+	iSIPRegistrarParameter.ResetAndDestroy();
+	iSIPRegistrarExtParameter.ResetAndDestroy();	
+
+	delete iDynamicProxy;
+	delete iSIPAORUri8;
+	delete iSIPRegistrar;
+	delete iSIPProviderName;
+	delete iSIPPrivateIdentity;
+	delete iSIPOutboundProxy;
+
+	iExtensionIntParams.Close();
+	iExtensionBoolParams.Close();
+	iExtensionDescrParams.ResetAndDestroy();
+	iExtensionDescrArrayParams.ResetAndDestroy();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::Id
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TUint32 CSIPConcreteProfile::Id() const
+	{
+	return iSIPProfileId;
+	}
+        
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetId
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetId(TUint32 aId)
+	{
+	iSIPProfileId = aId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetIapId
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetIapId(TUint32 aIapId)
+	{
+	iSIPIAPId = aIapId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::IapId
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TUint32 CSIPConcreteProfile::IapId() const
+	{
+	return iSIPIAPId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetProfileTypeL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetProfileType(
+    const TSIPProfileTypeInfo& aProfileType) 
+	{
+	iSIPProfileType.iSIPProfileClass = aProfileType.iSIPProfileClass;
+	iSIPProfileType.iSIPProfileName = aProfileType.iSIPProfileName;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ProfileType
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const TSIPProfileTypeInfo& CSIPConcreteProfile::ProfileType() const
+	{
+	return iSIPProfileType;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::Server
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const TDesC8& CSIPConcreteProfile::Server(TUint32 aServer) const
+	{
+	switch(aServer) 
+		{
+		case KSIPOutboundProxy:
+			return *iSIPOutboundProxy;
+		case KSIPRegistrar:
+			return *iSIPRegistrar;
+		default:
+			return KNullDesC8;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ServerParameter
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const TDesC8& CSIPConcreteProfile::ServerParameter(
+    TUint32 aServer,
+    TUint32 aServerParam) const
+	{
+	if (aServerParam == KSIPDigestUserName || 
+		aServerParam == KSIPDigestRealm ||
+		aServerParam == KSIPDigestPassword)
+		{
+		TBuf8<KParameterLength> parameter;
+		parameter.Format(KSIPProfileParameter, aServerParam);
+
+		switch(aServer) 
+			{
+			case KSIPOutboundProxy:
+				return Parameter(&iSIPOutboundProxyParameter, parameter);
+			case KSIPRegistrar:
+				return Parameter(&iSIPRegistrarParameter, parameter);
+			default:
+				return KNullDesC8;
+			}
+		}
+	else
+		{
+		return KNullDesC8;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ServerExtensionParameter
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const TDesC8& CSIPConcreteProfile::ServerExtensionParameter(
+    TUint32 aServer,
+	const TDesC8& aName) const
+	{
+	switch(aServer) 
+		{
+		case KSIPOutboundProxy:
+			return Parameter(&iSIPOutboundProxyExtParameter, aName);
+		case KSIPRegistrar:
+			return Parameter(&iSIPRegistrarExtParameter, aName);
+		default:
+			return KNullDesC8;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetServerL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetServerL(
+    TUint32 aServer, 
+							     const TDesC8& aSipUri)
+	{
+	switch(aServer) 
+		{
+		case KSIPOutboundProxy:
+			SetOutboundProxyL(aSipUri);
+			break;
+		case KSIPRegistrar:
+			SetRegistrarL(aSipUri);
+			break;
+		default:
+			User::Leave (KErrArgument);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetServerParameterL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetServerParameterL(
+    TUint32 aServer,
+    TUint32 aServerParam,
+    const TDesC8& aValue)
+	{
+	__ASSERT_ALWAYS(aServerParam == KSIPDigestUserName ||
+		aServerParam == KSIPDigestRealm ||
+		aServerParam == KSIPDigestPassword , User::Leave(KErrArgument));
+
+	TBuf8<KParameterLength> parameter;
+	parameter.Format(KSIPProfileParameter, aServerParam);
+
+	switch(aServer) 
+		{
+		case KSIPOutboundProxy:
+			SetParameterL(&iSIPOutboundProxyParameter, parameter, aValue);
+			break;
+		case KSIPRegistrar:
+			SetParameterL(&iSIPRegistrarParameter, parameter, aValue);
+			break;
+		default:
+			User::Leave (KErrArgument);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetServerExtensionParameterL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetServerExtensionParameterL(
+    TUint32 aServer,
+    const TDesC8& aName,
+    const TDesC8& aValue)
+	{
+	switch(aServer) 
+		{
+		case KSIPOutboundProxy:
+			SetParameterL(&iSIPOutboundProxyExtParameter, aName, aValue);
+			break;
+		case KSIPRegistrar:
+			SetParameterL(&iSIPRegistrarExtParameter, aName, aValue);
+			break;
+		default:
+			User::Leave (KErrArgument);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetAORL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetAORL(const TDesC8& aAOR)
+	{
+    TUriParser8 parser;
+    User::LeaveIfError(parser.Parse(aAOR));
+    CUri8* tmp = CUri8::NewL(parser);
+	delete iSIPAORUri8;
+	iSIPAORUri8 = tmp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::AOR
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const TDesC8& CSIPConcreteProfile::AOR() const
+	{
+	return iSIPAORUri8->Uri().UriDes();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::AORUri8
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const TUriC8& CSIPConcreteProfile::AORUri8() const
+    {
+    return iSIPAORUri8->Uri();
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::PrivateIdentity
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const TDesC8& CSIPConcreteProfile::PrivateIdentity() const
+	{
+	return *iSIPPrivateIdentity;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetPrivateIdentityL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetPrivateIdentityL(
+    const TDesC8& aPrivateIdentity)
+	{
+	HBufC8* tmp = aPrivateIdentity.AllocL();
+	delete iSIPPrivateIdentity;
+	iSIPPrivateIdentity = tmp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetProviderNameL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetProviderNameL(
+    const TDesC8& aProviderName)
+	{
+	HBufC8* tmp = aProviderName.AllocL();
+	delete iSIPProviderName;
+	iSIPProviderName = tmp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ProviderName
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const TDesC8& CSIPConcreteProfile::ProviderName() const
+	{
+	return *iSIPProviderName;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionParameter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt
+CSIPConcreteProfile::ExtensionParameter(TUint aID, TUint32& aValue) const
+	{
+	TInt index = ExtensionIntParamIndex(aID);
+	if (index != KErrNotFound)
+		{
+		aValue = iExtensionIntParams[index].Value();
+		return KErrNone;
+		}
+
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionParameter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionParameter(
+    TUint aID,
+    TBool& aValue) const
+	{
+	TInt index = ExtensionBoolParamIndex(aID);
+	if (index != KErrNotFound)
+		{
+		aValue = iExtensionBoolParams[index].Value();
+		return KErrNone;
+		}
+
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionParameter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionParameter(
+    TUint aID,
+    TDesC8 const *& aValue) const
+	{
+	TInt index = ExtensionDescrParamIndex(aID);
+	if (index != KErrNotFound)
+		{
+		aValue = &iExtensionDescrParams[index]->Value();
+		return KErrNone;
+		}
+
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionParameter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionParameter(
+    TUint aID,
+    MDesC8Array const *& aValue) const
+	{
+	TInt index = ExtensionDescrArrayParamIndex(aID);
+	if (index != KErrNotFound)
+		{
+		aValue = &iExtensionDescrArrayParams[index]->Value();
+		return KErrNone;
+		}
+
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetExtensionParameterL
+// If parameter with the same ID already exists, remove the old parameter.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPConcreteProfile::SetExtensionParameterL(
+    TUint32 aID, 
+    TUint32 aValue)
+	{
+	TInt index = ExtensionIntParamIndex(aID);
+	if (index != KErrNotFound)
+		{
+		iExtensionIntParams.Remove(index);
+		}
+
+	TExtensionIntParam param(aID, aValue);
+	iExtensionIntParams.AppendL(param);	
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetExtensionParameterL
+// If parameter with the same ID already exists, remove the old parameter.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPConcreteProfile::SetExtensionParameterL(
+    TUint32 aID,
+    TBool aValue)
+	{
+	TInt index = ExtensionBoolParamIndex(aID);
+	if (index != KErrNotFound)
+		{
+		iExtensionBoolParams.Remove(index);			
+		}
+
+	TExtensionBoolParam param(aID, aValue);
+	iExtensionBoolParams.AppendL(param);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetExtensionParameterL
+// If parameter with the same ID already exists, remove the old parameter.
+// -----------------------------------------------------------------------------
+//		 
+EXPORT_C void CSIPConcreteProfile::SetExtensionParameterL(
+    TUint32 aID,
+    const TDesC8& aValue)
+	{
+	TInt index = ExtensionDescrParamIndex(aID);
+	if (index != KErrNotFound)
+		{
+		CExtensionDescrParam* param = iExtensionDescrParams[index];
+		iExtensionDescrParams.Remove(index);
+		delete param;
+		}
+
+	if (aValue.Length() > 0)
+		{		
+		CExtensionDescrParam* param = CExtensionDescrParam::NewLC(aID, aValue);
+		iExtensionDescrParams.AppendL(param);
+		CleanupStack::Pop(param);
+		}
+	
+	TUint32 iVal;
+	if(aID == KSIPAccessPointName && !IapId())
+		{
+		iVal = FetchIAPIDL(aValue);
+		SetIapId(iVal);
+		}
+	
+	
+	if(aID == KSIPSnapName && ExtensionParameter(KSIPSnapId, iVal) != KErrNone )
+		{
+		iVal = FetchSNAPIDL(aValue);
+		SetExtensionParameterL(KSIPSnapId,iVal);
+		}
+
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetExtensionParameterL
+// If parameter with the same ID already exists, remove the old parameter.
+// -----------------------------------------------------------------------------
+//		 
+EXPORT_C void CSIPConcreteProfile::SetExtensionParameterL(
+    TUint32 aID,
+    const MDesC8Array& aValue)
+	{
+	TInt index = ExtensionDescrArrayParamIndex(aID);
+	if (index != KErrNotFound)
+		{	
+		CExtensionDescrArrayParam* param = iExtensionDescrArrayParams[index];
+		iExtensionDescrArrayParams.Remove(index);
+		delete param;
+		}
+
+	if (aValue.MdcaCount() > 0)
+		{
+		CExtensionDescrArrayParam* param =
+			CExtensionDescrArrayParam::NewLC(aID, aValue);
+		iExtensionDescrArrayParams.AppendL(param);
+		CleanupStack::Pop(param);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionIntParamIndex
+// -----------------------------------------------------------------------------
+//
+TInt CSIPConcreteProfile::ExtensionIntParamIndex(TUint32 aID) const
+	{
+	for (TInt i = 0; i < iExtensionIntParams.Count(); ++i)
+		{
+		if (iExtensionIntParams[i].ID() == aID)
+			{
+			return i;
+			}
+		}
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionBoolParamIndex
+// -----------------------------------------------------------------------------
+//
+TInt CSIPConcreteProfile::ExtensionBoolParamIndex(TUint32 aID) const
+	{
+	for (TInt i = 0; i < iExtensionBoolParams.Count(); ++i)
+		{
+		if (iExtensionBoolParams[i].ID() == aID)
+			{
+			return i;
+			}
+		}
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionDescrParamIndex
+// -----------------------------------------------------------------------------
+//
+TInt CSIPConcreteProfile::ExtensionDescrParamIndex(TUint32 aID) const
+	{
+	for (TInt i = 0; i < iExtensionDescrParams.Count(); ++i)
+		{
+		if (iExtensionDescrParams[i]->ID() == aID)
+			{
+			return i;
+			}
+		}
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionDescrArrayParamIndex
+// -----------------------------------------------------------------------------
+//
+TInt CSIPConcreteProfile::ExtensionDescrArrayParamIndex(TUint32 aID) const
+	{
+	for (TInt i = 0; i < iExtensionDescrArrayParams.Count(); ++i)
+		{
+		if (iExtensionDescrArrayParams[i]->ID() == aID)
+			{
+			return i;
+			}
+		}
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetDefault
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetDefault(TBool aOn)
+	{
+	iDefaultProfile = aOn;
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::IsDefault
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TBool CSIPConcreteProfile::IsDefault() const
+	{
+	//This parameter is set as ETrue, only temporarily.
+	//The value of iDefaultProfile is normally EFalse. 
+	return iDefaultProfile;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::EnableSigComp
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::EnableSigComp(TBool aOn)
+	{
+	iSIPSigComp = aOn;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::IsSigCompEnabled
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TBool CSIPConcreteProfile::IsSigCompEnabled() const
+	{
+	return iSIPSigComp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::EnableSecurityNegotiation
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::EnableSecurityNegotiation(TBool aOn)
+	{
+	iSecurityNegotiation = aOn;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::IsSecurityNegotiationEnabled
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TBool CSIPConcreteProfile::IsSecurityNegotiationEnabled() const
+	{
+	return iSecurityNegotiation;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetAutoRegistrationEnabled
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetAutoRegistrationEnabled(TBool aOn)
+	{
+	iSIPAutoRegistered = aOn;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::IsAutoRegistrationEnabled
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TBool CSIPConcreteProfile::IsAutoRegistrationEnabled() const
+	{
+	return iSIPAutoRegistered;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::TStatus
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C CSIPConcreteProfile::TStatus CSIPConcreteProfile::Status() const
+	{
+	return iStatus;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetStatus
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetStatus(
+    CSIPConcreteProfile::TStatus aStatus)
+	{
+	iStatus = aStatus;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ContextId
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TUint32 CSIPConcreteProfile::ContextId() const
+	{
+	return iContextId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetContextId
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetContextId(TUint32 id)
+	{
+	iContextId = id;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetLastRegistrationError
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetLastRegistrationError(TInt aError)
+	{
+	iLastRegistrationError = aError;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::LastRegistrationError
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TInt CSIPConcreteProfile::LastRegistrationError() const
+	{
+	return iLastRegistrationError;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::InternalizeL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C CSIPConcreteProfile* CSIPConcreteProfile::InternalizeL(
+    RReadStream& aReadStream,
+    TBool aAll)
+	{
+	CSIPConcreteProfile* self = new(ELeave)CSIPConcreteProfile();
+	CleanupStack::PushL(self);
+	self->DoInternalizeL(aReadStream, aAll);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExternalizeL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::ExternalizeL(
+    RWriteStream& aWriteStream, 
+    TBool aAll) const
+	{
+	TInt i = 0;
+
+	aWriteStream.WriteUint32L(iSIPProfileId);
+
+	aWriteStream.WriteUint32L(iSIPIAPId);
+
+	aWriteStream.WriteInt32L(iSIPProfileType.iSIPProfileName.Length());
+	aWriteStream.WriteL(iSIPProfileType.iSIPProfileName);
+	aWriteStream.WriteUint8L(iSIPProfileType.iSIPProfileClass);
+
+	aWriteStream.WriteInt32L(iSIPRegistrar->Length());
+	aWriteStream.WriteL(*iSIPRegistrar);
+
+	aWriteStream.WriteUint32L(iSIPRegistrarParameter.Count());
+	for (i = 0; i < iSIPRegistrarParameter.Count(); i++)
+		{
+		CSIPProfileParameter* param = iSIPRegistrarParameter[i];
+		param->ExternalizeL(aWriteStream);
+		}
+
+	aWriteStream.WriteUint32L(iSIPRegistrarExtParameter.Count());
+	for (i = 0; i < iSIPRegistrarExtParameter.Count(); i++)
+		{
+		CSIPProfileParameter* param = iSIPRegistrarExtParameter[i];
+		param->ExternalizeL(aWriteStream);
+		}
+
+	aWriteStream.WriteInt32L(iSIPOutboundProxy->Length());
+	aWriteStream.WriteL(*iSIPOutboundProxy);
+
+	aWriteStream.WriteUint32L(iSIPOutboundProxyParameter.Count());
+	for (i = 0; i < iSIPOutboundProxyParameter.Count(); i++)
+		{
+		CSIPProfileParameter* param = iSIPOutboundProxyParameter[i];
+		param->ExternalizeL(aWriteStream);
+		}
+
+	aWriteStream.WriteUint32L(iSIPOutboundProxyExtParameter.Count());
+	for (i = 0; i < iSIPOutboundProxyExtParameter.Count(); i++)
+		{
+		CSIPProfileParameter* param = iSIPOutboundProxyExtParameter[i];
+		param->ExternalizeL(aWriteStream);
+		}
+
+	aWriteStream.WriteInt32L(iSIPProviderName->Length());
+	aWriteStream.WriteL(*iSIPProviderName);
+
+	aWriteStream.WriteInt32L(iSIPPrivateIdentity->Length());
+	aWriteStream.WriteL(*iSIPPrivateIdentity);
+
+	aWriteStream.WriteInt32L(AOR().Length());
+	aWriteStream.WriteL(AOR());
+	
+	aWriteStream.WriteInt8L(iSIPSigComp);
+	aWriteStream.WriteInt8L(iSecurityNegotiation);
+	aWriteStream.WriteInt8L(iSIPAutoRegistered);
+	aWriteStream.WriteInt8L(iDynamicProxyResolving);
+
+    ExternalizeDesArrayL(*iSIPContactHeaderParams,aWriteStream);
+    ExternalizeDesArrayL(*iSIPHeaders,aWriteStream);
+
+	if (aAll) 
+		{
+		aWriteStream.WriteInt8L(iStatus);
+		aWriteStream.WriteUint32L(iContextId);
+		aWriteStream.WriteInt8L(iDefaultProfile);
+		aWriteStream.WriteUint32L(iLastRegistrationError);
+		}
+
+	//Extension parameters
+	aWriteStream.WriteUint32L(iExtensionIntParams.Count());
+	for (i = 0; i < iExtensionIntParams.Count(); ++i)
+		{
+		iExtensionIntParams[i].ExternalizeL(aWriteStream);
+		}
+	
+	aWriteStream.WriteUint32L(iExtensionBoolParams.Count());
+	for (i = 0; i < iExtensionBoolParams.Count(); ++i)
+		{
+		iExtensionBoolParams[i].ExternalizeL(aWriteStream);
+		}
+	
+	aWriteStream.WriteUint32L(iExtensionDescrParams.Count());
+	for (i = 0; i < iExtensionDescrParams.Count(); ++i)
+		{
+		iExtensionDescrParams[i]->ExternalizeL(aWriteStream);
+		}
+		
+	aWriteStream.WriteUint32L(iExtensionDescrArrayParams.Count());
+	for (i = 0; i < iExtensionDescrArrayParams.Count(); ++i)
+		{
+		iExtensionDescrArrayParams[i]->ExternalizeL(aWriteStream);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExternalizedSizeL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TUint CSIPConcreteProfile::ExternalizedSizeL(TBool aAll) const
+	{	
+	TUint size = 14 * sizeof(TUint32) +
+				 5 * sizeof(TInt8) +
+				 iSIPProfileType.iSIPProfileName.Length() +
+  			     iSIPRegistrar->Length() +
+			     iSIPOutboundProxy->Length() +
+			     iSIPProviderName->Length() +
+			     iSIPPrivateIdentity->Length() +
+			     AOR().Length();
+	TInt i(0);
+	for (i = 0; i < iSIPRegistrarParameter.Count(); i++)
+		{
+		CSIPProfileParameter* param = iSIPRegistrarParameter[i];
+		size = size + param->ExternalizedSizeL();
+		}
+
+	for (i = 0; i < iSIPRegistrarExtParameter.Count(); i++)
+		{
+		CSIPProfileParameter* param = iSIPRegistrarExtParameter[i];
+		size = size + param->ExternalizedSizeL();
+		}
+
+	for (i = 0; i < iSIPOutboundProxyParameter.Count(); i++)
+		{
+		CSIPProfileParameter* param = iSIPOutboundProxyParameter[i];
+		size = size + param->ExternalizedSizeL();
+		}
+
+	for (i = 0; i < iSIPOutboundProxyExtParameter.Count(); i++)
+		{
+		CSIPProfileParameter* param = iSIPOutboundProxyExtParameter[i];
+		size = size + param->ExternalizedSizeL();
+		}
+
+	for (i = 0; i < iSIPContactHeaderParams->Count(); i++)
+		{
+		const TPtrC8& value = (*iSIPContactHeaderParams)[i];
+		size = size + sizeof(TInt32) + value.Length();
+		}
+
+	for (i = 0; i < iSIPHeaders->Count(); i++)
+		{
+		const TPtrC8& value = (*iSIPHeaders)[i];
+		size = size + sizeof(TInt32) + value.Length();
+		}	
+
+	if (aAll)
+		{
+		size = size + 10; // 2 + 8
+		}
+
+	//Every extension parameter array writes a Uint32 that tells how many
+	//elements that array has.
+	const TInt KAmountOfExtensionArrays = 4;
+	size = size + KAmountOfExtensionArrays * sizeof(TUint32);
+
+	for (i = 0; i < iExtensionIntParams.Count(); ++i)
+		{
+		size = size + iExtensionIntParams[i].ExternalizedSizeL();
+		}
+	
+	for (i = 0; i < iExtensionBoolParams.Count(); ++i)
+		{
+		size = size + iExtensionBoolParams[i].ExternalizedSizeL();
+		}
+		
+	for (i = 0; i < iExtensionDescrParams.Count(); ++i)
+		{
+		size = size + iExtensionDescrParams[i]->ExternalizedSizeL();
+		}
+		
+	for (i = 0; i < iExtensionDescrArrayParams.Count(); ++i)
+		{
+		size = size + iExtensionDescrArrayParams[i]->ExternalizedSizeL();
+		}
+
+	return size;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::operator==
+// -----------------------------------------------------------------------------
+//	
+TBool CSIPConcreteProfile::operator==(
+    const CSIPConcreteProfile& aProfile)
+	{
+	iLastComparisonResult = 0;
+
+	if (iSIPProfileId != aProfile.Id())
+		{
+	    iLastComparisonResult = iLastComparisonResult | EId;
+		}
+
+	if (iSIPIAPId != aProfile.IapId())
+		{
+	    iLastComparisonResult = iLastComparisonResult | EIAPId;
+		}
+
+	if	(
+		(iSIPProfileType.iSIPProfileName.Compare(aProfile.ProfileType().iSIPProfileName) != 0)||
+		(iSIPProfileType.iSIPProfileClass != aProfile.ProfileType().iSIPProfileClass)
+		)
+		{
+		iLastComparisonResult = iLastComparisonResult | ETypeInfo;
+		}
+
+	if (iSIPRegistrar->Compare(aProfile.Server(KSIPRegistrar)) != 0)
+		{
+	    iLastComparisonResult = iLastComparisonResult | ERegistrar;
+		}
+
+	if (iSIPOutboundProxy->Compare(aProfile.Server(KSIPOutboundProxy)) != 0)
+		{
+	    iLastComparisonResult = iLastComparisonResult | EOutboundProxy;
+		}
+
+	if (iSIPPrivateIdentity->Compare(aProfile.PrivateIdentity()) != 0)
+		{
+	    iLastComparisonResult = iLastComparisonResult | EPrivateIdentity;
+		}
+
+	if (iSIPProviderName->Compare(aProfile.ProviderName()) != 0)
+		{
+	    iLastComparisonResult = iLastComparisonResult | EName;
+		}
+
+
+	if ((iSIPRegistrarParameter.Count() != aProfile.iSIPRegistrarParameter.Count())||
+		(ServerParameter(KSIPRegistrar, KSIPDigestRealm).
+		Compare(aProfile.ServerParameter(KSIPRegistrar, KSIPDigestRealm)) != 0)||
+		(ServerParameter(KSIPRegistrar, KSIPDigestUserName).
+		Compare(aProfile.ServerParameter(KSIPRegistrar, KSIPDigestUserName)) != 0)||
+		(ServerParameter(KSIPRegistrar, KSIPDigestPassword).
+		Compare(aProfile.ServerParameter(KSIPRegistrar, KSIPDigestPassword)) != 0)
+		)
+		{
+	    iLastComparisonResult = iLastComparisonResult | ERegistrarParameters;
+		}
+
+
+	if (iSIPRegistrarExtParameter.Count() != iSIPRegistrarExtParameter.Count())
+		{
+	    iLastComparisonResult = iLastComparisonResult | ERegistrarExtensionParameters;
+		}
+
+	TInt i = 0;
+	if	(iLastComparisonResult != ERegistrarExtensionParameters)
+		{
+		for (i = 0; i < iSIPRegistrarExtParameter.Count(); i++)
+			{
+			CSIPProfileParameter* param = iSIPRegistrarExtParameter[i];
+			if (param->Value().Compare(aProfile.ServerExtensionParameter(KSIPRegistrar,
+																	 param->Key())) != 0)
+				{
+				iLastComparisonResult = iLastComparisonResult | ERegistrarExtensionParameters;
+				}
+			}
+		}
+	
+	if	(
+		(iSIPOutboundProxyParameter.Count() != aProfile.iSIPOutboundProxyParameter.Count())||
+		(ServerParameter(KSIPOutboundProxy, KSIPDigestRealm).
+		Compare(aProfile.ServerParameter(KSIPOutboundProxy, KSIPDigestRealm)) != 0)||
+		(ServerParameter(KSIPOutboundProxy, KSIPDigestUserName).
+		Compare(aProfile.ServerParameter(KSIPOutboundProxy, KSIPDigestUserName)) != 0)||
+		(ServerParameter(KSIPOutboundProxy, KSIPDigestPassword).
+		Compare(aProfile.ServerParameter(KSIPOutboundProxy, KSIPDigestPassword)) != 0)
+		)
+		{
+		iLastComparisonResult = iLastComparisonResult | EOutboundProxyParameters;
+		}		
+		
+	if (iSIPOutboundProxyExtParameter.Count() != 
+	    aProfile.iSIPOutboundProxyExtParameter.Count())
+		{
+	    iLastComparisonResult = iLastComparisonResult | EOutboundProxyExtensionParameters;
+		}
+
+	if	(iLastComparisonResult != EOutboundProxyExtensionParameters)
+		{
+		for (i = 0; i < iSIPOutboundProxyExtParameter.Count(); i++)
+			{
+			CSIPProfileParameter* param = iSIPOutboundProxyExtParameter[i];
+			if (param->Value().Compare(
+			        aProfile.ServerExtensionParameter(KSIPOutboundProxy,param->Key())) != 0)
+				{
+				iLastComparisonResult = 
+				    iLastComparisonResult | EOutboundProxyExtensionParameters;
+				}
+			}
+		}
+	
+    TInt aorComparisonErr = iSIPAORUri8->Uri().Equivalent(aProfile.AORUri8());
+	if (aorComparisonErr != KErrNone && 
+	    aorComparisonErr != KErrNoMemory)
+		{
+	    iLastComparisonResult = iLastComparisonResult | EAOR;
+		}
+
+	if (iSIPSigComp != aProfile.IsSigCompEnabled())
+		{
+		iLastComparisonResult = iLastComparisonResult | ESigComp;
+		}
+
+	if (iSecurityNegotiation != aProfile.IsSecurityNegotiationEnabled()) 
+		{
+		iLastComparisonResult = iLastComparisonResult | ESecurityNegotiation;
+		}
+
+	if (iSIPAutoRegistered != aProfile.IsAutoRegistrationEnabled()) 
+		{
+		iLastComparisonResult = iLastComparisonResult | EAutoRegistration;
+		}
+
+	if (iDynamicProxy->Compare(aProfile.DynamicProxy()) != 0)
+		{
+		iLastComparisonResult = iLastComparisonResult | EProxyResolving;
+		}
+	
+	TBool done = EFalse;
+	const MDesC8Array& params = aProfile.ContactHeaderParams();
+	if (iSIPContactHeaderParams->Count() != params.MdcaCount())
+		{
+		iLastComparisonResult = iLastComparisonResult | EContactHeaderParams;
+		done = ETrue;
+		}
+		
+	
+	for (i = 0; i < params.MdcaCount() && !done; i++)
+		{
+		TInt pos = 0;
+
+		if (iSIPContactHeaderParams->Find(params.MdcaPoint(i), pos) != 0)
+			{
+			iLastComparisonResult = iLastComparisonResult | EContactHeaderParams;
+			done = ETrue;
+			}
+		}
+	
+	const MDesC8Array& headers = aProfile.SIPHeaders();	
+	if (iSIPHeaders->Count() != headers.MdcaCount())
+		{
+		iLastComparisonResult = iLastComparisonResult | ESIPHeaders;
+		}
+	for (i = 0; i < headers.MdcaCount(); i++)
+		{
+		TInt pos = 0;
+
+		if (iSIPHeaders->Find(headers.MdcaPoint(i), pos) != 0)
+			{
+			iLastComparisonResult = iLastComparisonResult | ESIPHeaders;
+			}
+		}
+	
+	return iLastComparisonResult == 0;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::LastCompareResult
+// -----------------------------------------------------------------------------
+//	
+TInt32 CSIPConcreteProfile::LastCompareResult() const
+	{
+	return iLastComparisonResult;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::CloneExtensionParamsL
+// -----------------------------------------------------------------------------
+//	
+void CSIPConcreteProfile::CloneExtensionParamsL(
+	CSIPConcreteProfile& aNewCopy) const
+	{
+	TInt i(0);
+	for (i = 0; i < iExtensionIntParams.Count(); ++i)
+		{
+		TExtensionIntParam param = iExtensionIntParams[i];
+		aNewCopy.SetExtensionParameterL(param.ID(), param.Value());
+		}
+		
+	for (i = 0; i < iExtensionBoolParams.Count(); ++i)
+		{
+		TExtensionBoolParam param = iExtensionBoolParams[i];
+		aNewCopy.SetExtensionParameterL(param.ID(), param.Value());
+		}
+
+	for (i = 0; i < iExtensionDescrParams.Count(); ++i)
+		{
+		CExtensionDescrParam* param = iExtensionDescrParams[i];
+		aNewCopy.SetExtensionParameterL(param->ID(), param->Value());
+		}
+		
+	for (i = 0; i < iExtensionDescrArrayParams.Count(); ++i)
+		{
+		CExtensionDescrArrayParam* param = iExtensionDescrArrayParams[i];
+		aNewCopy.SetExtensionParameterL(param->ID(), param->Value());
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetDynamicProxyL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const TDesC8& CSIPConcreteProfile::DynamicProxy() const
+	{
+	return *iDynamicProxy;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetDynamicProxyL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetDynamicProxyL(const TDesC8& aDynamicProxy)
+	{
+	HBufC8* tmp = aDynamicProxy.AllocL();
+	delete iDynamicProxy;
+	iDynamicProxy = tmp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ContactHeaderParams
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const MDesC8Array& CSIPConcreteProfile::ContactHeaderParams() const
+	{
+	return *iSIPContactHeaderParams;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetContactHeaderParamsL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetContactHeaderParamsL(
+	const MDesC8Array& aParams)
+	{
+	CDesC8ArrayFlat* tmp = CopyDesArrayL(aParams);
+    iSIPContactHeaderParams->Reset();
+    delete iSIPContactHeaderParams;
+	iSIPContactHeaderParams = tmp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::RegisteredAORs
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const MDesC8Array& CSIPConcreteProfile::RegisteredAORs() const
+	{
+	return *iSIPRegisteredAORs;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetRegisteredAORsL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetRegisteredAORsL(
+	const MDesC8Array& aParams)
+	{
+	CDesC8ArrayFlat* tmp = CopyDesArrayL(aParams);
+	iSIPRegisteredAORs->Reset();
+	delete iSIPRegisteredAORs;
+	iSIPRegisteredAORs = tmp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::NegotiatedSecurityMechanism
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const TDesC8& CSIPConcreteProfile::NegotiatedSecurityMechanism() const
+	{
+	return *iSIPNegotiatedSecurityMechanism;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetNegotiatedSecurityMechanismL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::SetNegotiatedSecurityMechanismL(
+	const TDesC8& aMechanism)
+	{
+	HBufC8* tmp = aMechanism.AllocL();
+	delete iSIPNegotiatedSecurityMechanism;
+	iSIPNegotiatedSecurityMechanism = tmp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SIPHeaders
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C const MDesC8Array& CSIPConcreteProfile::SIPHeaders() const
+    {
+    return *iSIPHeaders;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetSIPHeadersL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPConcreteProfile::SetSIPHeadersL(const MDesC8Array& aHeaders)
+    {
+	CDesC8ArrayFlat* tmp = CopyDesArrayL(aHeaders);	
+	iSIPHeaders->Reset();
+	delete iSIPHeaders;	
+	iSIPHeaders = tmp;		
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetEnabled
+// -----------------------------------------------------------------------------
+//   
+EXPORT_C void CSIPConcreteProfile::SetEnabled(TBool aIsEnabled)
+    {
+    iIsEnabled = aIsEnabled;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::IsEnabled
+// -----------------------------------------------------------------------------
+//   
+EXPORT_C TBool CSIPConcreteProfile::IsEnabled() const
+    {
+    return iIsEnabled;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetStorageId
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPConcreteProfile::SetStorageId(TUint32 aId)
+    {
+    iStorageId = aId;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::StorageId
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CSIPConcreteProfile::StorageId() const
+    {
+    return iStorageId;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::InternalizeRegisteredAORsL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::InternalizeRegisteredAORsL(
+	RReadStream& aReadStream)
+	{
+	CDesC8ArrayFlat* tmp = InternalizeDesArrayL(aReadStream);
+	iSIPRegisteredAORs->Reset();
+	delete iSIPRegisteredAORs;
+	iSIPRegisteredAORs = tmp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExternalizeRegisteredAORsL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CSIPConcreteProfile::ExternalizeRegisteredAORsL(
+	RWriteStream& aWriteStream) const
+	{
+	ExternalizeDesArrayL(*iSIPRegisteredAORs,aWriteStream);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExternalizedRegisteredAORsSizeL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TUint CSIPConcreteProfile::ExternalizedRegisteredAORsSizeL() const
+	{
+	TUint size = sizeof(TUint32);
+	for (TInt i = 0; i < iSIPRegisteredAORs->Count(); i++)
+		{
+		const TPtrC8& value = (*iSIPRegisteredAORs)[i];
+		size = size + sizeof(TInt32);
+		size = size + value.Length();
+		}
+	return size;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionBoolParameterCount
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionBoolParameterCount() const
+	{
+	return iExtensionBoolParams.Count();
+	}	
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionDesArrayParameterCount
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionDesArrayParameterCount() const
+	{
+	return iExtensionDescrArrayParams.Count();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionDesParameterCount
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionDesParameterCount() const
+	{
+	return iExtensionDescrParams.Count();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionIntParameterCount
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionIntParameterCount() const
+	{
+	return iExtensionIntParams.Count();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionParameter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionParameter(
+	TInt aIndex,
+	TUint& aID,
+	TUint32& aValue) const
+	{
+	TInt retVal(KErrNotFound);
+	if (aIndex < iExtensionIntParams.Count())	
+		{
+		aID = iExtensionIntParams[aIndex].ID();
+		aValue = iExtensionIntParams[aIndex].Value();
+		retVal = KErrNone;
+		}
+	return retVal;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionParameter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionParameter(
+	TInt aIndex,
+	TUint& aID,
+	TBool& aValue ) const
+	{
+	TInt retVal(KErrNotFound);
+	if (aIndex < iExtensionBoolParams.Count())	
+		{
+		aID = iExtensionBoolParams[aIndex].ID();
+		aValue = iExtensionBoolParams[aIndex].Value();
+		retVal = KErrNone;
+		}
+	return retVal;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionParameter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionParameter(
+	TInt aIndex,
+	TUint& aID,
+	MDesC8Array const *& aValue ) const
+	{
+	TInt retVal(KErrNotFound);
+	if (aIndex < iExtensionDescrArrayParams.Count())	
+		{
+		aID = iExtensionDescrArrayParams[aIndex]->ID();
+		aValue = &iExtensionDescrArrayParams[aIndex]->Value();
+		retVal = KErrNone;
+		}
+	return retVal;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExtensionParameter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ExtensionParameter(
+	TInt aIndex,
+	TUint& aID,
+	TDesC8 const *& aValue ) const
+	{
+	TInt retVal(KErrNotFound);
+	if (aIndex < iExtensionDescrParams.Count())	
+		{
+		aID = iExtensionDescrParams[aIndex]->ID();
+		aValue = &iExtensionDescrParams[aIndex]->Value();
+		retVal = KErrNone;
+		}
+	return retVal;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ServerExtensionParameter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ServerExtensionParameter(
+	TUint32 aServer,
+	TInt aIndex,
+	TDesC8 const *& aKey,
+	TDesC8 const *& aValue) const
+	{
+	TInt retVal(KErrNotFound);
+	switch(aServer) 
+			{
+			case KSIPOutboundProxy:
+				{
+				if (aIndex < iSIPOutboundProxyExtParameter.Count())
+					{
+					aKey = &iSIPOutboundProxyExtParameter[aIndex]->Key();
+					aValue = &iSIPOutboundProxyExtParameter[aIndex]->Value();
+					retVal = KErrNone;
+					}
+				break;
+				}
+			case KSIPRegistrar:
+				{
+				if (aIndex < iSIPRegistrarExtParameter.Count())
+					{
+					aKey = &iSIPRegistrarExtParameter[aIndex]->Key();
+					aValue = &iSIPRegistrarExtParameter[aIndex]->Value();
+					retVal = KErrNone;
+					}
+				break;
+				}
+			default:
+				break;
+			}
+	return retVal;		
+	}
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ServerExtensionParameterCount
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ServerExtensionParameterCount(
+	TUint32 aServer) const
+	{
+	switch(aServer) 
+		{
+		case KSIPOutboundProxy:
+			return  iSIPOutboundProxyExtParameter.Count();
+		case KSIPRegistrar:
+			return iSIPRegistrarExtParameter.Count();
+		default:
+			return KErrNotFound;	
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ServerParameter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ServerParameter(
+	TUint32 aServer, 
+	TInt aIndex,
+	TUint& aID,
+	TDesC8 const *& aValue) const
+	{
+	TInt retVal(KErrNotFound);
+	TLex8 lex;
+	switch(aServer) 
+			{
+			case KSIPOutboundProxy:
+				{
+				if (aIndex < iSIPOutboundProxyParameter.Count())
+					{
+					lex.Assign(iSIPOutboundProxyParameter[aIndex]->Key());
+					lex.Val(aID);
+					aValue = &iSIPOutboundProxyParameter[aIndex]->Value();
+					retVal = KErrNone;
+					}
+				break;
+				}
+			case KSIPRegistrar:
+				{
+				if (aIndex < iSIPRegistrarParameter.Count())
+					{
+					lex.Assign(iSIPRegistrarParameter[aIndex]->Key());
+					lex.Val(aID);
+					aValue = &iSIPRegistrarParameter[aIndex]->Value();
+					retVal = KErrNone;
+					}
+				break;
+				}
+			default:
+				break;
+			}
+	return retVal;		
+	}
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ServerParameterCount
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPConcreteProfile::ServerParameterCount(
+	TUint32 aServer) const
+	{
+	switch(aServer) 
+		{
+		case KSIPOutboundProxy:
+			return  iSIPOutboundProxyParameter.Count();
+		case KSIPRegistrar:
+			return iSIPRegistrarParameter.Count();
+		default:
+			return KErrNotFound;	
+		}
+	}
+// CSIPConcreteProfile::DoInternalizeL
+// -----------------------------------------------------------------------------
+//	
+void CSIPConcreteProfile::DoInternalizeL(RReadStream& aReadStream, TBool aAll)
+	{
+	iDynamicProxy = HBufC8::NewL(0);
+	iSIPRegisteredAORs = new (ELeave) CDesC8ArrayFlat(1);
+	iSIPNegotiatedSecurityMechanism = HBufC8::NewL(0);
+
+	iSIPProfileId = aReadStream.ReadUint32L();
+	iSIPIAPId = aReadStream.ReadUint32L();
+
+	TInt32 typeLength = aReadStream.ReadInt32L();
+	__ASSERT_ALWAYS(typeLength >= 0, User::Leave(KErrCorrupt));
+	__ASSERT_ALWAYS(typeLength < KMaxTInt/2, User::Leave (KErrCorrupt));
+	HBufC8* typeBuf = HBufC8::NewL (typeLength);
+	CleanupStack::PushL(typeBuf);
+	TPtr8 type(typeBuf->Des());
+	aReadStream.ReadL (type, typeLength);
+	iSIPProfileType.iSIPProfileName = *typeBuf;
+	CleanupStack::PopAndDestroy(typeBuf);
+	iSIPProfileType.iSIPProfileClass = 
+		(enum TSIPProfileTypeInfo::TSIPProfileClass) aReadStream.ReadUint8L();
+		
+	InternalizeRegistrarL(aReadStream);	
+	InternalizeProxyL(aReadStream);
+
+	TInt32 providerLength = aReadStream.ReadInt32L();
+	__ASSERT_ALWAYS(providerLength >= 0, User::Leave(KErrCorrupt));
+	__ASSERT_ALWAYS(providerLength < KMaxTInt/2, User::Leave (KErrCorrupt));
+	iSIPProviderName = HBufC8::NewL (providerLength);
+	TPtr8 provider(iSIPProviderName->Des());
+	aReadStream.ReadL (provider, providerLength);
+
+	TInt32 privateLength = aReadStream.ReadInt32L();
+	__ASSERT_ALWAYS(privateLength >= 0, User::Leave(KErrCorrupt));
+	__ASSERT_ALWAYS(privateLength < KMaxTInt/2, User::Leave (KErrCorrupt));
+	iSIPPrivateIdentity = HBufC8::NewL (privateLength);
+	TPtr8 priv(iSIPPrivateIdentity->Des());
+	aReadStream.ReadL (priv, privateLength);
+
+	TInt32 aorLength = aReadStream.ReadInt32L();
+	__ASSERT_ALWAYS(aorLength >= 0, User::Leave(KErrCorrupt));
+	__ASSERT_ALWAYS(aorLength < KMaxTInt/2, User::Leave (KErrCorrupt));
+	HBufC8* tmpAorBuf = HBufC8::NewLC(aorLength);
+	TPtr8 aorPtr(tmpAorBuf->Des());
+	aReadStream.ReadL(aorPtr, aorLength);
+	SetAORL(aorPtr);
+	CleanupStack::PopAndDestroy(tmpAorBuf);
+
+	iSIPSigComp = aReadStream.ReadInt8L();
+	iSecurityNegotiation = aReadStream.ReadInt8L();
+	iSIPAutoRegistered = aReadStream.ReadInt8L();
+	iDynamicProxyResolving = aReadStream.ReadInt8L();
+
+	iSIPContactHeaderParams = InternalizeDesArrayL(aReadStream);
+    iSIPHeaders = InternalizeDesArrayL(aReadStream);
+
+	if (aAll) 
+		{
+		iStatus = (enum TStatus) aReadStream.ReadUint8L();
+		iContextId = aReadStream.ReadUint32L();
+		iDefaultProfile = aReadStream.ReadInt8L();
+		iLastRegistrationError = aReadStream.ReadUint32L();
+		}
+	else 
+		{
+		iStatus = EUnregistered;
+		iContextId = 0;
+		iDefaultProfile = EFalse;
+		iLastRegistrationError = KErrNone;
+		}
+	
+	InternalizeExtensionParamsL(aReadStream);
+
+    // The Contact-header's user-part must be unique present in all profiles. 
+    // If the profile is imported from an older platform 
+    // that does not have SIP 6.0, generate KSIPContactHeaderUser-parameter 
+    // to preserve data compatibility.
+    // This profile can also be returned to the older platform
+    // as KSIPContactHeaderUser is an extension parameter.
+    if (ExtensionDescrParamIndex(KSIPContactHeaderUser) < 0)
+        {
+	    HBufC8* username = CreateContactUserNameLC();
+	    SetExtensionParameterL(KSIPContactHeaderUser,*username);
+	    CleanupStack::PopAndDestroy(username);
+        }
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::InternalizeRegistrarL
+// -----------------------------------------------------------------------------
+//	
+void CSIPConcreteProfile::InternalizeRegistrarL(RReadStream& aReadStream)
+	{
+	TUint i = 0;
+	TInt32 registrarLength = aReadStream.ReadInt32L();
+	__ASSERT_ALWAYS(registrarLength >= 0, User::Leave(KErrCorrupt));
+	__ASSERT_ALWAYS(registrarLength < KMaxTInt/2, User::Leave (KErrCorrupt));
+	iSIPRegistrar = HBufC8::NewL (registrarLength);
+	TPtr8 registrar(iSIPRegistrar->Des());
+	aReadStream.ReadL (registrar, registrarLength);
+
+	TUint count = aReadStream.ReadUint32L();
+	for (i = 0; i < count; i++)
+		{
+		CSIPProfileParameter* param = 
+		    CSIPProfileParameter::InternalizeL(aReadStream);
+		CleanupStack::PushL(param);
+		iSIPRegistrarParameter.AppendL(param);
+		CleanupStack::Pop(param);
+		}
+
+	count = aReadStream.ReadUint32L();
+	for (i = 0; i < count; i++)
+		{
+		CSIPProfileParameter* param = 
+		    CSIPProfileParameter::InternalizeL(aReadStream);
+		CleanupStack::PushL(param);
+		iSIPRegistrarExtParameter.AppendL(param);
+		CleanupStack::Pop(param);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::InternalizeProxyL
+// -----------------------------------------------------------------------------
+//	
+void CSIPConcreteProfile::InternalizeProxyL(RReadStream& aReadStream)
+	{
+	TUint i = 0;
+	TInt32 proxyLength = aReadStream.ReadInt32L();
+	__ASSERT_ALWAYS(proxyLength >= 0, User::Leave(KErrCorrupt));
+	__ASSERT_ALWAYS(proxyLength < KMaxTInt/2, User::Leave (KErrCorrupt));
+	iSIPOutboundProxy = HBufC8::NewL (proxyLength);
+	TPtr8 proxy(iSIPOutboundProxy->Des());
+	aReadStream.ReadL (proxy, proxyLength);
+
+	TUint count = aReadStream.ReadUint32L();
+	for (i = 0; i < count; i++)
+		{
+		CSIPProfileParameter* param = 
+		    CSIPProfileParameter::InternalizeL(aReadStream);
+		CleanupStack::PushL(param);
+		iSIPOutboundProxyParameter.AppendL(param);
+		CleanupStack::Pop(param);
+		}
+
+	count = aReadStream.ReadUint32L();
+	for (i = 0; i < count; i++)
+		{
+		CSIPProfileParameter* param = 
+		    CSIPProfileParameter::InternalizeL(aReadStream);
+		CleanupStack::PushL(param);
+		iSIPOutboundProxyExtParameter.AppendL(param);
+		CleanupStack::Pop(param);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::InternalizeExtensionParamsL
+// -----------------------------------------------------------------------------
+//	
+void CSIPConcreteProfile::InternalizeExtensionParamsL(RReadStream& aReadStream)
+	{
+	TUint count = aReadStream.ReadUint32L();
+	TUint i(0);
+	for (i = 0; i < count; ++i)
+		{
+		TExtensionIntParam param =
+			TExtensionIntParam::InternalizeL(aReadStream);
+		iExtensionIntParams.AppendL(param);
+		}
+	
+	count = aReadStream.ReadUint32L();
+	for (i = 0; i < count; ++i)
+		{
+		TExtensionBoolParam param =
+			TExtensionBoolParam::InternalizeL(aReadStream);
+		iExtensionBoolParams.AppendL(param);
+		}
+	
+	count = aReadStream.ReadUint32L();
+	for (i = 0; i < count; ++i)
+		{
+		CExtensionDescrParam* param =
+			CExtensionDescrParam::InternalizeL(aReadStream);
+		CleanupStack::PushL(param);
+		iExtensionDescrParams.AppendL(param);
+		CleanupStack::Pop(param);
+		}
+	
+	count = aReadStream.ReadUint32L();
+	for (i = 0; i < count; ++i)
+		{
+		CExtensionDescrArrayParam* param =
+			CExtensionDescrArrayParam::InternalizeL(aReadStream);
+		CleanupStack::PushL(param);
+		iExtensionDescrArrayParams.AppendL(param);
+		CleanupStack::Pop(param);
+		}	
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::IndexOf
+// -----------------------------------------------------------------------------
+//	
+TInt CSIPConcreteProfile::IndexOf(const TDesC8& aKey, 
+	const RPointerArray<CSIPProfileParameter>* aArray) const
+	{
+	TInt index = KErrNotFound;
+	TBool found = EFalse;
+
+	for (TInt i = 0; i < aArray->Count() && !found; i ++)
+		{
+		if ((*aArray)[i]->Key().Compare(aKey) == 0)
+			{
+			index = i;
+			found = ETrue;
+			}
+		}
+	return index;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetOutboundProxyL
+// -----------------------------------------------------------------------------
+//	
+void CSIPConcreteProfile::SetOutboundProxyL(const TDesC8& aOutboundProxy)
+	{
+	HBufC8* tmp = aOutboundProxy.AllocL();
+	delete iSIPOutboundProxy;
+	iSIPOutboundProxy = tmp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetRegistrarL
+// -----------------------------------------------------------------------------
+//	
+void CSIPConcreteProfile::SetRegistrarL(const TDesC8& aRegistrar)
+	{
+	HBufC8* tmp = aRegistrar.AllocL();
+	delete iSIPRegistrar;
+	iSIPRegistrar = tmp;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::SetParameterL
+// -----------------------------------------------------------------------------
+//	
+void CSIPConcreteProfile::SetParameterL(
+	RPointerArray<CSIPProfileParameter>* aArray, 
+	const TDesC8& aName, 
+	const TDesC8& aValue)
+	{
+	TInt index = IndexOf(aName, aArray);
+	if (index != KErrNotFound) 
+		{
+		CSIPProfileParameter* parameter = (*aArray)[index];
+		aArray->Remove(index);
+		delete parameter;
+
+		if(aValue.Length() > 0)
+			{
+			parameter = CSIPProfileParameter::NewLC(aName, aValue);
+			aArray->AppendL(parameter);
+			CleanupStack::Pop(parameter);
+			}
+		}
+	else
+		{
+		if(aValue.Length() > 0)
+			{
+			CSIPProfileParameter* parameter = 
+				CSIPProfileParameter::NewLC(aName, aValue);
+			aArray->AppendL(parameter);
+			CleanupStack::Pop(parameter);
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::Parameter
+// -----------------------------------------------------------------------------
+//	
+const TDesC8& CSIPConcreteProfile::Parameter(
+	const RPointerArray<CSIPProfileParameter>* aArray, 
+	const TDesC8& aName) const
+	{
+	TInt index = IndexOf(aName, aArray);
+
+	if (index != KErrNotFound) 
+		return (*aArray)[index]->Value();
+
+	return KNullDesC8;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ExternalizeDesArrayL
+// -----------------------------------------------------------------------------
+//	
+void CSIPConcreteProfile::ExternalizeDesArrayL(const MDesC8Array& aArray, 
+		                                       RWriteStream& aWriteStream)
+    {
+	aWriteStream.WriteUint32L(aArray.MdcaCount());
+	for (TInt i = 0; i < aArray.MdcaCount(); i++)
+		{
+		const TPtrC8& value = aArray.MdcaPoint(i);
+		aWriteStream.WriteInt32L(value.Length());
+		aWriteStream.WriteL(value);
+		}    
+    }
+    
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::InternalizeDesArrayL
+// -----------------------------------------------------------------------------
+//    
+CDesC8ArrayFlat* 
+CSIPConcreteProfile::InternalizeDesArrayL(RReadStream& aReadStream)
+    {
+	CDesC8ArrayFlat* array = new (ELeave) CDesC8ArrayFlat(1);
+	CleanupStack::PushL(array);
+	TInt count = aReadStream.ReadUint32L();
+	for (TInt i = 0; i < count; i++)
+		{
+		TInt32 valueLen = aReadStream.ReadInt32L();
+		__ASSERT_ALWAYS(valueLen >= 0, User::Leave(KErrCorrupt));
+		__ASSERT_ALWAYS(valueLen < KMaxTInt/2, User::Leave (KErrCorrupt));
+		HBufC8* valueBuf = HBufC8::NewLC(valueLen);
+		TPtr8 value = valueBuf->Des();
+		aReadStream.ReadL (value, valueLen);
+		array->AppendL(*valueBuf);
+		CleanupStack::PopAndDestroy(valueBuf);
+		}
+    CleanupStack::Pop(array);
+    return array;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::CopyDesArrayL
+// -----------------------------------------------------------------------------
+//    
+CDesC8ArrayFlat* CSIPConcreteProfile::CopyDesArrayL(const MDesC8Array& aArray)
+    {
+	CDesC8ArrayFlat* tmp = new (ELeave) CDesC8ArrayFlat(1);
+	CleanupStack::PushL(tmp);
+	for (TInt i = 0; i < aArray.MdcaCount(); i++)
+		{
+		tmp->AppendL(aArray.MdcaPoint(i));
+		}
+	CleanupStack::Pop(tmp);
+	return tmp;    
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::CreateContactUserNameLC
+// -----------------------------------------------------------------------------
+//
+HBufC8* CSIPConcreteProfile::CreateContactUserNameLC() const
+    {
+    CSystemRandom* random = CSystemRandom::NewLC();
+    HBufC8* data = HBufC8::NewLC(KContactUserNameLength);
+    TPtr8 dataPtr(data->Des());
+    dataPtr.FillZ(dataPtr.MaxLength());
+    random->GenerateBytesL(dataPtr);
+    
+    HBufC8* result = HBufC8::NewLC(KContactUserNameLength);
+    TPtr8 resultPtr(result->Des());
+    
+    //2^6 = 64 valid chars that can be put to descriptor
+	const TInt KMaxBitsReturned = 6;
+	_LIT8(KValidChars,
+          "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_");
+	TUint counter = 0;
+	for (TInt i = 0; i < KContactUserNameLength; i++)
+		{
+		TInt index = 
+		    GetNextBits(*data,KMaxBitsReturned,counter)%KValidChars().Length();
+		resultPtr.Append(KValidChars()[index]);
+		}
+
+	CleanupStack::Pop(result);   
+    CleanupStack::PopAndDestroy(data);
+    CleanupStack::PopAndDestroy(random);
+    CleanupStack::PushL(result);
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::GetNextBits
+// -----------------------------------------------------------------------------
+//
+TUint8 CSIPConcreteProfile::GetNextBits(
+    const TDesC8& aBuf, 
+    TInt aBits, 
+    TUint& aCounter) const
+	{
+	if (aBuf.Length() == 0)
+		{
+		return 0;
+		}
+
+	//Amount of aBits long bit sequences in aBuf
+	TUint sixBitItems = aBuf.Length() * KBitsInByte / aBits;
+
+	if (aCounter >= sixBitItems)
+		{
+		aCounter = 0;
+		}
+
+	//The position in aBuf, of the byte containing the first bit of the aBits
+	//long bit sequence. Zero means the first byte.
+	TInt startByte = aCounter * aBits / KBitsInByte;
+	TUint16 result = static_cast<TUint16>(aBuf[startByte] << KBitsInByte);
+
+	if (++startByte >= aBuf.Length())
+		{
+		startByte = 0;
+		}
+	
+	result = static_cast<TUint16>(result | aBuf[startByte]);
+	
+	
+	//The position of the first bit of the aBits long bit sequence, within the
+	//byte. Zero means the first bit.
+	TUint offsetInsideByte = (aCounter * aBits) % KBitsInByte;
+
+	//Remove excess bits from the result
+	result = static_cast<TUint16>(result << offsetInsideByte);	
+	result >>= ((2 * KBitsInByte) - aBits);
+	
+    aCounter++;
+    return static_cast<TUint8>(result);
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::FetchIAPIDL
+// -----------------------------------------------------------------------------
+//
+TUint32 CSIPConcreteProfile::FetchIAPIDL(const TDesC8& aValue)
+	{
+	TUint32 iVal(0);
+	TBuf16<1024> recordname;
+	recordname.SetLength(aValue.Length());
+	CnvUtfConverter::ConvertToUnicodeFromUtf8(recordname,aValue);
+	CMDBSession* db = CMDBSession::NewLC( KCDVersion1_1);
+	db->SetAttributeMask( ECDHidden );
+	CCDIAPRecord* ptrIAPRecord = static_cast<CCDIAPRecord *>(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord));
+	CleanupStack::PushL( ptrIAPRecord );
+	ptrIAPRecord->iRecordName.SetMaxLengthL(recordname.Length());
+	ptrIAPRecord->iRecordName = recordname;
+	if(ptrIAPRecord->FindL(*db))
+		{
+	      ptrIAPRecord->LoadL( *db );
+	      iVal = ptrIAPRecord->RecordId();
+		}
+	else
+	    {
+		  User::Leave(KErrNotFound);
+		}
+	CleanupStack::PopAndDestroy( ptrIAPRecord );
+	CleanupStack::PopAndDestroy( db );
+	return iVal;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::FetchSNAPIDL
+// -----------------------------------------------------------------------------
+//
+TUint32 CSIPConcreteProfile::FetchSNAPIDL(const TDesC8& aValue)
+	{
+	TUint32 iVal(0);
+	TBuf16<1024> recordname;
+	recordname.SetLength(aValue.Length());
+	CnvUtfConverter::ConvertToUnicodeFromUtf8(recordname,aValue);
+	CMDBSession* db = CMDBSession::NewLC( KCDVersion1_1);
+	db->SetAttributeMask( ECDHidden );
+	CCDAccessPointRecord* ptrAPRecord = static_cast<CCDAccessPointRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdAccessPointRecord));
+	CleanupStack::PushL(ptrAPRecord);
+	ptrAPRecord->iRecordName.SetMaxLengthL(recordname.Length());
+	ptrAPRecord->iRecordName = recordname;
+	if(ptrAPRecord->FindL(*db))
+		{
+	      ptrAPRecord->LoadL( *db );
+	      iVal = ptrAPRecord->RecordId();
+	   	}
+	else
+	    {
+		  User::Leave(KErrNotFound);
+		}
+	CleanupStack::PopAndDestroy( ptrAPRecord );
+	CleanupStack::PopAndDestroy( db );
+	return iVal;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPConcreteProfile::ValidateProfileParamsL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPConcreteProfile::ValidateProfileParamsL() 
+	{
+	TBool res(ETrue);
+	TUint32 iVal(0);
+	const TDesC8* aSnapName(NULL);
+	const TDesC8* aIAPName(NULL);
+		
+	if ( ExtensionParameter(KSIPSnapName,aSnapName) == KErrNone)
+		{
+			if(ExtensionParameter(KSIPSnapId,iVal) == KErrNone)
+			{
+				if (iVal != FetchSNAPIDL(*aSnapName))
+					res=EFalse;
+			}
+			else
+				res = ETrue;
+		}
+		
+	if ( ExtensionParameter(KSIPAccessPointName,aIAPName) == KErrNone)
+		{
+			if (IapId() != FetchIAPIDL(*aIAPName))
+			res=EFalse;
+		}
+	// Checking for the case of a Profile created without any Connection related Parameters.
+	//In such cases the SNAP Id will be set to a Unique value which will be later used to retrieve the Default SNAP.
+	if((ExtensionParameter(KSIPSnapId,iVal)!=KErrNone) && IapId() == 0)
+		{
+		PROFILE_DEBUG3("CSIPConcreteProfile::ValidateProfileParamsL.. Setting SNAP ID with 25000 as IAP is: ", 0)
+		PROFILE_DEBUG3("Exceptional SNAP Entry verifier :", KDefaultSNAPIdentifier)
+		SetExtensionParameterL(KSIPSnapId,KDefaultSNAPIdentifier);
+		}
+	return res;
+	}