realtimenetprots/sipfw/ProfileAgent/Client/Src/sipprofileregistrybase.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/Client/Src/sipprofileregistrybase.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,666 @@
+// Copyright (c) 2003-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        : sipprofileregistrybase
+// Part of     : SIP Profile Client
+// implementation
+// Version     : 1.0
+// INCLUDE FILES
+//
+
+
+
+#include "sip.h"
+#include "sipprofileregistrybase.h"
+#include "sipprofileregistryobserver.h"
+#include "sipprofileregistry.h"
+#include "sipprofileregistryobserver.h"
+#include "sipmanagedprofile.h"
+#include "SipProfileItem.h"
+#include "sipprofileplugins.h"
+#include "sipconcreteprofileholder.h"
+#include "SipProfileCleanupItem.h"
+#include "SIPProfileITC.h"
+#include "SIPProfileITCReceiver.h"
+#include "sipconnectionobserver.h"
+#include "SIPRemoteProfile.h"
+#include "sipprofilecs.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::~CSIPProfileRegistryBase
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPProfileRegistryBase::~CSIPProfileRegistryBase()
+	{
+	delete iProfilePlugins;
+	iProfilePlugins = 0;
+
+	delete iFindEntry;
+	iFindEntry = 0;
+
+	delete iITCReceiver;
+	iITCReceiver =  0;
+
+	delete iITC;
+	iITC = 0;
+
+	for (TInt i = 0; i < iProfiles.Count(); i++)
+		{
+		CSIPProfileItem* item = static_cast<CSIPProfileItem*>(iProfiles[i]);
+		if (item->Profile())
+			{
+			item->Profile()->ClearRegistry();
+			item->SetConcreteProfile(0);
+			}
+		}
+		
+	iProfiles.ResetAndDestroy();
+	iProfiles.Close();
+
+	if (iSipClient)
+		{
+		iSipClient->Close();
+		delete iSipClient;
+		iSipClient = 0;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ProfilesL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPProfileRegistryBase::ProfilesL(
+			 RPointerArray<CSIPProfile>& aProfiles)
+	{
+	CSIPConcreteProfileHolder* holder = iITC->SIPProfilesL();
+	
+	ProfilesCommonL(aProfiles, holder);
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ProfilesL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPProfileRegistryBase::ProfilesL(
+			 const TSIPProfileTypeInfo& aType,
+			 RPointerArray<CSIPProfile>& aProfiles)
+	{
+	CSIPConcreteProfileHolder* holder = iITC->SIPProfilesByTypeL(aType);
+	
+	ProfilesCommonL(aProfiles, holder);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ProfilesL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPProfileRegistryBase::ProfilesL(
+			 const TDesC8& aAOR,
+			 RPointerArray<CSIPProfile>& aProfiles)
+	{
+	CSIPConcreteProfileHolder* holder = iITC->SIPProfilesByAORL(aAOR);
+	
+	ProfilesCommonL(aProfiles, holder);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ProfilesCommonL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::ProfilesCommonL(
+			 				RPointerArray<CSIPProfile>& aProfiles,
+			 				CSIPConcreteProfileHolder* aHolder)
+	{
+	RPointerArray<CSIPConcreteProfile>& profiles = aHolder->SIPProfiles();
+
+	CleanupStack::PushL(aHolder);
+
+	StoreArrayL(profiles, aProfiles);
+
+	CleanupStack::Pop(aHolder);
+	delete aHolder;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ProfileL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPProfile* CSIPProfileRegistryBase::ProfileL(TUint32 aId)
+	{
+	return SIPProfileL(aId);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::DefaultProfileL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPProfile* CSIPProfileRegistryBase::DefaultProfileL()
+	{
+	TUint32 profileId(0);
+	TUint size(0);
+	iITC->SIPProfileDefaultL(size, profileId);
+
+	if (size == 0)
+		{
+		User::Leave(KErrNotFound);
+		}
+
+	return SIPProfileL(profileId, size);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::SupportedProfileTypesL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPProfileRegistryBase::SupportedProfileTypesL(
+					RArray<TSIPProfileTypeInfo>& aSupportedProfileTypes)
+	{
+	delete iProfilePlugins;
+	iProfilePlugins = NULL;
+	iProfilePlugins = iITC->SIPProfilePluginsL();
+	
+	const RArray<TSIPProfileTypeInfo>& array = iProfilePlugins->Plugins();
+	for (TInt i = 0; i < array.Count(); i++)
+		{
+		User::LeaveIfError(aSupportedProfileTypes.Append(array[i]));
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::LastRegistrationError
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CSIPProfileRegistryBase::LastRegistrationError(
+			 const CSIPProfile& aProfile) const
+	{
+	return aProfile.LastRegistrationError();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::CSIPProfileRegistryBase
+// -----------------------------------------------------------------------------
+//
+CSIPProfileRegistryBase::CSIPProfileRegistryBase(
+	MSIPProfileRegistryObserver& aObserver):
+	iObserver(aObserver)
+	{
+
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ProfileDeleted
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::ProfileDeleted(CSIPProfile& aProfile)
+	{
+	TUint32 profileId = 0;
+	aProfile.GetParameter(KSIPProfileId, profileId);
+	TInt index = ProfileIndex(profileId);
+	if(index != KErrNotFound) 
+		{
+		CSIPProfileItem* item = ProfileItemByIndex(index);
+		item->DecrementReferenceCount((CSIPProfile&) aProfile);
+		if (item->ReferenceCount() == 0) 
+			{
+			iProfiles.Remove(index);
+			delete item;
+			// ignore any error
+			TRAPD(err, iITC->DeleteSIPProfileL(aProfile.ConcreteProfile().Id()));
+			//for get rid of armv5 warning
+			err++;
+			}
+		else
+			{
+			aProfile.ClearConcreteProfile();
+			}
+		} 
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::EnableProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::EnableProfileL(
+	CSIPProfile& aProfile)
+	{
+	CSIPProfileItem* item = ProfileItemL(aProfile.ConcreteProfile().Id());
+	TInt status = 0;
+	TRAPD(err, status = iITC->EnableSIPProfileL(aProfile.ConcreteProfile().Id()));
+	aProfile.ConcreteProfile().SetLastRegistrationError(err);
+	User::LeaveIfError(err);
+	item->SetEnabled(ETrue);
+	aProfile.ConcreteProfile().SetStatus((enum CSIPConcreteProfile::TStatus) status);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::DisableProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::DisableProfileL(CSIPProfile& aProfile)
+	{
+	CSIPProfileItem* item = ProfileItemL(aProfile.ConcreteProfile().Id());
+	item->SetEnabled(EFalse);
+	TInt status = iITC->DisableSIPProfileL(aProfile.ConcreteProfile().Id());
+	aProfile.ConcreteProfile().SetStatus((enum CSIPConcreteProfile::TStatus) status);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ForceDisableProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::ForceDisableProfileL(
+	CSIPProfile& aProfile)
+	{
+	CSIPProfileItem* item = ProfileItemL(aProfile.ConcreteProfile().Id());
+	item->SetEnabled(EFalse);
+	TInt status = iITC->ForceDisableSIPProfileL(aProfile.ConcreteProfile().Id());
+	aProfile.ConcreteProfile().SetStatus((enum CSIPConcreteProfile::TStatus) status);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::UsageL
+// -----------------------------------------------------------------------------
+//
+TInt CSIPProfileRegistryBase::UsageL(const CSIPProfile& aProfile) const
+	{
+	return iITC->SIPProfileUsageL(aProfile.ConcreteProfile().Id());
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::AddProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::AddProfileL(CSIPProfile& aProfile)
+	{
+	CSIPProfileItem* item = CSIPProfileItem::NewL();
+	CleanupStack::PushL(item);
+	item->IncrementReferenceCountL(aProfile);
+	User::LeaveIfError(iProfiles.Append(item));
+	CleanupStack::Pop(item);
+
+	TRAPD(err, iITC->AddSIPProfileL(aProfile.ConcreteProfile()));
+	if (aProfile.ConcreteProfile().Id() != 0)
+		{
+		item->SetProfile(aProfile);
+		}
+	else
+		{
+		TBool found = EFalse;
+		for (TInt i = 0; i < iProfiles.Count() && !found; i++)
+			{
+			if (iProfiles[i] == item)
+				{
+				iProfiles.Remove(i);
+				delete item;
+				found = ETrue;
+				}
+			}
+		}
+	User::LeaveIfError(err);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::UpdateProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::UpdateProfileL(CSIPProfile& aProfile)
+	{	
+	iITC->UpdateSIPProfileL(aProfile.ConcreteProfile());
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::RemoveProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::RemoveProfileL(CSIPProfile& aProfile)
+	{
+	iITC->RemoveSIPProfileL(aProfile.ConcreteProfile().Id());
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::IsDefaultProfileL
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileRegistryBase::IsDefaultProfileL(const CSIPProfile& aProfile)
+	{
+	TUint32 profileId = iITC->SIPProfileDefaultIdL();
+	return (aProfile.ConcreteProfile().Id() == profileId);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::RegistrationStatusChangedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::NegotiatedSecurityMechanismL(
+	CSIPConcreteProfile& aProfile)
+	{
+	iITC->NegotiatedSecurityMechanismL(aProfile);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::RegisteredAORsL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::RegisteredAORsL(CSIPConcreteProfile& aProfile)
+	{
+	iITC->RegisteredAORsL(aProfile);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::SIPProfileL
+// -----------------------------------------------------------------------------
+//
+CSIPProfile* CSIPProfileRegistryBase::SIPProfileL(TUint32 aId, TInt aSize)
+	{
+	__ASSERT_ALWAYS (aId > 0, User::Leave (KErrArgument));
+	TInt index = ProfileIndex(aId);
+	if(index == KErrNotFound) 
+		{
+		CSIPProfileCleanupItem* cleanupItem = new (ELeave) CSIPProfileCleanupItem(iITC);
+		CleanupStack::PushL(cleanupItem);
+		CleanupStack::PushL(TCleanupItem(CrashRevert, cleanupItem));
+		
+		cleanupItem->iProfileId = aId;
+		cleanupItem->iConcreteProfile = iITC->SIPProfileL(aId, aSize);
+
+		CSIPProfile* managed = 0;
+		if (cleanupItem->iConcreteProfile != 0)
+			{
+			StoreProfileL(cleanupItem);
+			managed = cleanupItem->iManagedProfile;
+			}
+
+		CleanupStack::Pop();
+		CleanupStack::PopAndDestroy(cleanupItem);
+		return managed;
+		}
+	else
+		{
+		CSIPProfileItem* item = ProfileItemL(aId);
+		CSIPProfile* managed = NewInstanceL();
+		CleanupStack::PushL(managed);
+		managed->SetConcreteProfile(&(item->ConcreteProfile()));
+		managed->SetEnabled(item->IsEnabled());
+		item->IncrementReferenceCountL(*managed);
+		CleanupStack::Pop(managed);
+		return managed;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::StoreProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::StoreProfileL(CSIPProfileCleanupItem* aCleanupItem)
+	{
+	CSIPProfile* managed = NewInstanceL();
+	aCleanupItem->iManagedProfile = managed;
+	managed->SetConcreteProfile(aCleanupItem->iConcreteProfile);
+
+	CSIPProfileItem* item = CSIPProfileItem::NewL();
+	item->SetProfile(*managed);
+
+	CleanupStack::PushL(item);
+	User::LeaveIfError(iProfiles.Append(item));
+	CleanupStack::Pop(item);
+
+	item->IncrementReferenceCountL(*managed);
+	aCleanupItem->iStored = ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::StoreProfileL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::StoreArrayL(
+	RPointerArray<CSIPConcreteProfile>& aProfiles,
+	RPointerArray<CSIPProfile>& aRetProfiles)
+	{
+	int count = aProfiles.Count();
+
+	for (TInt i = 0; i < count; i++)
+		{
+		TUint profileId = (aProfiles[0])->Id();
+		TInt index = ProfileIndex(profileId);
+		
+		CSIPProfileCleanupItem* cleanupItem = new (ELeave) CSIPProfileCleanupItem(iITC);
+		CleanupStack::PushL(cleanupItem);
+
+		if(index == KErrNotFound) 
+			{
+			CleanupStack::PushL(TCleanupItem(CrashRevert, cleanupItem));
+
+			cleanupItem->iProfileId = (aProfiles[0])->Id();
+			cleanupItem->iConcreteProfile = aProfiles[0];
+			aProfiles.Remove(0);
+
+			StoreProfileL(cleanupItem);
+			User::LeaveIfError(aRetProfiles.Append(cleanupItem->iManagedProfile));
+			}
+		else
+			{
+			CleanupStack::PushL(TCleanupItem(LocalCrashRevert, cleanupItem));
+
+			CSIPProfileItem* item = ProfileItemL(profileId);
+			CSIPProfile* managed = NewInstanceL();
+			cleanupItem->iManagedProfile = managed;
+			managed->SetConcreteProfile(&(item->ConcreteProfile()));
+			managed->SetEnabled(item->IsEnabled());
+			item->IncrementReferenceCountL(*managed);
+			User::LeaveIfError(aRetProfiles.Append(managed));
+			CSIPConcreteProfile* profileNotUsed = aProfiles[0];
+			aProfiles.Remove(0);
+			delete profileNotUsed;
+			}
+		}
+	aProfiles.Reset();
+
+	for (TInt j = 0; j < count; j++)
+		{
+		CleanupStack::Pop(); //TCleanupItem
+		CleanupStack::PopAndDestroy(); //cleanupItem
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ProfileItemL
+// -----------------------------------------------------------------------------
+//
+CSIPProfileItem* CSIPProfileRegistryBase::ProfileItemL(TUint aProfileId)
+	{
+	TInt index = ProfileIndex (aProfileId);
+	__ASSERT_ALWAYS (index != KErrNotFound, User::Leave (KErrNotFound));
+	return ProfileItemByIndex(index); 
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ProfileIndex
+// -----------------------------------------------------------------------------
+//
+TInt CSIPProfileRegistryBase::ProfileIndex (TUint aProfileId)
+	{
+	TIdentityRelation<CSIPProfileItem> compareId(CSIPProfileItem::Compare);
+	iFindEntry->SetProfileId(aProfileId);
+	TInt index = iProfiles.Find(iFindEntry, compareId);
+	return index;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ProfileItemByIndex
+// -----------------------------------------------------------------------------
+//
+CSIPProfileItem* CSIPProfileRegistryBase::ProfileItemByIndex(TUint aIndex)
+	{
+	return static_cast<CSIPProfileItem*>(iProfiles[aIndex]);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::RegistrationStatusChangedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::RegistrationStatusChangedL(TUint32 aProfileId,
+							  TInt aStatus,
+							  TUint32 aStatusId)
+	{
+	TInt index = ProfileIndex(aProfileId);
+	if(index != KErrNotFound) 
+		{
+		CSIPProfileItem* item = ProfileItemByIndex(index);
+		// The concrete profile has to be fetched to get the registered Contact
+		CSIPConcreteProfile* updatedProfile = 
+		    iITC->SIPProfileRefreshL(aProfileId);
+		updatedProfile->SetStatus((CSIPConcreteProfile::TStatus) aStatus);
+		updatedProfile->SetContextId(aStatusId);
+		item->SetConcreteProfile(updatedProfile);
+		if (aStatus == CSIPConcreteProfile::ERegistered)
+			{
+			iObserver.ProfileRegistryEventOccurred(aProfileId, 
+				MSIPProfileRegistryObserver::EProfileRegistered);
+			}
+		else
+			{
+			if (aStatusId == ESipProfileItcOpProfileForciblyDisabled)
+				iObserver.ProfileRegistryEventOccurred(aProfileId,
+					MSIPProfileRegistryObserver::EProfileForciblyDisabled);	
+			else
+				iObserver.ProfileRegistryEventOccurred(aProfileId,
+					MSIPProfileRegistryObserver::EProfileDeregistered);
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::UpdatedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::UpdatedL(TUint32 aProfileId, TUint aSize)
+	{
+	TInt index = ProfileIndex(aProfileId);
+	if(index != KErrNotFound) 
+		{	
+		CSIPConcreteProfile* concrete = 0;
+		CSIPProfileItem* item = ProfileItemByIndex(index);
+		TRAPD(err, concrete = iITC->SIPProfileRefreshL(aProfileId, aSize));
+		if (err == KErrNone)
+			{
+			item->SetConcreteProfile(concrete); 
+			iObserver.ProfileRegistryEventOccurred(aProfileId,
+				MSIPProfileRegistryObserver::EProfileUpdated);
+			}
+#ifdef CPPUNIT_TEST
+		if (err == KErrNoMemory) User::Leave(KErrNoMemory);
+#endif
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::AddedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::AddedL(TUint32 aProfileId) 
+	{
+	iObserver.ProfileRegistryEventOccurred(aProfileId,
+		MSIPProfileRegistryObserver::EProfileCreated);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::RemovedL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::RemovedL(TUint32 aProfileId)
+	{
+	TInt index = ProfileIndex(aProfileId);
+	if(index != KErrNotFound) 
+		{
+		iObserver.ProfileRegistryEventOccurred(aProfileId,
+			MSIPProfileRegistryObserver::EProfileDestroyed);
+		}
+	}	
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ErrorOccurredL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::ErrorOccurredL(TUint32 aProfileId,
+										   TInt aStatus,
+										   TInt aError)
+	{
+	TInt index = ProfileIndex(aProfileId);
+	if(index != KErrNotFound) 
+		{
+		CSIPProfileItem* item = ProfileItemByIndex(index);
+		item->ErrorOccurred((CSIPConcreteProfile::TStatus) aStatus, aError);
+		iObserver.ProfileRegistryErrorOccurred(aProfileId, aError);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::BaseConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::BaseConstructL()
+	{
+	iFindEntry = CSIPProfileItem::NewL();
+
+	iSipClient = new (ELeave) RSIPProfile;
+	User::LeaveIfError(iSipClient->Connect());
+
+	iITCReceiver = CSIPProfileITCReceiver::NewL (*iSipClient, *this);
+	iITC = CSIPProfileITC::NewL (*iSipClient);
+	
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::CrashRevert
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::CrashRevert (TAny* aItem)
+	{
+	CSIPProfileCleanupItem* cleanupItem = static_cast<CSIPProfileCleanupItem*>(aItem);
+	TRAPD(err, cleanupItem->CrashRevertL());
+	//for get rid of armv5 warning
+	err++;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::LocalCrashRevert
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileRegistryBase::LocalCrashRevert (TAny* aItem)
+	{
+	CSIPProfileCleanupItem* cleanupItem = static_cast<CSIPProfileCleanupItem*>(aItem);
+
+	delete cleanupItem->iManagedProfile;
+	cleanupItem->iManagedProfile = 0;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::Itc
+// -----------------------------------------------------------------------------
+//
+CSIPProfileITC& CSIPProfileRegistryBase::Itc()
+	{
+	return *iITC;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileRegistryBase::ItcReceiver
+// -----------------------------------------------------------------------------
+//
+CSIPProfileITCReceiver& CSIPProfileRegistryBase::ItcReceiver()
+	{
+	return *iITCReceiver;
+	}
+