realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileCSSession.cpp
changeset 0 307788aac0a8
child 2 1e1cc61f56c3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileCSSession.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,950 @@
+// 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        : sipprofilecssession
+// Part of     : SIP Profile Server
+// implementation
+// Version     : 1.0
+//
+
+
+
+// INCLUDE FILES
+#include "SipProfileCSServer.h"
+#include "SipProfileCSSession.h"
+#include "sipconcreteprofile.h"
+#include "sipconcreteprofileholder.h"
+#include "sipprofileslots.h"
+#include "sipprofileplugins.h"
+#include "SipProfileLog.h"
+#include "sipprofile.h"
+#include "sipmanagedprofile.h"
+#include <s32mem.h>
+
+const TUint KBufferSize = 100;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPProfileCSSession* CSIPProfileCSSession::NewL(CSIPProfileCSServer& aServer,
+												 CSIPProfileServerCore& aCore)
+	{
+    CSIPProfileCSSession* self = CSIPProfileCSSession::NewLC(aServer, aCore);
+    CleanupStack::Pop(self);
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPProfileCSSession* CSIPProfileCSSession::NewLC(CSIPProfileCSServer& aServer,
+									 			  CSIPProfileServerCore& aCore)
+	{
+    CSIPProfileCSSession* self =
+    	new (ELeave) CSIPProfileCSSession(aServer, aCore);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::CSIPProfileCSSession
+// -----------------------------------------------------------------------------
+//
+ CSIPProfileCSSession::CSIPProfileCSSession(CSIPProfileCSServer& aServer,
+							  				CSIPProfileServerCore& aCore) :
+	iProfileServer(aServer),
+  	iCore(aCore),
+  	iClientReadyToReceive(EFalse),
+  	iSessionTerminated(EFalse),
+  	iALRObserverExists(EFalse)
+	{
+    iProfileServer.IncrementSessions();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::ConstructL()
+	{
+	iCore.SessionRegisterL(*this);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::~CSIPProfileCSSession
+// -----------------------------------------------------------------------------
+//
+CSIPProfileCSSession::~CSIPProfileCSSession()
+	{
+	iCore.SessionCleanup(*this);
+	iEventQueue.Close();
+    iProfileServer.DecrementSessions();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::PanicClient
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::PanicClient(TInt aError)
+	{
+    if (iClientReadyToReceive)
+        {
+		iEventMessage.Panic(KSipProfileServerName, aError);
+		}
+	iSessionTerminated = ETrue;	
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::ServiceL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::ServiceL(const RMessage2& aMessage)
+	{
+	TInt function = iHelper.ServiceFunction(aMessage);
+    __ASSERT_ALWAYS (!(iSessionTerminated &&
+		function != ESipProfileItcOpCancelReceive), 
+		aMessage.Panic (KSipProfileServerName, EBadSipSessionHandle));
+		
+#ifndef PLAT_SEC_TEST
+	PROFILE_DEBUG3("ProfileCSSession::ServiceL", function)
+	
+    switch (function)
+		{
+        case ESipProfileItcOpPluginsSize: ProfilePluginsSizeL(aMessage); break;
+
+        case ESipProfileItcOpPlugins: ProfilePluginsL(aMessage); break;
+
+        case ESipProfileItcOpAddProfile: AddProfileL(aMessage); break;
+
+        case ESipProfileItcOpUpdateProfile: UpdateProfileL(aMessage); break;
+
+        case ESipProfileItcOpRemoveProfile: RemoveProfileL(aMessage); break;
+
+        case ESipProfileItcOpEnable: EnableL(aMessage); break;
+
+        case ESipProfileItcOpDisable: DisableL(aMessage); break;
+
+        case ESipProfileItcOpUsage: UsageL(aMessage); break;
+
+        case ESipProfileItcOpProfileSize: SipProfileSizeL (aMessage); break;
+
+        case ESipProfileItcOpProfileSizeDefault: SipProfileSizeDefaultL (aMessage); break;
+
+        case ESipProfileItcOpProfile: SipProfileL (aMessage); break;
+
+        case ESipProfileItcOpProfileRefresh: SipProfileRefreshL (aMessage); break;
+
+        case ESipProfileItcOpProfilesSize: SipProfilesSizeL (aMessage); break;
+
+        case ESipProfileItcOpProfiles: SipProfilesL (aMessage); break;
+
+        case ESipProfileItcOpProfilesSizeByAOR: SipProfilesSizeByAORL (aMessage); break;
+
+        case ESipProfileItcOpProfilesByAOR: SipProfilesByAORL (aMessage); break;
+
+        case ESipProfileItcOpProfilesSizeByType: SipProfilesSizeByTypeL (aMessage); break;
+
+        case ESipProfileItcOpProfilesByType: SipProfilesByTypeL (aMessage); break;
+
+        case ESipProfileItcOpDeleteProfile: DeleteSipProfileL (aMessage); break;
+
+        case ESipProfileItcOpCancelReceive: CancelClientReceiveL (); break;
+
+        case ESipProfileItcOpCreateProfileSize: CreateProfileSizeL (aMessage); break;
+
+        case ESipProfileItcOpCreateProfile: CreateProfileL (aMessage); break;
+ 
+        case ESipProfileItcOpRegisteredAORs: RegisteredAORsL (aMessage); break;
+
+        case ESipProfileItcOpRegisteredAORsSize: RegisteredAORsSizeL (aMessage); break;
+
+        case ESipProfileItcOpNegotiatedSecurity: NegotiatedSecurityL (aMessage); break;
+
+        case ESipProfileItcOpNegotiatedSecuritySize: NegotiatedSecuritySizeL (aMessage); break;
+
+		case ESipProfileItcOpAllowMigration: AllowMigrationL (aMessage); break;
+		
+		case ESipProfileItcOpDisallowMigration: DisallowMigrationL (aMessage); break;
+		
+		case ESipProfileItcOpAddALRObserver: iALRObserverExists = ETrue; break;
+		
+		case ESipProfileItcOpRemoveALRObserver: iALRObserverExists = EFalse; break;
+		
+		case ESipProfileItcOpRefreshIapAvailability: RefreshIapAvailabilityL (aMessage); break;
+
+		case ESipProfileItcOpForceDisable: ForceDisableL(aMessage); break;
+
+        case ESipProfileItcOpReadyToReceive: // Asynchronous. Do not complete yet!
+            ClientReadyToReceiveL (aMessage); return;
+
+
+        default: aMessage.Panic (KSipProfileServerName, EBadRequest); break;
+		}
+#endif	
+	iHelper.CompleteService(aMessage, KErrNone);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::ProfilePluginsSizeL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::ProfilePluginsSizeL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	const CSIPProfilePlugins& plugins = iCore.ProfilePluginsL();
+	ids.iSlot1 = plugins.ExternalizedSize(); 
+	iHelper.WriteL(aMessage, ids);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::ProfilePluginsL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::ProfilePluginsL(const RMessage2& aMessage)
+    {
+	const CSIPProfilePlugins& plugins = iCore.ProfilePluginsL();
+	CBufFlat* buf = ExternalizeLC (plugins);
+	TPtr8 externalized = buf->Ptr(0);
+	iHelper.WriteL(ESipProfileItcArgPlugins, aMessage, externalized);
+	CleanupStack::PopAndDestroy(buf);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::AddProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::AddProfileL(const RMessage2& aMessage)
+    {
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	HBufC8* profileBuf = iHelper.ReadLC(ESipProfileItcArgProfile,aMessage);
+	CSIPConcreteProfile* profile = InternalizeProfileLC(*profileBuf);
+	iCore.AddProfileL(profile, *this);
+	CleanupStack::Pop(profile);
+	CleanupStack::PopAndDestroy(profileBuf);
+	ids.iProfileId = profile->Id(); 
+	iHelper.WriteL(aMessage, ids);
+	iCore.UpdateRegistrationL(profile->Id(), *this);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::UpdateProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::UpdateProfileL(const RMessage2& aMessage)
+    {
+	HBufC8* profileBuf = iHelper.ReadLC(ESipProfileItcArgProfile,aMessage);
+	CSIPConcreteProfile* profile = InternalizeProfileLC(*profileBuf);
+    TBool canProceed = iCore.UpdateProfileToStoreL(profile, *this);
+    CleanupStack::Pop(profile);
+    CleanupStack::PopAndDestroy(profileBuf);
+    if (canProceed)
+    	{
+    	iCore.UpdateRegistrationL(profile->Id(), *this);
+    	}
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::RemoveProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::RemoveProfileL(const RMessage2& aMessage)
+    { 
+	TUint id = iHelper.IPCArgTUintL(ESipProfileItcArgProfileId, aMessage);
+	iCore.RemoveProfileL(id);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::EnableL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::EnableL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	ids.iSlot1 = iCore.EnableProfileL(ids.iProfileId, *this);
+	iHelper.WriteL(aMessage, ids);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::DisableL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::DisableL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	ids.iSlot1 = iCore.DisableProfileL(ids.iProfileId, *this);
+	iHelper.WriteL(aMessage, ids);	
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::ForceDisableL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::ForceDisableL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	ids.iSlot1 = iCore.ForceDisableProfileL(ids.iProfileId, *this);
+	iHelper.WriteL(aMessage, ids);	
+	}
+
+// CSIPProfileCSSession::UsageL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::UsageL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	ids.iSlot1 = iCore.ProfileUsageL(ids.iProfileId);
+	iHelper.WriteL(aMessage, ids);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SipProfileSizeL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SipProfileSizeL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	const CSIPConcreteProfile* profile = iCore.Profile(ids.iProfileId);
+	if (profile) 
+		{
+		CSIPConcreteProfile* clonedProfile = 
+			CloneProfileWithoutPasswordsLC(profile);
+		ids.iSlot1 = clonedProfile->ExternalizedSizeL(); 
+		CleanupStack::PopAndDestroy(clonedProfile);
+		
+		iHelper.WriteL(aMessage, ids);
+		
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SipProfileSizeDefaultL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SipProfileSizeDefaultL(const RMessage2& aMessage)
+	{
+	const CSIPConcreteProfile* profile = iCore.ProfileDefaultL();
+	if (profile)
+		{
+		TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+
+		CSIPConcreteProfile* clonedProfile = 
+			CloneProfileWithoutPasswordsLC(profile);
+		ids.iProfileId = clonedProfile->Id();
+		ids.iSlot1 = clonedProfile->ExternalizedSizeL(); 
+		CleanupStack::PopAndDestroy(clonedProfile);
+
+		iHelper.WriteL(aMessage, ids);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SipProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SipProfileL(const RMessage2& aMessage)
+	{
+	TUint id = iHelper.IPCArgTUintL(ESipProfileItcArgProfileId, aMessage);
+	CSIPConcreteProfile* profile = 
+		CloneProfileWithoutPasswordsLC(&iCore.ProfileL(id, *this));
+	WriteProfileL( aMessage, profile ) ;
+	CleanupStack::PopAndDestroy (profile);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SipProfileRefreshL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SipProfileRefreshL(const RMessage2& aMessage)
+	{
+	TUint id = iHelper.IPCArgTUintL(ESipProfileItcArgProfileId, aMessage);
+	CSIPConcreteProfile* profile = 
+		CloneProfileWithoutPasswordsLC( &iCore.ProfileRefreshL(id, *this) );
+
+	WriteProfileL( aMessage, profile );
+
+	CleanupStack::PopAndDestroy (profile);	
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SipProfilesSizeL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SipProfilesSizeL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	CSIPConcreteProfileHolder* holder = CSIPConcreteProfileHolder::NewLC();
+	RPointerArray<CSIPConcreteProfile>& array = holder->SIPProfiles();
+	iCore.ProfilesL(NULL, array);
+	ids.iSlot1 = holder->ExternalizedSizeL();
+	array.Reset();
+	CleanupStack::PopAndDestroy(holder);
+	iHelper.WriteL(aMessage, ids);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SipProfilesL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SipProfilesL(const RMessage2& aMessage)
+	{
+	CSIPConcreteProfileHolder* holder = CSIPConcreteProfileHolder::NewLC();
+	RPointerArray<CSIPConcreteProfile>& array = holder->SIPProfiles();
+	iCore.ProfilesL(this, array);
+	CBufFlat* buf = ExternalizeLC (*holder);
+	TPtr8 externalized = buf->Ptr(0);
+	iHelper.WriteL(ESipProfileItcArgProfiles, aMessage, externalized);
+	array.Reset();
+	CleanupStack::PopAndDestroy(buf);
+	CleanupStack::PopAndDestroy(holder);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SipProfilesSizeByAORL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SipProfilesSizeByAORL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	HBufC8* aor = iHelper.ReadLC(ESipProfileItcArgNarrator,aMessage);
+	CSIPConcreteProfileHolder* holder = CSIPConcreteProfileHolder::NewLC();
+	RPointerArray<CSIPConcreteProfile>& array = holder->SIPProfiles();
+
+	iCore.ProfilesByAORL(*aor, NULL, array);
+
+	ids.iSlot1 = holder->ExternalizedSizeL();
+	array.Reset();
+	CleanupStack::PopAndDestroy(holder);
+	CleanupStack::PopAndDestroy(aor);
+	iHelper.WriteL(aMessage, ids);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SipProfilesByAORL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SipProfilesByAORL(const RMessage2& aMessage)
+	{
+	HBufC8* aor = iHelper.ReadLC(ESipProfileItcArgNarrator,aMessage);
+	CSIPConcreteProfileHolder* holder = CSIPConcreteProfileHolder::NewLC();
+	RPointerArray<CSIPConcreteProfile>& array = holder->SIPProfiles();
+
+	iCore.ProfilesByAORL(*aor, this, array);
+
+	CBufFlat* buf = ExternalizeLC(*holder);
+	TPtr8 externalized = buf->Ptr(0);
+	iHelper.WriteL(ESipProfileItcArgProfiles, aMessage, externalized);
+	array.Reset();
+	CleanupStack::PopAndDestroy(buf);
+	CleanupStack::PopAndDestroy(holder);
+	CleanupStack::PopAndDestroy(aor);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SipProfilesSizeByTypeL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SipProfilesSizeByTypeL(const RMessage2& aMessage)
+	{
+	TSIPProfileTypeInfo info;
+	iHelper.ReadSIPProfileTypeInfoL(aMessage,info);
+	
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	
+	CSIPConcreteProfileHolder* holder = CSIPConcreteProfileHolder::NewLC();
+	RPointerArray<CSIPConcreteProfile>& array = holder->SIPProfiles();
+
+	iCore.ProfilesByTypeL(info, NULL, array);
+
+	ids.iSlot1 = holder->ExternalizedSizeL();
+	array.Reset();
+	CleanupStack::PopAndDestroy(holder);
+	iHelper.WriteL(aMessage, ids);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SipProfilesByTypeL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SipProfilesByTypeL(const RMessage2& aMessage)
+	{	
+	TSIPProfileTypeInfo info;
+	iHelper.ReadSIPProfileTypeInfoL(aMessage,info);
+	
+	CSIPConcreteProfileHolder* holder = CSIPConcreteProfileHolder::NewLC();
+	RPointerArray<CSIPConcreteProfile>& array = holder->SIPProfiles();
+
+	iCore.ProfilesByTypeL(info, this, array);
+
+	CBufFlat* buf = ExternalizeLC(*holder);
+	TPtr8 externalized = buf->Ptr(0);
+	iHelper.WriteL(ESipProfileItcArgProfiles, aMessage, externalized);
+	array.Reset();
+	CleanupStack::PopAndDestroy(buf);
+	CleanupStack::PopAndDestroy(holder);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::DeleteSipProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::DeleteSipProfileL(const RMessage2& aMessage)
+	{
+	TUint id = iHelper.IPCArgTUintL(ESipProfileItcArgProfileId, aMessage);
+
+	iCore.DeleteProfileL(id, *this);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::CancelClientReceiveL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::CancelClientReceiveL()
+	{
+    __ASSERT_ALWAYS (iClientReadyToReceive, User::Leave (KErrNotFound));
+
+    iClientReadyToReceive = EFalse;
+    iHelper.CompleteService(iEventMessage, KErrCancel);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::CreateProfileSizeL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::CreateProfileSizeL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+
+	TSIPProfileTypeInfo info;
+	iHelper.ReadSIPProfileTypeInfoL(aMessage,info);
+
+	CSIPConcreteProfile* profile = iCore.CreateProfileL(info);
+	CleanupStack::PushL(profile);
+	ids.iSlot1 = profile->ExternalizedSizeL(); 
+	iHelper.WriteL(aMessage, ids);
+	CleanupStack::PopAndDestroy(profile);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::NegotiatedSecuritySizeL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::NegotiatedSecuritySizeL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	const CSIPConcreteProfile* profile = iCore.Profile(ids.iProfileId);
+	if (profile)
+		{
+		ids.iSlot1 = profile->NegotiatedSecurityMechanism().Length(); 
+		iHelper.WriteL(aMessage, ids);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::NegotiatedSecurityL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::NegotiatedSecurityL(const RMessage2& aMessage)
+	{
+	TUint id = iHelper.IPCArgTUintL(ESipProfileItcArgProfileId, aMessage);
+	const CSIPConcreteProfile* profile = iCore.Profile(id);
+	if (profile)
+		{
+		iHelper.WriteL(ESipProfileItcArgNegotiated, aMessage,
+			profile->NegotiatedSecurityMechanism());
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::RegisteredAORsSizeL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::RegisteredAORsSizeL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	const CSIPConcreteProfile* profile = iCore.Profile(ids.iProfileId);
+	if (profile)
+		{
+		ids.iSlot1 = profile->ExternalizedRegisteredAORsSizeL(); 
+		iHelper.WriteL(aMessage, ids);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::RegisteredAORsL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::RegisteredAORsL(const RMessage2& aMessage)
+	{
+	TUint id = iHelper.IPCArgTUintL(ESipProfileItcArgProfileId, aMessage);
+	const CSIPConcreteProfile* profile = iCore.Profile(id);
+	if (profile)
+		{
+		CBufFlat* buf = CBufFlat::NewL(KBufferSize);
+		CleanupStack::PushL(buf);
+		RBufWriteStream writeStream(*buf, 0);
+		writeStream.PushL();
+		profile->ExternalizeRegisteredAORsL(writeStream);
+		CleanupStack::Pop(1); // writeStream
+		writeStream.Close();
+
+		TPtr8 externalized = buf->Ptr(0);
+		iHelper.WriteL(ESipProfileItcArgAORs, aMessage, externalized);
+		CleanupStack::PopAndDestroy(buf);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::CreateProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::CreateProfileL(const RMessage2& aMessage)
+	{
+	TSIPProfileTypeInfo info;
+	iHelper.ReadSIPProfileTypeInfoL(aMessage,info);
+
+	CSIPConcreteProfile* profile = iCore.CreateProfileL(info);
+	CleanupStack::PushL(profile);
+	WriteProfileL(aMessage, profile);
+	CleanupStack::PopAndDestroy(profile);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::InternalizeProfileLC
+// -----------------------------------------------------------------------------
+//
+CSIPConcreteProfile*
+CSIPProfileCSSession::InternalizeProfileLC(const TDesC8& aProfile)
+	{
+	RDesReadStream readStream(aProfile);
+	readStream.PushL();
+	CSIPConcreteProfile* profile =
+		static_cast<CSIPConcreteProfile*>(
+			CSIPConcreteProfile::InternalizeL(readStream));
+	readStream.Pop();
+	readStream.Close();
+	CleanupStack::PushL(profile);
+	return profile;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::RegistrationStatusChangedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::RegistrationStatusChangedL(TUint32 aProfileId, 
+													  TInt aStatus,
+													  TUint32 aStatusId)
+	{
+	switch (aStatus)
+		{
+	case CSIPConcreteProfile::ERegistered:
+		SendEvent(aProfileId, ESipProfileItcOpRegistered, aStatusId);
+		break;
+	case CSIPConcreteProfile::EUnregistered:
+		{
+			if(ESipProfileItcOpProfileForciblyDisabled == aStatusId)
+				SendEvent(aProfileId, ESipProfileItcOpProfileForciblyDisabled, 0);
+            else
+				SendEvent(aProfileId, ESipProfileItcOpDeregistered, 0);
+		}
+		break;
+	default:
+		break;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::AddedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::AddedL(TUint32 aProfileId)
+	{
+	SendEventL(aProfileId, ESipProfileItcOpProfileAdded);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::RemovedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::RemovedL(TUint32 aProfileId)
+	{
+	SendEvent(aProfileId, ESipProfileItcOpProfileRemoved);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::UpdatedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::UpdatedL(TUint32 aProfileId, TUint aSize)
+	{
+	SendEventL(aProfileId, ESipProfileItcOpProfileUpdated, aSize);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::ErrorOccurredL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::ErrorOccurredL(TUint32 aProfileId,
+										  TInt aStatus,
+										  TInt aError)
+	{
+	TInt event(ESipProfileItcOpUnregistrationError);
+	if (aStatus == CSIPConcreteProfile::ERegistrationInProgress)
+		{
+		event = ESipProfileItcOpRegistrationError;
+		}
+
+    SendEventL(aProfileId, event, aError);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::IapAvailableL
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileCSSession::IapAvailableL(TUint32 aProfileId,
+										  TUint32 aSnapId,
+										  TUint32 aIapId)
+	{
+	if (iALRObserverExists)
+		{
+		SendEventL(aProfileId, ESipProfileItcOpIapAvailable, aSnapId, aIapId);
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::MigrationStartedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::MigrationStartedL(TUint32 aProfileId,
+										   	 TUint32 aSnapId,
+										   	 TUint32 aIapId)
+	{
+	if (iALRObserverExists)
+		{
+		SendEventL(aProfileId,
+				   ESipProfileItcOpMigrationStarted,
+				   aSnapId,
+				   aIapId);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::MigrationCompletedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::MigrationCompletedL(TUint32 aProfileId,
+										   	   TUint32 aSnapId,
+										   	   TUint32 aIapId)
+	{
+	if (iALRObserverExists)
+		{
+		SendEventL(aProfileId,
+				   ESipProfileItcOpMigrationCompleted,
+				   aSnapId,
+				   aIapId);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::AlrError
+// -----------------------------------------------------------------------------
+//
+TInt CSIPProfileCSSession::AlrError(TInt aError,
+									TUint32 aProfileId,
+									TUint32 aSnapId,
+									TUint32 aIapId)
+	{
+	TInt err(KErrNone);
+	if (iALRObserverExists)
+		{
+		err = SendEvent(aProfileId,
+				        ESipProfileItcOpALRError,
+				        aSnapId,
+				        aIapId,
+				        aError);
+		}
+    return err;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SendEvent
+// -----------------------------------------------------------------------------
+//
+TInt CSIPProfileCSSession::SendEvent(TUint aProfileId,
+									 TUint aEventId,
+									 TInt aSlot,
+									 TInt aSlot2,
+									 TInt aError)
+	{
+	TRAPD(err, SendEventL(aProfileId, aEventId, aSlot, aSlot2, aError));
+	return err;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SendEventL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SendEventL(TUint aProfileId,
+									  TUint aEventId,
+									  TInt aSlot,
+									  TInt aSlot2,
+									  TInt aError)
+	{
+    if (iClientReadyToReceive)
+        {
+		TSIPProfileSlots ids = iHelper.ReadSipIdsL(iEventMessage);
+		SetProfileSlots(ids, aProfileId, aEventId, aSlot, aSlot2, aError);
+
+		iHelper.WriteL(iEventMessage, ids);
+		iHelper.CompleteService(iEventMessage, KErrNone);
+        iClientReadyToReceive = EFalse;
+		}
+	else
+		{
+		TSIPProfileSlots ids;
+		SetProfileSlots(ids, aProfileId, aEventId, aSlot, aSlot2, aError);
+
+		iEventQueue.AppendL(ids);
+		}
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::ClientReadyToReceiveL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::ClientReadyToReceiveL(const RMessage2& aMessage)
+	{
+    __ASSERT_ALWAYS(!iClientReadyToReceive, User::Leave(KErrNotFound));
+
+    iEventMessage = aMessage;
+    if (iEventQueue.Count() == 0)
+		{
+        iClientReadyToReceive = ETrue;
+		}
+    else
+		{
+		const TSIPProfileSlots& stored = iEventQueue[0];
+		TSIPProfileSlots ids = iHelper.ReadSipIdsL(iEventMessage);
+		ids.iProfileId = stored.iProfileId; 
+		ids.iEventId = stored.iEventId; 
+		ids.iSlot1 = stored.iSlot1; 
+		iHelper.WriteL(iEventMessage, ids);
+		iHelper.CompleteService(iEventMessage, KErrNone);
+		iEventQueue.Remove(0);
+        iClientReadyToReceive = EFalse;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::WriteProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::WriteProfileL(const RMessage2& aMessage, 
+	CSIPConcreteProfile* aProfile)
+	{
+	CBufFlat* buf = ExternalizeLC (*aProfile);
+	TPtr8 externalized = buf->Ptr(0);
+	iHelper.WriteL(ESipProfileItcArgProfile, aMessage, externalized);
+	CleanupStack::PopAndDestroy(buf);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::ExternalizeLC
+// -----------------------------------------------------------------------------
+//
+template<class T> CBufFlat*
+CSIPProfileCSSession::ExternalizeLC(const T& aElements)
+	{
+	CBufFlat* buf = CBufFlat::NewL(KBufferSize);
+	CleanupStack::PushL(buf);
+	RBufWriteStream writeStream(*buf, 0);
+	writeStream.PushL();
+	aElements.ExternalizeL(writeStream);
+	CleanupStack::Pop(1); // writeStream
+	writeStream.Close();
+    return buf;
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::AllowMigrationL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::AllowMigrationL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	iCore.AllowMigrationL(ids.iProfileId, ids.iSlot1, *this);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::DisallowMigrationL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::DisallowMigrationL(const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	iCore.DisallowMigrationL(ids.iProfileId, ids.iSlot1, *this);		
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::RefreshIapAvailabilityL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::RefreshIapAvailabilityL (const RMessage2& aMessage)
+	{
+	TSIPProfileSlots ids = iHelper.ReadSipIdsL(aMessage);
+	iCore.RefreshIapAvailabilityL(ids.iProfileId);		
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::SetProfileSlots
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileCSSession::SetProfileSlots(TSIPProfileSlots& aSlots,
+										   TUint aProfileId,
+										   TUint aEventId,
+										   TInt aSlot,
+										   TInt aSlot2,
+										   TInt aError) const
+	{
+	aSlots.iProfileId = aProfileId; 
+	aSlots.iEventId = aEventId; 
+	aSlots.iSlot1 = aSlot;
+	aSlots.iSlot2 = aSlot2;
+	aSlots.iError = aError;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileCSSession::CloneProfileWithoutPasswordsLC
+// -----------------------------------------------------------------------------
+//
+CSIPConcreteProfile* CSIPProfileCSSession::CloneProfileWithoutPasswordsLC(
+		const CSIPConcreteProfile* aProfile)
+	{
+	CSIPConcreteProfile* clonedProfile = 
+		aProfile->CloneWithDynamicValuesL();
+
+	// Remove password from cloned profile
+	CleanupStack::PushL(clonedProfile);
+	clonedProfile->SetServerParameterL(
+		KSIPOutboundProxy, KSIPDigestPassword, KNullDesC8 );
+	clonedProfile->SetServerParameterL( 
+		KSIPRegistrar, KSIPDigestPassword, KNullDesC8 );	
+
+	return clonedProfile;
+	}