diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileCSSession.cpp --- /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 + +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& 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& 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& 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& 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& 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& 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::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 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; + }