--- /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 <sipmanagedprofileregistry.h>
+#include <sipprofile.h>
+
+#include <spsettings.h>
+#include <spentry.h>
+#include <spproperty.h>
+#include <spdefinitions.h>
+#include <featmgr.h>
+
+#include <cenrepdatabaseutil.h>
+#include <cenrepdatabaseproperty.h>
+
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+
+#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<TUint32> 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<CRCSEProfileEntry&>( 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<TUint32>& 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<CRCSEProfileEntry>& aFoundEntries )
+ {
+ RCSELOGSTRING( "CRCSEProfileRegistry::FindByServiceIdL() - IN" );
+
+ CleanupResetAndDestroyPushL( aFoundEntries );
+
+ BeginL();
+
+ TBuf<KDesLength128> des;
+
+ RArray<TUint32> 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<CRCSEProfileEntry>& aFoundEntries )
+ {
+ RCSELOGSTRING( "CRCSEProfileRegistry::FindBySIPProfileIdL() - IN" );
+
+ CleanupResetAndDestroyPushL( aFoundEntries );
+
+ BeginL();
+
+ // Find all profile IDs
+ RArray<TUint32> 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<TSettingIds> 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<CRCSEProfileEntry>& 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<KDesLength256> 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<TUint32>( 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<CRCSEProfileEntry::TOnOff>( ToTInt32L( value ) );
+
+ GetPropertyValueL( KColOutbandDtmf, value, aProperties );
+ aEntry.iOutbandDTMF = static_cast<CRCSEProfileEntry::TOnOff>( ToTInt32L( value ) );
+
+ GetPropertyValueL( KColHoldRingBack, value, aProperties );
+ aEntry.iHoldRingBack = ToTInt32L( value );
+
+ GetPropertyValueL( KColAutoComplete, value, aProperties );
+ aEntry.iAutoComplete = static_cast<CRCSEProfileEntry::TOnOff>( ToTInt32L( value ) );
+
+ GetPropertyValueL( KColCFNoAnswer, value, aProperties );
+ aEntry.iCFNoAnswer = static_cast<CRCSEProfileEntry::TOnOff>( ToTInt32L( value ) );
+
+ GetPropertyValueL( KColCFBusy, value, aProperties );
+ aEntry.iCFBusy = static_cast<CRCSEProfileEntry::TOnOff>( ToTInt32L( value ) );
+
+ GetPropertyValueL( KColCFUnconditional, value, aProperties );
+ aEntry.iCFUnconditional = static_cast<CRCSEProfileEntry::TOnOff>( ToTInt32L( value ) );
+
+ GetPropertyValueL( KColRedundancy, value, aProperties );
+ aEntry.iRedundancy = static_cast<CRCSEProfileEntry::TOnOff>( 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<CRCSEProfileEntry::TOnOff>( ToTInt32L( value ) );
+
+ GetPropertyValueL( KColVoIPPluginUID, value, aProperties );
+ aEntry.iVoIPPluginUID = ToTInt32L( value );
+
+ GetPropertyValueL( KColAllowVoIPoverWCDMA, value, aProperties );
+ aEntry.iAllowVoIPoverWCDMA = static_cast<CRCSEProfileEntry::TOnOff>( ToTInt32L( value ) );
+
+ GetPropertyValueL( KColAllowVoIPoverBT, value, aProperties );
+ aEntry.iAllowVoIPoverBT = static_cast<CRCSEProfileEntry::TOnOff>( 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<CRCSEProfileEntry::TOnOff>( 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<CRCSEProfileEntry::TOnOff>( 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<KDesLength128> 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<TUint32>( 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<KDesLength15> 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<TSettingIds>& 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<TUint32>( 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<TUint32> voipIds;
+ CleanupClosePushL( voipIds );
+ FindAllIdsL( voipIds );
+
+
+ // Check service id from each profile
+ CCenRepDatabaseProperty* property = CCenRepDatabaseProperty::NewLC();
+ TBuf<KDesLength256> 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<KDesLength128> 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<CRCSEProfileEntry>* array =
+ reinterpret_cast<RPointerArray<CRCSEProfileEntry>*>( 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
+
+