diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/Client/Src/sipprofileregistrybase.cpp --- /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(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& aProfiles) + { + CSIPConcreteProfileHolder* holder = iITC->SIPProfilesL(); + + ProfilesCommonL(aProfiles, holder); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileRegistryBase::ProfilesL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CSIPProfileRegistryBase::ProfilesL( + const TSIPProfileTypeInfo& aType, + RPointerArray& aProfiles) + { + CSIPConcreteProfileHolder* holder = iITC->SIPProfilesByTypeL(aType); + + ProfilesCommonL(aProfiles, holder); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileRegistryBase::ProfilesL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CSIPProfileRegistryBase::ProfilesL( + const TDesC8& aAOR, + RPointerArray& aProfiles) + { + CSIPConcreteProfileHolder* holder = iITC->SIPProfilesByAORL(aAOR); + + ProfilesCommonL(aProfiles, holder); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileRegistryBase::ProfilesCommonL +// ----------------------------------------------------------------------------- +// +void CSIPProfileRegistryBase::ProfilesCommonL( + RPointerArray& aProfiles, + CSIPConcreteProfileHolder* aHolder) + { + RPointerArray& 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& aSupportedProfileTypes) + { + delete iProfilePlugins; + iProfilePlugins = NULL; + iProfilePlugins = iITC->SIPProfilePluginsL(); + + const RArray& 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& aProfiles, + RPointerArray& 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 compareId(CSIPProfileItem::Compare); + iFindEntry->SetProfileId(aProfileId); + TInt index = iProfiles.Find(iFindEntry, compareId); + return index; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileRegistryBase::ProfileItemByIndex +// ----------------------------------------------------------------------------- +// +CSIPProfileItem* CSIPProfileRegistryBase::ProfileItemByIndex(TUint aIndex) + { + return static_cast(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(aItem); + TRAPD(err, cleanupItem->CrashRevertL()); + //for get rid of armv5 warning + err++; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileRegistryBase::LocalCrashRevert +// ----------------------------------------------------------------------------- +// +void CSIPProfileRegistryBase::LocalCrashRevert (TAny* aItem) + { + CSIPProfileCleanupItem* cleanupItem = static_cast(aItem); + + delete cleanupItem->iManagedProfile; + cleanupItem->iManagedProfile = 0; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileRegistryBase::Itc +// ----------------------------------------------------------------------------- +// +CSIPProfileITC& CSIPProfileRegistryBase::Itc() + { + return *iITC; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileRegistryBase::ItcReceiver +// ----------------------------------------------------------------------------- +// +CSIPProfileITCReceiver& CSIPProfileRegistryBase::ItcReceiver() + { + return *iITCReceiver; + } +