--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/voipadapters/dmgenvoipsettings/src/NSmlDmGeneralVoIPSettingsAdapter.cpp Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,1102 @@
+/*
+* Copyright (c) 2006 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: Device Management General VoIP Settings Adapter
+*
+*/
+
+
+#include <utf.h>
+#include <implementationproxy.h> // For TImplementationProxy definition
+#include <sysutil.h>
+#include <e32property.h>
+#include <centralrepository.h>
+#include <crcseprofileentry.h>
+#include <crcseprofileregistry.h>
+#include <settingsinternalcrkeys.h>
+#include <featmgr.h>
+
+#include "NSmlDmGeneralVoIPSettingsAdapter.h"
+#include "nsmlconstants.h"
+#include "nsmldmconstants.h"
+#include "nsmldmconst.h"
+
+const TUint KNSmlDMGenVoIPAdapterImplUid = 0x10275413;
+const TInt KNSmlGenVoIPMaxResultLength = 256;
+const TInt KNSmlGenVoIPMaxUriLength = 100;
+const TInt KDefaultResultSize = 64;
+const TInt KTwoSegs = 2;
+const TInt KMaxUriLength = 64;
+
+// Reference: OMA_Device_Management_DDF_for_General_VoIP_Settings
+_LIT8( KNSmlDMGenVoIPDDFVersion, "0.1" );
+_LIT8( KNSmlDMGenVoIPNodeName, "GenVoIP" );
+_LIT8( KNSmlDMVoIPNodeName, "VoIP" );
+_LIT8( KNSmlDMGenVoIPClir, "Clir" );
+_LIT8( KNSmlDMGenVoIPAnonCallBlockRule, "AnonCallBlockRule" );
+_LIT8( KNSmlDMGenVoIPPreferredTelephony, "PrefTelephony" );
+_LIT8( KNSmlDMGenVoIPDoNotDisturb, "DoNotDisturb" );
+_LIT8( KNSmlDMGenVoIPPSCallWaiting, "PSCallWaiting" );
+_LIT8( KNSmlDMGenVoIPProfileId, "VoIPProfileId" );
+
+_LIT8( KNSmlDMGenVoIPNodeNameExp, "Main node for General VoIP settings" );
+_LIT8( KNSmlDMGenVoIPClirExp, "Calling Line Identification Restriction" );
+_LIT8( KNSmlDMGenVoIPPSCallWaitingExp, "PS call waiting" );
+_LIT8( KNSmlDMGenVoIPAnonCallBlockRuleExp, "Anonymous call blocking rule" );
+_LIT8( KNSmlDMGenVoIPPreferredTelephonyExp, "Preferred telephony" );
+_LIT8( KNSmlDMGenVoIPDoNotDisturbExp, "Do not disturb" );
+_LIT8( KNSmlDMGenVoIPProfileIdExp, "VoIP node id for linking" );
+
+// Other
+_LIT8( KNSmlDMGenVoIPTextPlain, "text/plain" );
+_LIT8( KNSmlDMGenVoIPSeparator, "/" );
+_LIT8( KNSmlDMGenVoIPUriDotSlash, "./");
+_LIT8( KVoipId, "VoIPId" );
+
+//MACROS
+#define KNSMLDMURISEPARATORDEF '/'
+
+// Following lines are for enabling debug prints.
+#ifdef _DEBUG
+#define _DBG_FILE(p) RDebug::Print(_L(p))
+#define _DBG_FILE2(p,a) RDebug::Print(_L(p),a)
+#else
+#define _DBG_FILE(p)
+#define _DBG_FILE2(p,a)
+#endif // _DEBUG
+
+// ======== LOCAL FUNCTIONS ========
+
+template <class T>
+inline void CleanupResetAndDestroy<T>::PushL(T& aRef)
+ {CleanupStack::PushL(TCleanupItem(&ResetAndDestroy,&aRef));}
+
+template <class T>
+void CleanupResetAndDestroy<T>::ResetAndDestroy(TAny *aPtr)
+ {(STATIC_CAST(T*,aPtr))->ResetAndDestroy();}
+
+template <class T>
+inline void CleanupResetAndDestroyL(T& aRef)
+ {CleanupResetAndDestroy<T>::PushL(aRef);}
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::ConstructL()
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::ConstructL(): begin" );
+ // Check VoIP support from feature manager
+ FeatureManager::InitializeLibL();
+ TBool support = FeatureManager::FeatureSupported( KFeatureIdCommonVoip );
+ FeatureManager::UnInitializeLib();
+
+ if( !support )
+ {
+ _DBG_FILE(
+ "CNSmlDmGeneralVoIPSettingsAdapter::ConstructL(): no support" );
+ User::Leave( KErrNotSupported );
+ }
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::ConstructL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter* CNSmlDmGeneralVoIPSettingsAdapter::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CNSmlDmGeneralVoIPSettingsAdapter* CNSmlDmGeneralVoIPSettingsAdapter::NewL(
+ MSmlDmCallback* aDmCallback )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::NewL(): begin" );
+ CNSmlDmGeneralVoIPSettingsAdapter* self = NewLC( aDmCallback );
+ CleanupStack::Pop( self );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::NewL(): end" );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter* CNSmlDmGeneralVoIPSettingsAdapter::NewLC
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CNSmlDmGeneralVoIPSettingsAdapter* CNSmlDmGeneralVoIPSettingsAdapter::NewLC(
+ MSmlDmCallback* aDmCallback )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::NewLC(): begin" );
+ CNSmlDmGeneralVoIPSettingsAdapter* self =
+ new ( ELeave ) CNSmlDmGeneralVoIPSettingsAdapter( aDmCallback );
+ CleanupStack::PushL( self );
+
+ self->ConstructL();
+ self->iDmCallback = aDmCallback;
+
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::NewLC(): end" );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::~CNSmlDmGeneralVoIPSettingsAdapter()
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CNSmlDmGeneralVoIPSettingsAdapter::~CNSmlDmGeneralVoIPSettingsAdapter()
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::~CNSmlDmGeneralVoIPSettingsAdapter(): begin" );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::~CNSmlDmGeneralVoIPSettingsAdapter(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::CNSmlDmGeneralVoIPSettingsAdapter
+// ---------------------------------------------------------------------------
+//
+CNSmlDmGeneralVoIPSettingsAdapter::CNSmlDmGeneralVoIPSettingsAdapter(
+ TAny* aEcomArguments ):CSmlDmAdapter( aEcomArguments )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::CNSmlDmGeneralVoIPSettingsAdapter( aEcomArguments ): begin" );
+ iEntry.iAreSettingsLoaded = EFalse;
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::CNSmlDmGeneralVoIPSettingsAdapter( aEcomArguments ): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::FetchObjectL
+// Fetches the values of leaf objects.
+// ---------------------------------------------------------------------------
+//
+CSmlDmAdapter::TError CNSmlDmGeneralVoIPSettingsAdapter::FetchObjectL(
+ const TDesC8& aURI,
+ CBufBase& aResult )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::FetchObjectL(): begin" );
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EError;
+ TBuf8< KNSmlGenVoIPMaxResultLength > segmentResult;
+ TPtrC8 lastURISeg = LastURISeg( aURI );
+ TPtrC8 uriTmp = RemoveLastURISeg( aURI );
+ TPtrC8 secondLastURISeg = LastURISeg( uriTmp );
+
+ if ( !( iEntry.iAreSettingsLoaded ) )
+ {
+ TInt err = LoadSettingsL();
+ if ( KErrNone != err )
+ {
+ return status;
+ }
+ }
+
+ if ( 0 == secondLastURISeg.Compare( KNSmlDMGenVoIPNodeName() )
+ && KTwoSegs == NumOfURISegs( aURI ) )
+ {
+ status = CSmlDmAdapter::EOk;
+ // Clir
+ if ( KNSmlDMGenVoIPClir() == lastURISeg )
+ {
+ segmentResult.Num( iEntry.iClir );
+ }
+ // AnonCallBlockRule
+ else if ( KNSmlDMGenVoIPAnonCallBlockRule() == lastURISeg )
+ {
+ segmentResult.Num( iEntry.iACBRule );
+ }
+ // PreferredTelephony
+ else if ( KNSmlDMGenVoIPPreferredTelephony() == lastURISeg )
+ {
+ segmentResult.Num( iEntry.iPrefTel );
+ }
+ // DoNotDisturb
+ else if ( KNSmlDMGenVoIPDoNotDisturb() == lastURISeg )
+ {
+ segmentResult.Num( iEntry.iDnd );
+ }
+ // PSCallWaiting
+ else if ( KNSmlDMGenVoIPPSCallWaiting() == lastURISeg )
+ {
+ segmentResult.Num( iEntry.iPSCallWaiting );
+ }
+ // ProfileName
+ else if ( KNSmlDMGenVoIPProfileId() == lastURISeg )
+ {
+ segmentResult.Copy( iEntry.iVoipProfileId );
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+
+ if ( CSmlDmAdapter::EOk == status )
+ {
+ aResult.InsertL( aResult.Size(), segmentResult );
+ }
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::FetchObjectL(): end" );
+ return status;
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::LoadSettingsL
+// Loads general VoIP settings from Central Repository.
+// ---------------------------------------------------------------------------
+//
+TInt CNSmlDmGeneralVoIPSettingsAdapter::LoadSettingsL()
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSEttingsAdapter::LoadSettingsL(): begin" );
+ CRepository* cRepository = CRepository::NewLC( KCRUidRichCallSettings );
+
+ TInt err( KErrNone );
+ err = cRepository->Get( KRCSEClir, iEntry.iClir );
+ if ( KErrNone == err )
+ {
+ err = cRepository->Get( KRCSEAnonymousCallBlockRule,
+ iEntry.iACBRule );
+ }
+ if ( KErrNone == err )
+ {
+ err = cRepository->Get( KRCSEPreferredTelephony, iEntry.iPrefTel );
+ }
+ if ( KErrNone == err )
+ {
+ err = cRepository->Get( KRCSEDoNotDisturb, iEntry.iDnd );
+ }
+ if ( KErrNone == err )
+ {
+ err = cRepository->Get( KRCSPSCallWaiting, iEntry.iPSCallWaiting );
+ }
+ if ( KErrNone == err )
+ {
+ err = ResolvePreferredServiceNameL( *cRepository );
+ }
+ if ( KErrNone == err )
+ {
+ iEntry.iAreSettingsLoaded = ETrue;
+ }
+ CleanupStack::PopAndDestroy( cRepository );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSEttingsAdapter::LoadSettingsL(): end" );
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::DesToInt
+// Converts a 8 bit descriptor to int.
+// ---------------------------------------------------------------------------
+//
+TInt CNSmlDmGeneralVoIPSettingsAdapter::DesToInt(
+ const TDesC8& aDes )
+ {
+ TLex8 lex( aDes );
+ TInt value( 0 );
+ lex.Val( value );
+ return value;
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::RemoveLastURISeg
+// returns parent uri, i.e. removes last uri segment
+// ---------------------------------------------------------------------------
+//
+TPtrC8 CNSmlDmGeneralVoIPSettingsAdapter::RemoveLastURISeg(
+ const TDesC8& aURI )
+ {
+ TInt counter( 0 );
+
+ // Check that aURI exists
+ if ( 0 < aURI.Length() )
+ {
+ for ( counter = aURI.Length() - 1; counter >= 0; counter-- )
+ {
+ if ( KNSMLDMURISEPARATORDEF == aURI[ counter ] )
+ {
+ break;
+ }
+ }
+ }
+ return aURI.Left( counter );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::NumOfURISegs
+// For getting the number of uri segs
+// ---------------------------------------------------------------------------
+//
+TInt CNSmlDmGeneralVoIPSettingsAdapter::NumOfURISegs(
+ const TDesC8& aURI )
+ {
+ TInt numOfURISegs( 1 );
+ for ( TInt counter = 0; counter < aURI.Length(); counter++ )
+ {
+ if ( KNSMLDMURISEPARATORDEF == aURI[ counter ] )
+ {
+ numOfURISegs++;
+ }
+ }
+ return numOfURISegs;
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::LastURISeg
+// Returns only the last uri segment
+// ---------------------------------------------------------------------------
+//
+TPtrC8 CNSmlDmGeneralVoIPSettingsAdapter::LastURISeg(
+ const TDesC8& aURI ) const
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::LastURISeg() : begin" );
+ TInt counter( 0 );
+
+ // Check that aURI exists
+ if ( 0 < aURI.Length() )
+ {
+ for ( counter = aURI.Length() - 1; counter >= 0; counter-- )
+ {
+ if ( KNSMLDMURISEPARATORDEF == aURI[ counter ] )
+ {
+ break;
+ }
+ }
+ }
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::LastURISeg() : end" );
+ if ( 0 == counter )
+ {
+ return aURI;
+ }
+ else
+ {
+ return aURI.Mid( counter + 1 );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::RemoveDotSlash
+// return uri without dot and slash in start
+// ---------------------------------------------------------------------------
+//
+TPtrC8 CNSmlDmGeneralVoIPSettingsAdapter::RemoveDotSlash(
+ const TDesC8& aURI )
+ {
+ if ( 0 == aURI.Find( KNSmlDMGenVoIPUriDotSlash ) )
+ {
+ return aURI.Right(
+ aURI.Length() - KNSmlDMGenVoIPUriDotSlash().Length() );
+ }
+ else
+ {
+ return aURI;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::DDFVersionL
+// From base class CNSmlDmAdapter.
+// Inserts DDF version of the adapter to aDDFVersion
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::DDFVersionL(
+ CBufBase& aDDFVersion )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::DDFVersionL( TDes& aDDFVersion): begin" );
+ aDDFVersion.InsertL( 0, KNSmlDMGenVoIPDDFVersion );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::DDFVersionL( TDes& aDDFVersion): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::DDFStructureL
+// From base class CNSmlDmAdapter.
+// Builds the DDF structure of adapter
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::DDFStructureL( MSmlDmDDFObject& aDDF )
+ {
+ _DBG_FILE("CNSmlDmGeneralVoIPSettingsAdapter::DDFStructureL(): begin");
+
+ TSmlDmAccessTypes accessTypesGet;
+ accessTypesGet.SetGet();
+
+ TSmlDmAccessTypes accessTypesGetAdd;
+ accessTypesGetAdd.SetGet();
+ accessTypesGetAdd.SetAdd();
+
+ TSmlDmAccessTypes accessTypesGetReplaceAdd;
+ accessTypesGetReplaceAdd.SetGet();
+ accessTypesGetReplaceAdd.SetReplace();
+ accessTypesGetReplaceAdd.SetAdd();
+
+ TSmlDmAccessTypes accessTypesAll;
+ accessTypesAll.SetGet();
+ accessTypesAll.SetDelete();
+ accessTypesAll.SetAdd();
+ accessTypesAll.SetReplace();
+
+ // GenVoIP
+ MSmlDmDDFObject& genVoIP = aDDF.AddChildObjectL( KNSmlDMGenVoIPNodeName );
+ genVoIP.SetAccessTypesL( accessTypesGet );
+ genVoIP.SetOccurenceL( MSmlDmDDFObject::EOne );
+ genVoIP.SetScopeL( MSmlDmDDFObject::EPermanent );
+ genVoIP.SetDFFormatL( MSmlDmDDFObject::ENode );
+ genVoIP.AddDFTypeMimeTypeL( KNSmlDMGenVoIPTextPlain );
+ genVoIP.SetDescriptionL( KNSmlDMGenVoIPNodeNameExp );
+
+ // Clir
+ MSmlDmDDFObject& clir = genVoIP.AddChildObjectL( KNSmlDMGenVoIPClir );
+ clir.SetAccessTypesL( accessTypesGetReplaceAdd );
+ clir.SetOccurenceL( MSmlDmDDFObject::EZeroOrOne );
+ clir.SetScopeL( MSmlDmDDFObject::EDynamic );
+ clir.SetDFFormatL( MSmlDmDDFObject::EInt );
+ clir.AddDFTypeMimeTypeL( KNSmlDMGenVoIPTextPlain );
+ clir.SetDescriptionL( KNSmlDMGenVoIPClirExp );
+
+ // AnonCallBlockRule
+ MSmlDmDDFObject& acbRule = genVoIP.AddChildObjectL(
+ KNSmlDMGenVoIPAnonCallBlockRule );
+ acbRule.SetAccessTypesL( accessTypesGetReplaceAdd );
+ acbRule.SetOccurenceL( MSmlDmDDFObject::EZeroOrOne );
+ acbRule.SetScopeL( MSmlDmDDFObject::EDynamic );
+ acbRule.SetDFFormatL( MSmlDmDDFObject::EInt );
+ acbRule.AddDFTypeMimeTypeL( KNSmlDMGenVoIPTextPlain );
+ acbRule.SetDescriptionL( KNSmlDMGenVoIPAnonCallBlockRuleExp );
+
+ // PreferredTelephony
+ MSmlDmDDFObject& prefTel = genVoIP.AddChildObjectL(
+ KNSmlDMGenVoIPPreferredTelephony );
+ prefTel.SetAccessTypesL( accessTypesGetReplaceAdd );
+ prefTel.SetOccurenceL( MSmlDmDDFObject::EZeroOrOne );
+ prefTel.SetScopeL( MSmlDmDDFObject::EDynamic );
+ prefTel.SetDFFormatL( MSmlDmDDFObject::EInt );
+ prefTel.AddDFTypeMimeTypeL( KNSmlDMGenVoIPTextPlain );
+ prefTel.SetDescriptionL( KNSmlDMGenVoIPPreferredTelephonyExp );
+
+ // DoNotDisturb
+ MSmlDmDDFObject& dnd = genVoIP.AddChildObjectL(
+ KNSmlDMGenVoIPDoNotDisturb );
+ dnd.SetAccessTypesL( accessTypesGetReplaceAdd );
+ dnd.SetOccurenceL( MSmlDmDDFObject::EZeroOrOne );
+ dnd.SetScopeL( MSmlDmDDFObject::EDynamic );
+ dnd.SetDFFormatL( MSmlDmDDFObject::EInt );
+ dnd.AddDFTypeMimeTypeL( KNSmlDMGenVoIPTextPlain );
+ dnd.SetDescriptionL( KNSmlDMGenVoIPDoNotDisturbExp );
+
+ // PSCallWaiting
+ MSmlDmDDFObject& psCallWaiting = genVoIP.AddChildObjectL(
+ KNSmlDMGenVoIPPSCallWaiting );
+ psCallWaiting.SetAccessTypesL( accessTypesGetReplaceAdd );
+ psCallWaiting.SetOccurenceL( MSmlDmDDFObject::EZeroOrOne );
+ psCallWaiting.SetScopeL( MSmlDmDDFObject::EDynamic );
+ psCallWaiting.SetDFFormatL( MSmlDmDDFObject::EInt );
+ psCallWaiting.AddDFTypeMimeTypeL( KNSmlDMGenVoIPTextPlain );
+ psCallWaiting.SetDescriptionL( KNSmlDMGenVoIPPSCallWaitingExp );
+
+ // ProfileName
+ MSmlDmDDFObject& voipProfileId = genVoIP.AddChildObjectL(
+ KNSmlDMGenVoIPProfileId );
+ voipProfileId.SetAccessTypesL( accessTypesGetReplaceAdd );
+ voipProfileId.SetOccurenceL( MSmlDmDDFObject::EZeroOrOne );
+ voipProfileId.SetScopeL( MSmlDmDDFObject::EDynamic );
+ voipProfileId.SetDFFormatL( MSmlDmDDFObject::EChr );
+ voipProfileId.AddDFTypeMimeTypeL( KNSmlDMGenVoIPTextPlain );
+ voipProfileId.SetDescriptionL( KNSmlDMGenVoIPProfileIdExp );
+
+ _DBG_FILE("CNSmlDmGeneralVoIPSettingsAdapter::DDFStructureL(): end");
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::UpdateLeafObjectL
+// From base class CNSmlDmAdapter.
+// Updates value of a leaf object
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::UpdateLeafObjectL(
+ const TDesC8& aURI,
+ const TDesC8& /*aLUID*/,
+ const TDesC8& aObject,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::UpdateLeafObjectL(): begin" );
+
+ CSmlDmAdapter::TError status = EError;
+
+ TPtrC8 lastURISeg = LastURISeg( aURI );
+ TPtrC8 uriTmp = RemoveLastURISeg( aURI );
+ TPtrC8 secondLastURISeg = LastURISeg( uriTmp );
+
+ // Make sure iEntry holds values.
+ if ( !( iEntry.iAreSettingsLoaded ) )
+ {
+ TInt err = LoadSettingsL();
+ if ( KErrNone != err )
+ {
+ status = CSmlDmAdapter::EError;
+ iDmCallback->SetStatusL( aStatusRef, status );
+ return;
+ }
+ }
+
+ if( 0 == secondLastURISeg.Compare( KNSmlDMGenVoIPNodeName() )
+ && KTwoSegs == NumOfURISegs( aURI ) )
+ {
+ status = CSmlDmAdapter::EOk;
+ iEntry.iStatusRef = aStatusRef;
+
+ // Clir
+ if ( KNSmlDMGenVoIPClir() == lastURISeg )
+ {
+ iEntry.iClir = DesToInt( aObject );
+ }
+ // AnonCallBlockRule
+ else if ( KNSmlDMGenVoIPAnonCallBlockRule() == lastURISeg )
+ {
+ iEntry.iACBRule = DesToInt( aObject );
+ }
+ // PreferredTelephony
+ else if ( KNSmlDMGenVoIPPreferredTelephony() == lastURISeg )
+ {
+ iEntry.iPrefTel = DesToInt( aObject );
+ }
+ // DoNotDisturb
+ else if ( KNSmlDMGenVoIPDoNotDisturb() == lastURISeg )
+ {
+ iEntry.iDnd = DesToInt( aObject );
+ }
+ // PSCallWaiting
+ else if ( KNSmlDMGenVoIPPSCallWaiting() == lastURISeg )
+ {
+ iEntry.iPSCallWaiting = DesToInt( aObject );
+ }
+ else if ( KNSmlDMGenVoIPProfileId() == lastURISeg )
+ {
+ iEntry.iVoipProfileId = aObject;
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+
+ iDmCallback->SetStatusL( aStatusRef, status );
+
+ _DBG_FILE("CNSmlDmGeneralVoIPSettingsAdapter::UpdateLeafObjectL(): end");
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::UpdateLeafObjectL
+// From base class CNSmlDmAdapter.
+// Not supported (see smldmadapter.h).
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::UpdateLeafObjectL(
+ const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ RWriteStream*& /*aStream*/,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::UpdateLeafObjectL(): stream: begin" );
+ iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::UpdateLeafObjectL(): stream: end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::DeleteObjectL
+// From base class CNSmlDmAdapter.
+// Not supported.
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::DeleteObjectL(
+ const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::DeleteObjectL(): begin" );
+ iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::DeleteObjectL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::FetchLeafObjectL
+// From base class CNSmlDmAdapter.
+// Fetches the values of leaf objects.
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::FetchLeafObjectL(
+ const TDesC8& aURI,
+ const TDesC8& /*aLUID*/,
+ const TDesC8& aType,
+ const TInt aResultsRef,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::FetchLeafObjectL(): begin" );
+
+ CBufBase *result = CBufFlat::NewL( KDefaultResultSize );
+ CleanupStack::PushL( result );
+ CSmlDmAdapter::TError status = FetchObjectL( aURI, *result );
+
+ if ( CSmlDmAdapter::EOk == status )
+ {
+ iDmCallback->SetResultsL( aResultsRef, *result, aType );
+ }
+ iDmCallback->SetStatusL( aStatusRef, status );
+
+ CleanupStack::PopAndDestroy( result );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::FetchLeafObjectL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::FetchLeafObjectSizeL
+// From base class CNSmlDmAdapter.
+// Fetches the size of a leaf object.
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::FetchLeafObjectSizeL(
+ const TDesC8& aURI,
+ const TDesC8& /*aLUID*/,
+ const TDesC8& aType,
+ const TInt aResultsRef,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::FetchLeafObjectSizeL(): begin" );
+ CBufBase *result = CBufFlat::NewL( 1 );
+ CleanupStack::PushL( result );
+ CSmlDmAdapter::TError status = FetchObjectL( aURI, *result );
+
+ TInt objSizeInBytes = result->Size();
+ TBuf8<16> stringObjSizeInBytes;
+ stringObjSizeInBytes.Num( objSizeInBytes );
+ result->Reset();
+ result->InsertL( 0, stringObjSizeInBytes );
+
+ iDmCallback->SetStatusL( aStatusRef, status );
+ iDmCallback->SetResultsL( aResultsRef, *result, aType );
+ CleanupStack::PopAndDestroy( result );
+ _DBG_FILE("CNSmlDmGeneralVoIPSettingsAdapter::FetchLeafObjectSizeL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::ChildURIListL
+// From base class CNSmlDmAdapter.
+// Asks for the list of child objects of the node.
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::ChildURIListL(
+ const TDesC8& aURI,
+ const TDesC8& /*aLUID*/,
+ const CArrayFix<TSmlDmMappingInfo>& /*aPreviousURISegmentList*/,
+ const TInt aResultsRef,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::ChildURIListL(): start" );
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EError;
+
+ CBufBase *currentURISegmentList = CBufFlat::NewL( KDefaultResultSize );
+ CleanupStack::PushL( currentURISegmentList );
+ TBuf8<KNSmlGenVoIPMaxUriLength> mappingInfo( KNullDesC8 );
+ TBuf8<KNSmlGenVoIPMaxUriLength> uri = aURI;
+ TBuf8<KSmlMaxURISegLen> segmentName;
+
+ if ( KNSmlDMGenVoIPNodeName() == LastURISeg( aURI ) )
+ {
+ // Clir
+ segmentName.Copy( KNSmlDMGenVoIPClir );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMGenVoIPSeparator );
+ // AnonCallBlockRule
+ segmentName.Copy( KNSmlDMGenVoIPAnonCallBlockRule );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMGenVoIPSeparator );
+ // PreferredTelephony
+ segmentName.Copy( KNSmlDMGenVoIPPreferredTelephony );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMGenVoIPSeparator );
+ // DoNotDisturb
+ segmentName.Copy( KNSmlDMGenVoIPDoNotDisturb );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMGenVoIPSeparator );
+ // PSCallWaiting
+ segmentName.Copy( KNSmlDMGenVoIPPSCallWaiting );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMGenVoIPSeparator );
+ // ProfileName
+ segmentName.Copy( KNSmlDMGenVoIPProfileId );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMGenVoIPSeparator );
+ status = CSmlDmAdapter::EOk;
+ }
+
+ iDmCallback->SetStatusL( aStatusRef, status );
+ iDmCallback->SetResultsL( aResultsRef,
+ *currentURISegmentList, KNullDesC8 );
+ CleanupStack::PopAndDestroy( currentURISegmentList );
+
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::ChildURIListL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::AddNodeObjectL
+// From base class CNSmlDmAdapter.
+// Not supported since there can only be one general VoIP settings node.
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::AddNodeObjectL(
+ const TDesC8& /*aURI*/,
+ const TDesC8& /*aParentLUID*/,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::AddNodeObjectL(): begin" );
+ iDmCallback->SetStatusL( aStatusRef, EOk );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::AddNodeObjectL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::ExecuteCommandL
+// From base class CNSmlDmAdapter.
+// Not supported (see smldmadapter.h).
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::ExecuteCommandL(
+ const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ const TDesC8& /*aArgument*/,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::ExecuteCommandL(): begin" );
+ iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::ExecuteCommandL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::ExecuteCommandL
+// From base class CNSmlDmAdapter.
+// Not supported (see smldmadapter.h).
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::ExecuteCommandL(
+ const TDesC8& /*aURI*/,
+ const TDesC8& /*aParentLUID*/,
+ RWriteStream*& /*aStream*/,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::ExecuteCommandL(): stream: begin" );
+ iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::ExecuteCommandL(): stream: end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::CopyCommandL
+// From base class CNSmlDmAdapter.
+// Not supported (see smldmadapter.h).
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::CopyCommandL(
+ const TDesC8& /*aTargetURI*/,
+ const TDesC8& /*aTargetLUID*/,
+ const TDesC8& /*aSourceURI*/,
+ const TDesC8& /*aSourceLUID*/,
+ const TDesC8& /*aType*/,
+ TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::CopyCommandL(): begin" );
+ iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::CopyCommandL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::StartAtomicL
+// From base class CNSmlDmAdapter.
+// Not supported (see smldmadapter.h).
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::StartAtomicL()
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::StartAtomicL(): begin" );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::StartAtomicL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::CommitAtomicL
+// From base class CNSmlDmAdapter.
+// Not supported (see smldmadapter.h).
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::CommitAtomicL()
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::CommitAtomicL(): begin" );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::CommitAtomicL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::RollbackAtomicL
+// From base class CNSmlDmAdapter.
+// Not supported (see smldmadapter.h).
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::RollbackAtomicL()
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::RollbackAtomicL(): begin" );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::RollbackAtomicL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::StreamingSupport
+// From base class CNSmlDmAdapter.
+// Not supported (see smldmadapter.h).
+// ---------------------------------------------------------------------------
+//
+TBool CNSmlDmGeneralVoIPSettingsAdapter::StreamingSupport( TInt& /*aItemSize*/ )
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::StreamingSupport(): begin" );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::StreamingSupport(): end" );
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::StreamCommittedL
+// From base class CNSmlDmAdapter.
+// Not supported (see smldmadapter.h).
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::StreamCommittedL()
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::StreamCommittedL(): begin" );
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::StreamCommittedL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::CompleteOutstandingCmdsL
+// From base class CNSmlDmAdapter.
+// Saves modified profiles back to permanent store.
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmGeneralVoIPSettingsAdapter::CompleteOutstandingCmdsL()
+ {
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::CompleteOutstandingCmdsL(): begin" );
+ // All commands received, save changes.
+ if ( iEntry.iAreSettingsLoaded )
+ {
+ CRepository* cRepository = CRepository::NewLC( KCRUidRichCallSettings );
+
+ User::LeaveIfError( cRepository->Set( KRCSEClir, iEntry.iClir ) );
+ User::LeaveIfError( cRepository->Set( KRCSEAnonymousCallBlockRule,
+ iEntry.iACBRule ) );
+ User::LeaveIfError( cRepository->Set( KRCSEPreferredTelephony,
+ iEntry.iPrefTel ) );
+ User::LeaveIfError( cRepository->Set( KRCSEDoNotDisturb,
+ iEntry.iDnd ) );
+ User::LeaveIfError( cRepository->Set( KRCSPSCallWaiting,
+ iEntry.iPSCallWaiting ) );
+
+ // If preferred telephony mode has been set to VoIP and general VoIP
+ // settings "links" to a VoIP profile, set the service id stored in
+ // the profile as the preferred service id.
+ if ( 1 == iEntry.iPrefTel && iEntry.iVoipProfileId.Length() )
+ {
+ // Get VoIP profile id.
+ TInt voipId( VoIPProfileIdL( iEntry.iVoipProfileId ) );
+
+ // Get service ID from RCSE.
+ CRCSEProfileRegistry* registry = CRCSEProfileRegistry::NewLC();
+ CRCSEProfileEntry* entry = CRCSEProfileEntry::NewLC();
+
+ registry->FindL( voipId, *entry );
+ TUint serviceId = entry->iServiceProviderId;
+
+ CleanupStack::PopAndDestroy( 2, registry ); // entry, registry
+
+ cRepository->Set( KRCSPSPreferredService, (TInt)serviceId );
+ }
+
+ CleanupStack::PopAndDestroy( cRepository );
+ }
+ else
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ _DBG_FILE( "CNSmlDmGeneralVoIPSettingsAdapter::CompleteOutstandingCmdsL(): end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::VoIPProfileIdL
+// Get VoIP profile ID.
+// ---------------------------------------------------------------------------
+//
+TUint32 CNSmlDmGeneralVoIPSettingsAdapter::VoIPProfileIdL(
+ const TDesC8& aObject ) const
+ {
+ _DBG_FILE("CNSmlDmGeneralVoIPSettingsAdapter::VoIPProfileIdL : begin");
+
+ __ASSERT_ALWAYS( iDmCallback != NULL, User::Leave( KErrArgument ) );
+
+ HBufC8* luid = iDmCallback->GetLuidAllocL( aObject );
+ CleanupStack::PushL( luid ); // CS:1
+ if ( luid->Des().Length() )
+ {
+ TBuf8<KMaxUriLength> tmp;
+ tmp.Copy( luid->Des().Mid( KVoipId().Length() ) );
+ TLex8 lex( tmp );
+ TUint profileId( 0 );
+ User::LeaveIfError( lex.Val( profileId ) );
+
+ CleanupStack::PopAndDestroy( luid ); // CS:0
+ _DBG_FILE("CNSmlDmGeneralVoIPSettingsAdapter::VoIPProfileIdL : end");
+ return profileId;
+ }
+ CleanupStack::PopAndDestroy( luid ); // CS:0
+
+ _DBG_FILE("CNSmlDmGeneralVoIPSettingsAdapter::VoIPProfileIdL : end");
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CNSmlDmGeneralVoIPSettingsAdapter::ResolvePreferredServiceNameL
+// Get name of the preferred VoIP service.
+// ---------------------------------------------------------------------------
+//
+TInt CNSmlDmGeneralVoIPSettingsAdapter::ResolvePreferredServiceNameL(
+ CRepository& aRepository )
+ {
+ _DBG_FILE("CNSmlDmGeneralVoIPSettingsAdapter::ResolvePreferredServiceNameL : begin");
+
+ // Reset VoIP profile id.
+ iEntry.iVoipProfileId.Zero();
+
+ // No need to resolve if preferred telephony isn't set to VoIP.
+ if ( 1 != iEntry.iPrefTel )
+ {
+ return KErrNone;
+ }
+
+ // Get preferred service id from central repository.
+ TInt serviceId( KErrNotFound );
+
+ User::LeaveIfError( aRepository.Get(
+ KRCSPSPreferredService, serviceId ) );
+
+ // Find the VoIP profile with the given service id.
+ CRCSEProfileRegistry* registry = CRCSEProfileRegistry::NewLC();
+ RPointerArray<CRCSEProfileEntry> entries;
+ CleanupResetAndDestroyL( entries );
+
+ registry->FindByServiceIdL( serviceId, entries );
+
+ if ( !entries.Count() )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ TInt voipProfileId = entries[0]->iId;
+
+ CleanupStack::PopAndDestroy( 2, registry ); // entries, registry
+
+ // Get URIs to all VoIP settings.
+ CBufBase* result = CBufFlat::NewL( 1 );
+ CleanupStack::PushL( result ); // CS:1
+ CSmlDmAdapter::TError status;
+
+ iDmCallback->FetchLinkL( KNSmlDMVoIPNodeName(), *result, status );
+
+ result->Compress();
+
+ HBufC8* childList = HBufC8::NewLC( result->Size() ); // CS:2
+ TInt uriSegCount( 0 );
+
+ if ( result->Size() )
+ {
+ childList->Des().Copy( result->Ptr( 0 ) );
+ uriSegCount = NumOfURISegs( childList->Des() );
+ }
+
+ // Get LUIDs for URIs and save the correct profile name.
+ for ( TInt index = 0; index < uriSegCount; index++ )
+ {
+ HBufC8* uri = HBufC8::NewLC( KMaxUriLength ); // CS:3
+
+ uri->Des().Copy( KNSmlDMVoIPNodeName() );
+ uri->Des().Append( KNSmlDMGenVoIPSeparator() );
+ uri->Des().Append( LastURISeg( childList->Des() ) );
+
+ HBufC8* luid = iDmCallback->GetLuidAllocL( uri->Des() );
+ CleanupStack::PushL( luid ); // CS:4
+
+ if ( luid->Des().Length() &&
+ voipProfileId == DesToInt(
+ luid->Des().Mid( KVoipId().Length() ) ) )
+ {
+ iEntry.iVoipProfileId.Copy( uri->Des() );
+ CleanupStack::PopAndDestroy( luid ); // CS:3
+ CleanupStack::PopAndDestroy( uri ); // CS:2
+ break;
+ }
+ childList->Des().Copy( RemoveLastURISeg( childList->Des() ) );
+ CleanupStack::PopAndDestroy( luid ); // CS:3
+ CleanupStack::PopAndDestroy( uri ); // CS:2
+ }
+
+ CleanupStack::PopAndDestroy( childList ); // CS:1
+ CleanupStack::PopAndDestroy( result ); // CS:0
+
+ _DBG_FILE("CNSmlDmGeneralVoIPSettingsAdapter::ResolvePreferredServiceNameL : end");
+ return status;
+ }
+
+// ---------------------------------------------------------------------------
+// TImplementationProxy ImplementationTable[]
+// Needed because of ECOM architecture
+// ---------------------------------------------------------------------------
+//
+#ifndef IMPLEMENTATION_PROXY_ENTRY
+#define IMPLEMENTATION_PROXY_ENTRY( aUid, aFuncPtr ) {{ aUid }, ( aFuncPtr )}
+#endif
+
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY( KNSmlDMGenVoIPAdapterImplUid,
+ CNSmlDmGeneralVoIPSettingsAdapter::NewL )
+ };
+
+// ---------------------------------------------------------------------------
+// ImplementationGroupProxy()
+// Needed because of ECOM architecture
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(
+ TInt& aTableCount )
+ {
+ _DBG_FILE( "ImplementationGroupProxy() for CNSmlDmGeneralVoIPSettingsAdapter: begin" );
+ aTableCount = sizeof( ImplementationTable ) /
+ sizeof( TImplementationProxy );
+ _DBG_FILE( "ImplementationGroupProxy() for CNSmlDmGeneralVoIPSettingsAdapter: end" );
+ return ImplementationTable;
+ }
+