diff -r f742655b05bf -r d38647835c2e richcallsettingsengine/rcse2/src/crcseprofileregistry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/richcallsettingsengine/rcse2/src/crcseprofileregistry.cpp Wed Sep 01 12:29:57 2010 +0100 @@ -0,0 +1,1764 @@ +/* +* Copyright (c) 2002-2010 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: Stores and loads CRCSEProfileEntry to/from data storage. +* +*/ + + + +// INCLUDE FILES +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include "crcseprofileregistry.h" +#include "crcseprofileentry.h" +#include "crcseaudiocodecregistry.h" +#include "rcsepanic.h" +#include "rcseconstants.h" +#include "rcsedefaults.h" +#include "rcseprivatecrkeys.h" +#include "rcselogger.h" + + +const TInt KArrayInitSize = 2; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::CRCSEProfileRegistry +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CRCSEProfileRegistry::CRCSEProfileRegistry() + : CRCSERegistryBase( EVoIPProfile ), + iSIPRegistry( NULL ) + { + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::ConstructL() + { + // Check VoIP support from feature manager + FeatureManager::InitializeLibL(); + TBool support = FeatureManager::FeatureSupported( KFeatureIdCommonVoip ); + FeatureManager::UnInitializeLib(); + if ( !support ) + { + User::Leave( KErrNotSupported ); + } + + BaseConstructL(); + iSIPRegistry = CSIPManagedProfileRegistry::NewL( *this ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CRCSEProfileRegistry* CRCSEProfileRegistry::NewL() + { + CRCSEProfileRegistry* self = CRCSEProfileRegistry::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CRCSEProfileRegistry* CRCSEProfileRegistry::NewLC() + { + CRCSEProfileRegistry* self = new( ELeave ) CRCSEProfileRegistry; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +EXPORT_C CRCSEProfileRegistry::~CRCSEProfileRegistry() + { + RCSELOGSTRING( "CRCSEProfileRegistry::~CRCSEProfileRegistry() - IN" ); + + delete iSIPRegistry; + iSIPProfiles.ResetAndDestroy(); + + RCSELOGSTRING( "CRCSEProfileRegistry::~CRCSEProfileRegistry() - OUT" ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::FindL +// Start search of profile entry by provider name. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRCSEProfileRegistry::FindL( + const TDesC& aProviderName, + CRCSEProfileEntry& aFoundEntry ) + { + RCSELOGSTRING2( "CRCSEProfileRegistry::FindL(%S) - IN", &aProviderName ); + + BeginL(); + + RArray entryIds; + CleanupClosePushL( entryIds ); + + // Search IDs of entries that have this service ID + FindIdsByValueL( KColProviderName, + aProviderName, + entryIds ); + + // Search whole entry if ID was found + if ( 0 < entryIds.Count() ) + { + FindEntryL( entryIds[ 0 ], aFoundEntry ); + } + else + { + User::Leave( KErrNotFound ); + } + + // Check that SIP Ids are valid + UpdateSIPProfileLinksL( aFoundEntry ); + + CleanupStack::PopAndDestroy( &entryIds ); + + EndL(); + + RCSELOGSTRING2( "CRCSEProfileRegistry::FindL(%S) - OUT", &aProviderName ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::FindL +// Start search of profile entry by ID. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRCSEProfileRegistry::FindL( + TUint32 aProfileId, + CRCSEProfileEntry& aFoundEntry ) + { + RCSELOGSTRING2( "CRCSEProfileRegistry::FindL(id=%d) - IN", aProfileId ); + + BeginL(); + + FindEntryL( aProfileId, aFoundEntry ); + + // Check that SIP Ids are valid + UpdateSIPProfileLinksL( aFoundEntry ); + + EndL(); + + RCSELOGSTRING2( "CRCSEProfileRegistry::FindL(id=%d) - OUT", aProfileId ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::AddL +// Start addition of profile entry. +// ----------------------------------------------------------------------------- +// +EXPORT_C TUint32 CRCSEProfileRegistry::AddL( + const CRCSEProfileEntry& aNewEntry ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::AddL() - IN" ); + + BeginL(); + + TUint32 id( KNoEntryId ); + + // Add entry to storage + AddOrUpdateEntryL( id, aNewEntry ); + + __ASSERT_ALWAYS( KNoEntryId < id, User::Leave( KErrCorrupt ) ); + + // Create service settings or use existing + CRCSEProfileEntry& modifyEntry + = const_cast( aNewEntry ); + + // New service settings entry... + if( ( CRCSEProfileEntry::EOONotSet == modifyEntry.iNewServiceTableEntry || + CRCSEProfileEntry::EOn == modifyEntry.iNewServiceTableEntry ) ) + { + CreateDefaultServiceSettingsL( modifyEntry ); + if ( modifyEntry.iServiceProviderId != KRCSEDefServiceProviderId ) + { + UpdateServiceIdL( id, modifyEntry.iServiceProviderId ); + } + } + + // Use existing service settings entry if + // - given service id is valid + // - service id is not used by another profile + // - provider name is valid + else if( CRCSEProfileEntry::EOff == modifyEntry.iNewServiceTableEntry && + KSPNoId < modifyEntry.iServiceProviderId ) + { + // Check that provide name is valid + TBool providerExist( + NameExistsInServiceTableL( modifyEntry.iProviderName ) ); + + if( !providerExist ) + { + User::Leave( KErrNotFound ); + } + + // Check that service id is not used by another profile + LeaveIfServiceIdInUseL( modifyEntry ); + } + + // Fail all other cases + else + { + User::Leave( KErrArgument ); + } + + EndL(); + + RCSELOGSTRING( "CRCSEProfileRegistry::AddL() - OUT" ); + + return id; + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::DeleteL +// Deletes a profile entry which profile id is aProfileId. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRCSEProfileRegistry::DeleteL( + TUint32 aProfileId ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::DeleteL() - IN" ); + + // Delete referenced settings first + DeleteReferenceSettingsL( aProfileId ); + + // Start transaction here since referenced settings are + // deleted in own separate transaction + BeginL(); + + // Delete actual profile + iCenRepDb->DeleteEntryL( aProfileId ); + + EndL(); + + RCSELOGSTRING( "CRCSEProfileRegistry::DeleteL() - OUT" ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::UpdateL +// Updates profile entry, which profile identifier is aId. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRCSEProfileRegistry::UpdateL( + TUint32 aId, const CRCSEProfileEntry& aUpdateData ) + { + RCSELOGSTRING2( "CRCSEProfileRegistry::UpdateL(%d) - IN", aId ); + + __ASSERT_ALWAYS( KNoEntryId < aId, User::Leave( KErrArgument ) ); + + BeginL(); + + AddOrUpdateEntryL( aId, aUpdateData ); + + // Update also service settings if needed + if ( aUpdateData.iIds.Count() && + aUpdateData.iIds[0].iProfileType == CRCSEProfileEntry::EProtocolSIP ) + { + if ( aUpdateData.iServiceProviderId == KRCSEDefServiceProviderId ) + { + CRCSEProfileEntry* entry = CRCSEProfileEntry::NewLC(); + CopyEntryValues( aUpdateData, *entry ); + CreateDefaultServiceSettingsL( *entry ); + UpdateServiceSettingsL( *entry ); + AddOrUpdateEntryL( aId, *entry ); + CleanupStack::PopAndDestroy( entry ); + } + else + { + UpdateServiceSettingsL( aUpdateData ); + } + } + + EndL(); + + RCSELOGSTRING2( "CRCSEProfileRegistry::UpdateL(%d) - OUT", aId ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::GetDefaultProfile +// Resets a default profile values. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRCSEProfileRegistry::GetDefaultProfile( + CRCSEProfileEntry& aDefaultProfile ) const + { + aDefaultProfile.ResetDefaultValues(); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::GetAllIdsL +// Gets all profile identifiers. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRCSEProfileRegistry::GetAllIdsL( RArray& aAllIds ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::GetAllIdsL() - IN" ); + + BeginL(); + + FindAllIdsL( aAllIds ); + + EndL(); + + RCSELOGSTRING( "CRCSEProfileRegistry::GetAllIdsL() - OUT" ); + } + + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::FindByServiceIdL +// Gets all profiles matching to service ID. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRCSEProfileRegistry::FindByServiceIdL( TUint32 aServiceId, + RPointerArray& aFoundEntries ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::FindByServiceIdL() - IN" ); + + CleanupResetAndDestroyPushL( aFoundEntries ); + + BeginL(); + + TBuf des; + + RArray entryIds; + CleanupClosePushL( entryIds ); + + // Search IDs of entries that have this service ID + FindIdsByValueL( KColServiceProviderId, + ToDes( aServiceId, des ), + entryIds ); + + const TInt count( entryIds.Count() ); + RCSELOGSTRING2( " - Entries found: %d", count ); + + // Search entries using found IDs + for ( TInt i( 0 ); i < count; i++ ) + { + CRCSEProfileEntry* entry = CRCSEProfileEntry::NewLC(); + TRAPD( e, FindEntryL( entryIds[ i ], *entry ) ); + + if ( KErrNone == e ) + { + aFoundEntries.AppendL( entry ); + CleanupStack::Pop( entry ); + } + else + { + CleanupStack::PopAndDestroy( entry ); + } + } + + CleanupStack::PopAndDestroy( &entryIds ); + + // Update SIP profile links + const TInt entryCount( aFoundEntries.Count() ); + for ( TInt k( 0 ); k < entryCount; ++k ) + { + UpdateSIPProfileLinksL( *aFoundEntries[k] ); + } + + EndL(); + + CleanupStack::Pop( &aFoundEntries ); + + RCSELOGSTRING( "CRCSEProfileRegistry::FindByServiceIdL() - OUT" ); + } + + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::FindBySIPSprofileIdL +// Gets all profiles based on SIP profile ID. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRCSEProfileRegistry::FindBySIPProfileIdL( TUint32 aSipProfileId, + RPointerArray& aFoundEntries ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::FindBySIPProfileIdL() - IN" ); + + CleanupResetAndDestroyPushL( aFoundEntries ); + + BeginL(); + + // Find all profile IDs + RArray voipIds; + CleanupClosePushL( voipIds ); + FindAllIdsL( voipIds ); + + // Check protocol ids (iIds) from each found profile ID. + // Leave only those profile IDs where match found. + CCenRepDatabaseProperty* property = CCenRepDatabaseProperty::NewLC(); + TInt count( voipIds.Count() ); + + RArray prIds; + CleanupClosePushL( prIds ); + + for ( TInt i( 0 ); i < count; i++ ) + { + iCenRepDb->FindPropertyL( voipIds[ i ], KColProtocolIds, *property ); + + const TDesC& value = property->GetDesValue(); + + ExtractProtocoIdsL( value, prIds ); + + TBool found( EFalse ); + TInt prIdCount( prIds.Count() ); + for ( TInt j( 0 ); j < prIdCount && !found; j++ ) + { + if ( prIds[ j ].iProfileType == CRCSEProfileEntry::EProtocolSIP && + prIds[ j ].iProfileId == aSipProfileId ) + { + found = ETrue; + } + } + + // Search profile if match found + if ( found ) + { + CRCSEProfileEntry* entry = CRCSEProfileEntry::NewLC(); + TRAPD( e, FindEntryL( voipIds[ i ], *entry ) ); + + if ( KErrNone == e ) + { + aFoundEntries.AppendL( entry ); + CleanupStack::Pop( entry ); + } + else + { + CleanupStack::PopAndDestroy( entry ); + } + } + } + + + CleanupStack::PopAndDestroy( &prIds ); + CleanupStack::PopAndDestroy( property ); + + + // Update SIP profile links + TInt entryCount( aFoundEntries.Count() ); + for ( TInt k( 0 ); k < entryCount; ++k ) + { + UpdateSIPProfileLinksL( *aFoundEntries[k] ); + } + + CleanupStack::PopAndDestroy( &voipIds ); + EndL(); + + CleanupStack::Pop( &aFoundEntries ); + + RCSELOGSTRING( "CRCSEProfileRegistry::FindBySIPProfileIdL() - OUT" ); + } + +// --------------------------------------------------------------------------- +// CRCSEProfileRegistry::AddL +// Add bunch of entries to store +// --------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::AddL( + RPointerArray& aEntries ) + { + RCSELOGSTRING2( + "CRCSEProfileRegistry::AddL( %d entries) - IN", aEntries.Count() ); + + BeginL(); + + TInt count( aEntries.Count() ); + + for ( TInt i( 0 ); i < count; ++i ) + { + // Create service settings if service ID is not available for entry + if ( KRCSEDefServiceProviderId == aEntries[ i ]->iServiceProviderId ) + { + CreateDefaultServiceSettingsL( *aEntries[ i ] ); + } + + TUint32 id( KNoEntryId ); + AddOrUpdateEntryL( id, *aEntries[ i ] ); + aEntries[ i ]->iId = id; + } + + + EndL(); + + RCSELOGSTRING( "CRCSEProfileRegistry::AddL(entries) - OUT" ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::FindEntryL +// Do actual search of profile entry +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::FindEntryL( + TUint32 aProfileId, + CRCSEProfileEntry& aFoundEntry ) + { + RCSELOGSTRING2( "CRCSEProfileRegistry::FindEntryL(id=%d) - IN", aProfileId ); + + RIpAppPropArray properties; + TCleanupItem cleanup( CRCSERegistryBase::CleanupDbPropArray, &properties ); + CleanupStack::PushL( cleanup ); + + User::LeaveIfError( iCenRepDb->FindEntryL( aProfileId, properties ) ); + ConvertPropertiesToEntryL( aFoundEntry, properties ); + aFoundEntry.iId = aProfileId; + + CleanupStack::PopAndDestroy( &properties ); + + RCSELOGSTRING2( "CRCSEProfileRegistry::FindEntryL(id=%d) - OUT", aProfileId ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::AddOrUpdateEntryL +// Adds new entry or updates values of existing enry +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::AddOrUpdateEntryL( + TUint32& aId, + const CRCSEProfileEntry& aEntry ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::AddOrUpdateEntryL() - IN" ); + + TInt id( aId ); + + RIpAppPropArray properties; + TCleanupItem cleanup( CRCSERegistryBase::CleanupDbPropArray, &properties ); + CleanupStack::PushL( cleanup ); + + ConvertEntryToPropertiesL( aEntry, properties ); + + if ( KNoEntryId == id ) // Add new one + { + RCSELOGSTRING( "-- Add --" ); + iCenRepDb->AddEntryL( id, properties ); + } + else // Update existing entry + { + RCSELOGSTRING( "-- Update --" ); + User::LeaveIfError( iCenRepDb->UpdateEntryL( id, properties ) ); + } + + aId = id; + + CleanupStack::PopAndDestroy( &properties ); + + RCSELOGSTRING( "CRCSEProfileRegistry::AddOrUpdateEntryL() - OUT" ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::ConvertPropertiesToEntryL( + CRCSEProfileEntry& aEntry, + RIpAppPropArray& aProperties ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::ConvertPropertiesToEntryL() - IN" ); + + aEntry.ResetDefaultValues(); + + TBuf value; + + GetPropertyValueL( KColProviderName, aEntry.iProviderName, aProperties ); + + GetPropertyValueL( KColSettingsName, aEntry.iSettingsName, aProperties ); + + GetPropertyValueL( KColPreferredCodecs, value, aProperties ); + + TLex lex2( value ); + while( !lex2.Eos() ) + { + // Extract the number as unsigned int 32, which can be + // converted to value wanted (template) + TUint32 num; + lex2.Val( num, EDecimal ); + aEntry.iPreferredCodecs.AppendL( static_cast( num ) ); + // Skip characters to space char. + lex2.SkipCharacters(); + if ( !lex2.Eos() ) // Check that End of string is not next char. + { + // Go over the space character. + lex2.Inc( 1 ); + } + } + + GetPropertyValueL( KColStartMediaPort, value, aProperties ); + aEntry.iStartMediaPort = ToTInt32L( value ); + + GetPropertyValueL( KColEndMediaPort, value, aProperties ); + aEntry.iEndMediaPort = ToTInt32L( value ); + + GetPropertyValueL( KColSiqnalingQOS, value, aProperties ); + aEntry.iSiqnalingQOS = ToTInt32L( value ); + + GetPropertyValueL( KColMediaQOS, value, aProperties ); + aEntry.iMediaQOS = ToTInt32L( value ); + + GetPropertyValueL( KColInbandDtmf, value, aProperties ); + aEntry.iInbandDTMF = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColOutbandDtmf, value, aProperties ); + aEntry.iOutbandDTMF = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColHoldRingBack, value, aProperties ); + aEntry.iHoldRingBack = ToTInt32L( value ); + + GetPropertyValueL( KColAutoComplete, value, aProperties ); + aEntry.iAutoComplete = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColCFNoAnswer, value, aProperties ); + aEntry.iCFNoAnswer = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColCFBusy, value, aProperties ); + aEntry.iCFBusy = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColCFUnconditional, value, aProperties ); + aEntry.iCFUnconditional = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColRedundancy, value, aProperties ); + aEntry.iRedundancy = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColProtocolIds, value, aProperties ); + ExtractProtocoIdsL( value, aEntry.iIds ); + + GetPropertyValueL( KColSecureCallPreference, value, aProperties ); + aEntry.iSecureCallPreference = ToTUint32L( value ); + + GetPropertyValueL( KColVoIPProfileLock, value, aProperties ); + aEntry.iVoIPProfileLock = ToTUint32L( value ); + + GetPropertyValueL( KColAdhocAllowed, value, aProperties ); + aEntry.iAdhocAllowed = ToTUint32L( value ); + + GetPropertyValueL( KColSIPServerType, value, aProperties ); + aEntry.iSIPServerType.Copy( value ); + + GetPropertyValueL( KColSBCType, value, aProperties ); + aEntry.iSBCType.Copy( value );; + + GetPropertyValueL( KColSTUNServerType, value, aProperties ); + aEntry.iSTUNServerType.Copy( value ); + + GetPropertyValueL( KColWLANAPType, value, aProperties ); + aEntry.iWLANAPType.Copy( value ); + + GetPropertyValueL( KColPSTNGatewayType, value, aProperties ); + aEntry.iPSTNGatewayType.Copy( value ); + + GetPropertyValueL( KColSecurityGatewayType, value, aProperties ); + aEntry.iSecurityGatewayType.Copy( value ); + + GetPropertyValueL( KColRTCP, value, aProperties ); + aEntry.iRTCP = ToTUint32L( value ); + + GetPropertyValueL( KColSIPVoIPUAHTerminalType, value, aProperties ); + aEntry.iSIPVoIPUAHTerminalType = ToTUint32L( value ); + + GetPropertyValueL( KColSIPVoIPUAHeaderWLANMAC, value, aProperties ); + aEntry.iSIPVoIPUAHeaderWLANMAC = ToTUint32L( value ); + + GetPropertyValueL( KColSIPVoIPUAHeaderString, value, aProperties ); + aEntry.iSIPVoIPUAHeaderString.Copy( value ); + + GetPropertyValueL( KColProfileLockedToIAP, value, aProperties ); + aEntry.iProfileLockedToIAP = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColVoIPPluginUID, value, aProperties ); + aEntry.iVoIPPluginUID = ToTInt32L( value ); + + GetPropertyValueL( KColAllowVoIPoverWCDMA, value, aProperties ); + aEntry.iAllowVoIPoverWCDMA = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColAllowVoIPoverBT, value, aProperties ); + aEntry.iAllowVoIPoverBT = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColMeanCountOfVoIPDigits, value, aProperties ); + aEntry.iMeanCountOfVoIPDigits = ToTInt32L( value ); + + GetPropertyValueL( KColIgnoreAddrDomainPart, value, aProperties ); + aEntry.iIgnoreAddrDomainPart = ToTInt32L( value ); + + GetPropertyValueL( KColHandoverDialect, value, aProperties ); + aEntry.iHandoverDialect = ToTInt32L( value ); + + GetPropertyValueL( KColPSTelephonyHOPreference, value, aProperties ); + aEntry.iPSTelephonyHOPreference = ToTInt32L( value ); + + GetPropertyValueL( KColHOThresholdValueLL, value, aProperties ); + aEntry.iHOThresholdValueLL = ToTInt32L( value ); + + GetPropertyValueL( KColHOThresholdValueHL, value, aProperties ); + aEntry.iHOThresholdValueHL = ToTInt32L( value ); + + GetPropertyValueL( KColNumberOfMeasurementsAbove, value, aProperties ); + aEntry.iNumberOfMeasurementsAbove = ToTInt32L( value ); + + GetPropertyValueL( KColNumberOfMeasurementsBelow, value, aProperties ); + aEntry.iNumberOfMeasurementsBelow = ToTInt32L( value ); + + GetPropertyValueL( KColSmartScannInterParaHigh, value, aProperties ); + aEntry.iSmartScannInterParaHigh = ToTInt32L( value ); + + GetPropertyValueL( KColSmartScannInterParaMedium, value, aProperties ); + aEntry.iSmartScannInterParaMedium = ToTInt32L( value ); + + GetPropertyValueL( KColSmartScannInterParaLow, value, aProperties ); + aEntry.iSmartScannInterParaLow = ToTInt32L( value ); + + GetPropertyValueL( KColSmartScannInterParaStatic, value, aProperties ); + aEntry.iSmartScannInterParaStatic = ToTInt32L( value ); + + GetPropertyValueL( KColSmartScannDurationHighMode, value, aProperties ); + aEntry.iSmartScannDurationHighMode = ToTInt32L( value ); + + GetPropertyValueL( KColSmartScannDurationMediumMode, value, aProperties ); + aEntry.iSmartScannDurationMediumMode = ToTInt32L( value ); + + GetPropertyValueL( KColSmartScannDurationLowMode, value, aProperties ); + aEntry.iSmartScannDurationLowMode = ToTInt32L( value ); + + GetPropertyValueL( KColHandoffNumber, value, aProperties ); + aEntry.iHandoffNumber = ToTInt32L( value ); + + GetPropertyValueL( KColHandbackNumber, value, aProperties ); + aEntry.iHandbackNumber = ToTInt32L( value ); + + GetPropertyValueL( KColHysterisisTimer, value, aProperties ); + aEntry.iHysterisisTimer = ToTInt32L( value ); + + GetPropertyValueL( KColHandOffProcessTimer, value, aProperties ); + aEntry.iHandOffProcessTimer = ToTInt32L( value ); + + GetPropertyValueL( KColDisconnectProcessTimer, value, aProperties ); + aEntry.iDisconnectProcessTimer = ToTInt32L( value ); + + GetPropertyValueL( KColHandoffPrefix, value, aProperties ); + aEntry.iHandoffPrefix.Copy( value ); + + GetPropertyValueL( KColHandbackPrefix, value, aProperties ); + aEntry.iHandbackPrefix.Copy( value ); + + GetPropertyValueL( KColHandoverTones, value, aProperties ); + aEntry.iHandoverTones = ToTInt32L( value ); + + GetPropertyValueL( KColSupportSMSoverWLAN, value, aProperties ); + aEntry.iSupportSMSoverWLAN = ToTInt32L( value ); + + GetPropertyValueL( KColServiceProviderId, value, aProperties ); + aEntry.iServiceProviderId = ToTUint32L( value ); + + GetPropertyValueL( KColUserPhoneUriParam, value, aProperties ); + aEntry.iUserPhoneUriParameter = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColSIPConnTestAddress, value, aProperties ); + aEntry.iSIPConnTestAddress.Copy( value ); + + GetPropertyValueL( KColNATSettingsStorageId, value, aProperties ); + aEntry.iNATSettingsStorageId = ToTUint32L( value ); + + GetPropertyValueL( KColSIPMinSE, value, aProperties ); + aEntry.iSIPMinSE = ToTInt32L( value ); + + GetPropertyValueL( KColSIPSessionExpires, value, aProperties ); + aEntry.iSIPSessionExpires = ToTInt32L( value ); + + GetPropertyValueL( KColNATProtocol, value, aProperties ); + aEntry.iNATProtocol = ToTInt32L( value ); + + GetPropertyValueL( KColNewServiceTable, value, aProperties ); + aEntry.iNewServiceTableEntry = static_cast( ToTInt32L( value ) ); + + GetPropertyValueL( KColSNAPId, value, aProperties ); + aEntry.iSNAPId = ToTUint32L( value ); + + GetPropertyValueL( KColCreationUrl, value, aProperties ); + aEntry.iAccountCreationUrl.Copy( value ); + + RCSELOGSTRING( "CRCSEProfileRegistry::ConvertPropertiesToEntryL() - OUT" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::ConvertEntryToPropertiesL( + const CRCSEProfileEntry& aEntry, + RIpAppPropArray& aProperties ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::ConvertEntryToPropertiesL() - IN" ); + + // Descriptor for value conversion + TBuf des; + + CreatePropertyL( KColProviderName, + aEntry.iProviderName, + aProperties ); + + CreatePropertyL( KColSettingsName, + aEntry.iSettingsName, + aProperties ); + + TInt count = aEntry.iPreferredCodecs.Count(); + des.Zero(); + for ( TInt j( 0 ); j < count; j++ ) + { + des.AppendNum( static_cast( aEntry.iPreferredCodecs[j] ) ); + if ( j < count - 1 ) + { + des.Append( KSpace ); + } + } + + CreatePropertyL( KColPreferredCodecs, + des, + aProperties ); + + CreatePropertyL( KColStartMediaPort, + ToDes( aEntry.iStartMediaPort, des ), + aProperties ); + + CreatePropertyL( KColEndMediaPort, + ToDes( aEntry.iEndMediaPort, des ), + aProperties ); + + CreatePropertyL( KColSiqnalingQOS, + ToDes( aEntry.iSiqnalingQOS, des ), + aProperties ); + + CreatePropertyL( KColMediaQOS, + ToDes( aEntry.iMediaQOS, des ), + aProperties ); + + TInt32 inbandDTMF( aEntry.iInbandDTMF ); // TOnOff + CreatePropertyL( KColInbandDtmf, + ToDes( inbandDTMF, des ), + aProperties ); + + TInt32 outbandDTMF( aEntry.iOutbandDTMF ); // TOnOff + CreatePropertyL( KColOutbandDtmf, + ToDes( outbandDTMF, des ), + aProperties ); + + TInt32 holdRingBack( aEntry.iHoldRingBack ); // TOnOff + CreatePropertyL( KColHoldRingBack, + ToDes( holdRingBack, des ), + aProperties ); + + TInt32 autoComplete = aEntry.iAutoComplete; // TOnOff + CreatePropertyL( KColAutoComplete, + ToDes( autoComplete, des ), + aProperties ); + + TInt32 cfNoAnswer( aEntry.iCFNoAnswer ); // TOnOff + CreatePropertyL( KColCFNoAnswer, + ToDes( cfNoAnswer, des ), + aProperties ); + + TInt32 cfBusy( aEntry.iCFBusy ); // TOnOff + CreatePropertyL( KColCFBusy, + ToDes( cfBusy, des ), + aProperties ); + + TInt32 cfUnconditional( aEntry.iCFUnconditional ); // TOnOff + CreatePropertyL( KColCFUnconditional, + ToDes( cfUnconditional, des ), + aProperties ); + + TInt32 redundancy( aEntry.iRedundancy ); // TOnOff + CreatePropertyL( KColRedundancy, + ToDes( redundancy, des ), + aProperties ); + + des.Zero(); + TBuf intDes; // for SIP profile ID + count = aEntry.iIds.Count(); + + if ( count ) + { + for( TInt i = 0; i < count; i++ ) + { + intDes.Zero(); + + TInt profileType = aEntry.iIds[i].iProfileType; + intDes.Num( profileType ); + des.Append( intDes ); + des.Append( KSpace ); + + TInt profileId = aEntry.iIds[i].iProfileId; + intDes.Num( profileId ); + des.Append( intDes ); + des.Append( KSpace ); + + TInt profileSpecificId = aEntry.iIds[i].iProfileSpecificSettingId; + intDes.Num( profileSpecificId ); + des.Append( intDes ); + des.Append( KSpace ); + } + } + + CreatePropertyL( KColProtocolIds, + des, + aProperties ); + + CreatePropertyL( KColSecureCallPreference, + ToDes( aEntry.iSecureCallPreference, des ), + aProperties ); + + CreatePropertyL( KColVoIPProfileLock, + ToDes( aEntry.iVoIPProfileLock, des ), + aProperties ); + + CreatePropertyL( KColAdhocAllowed, + ToDes( aEntry.iAdhocAllowed, des ), + aProperties ); + + CreatePropertyL( KColSIPServerType, + aEntry.iSIPServerType, + aProperties ); + + CreatePropertyL( KColSBCType, + aEntry.iSBCType, + aProperties ); + + CreatePropertyL( KColSTUNServerType, + aEntry.iSTUNServerType, + aProperties ); + + CreatePropertyL( KColWLANAPType, + aEntry.iWLANAPType, + aProperties ); + + CreatePropertyL( KColPSTNGatewayType, + aEntry.iPSTNGatewayType, + aProperties ); + + CreatePropertyL( KColSecurityGatewayType, + aEntry.iSecurityGatewayType, + aProperties ); + + CreatePropertyL( KColRTCP, + ToDes( aEntry.iRTCP, des ), + aProperties ); + + CreatePropertyL( KColSIPVoIPUAHTerminalType, + ToDes( aEntry.iSIPVoIPUAHTerminalType, des ), + aProperties ); + + CreatePropertyL( KColSIPVoIPUAHeaderWLANMAC, + ToDes( aEntry.iSIPVoIPUAHeaderWLANMAC, des ), + aProperties ); + + CreatePropertyL( KColSIPVoIPUAHeaderString, + aEntry.iSIPVoIPUAHeaderString, + aProperties ); + + TInt32 profileLockedToIAP( aEntry.iProfileLockedToIAP ); // TOnOff + CreatePropertyL( KColProfileLockedToIAP, + ToDes( profileLockedToIAP, des ), + aProperties ); + + CreatePropertyL( KColVoIPPluginUID, + ToDes( aEntry.iVoIPPluginUID, des ), + aProperties ); + + TInt32 allowVoIPoverWCDMA( aEntry.iAllowVoIPoverWCDMA ); // TOnOff + CreatePropertyL( KColAllowVoIPoverWCDMA, + ToDes( allowVoIPoverWCDMA, des ), + aProperties ); + + TInt32 allowVoIPoverBT( aEntry.iAllowVoIPoverBT ); // TOnOff + CreatePropertyL( KColAllowVoIPoverBT, + ToDes( allowVoIPoverBT, des ), + aProperties ); + + CreatePropertyL( KColMeanCountOfVoIPDigits, + ToDes( aEntry.iMeanCountOfVoIPDigits, des ), + aProperties ); + + CreatePropertyL( KColIgnoreAddrDomainPart, + ToDes( aEntry.iIgnoreAddrDomainPart, des ), + aProperties ); + + CreatePropertyL( KColHandoverDialect, + ToDes( aEntry.iHandoverDialect, des ), + aProperties ); + + CreatePropertyL( KColPSTelephonyHOPreference, + ToDes( aEntry.iPSTelephonyHOPreference, des ), + aProperties ); + + CreatePropertyL( KColHOThresholdValueLL, + ToDes( aEntry.iHOThresholdValueLL, des ), + aProperties ); + + CreatePropertyL( KColHOThresholdValueHL, + ToDes( aEntry.iHOThresholdValueHL, des ), + aProperties ); + + CreatePropertyL( KColNumberOfMeasurementsAbove, + ToDes( aEntry.iNumberOfMeasurementsAbove, des ), + aProperties ); + + CreatePropertyL( KColNumberOfMeasurementsBelow, + ToDes( aEntry.iNumberOfMeasurementsBelow, des ), + aProperties ); + + CreatePropertyL( KColSmartScannInterParaHigh, + ToDes( aEntry.iSmartScannInterParaHigh, des ), + aProperties ); + + CreatePropertyL( KColSmartScannInterParaMedium, + ToDes( aEntry.iSmartScannInterParaMedium, des ), + aProperties ); + + CreatePropertyL( KColSmartScannInterParaLow, + ToDes( aEntry.iSmartScannInterParaLow, des ), + aProperties ); + + CreatePropertyL( KColSmartScannInterParaStatic, + ToDes( aEntry.iSmartScannInterParaStatic, des ), + aProperties ); + + CreatePropertyL( KColSmartScannDurationHighMode, + ToDes( aEntry.iSmartScannDurationHighMode, des ), + aProperties ); + + CreatePropertyL( KColSmartScannDurationMediumMode, + ToDes( aEntry.iSmartScannDurationMediumMode, des ), + aProperties ); + + CreatePropertyL( KColSmartScannDurationLowMode, + ToDes( aEntry.iSmartScannDurationLowMode, des ), + aProperties ); + + CreatePropertyL( KColHandoffNumber, + ToDes( aEntry.iHandoffNumber, des ), + aProperties ); + + CreatePropertyL( KColHandbackNumber, + ToDes( aEntry.iHandbackNumber, des ), + aProperties ); + + CreatePropertyL( KColHysterisisTimer, + ToDes( aEntry.iHysterisisTimer, des ), + aProperties ); + + CreatePropertyL( KColHandOffProcessTimer, + ToDes( aEntry.iHandOffProcessTimer, des ), + aProperties ); + + CreatePropertyL( KColDisconnectProcessTimer, + ToDes( aEntry.iDisconnectProcessTimer, des ), + aProperties ); + + CreatePropertyL( KColHandoffPrefix, + aEntry.iHandoffPrefix, + aProperties ); + + CreatePropertyL( KColHandbackPrefix, + aEntry.iHandbackPrefix, + aProperties ); + + CreatePropertyL( KColHandoverTones, + ToDes( aEntry.iHandoverTones, des ), + aProperties ); + + CreatePropertyL( KColSupportSMSoverWLAN, + ToDes( aEntry.iSupportSMSoverWLAN, des ), + aProperties ); + + CreatePropertyL( KColServiceProviderId, + ToDes( aEntry.iServiceProviderId, des ), + aProperties ); + + TInt32 userPhoneUriParameter( aEntry.iUserPhoneUriParameter ); // TOnOff + CreatePropertyL( KColUserPhoneUriParam, + ToDes( userPhoneUriParameter, des ), + aProperties ); + + CreatePropertyL( KColSIPConnTestAddress, + aEntry.iSIPConnTestAddress, + aProperties ); + + CreatePropertyL( KColNATSettingsStorageId, + ToDes( aEntry.iNATSettingsStorageId, des ), + aProperties ); + + CreatePropertyL( KColSIPMinSE, + ToDes( aEntry.iSIPMinSE, des ), + aProperties ); + + CreatePropertyL( KColSIPSessionExpires, + ToDes( aEntry.iSIPSessionExpires, des ), + aProperties ); + + CreatePropertyL( KColNATProtocol, + ToDes( aEntry.iNATProtocol, des ), + aProperties ); + + TInt32 newServiceTable( aEntry.iNewServiceTableEntry ); // TOnOff + CreatePropertyL( KColNewServiceTable, + ToDes( newServiceTable, des ), + aProperties ); + + CreatePropertyL( KColSNAPId, + ToDes( aEntry.iSNAPId, des ), + aProperties ); + + CreatePropertyL( KColCreationUrl, + aEntry.iAccountCreationUrl, + aProperties ); + + RCSELOGSTRING( "CRCSEProfileRegistry::ConvertEntryToPropertiesL() - OUT" ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry:: +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::ExtractProtocoIdsL( + const TDesC& aDes, RArray& aArray ) + { + CleanupClosePushL( aArray ); + + TLex lex( aDes ); + + TSettingIds value; + + // Reset original array + aArray.Reset(); + + while( !lex.Eos() ) + { + lex.Val( value.iProfileType ); + // Skip characters to space char. + lex.SkipCharacters(); + lex.Inc( 1 ); + lex.Val( value.iProfileId ); + lex.SkipCharacters(); + lex.Inc( 1 ); + lex.Val( value.iProfileSpecificSettingId ); + + aArray.AppendL( value ); + if ( !lex.Eos() ) // Check that End of string is not next char. + { + // Go over the space character. + lex.Inc( 1 ); + } + } + + CleanupStack::Pop( &aArray ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::UpdateSIPProfileLinksL +// Validates profile's SIP profile IDs and updates if necessary +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::UpdateSIPProfileLinksL( CRCSEProfileEntry& aEntry ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::UpdateSIPProfileLinksL - IN" ); + const TInt count( aEntry.iIds.Count() ); + TSettingIds value; + RCSELOGSTRING2( "Protocol link count=%d", count ); + + if ( 0 < count ) + { + iSIPProfiles.ResetAndDestroy(); + + TInt err(0); + // Check the existence of linked SIP profiles + for ( TInt i( count-1 ); 0 <= i ; i-- ) + { + value = aEntry.iIds[i]; + + if ( CRCSEProfileEntry::EProtocolSIP == value.iProfileType ) + { + CSIPProfile* profile = NULL; + TRAP( err, profile = iSIPRegistry->ProfileL( value.iProfileId ) ); + if ( KErrNotFound == err ) + { + aEntry.iIds.Remove( i ); + delete profile; + profile = NULL; + RCSELOGSTRING2( "SIP link removed, id=%d", value.iProfileId ); + } + else if ( KErrNone == err ) + { + err = iSIPProfiles.Append( profile ); + } + else + { + delete profile; + profile = NULL; + } + } + } + + // Check that all profiles have same AOR. + // If some AOR differs leave only the first link + TInt profCount( iSIPProfiles.Count() ); + RCSELOGSTRING2( "SIP link count=%d", profCount ); + TBool ok( ETrue ); + if ( 1 < profCount ) + { + const TDesC8* aor1; + HBufC8* empty = KNullDesC8().AllocLC(); + err = iSIPProfiles[0]->GetParameter( KSIPUserAor, aor1 ); + + if ( KErrNotFound == err ) + { + aor1 = empty; + } + + for ( TInt j( 1 ); j < profCount; j++ ) + { + const TDesC8* aor2; + err = iSIPProfiles[j]->GetParameter( KSIPUserAor, aor2 ); + + if ( KErrNotFound == err ) + { + if ( aor1->Compare( KNullDesC8() ) != 0 ) + { + ok = EFalse; + } + } + else + { + if ( aor1->Compare( *aor2 ) != 0 ) + { + ok = EFalse; + } + } + } + CleanupStack::PopAndDestroy( empty ); + + if ( !ok ) + { + RCSELOGSTRING( "AOR changed" ); + TInt newCount = aEntry.iIds.Count(); + TBool first( ETrue ); + for ( TInt k( 0 ); k < newCount; k++ ) + { + value = aEntry.iIds[k]; + if ( CRCSEProfileEntry::EProtocolSIP == value.iProfileType ) + { + if ( first ) + { + first = EFalse; + RCSELOGSTRING2( "Leave SIP link, index=%d", k ); + } + else + { + aEntry.iIds.Remove( k ); + newCount--; + k--; + RCSELOGSTRING2( "Remove SIP link, index=%d", k ); + } + } + } + } + } + + iSIPProfiles.ResetAndDestroy(); + + // Update entry if count of ids have changed + if ( count != aEntry.iIds.Count() ) + { + RCSELOGSTRING3( "Link ID count: initial=%d, final=%d", + count, aEntry.iIds.Count() ); + + AddOrUpdateEntryL( aEntry.iId, aEntry ); + + RCSELOGSTRING( "Entry updated" ); + } + } + + RCSELOGSTRING( "CRCSEProfileRegistry::UpdateSIPProfileLinksL - OUT" ); + } + +// ----------------------------------------------------------------------------- +// Local helper method for searching default values of properties from service +// table and adding them to given service entry. +// ----------------------------------------------------------------------------- +// +void FindAndAddDefaultPropertyL( + CSPSettings& aTable, + CSPEntry& aEntry, + CSPProperty& aProperty, + TServicePropertyName aName ) + { + TInt err = aTable.FindPropertyL( KDefaultVoIPService, aName, aProperty ); + + if ( KErrNone == err ) + { + err = aEntry.AddPropertyL( aProperty ); + if ( KErrNone != err ) + { + RCSELOGSTRING2( + "CRCSEProfileRegistry::FindAndAddDefaultPropertyL - add property err: %d", + err ); + } + } + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::CreateDefaultServiceSettingsL +// Creates a voip-sip service entry with default content and return +// service ID for new profile +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::CreateDefaultServiceSettingsL( + CRCSEProfileEntry& aNewEntry ) + { + RCSELOGSTRING( + "CRCSEProfileRegistry::CreateDefaultServiceSettingsL - IN" ); + + // Do not create service if there is no SIP linkage. + if ( !aNewEntry.iIds.Count() ) + { + return; + } + else if ( aNewEntry.iIds[0].iProfileType != + CRCSEProfileEntry::EProtocolSIP ) + { + return; + } + + TInt err( KErrNone ); + + // Service table API + CSPSettings* table = CSPSettings::NewLC(); + + // New service entry for this provider name + CSPEntry* entry = CSPEntry::NewLC(); + entry->SetServiceName( aNewEntry.iProviderName ); + + CSPProperty* property = CSPProperty::NewLC(); + + // Service Setup plug-in UID ( if VoIP plugin UID set ) + if ( KRCSEDefaultVoIPPluginUID != aNewEntry.iVoIPPluginUID ) + { + property->SetName( EPropertyServiceSetupPluginId ); + property->SetValue( aNewEntry.iVoIPPluginUID ); + err = entry->AddPropertyL( *property ); + if ( KErrAlreadyExists == err ) + { + User::LeaveIfError( + entry->UpdateProperty( EPropertyServiceSetupPluginId, + aNewEntry.iVoIPPluginUID ) ); + } + else + { + User::LeaveIfError( err ); + } + } + + // This property is needed by clients to check if VoIP service is used + property->SetName( ESubPropertyVoIPSettingsId ); + property->SetValue( KVoIPSettingsID ); + err = entry->AddPropertyL( *property ); + if ( KErrAlreadyExists == err ) + { + User::LeaveIfError( entry->UpdateProperty( ESubPropertyVoIPSettingsId, + KVoIPSettingsID ) ); + } + else + { + User::LeaveIfError( err ); + } + + // Service Attribute Mask + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyServiceAttributeMask ); + + // Phone Application CLI plug-in UID + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyCLIPluginId ); + + // Phone Application Call Logging plug-in UID. + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyCallLoggingPluginId ); + + // Phone Application Call State Indicator plug-in UID. + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyCallStateIndicatorPluginId ); + + // Phone Application Call Menu Handler plug-in UID. + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyCallMenuHandlerPluginId ); + + // Converged Call Engine Call Provider plug-in UID. + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyCallProviderPluginId ); + + // Virtual Phonebook Contact Store ID. + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyContactStoreId ); + + // Contact View plug-in UID + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyContactViewPluginId ); + + // Converged Connection Handler (CCH) VoIP Subservice plug-in UID + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyVoIPSubServicePluginId ); + + // Converged Connection Handler (CCH) VMBX Subservice plug-in UID + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyVMBXSubServicePluginId ); + + // Brand ID for VoIP + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyBrandId ); + + // Presence Service Connectivity plugin UID + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyPCSPluginId ); + + // Maximum Lenght of Log Contact Link + FindAndAddDefaultPropertyL( + *table, *entry, *property, EPropertyLogCntLinkMaxLength ); + + // Field Type of Presence Presentity ID + FindAndAddDefaultPropertyL( + *table, *entry, *property, ESubPropertyPresencePresentityIDFieldType ); + + // Add entry to store and set service ID + User::LeaveIfError( table->AddEntryL( *entry ) ); + aNewEntry.iServiceProviderId + = static_cast( entry->GetServiceId() ); + + CleanupStack::PopAndDestroy( property ); + CleanupStack::PopAndDestroy( entry ); + CleanupStack::PopAndDestroy( table ); + + RCSELOGSTRING( + "CRCSEProfileRegistry::CreateDefaultServiceSettingsL - OUT" ); + } + +// --------------------------------------------------------------------------- +// CRCSEProfileRegistry::DeleteReferenceSettingsL +// --------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::DeleteReferenceSettingsL( TUint32 aProfileId ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::DeleteReferenceSettingsL - IN" ); + + CRCSEProfileEntry* profileInfo = CRCSEProfileEntry::NewLC(); + + TRAPD( e, FindL( aProfileId, *profileInfo ) ); + + __ASSERT_ALWAYS( KErrNone == e || KErrNotFound == e, User::Leave( e ) ); + + // Delete related audio codecs + CRCSEAudioCodecRegistry* codecReg = CRCSEAudioCodecRegistry::NewLC(); + codecReg->DeleteL( profileInfo->iPreferredCodecs ); + CleanupStack::PopAndDestroy( codecReg ); + + // Delete related service settings + if( CRCSEProfileEntry::EOONotSet == profileInfo->iNewServiceTableEntry || + CRCSEProfileEntry::EOn == profileInfo->iNewServiceTableEntry ) + { + RCSELOGSTRING( "Delete related service settings" ); + CSPSettings* serviceSettings = CSPSettings::NewLC(); + serviceSettings->DeleteEntryL( profileInfo->iServiceProviderId ); + CleanupStack::PopAndDestroy( serviceSettings ); + } + + CleanupStack::PopAndDestroy( profileInfo ); + + RCSELOGSTRING( "CRCSEProfileRegistry::DeleteReferenceSettingsL - OUT" ); + } +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::NameExistsInServiceTableL +// ----------------------------------------------------------------------------- +// +TBool CRCSEProfileRegistry::NameExistsInServiceTableL( + const TDesC& aProviderName ) const + { + RCSELOGSTRING( "CRCSEProfileRegistry::NameExistsInServiceTableL- IN" ); + TBool result( EFalse ); + + RIdArray serviceIds; + CleanupClosePushL( serviceIds ); + CDesCArray* serviceNames = + new ( ELeave ) CDesCArrayFlat( KArrayInitSize ); + CleanupStack::PushL( serviceNames ); + CSPSettings* serviceSettings = CSPSettings::NewLC(); + TInt err(KErrNone); + err = serviceSettings->FindServiceIdsL( serviceIds ); + if ( KErrNotFound == err ) + { + CleanupStack::PopAndDestroy( serviceSettings ); + CleanupStack::PopAndDestroy( serviceNames ); + CleanupStack::PopAndDestroy( &serviceIds ); + return EFalse; + } + User::LeaveIfError( err ); + User::LeaveIfError( + serviceSettings->FindServiceNamesL( serviceIds, *serviceNames ) ); + CleanupStack::PopAndDestroy( serviceSettings ); + TBool serviceFound( EFalse ); + for ( TInt i( 0 ) ; i < serviceNames->MdcaCount() && !serviceFound ; i++ ) + { + if ( !aProviderName.Compare( serviceNames->MdcaPoint( i) ) ) + { + result = ETrue; + serviceFound = ETrue; + } + } + CleanupStack::PopAndDestroy( serviceNames ); + CleanupStack::PopAndDestroy( &serviceIds ); + + RCSELOGSTRING( "CRCSEProfileRegistry::NameExistsInServiceTableL- OUT" ); + return result; + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::LeaveIfServiceIdInUseL +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::LeaveIfServiceIdInUseL( + const CRCSEProfileEntry& aEntry ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::LeaveIfServiceIdInUseL - IN" ); + + // Find all profile IDs + RArray voipIds; + CleanupClosePushL( voipIds ); + FindAllIdsL( voipIds ); + + + // Check service id from each profile + CCenRepDatabaseProperty* property = CCenRepDatabaseProperty::NewLC(); + TBuf value; + TInt count( voipIds.Count() ); + + for ( TInt i( 0 ); i < count; i++ ) + { + iCenRepDb->FindPropertyL( voipIds[ i ], KColProtocolIds, *property ); + + __ASSERT_ALWAYS( + aEntry.iServiceProviderId != ToTUint32L( property->GetDesValue() ), + User::Leave( KErrAlreadyExists ) ); + } + + CleanupStack::PopAndDestroy( property ); + CleanupStack::PopAndDestroy( &voipIds ); + + RCSELOGSTRING( "CRCSEProfileRegistry::LeaveIfServiceIdInUseL - OUT" ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::UpdateServiceSettingsL +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::UpdateServiceSettingsL( + const CRCSEProfileEntry& aEntry ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::UpdateServiceSettingsL - IN" ); + + // Do not update service if there is no SIP linkage. + if ( !aEntry.iIds.Count() ) + { + return; + } + else if ( aEntry.iIds[0].iProfileType != + CRCSEProfileEntry::EProtocolSIP ) + { + return; + } + + CSPSettings* serviceSettings = CSPSettings::NewLC(); + CSPEntry* serviceEntry = CSPEntry::NewLC(); + + User::LeaveIfError( + serviceSettings->FindEntryL( + aEntry.iServiceProviderId, *serviceEntry ) ); + + // Update service settings if service name has been changed + if ( aEntry.iProviderName != serviceEntry->GetServiceName() ) + { + serviceEntry->SetServiceName( aEntry.iProviderName ); + User::LeaveIfError( serviceSettings->UpdateEntryL( *serviceEntry ) ); + } + + CleanupStack::PopAndDestroy( serviceEntry ); + CleanupStack::PopAndDestroy( serviceSettings ); + + RCSELOGSTRING( "CRCSEProfileRegistry::UpdateServiceSettingsL - OUT" ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::UpdateServiceIdL +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::UpdateServiceIdL( TUint32 aId, TUint32 aServiceId ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::UpdateServiceIdL - IN" ); + + TBuf des; + + RIpAppPropArray properties; + + CreatePropertyL( KColServiceProviderId, + ToDes( aServiceId, des ), + properties ); + + iCenRepDb->AddOrUpdatePropertiesL( aId, properties ); + + properties.ResetAndDestroy(); + + RCSELOGSTRING( "CRCSEProfileRegistry::UpdateServiceIdL - OUT" ); + } + +// --------------------------------------------------------------------------- +// From MSIPProfileRegistryObserver +// CRCSEProfileRegistry::ProfileRegistryEventOccurred +// SIP profile event +// --------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::ProfileRegistryEventOccurred( + TUint32 /*aSIPProfileId*/, + TEvent /*aEvent*/ ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::ProfileRegistryEventOccurred" ); + // Have to be implemented because MSIPProfileRegistryObserver + // is passed to CSIPManagedProfileRegistry. + } + +// --------------------------------------------------------------------------- +// From MSIPProfileRegistryObserver +// CRCSEProfileRegistry::ProfileRegistryErrorOccured +// An asynchronous error has occurred related to SIP profile +// --------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::ProfileRegistryErrorOccurred( + TUint32 /*aProfileId*/, + TInt /*aError*/ ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::ProfileRegistryErrorOccurred" ); + // Have to be implemented because MSIPProfileRegistryObserver + // is passed to CSIPManagedProfileRegistry. + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::ResetAndDestroyEntries +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::ResetAndDestroyEntries( TAny* anArray ) + { + RCSELOGSTRING( "CRCSEProfileRegistry::ResetAndDestroyEntries - IN" ); + + RPointerArray* array = + reinterpret_cast*>( anArray ); + if (array) + { + array->ResetAndDestroy(); + array->Close(); + } + RCSELOGSTRING( "CRCSEProfileRegistry::ResetAndDestroyEntries - OUT" ); + } + +// ----------------------------------------------------------------------------- +// CRCSEProfileRegistry::CopyEntryValues +// ----------------------------------------------------------------------------- +// +void CRCSEProfileRegistry::CopyEntryValues( + const CRCSEProfileEntry& aSourceEntry, + CRCSEProfileEntry& aDestinationEntry ) + { + aDestinationEntry.ResetDefaultValues(); + aDestinationEntry.iIds.Reset(); + for ( TInt i = 0; i < aSourceEntry.iIds.Count(); i++ ) + { + aDestinationEntry.iIds.Append( aSourceEntry.iIds[i] ); + } + aDestinationEntry.iId = aSourceEntry.iId; + aDestinationEntry.iProviderName = aSourceEntry.iProviderName; + aDestinationEntry.iSettingsName = aSourceEntry.iSettingsName; + aDestinationEntry.iPreferredCodecs.Reset(); + for ( TInt i = 0; i < aSourceEntry.iPreferredCodecs.Count(); i++ ) + { + aDestinationEntry.iPreferredCodecs.Append( + aSourceEntry.iPreferredCodecs[i] ); + } + aDestinationEntry.iStartMediaPort = aSourceEntry.iStartMediaPort; + aDestinationEntry.iEndMediaPort = aSourceEntry.iEndMediaPort; + aDestinationEntry.iMediaQOS = aSourceEntry.iMediaQOS; + aDestinationEntry.iInbandDTMF = aSourceEntry.iInbandDTMF; + aDestinationEntry.iOutbandDTMF = aSourceEntry.iOutbandDTMF; + aDestinationEntry.iSecureCallPreference = + aSourceEntry.iSecureCallPreference; + aDestinationEntry.iRTCP = aSourceEntry.iRTCP; + aDestinationEntry.iSIPVoIPUAHTerminalType = + aSourceEntry.iSIPVoIPUAHTerminalType; + aDestinationEntry.iSIPVoIPUAHeaderWLANMAC = + aSourceEntry.iSIPVoIPUAHeaderWLANMAC; + aDestinationEntry.iSIPVoIPUAHeaderString = + aSourceEntry.iSIPVoIPUAHeaderString; + aDestinationEntry.iProfileLockedToIAP = aSourceEntry.iProfileLockedToIAP; + aDestinationEntry.iVoIPPluginUID = aSourceEntry.iVoIPPluginUID; + aDestinationEntry.iAllowVoIPoverWCDMA = aSourceEntry.iAllowVoIPoverWCDMA; + aDestinationEntry.iMeanCountOfVoIPDigits = + aSourceEntry.iMeanCountOfVoIPDigits; + aDestinationEntry.iIgnoreAddrDomainPart = + aSourceEntry.iIgnoreAddrDomainPart; + aDestinationEntry.iServiceProviderId = aSourceEntry.iServiceProviderId; + aDestinationEntry.iUserPhoneUriParameter = + aSourceEntry.iUserPhoneUriParameter; + aDestinationEntry.iSIPConnTestAddress = aSourceEntry.iSIPConnTestAddress; + aDestinationEntry.iNATSettingsStorageId = + aSourceEntry.iNATSettingsStorageId; + aDestinationEntry.iSIPMinSE = aSourceEntry.iSIPMinSE; + aDestinationEntry.iSIPSessionExpires = aSourceEntry.iSIPSessionExpires; + aDestinationEntry.iNATProtocol = aSourceEntry.iNATProtocol; + aDestinationEntry.iNewServiceTableEntry = + aSourceEntry.iNewServiceTableEntry; + aDestinationEntry.iSNAPId = aSourceEntry.iSNAPId; + aDestinationEntry.iAccountCreationUrl = aSourceEntry.iAccountCreationUrl; + } + +// End of File + +