--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/voipadapters/cpvoipadapter/src/CWPVoIPItem.cpp Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,2001 @@
+/*
+* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Holds transiently and stores one VoIP settings item.
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <WPVoIPAdapter.rsg>
+#include <charconv.h>
+#include <in_sock.h> // TInetAddr, TSockAddr
+#include <crcseprofileentry.h>
+#include <crcseprofileregistry.h>
+#include <crcseaudiocodecentry.h>
+#include <crcseaudiocodecregistry.h>
+#include <CWPCharacteristic.h>
+#include <sysutil.h> // For GetWlanMacAddressL.
+#include <wlaninternalpskeys.h> // For GetWlanMacAddressL.
+#include <centralrepository.h>
+#include <settingsinternalcrkeys.h>
+#include <coemain.h> // For GetPhoneModelL.
+#include <WPAdapterUtil.h>
+#include <sipmanagedprofile.h>
+#include <sipprofileregistryobserver.h>
+#include <sipmanagedprofileregistry.h>
+#include <spsettings.h> // for SPS
+#include <spentry.h> // for SPS
+#include <spproperty.h> // for SPS
+#include <spdefinitions.h>
+#include <cmmanagerext.h>
+#include <cmdestinationext.h>
+#include <cmconnectionmethodext.h>
+#include <cmconnectionmethoddef.h>
+#include <cmpluginwlandef.h> // For WLAN plugin UID, i.e. bearer type.
+#include <versit.h>
+#include <cvimpstsettingsstore.h> // For IM tone path
+#include <pathinfo.h> // For getting phone rom root path.
+
+#include "CWPVoIPItem.h"
+#include "CSIPProfileRegistryObserver.h"
+#include "cipappphoneutils.h" // For GetPhoneModelL, GetTerminalTypeL
+#include "cipapputilsaddressresolver.h" // For GetWlanMacAddressL
+
+// LOCAL CONSTANTS
+static const TInt32 KNotSaved( -1 );
+static const TInt KMaxCharsInTUint32( 10 );
+const TInt32 KCCHPresenceSubServicePlugId = 0x1027545A;
+_LIT8( KUserAgent, "User-Agent" );
+_LIT8( KColonMark, ":" );
+// Default IM message tone
+_LIT( KDefaultTone, "Message 2.aac" );
+_LIT8( KSpaceMark, " " );
+_LIT( KVoIPAdapterName, "WPVoIPAdapter");
+_LIT( KOpenParenthesis, "(" );
+_LIT( KClosedParenthesis, ")" );
+const TInt KTwo( 2 );
+const TInt KVmbxResubscribeDefault = 600;
+
+// IM related constants.
+const TUint32 KIMSubServicePluginId = 0x1027545A; // KSIPConnectivityPluginImplUid
+const TUint32 KIMLaunchUid = 0x200255D0;
+const TInt KIMSettingsId = 1;
+
+// Following lines are for enabling debug prints.
+#ifdef _DEBUG
+#define DBG_PRINT(p) RDebug::Print(_L(p))
+#define DBG_PRINT2(p,a) RDebug::Print(_L(p),a)
+#else
+#define DBG_PRINT(p)
+#define DBG_PRINT2(p,a)
+#endif // _DEBUG
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::CWPVoIPItem
+//
+// ---------------------------------------------------------------------------
+//
+CWPVoIPItem::CWPVoIPItem()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::NewL
+//
+// ---------------------------------------------------------------------------
+//
+CWPVoIPItem* CWPVoIPItem::NewL()
+ {
+ DBG_PRINT( "CWPVoIPItem::NewL - begin" );
+ CWPVoIPItem* self = new (ELeave) CWPVoIPItem;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ DBG_PRINT( "CWPVoIPItem::NewL - end" );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::ConstructL()
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::ConstructL()
+ {
+ // Initialization with empty string or KNotSaved or -1 or if default
+ // value exists with default values.
+ iItemId = TUint( KNotSaved );
+ TFileName fileName;
+ Dll::FileName(fileName);
+
+ // Default provider value read from the resource file.
+ iProviderId = WPAdapterUtil::ReadHBufCL( fileName,
+ KVoIPAdapterName, R_QTN_SM_PROVIDER_VOIP );
+ // Default name value read from the resource file.
+ iName = WPAdapterUtil::ReadHBufCL( fileName, KVoIPAdapterName,
+ R_QTN_SM_HEAD_VOIP );
+
+ iStartMediaPort = KNotSet;
+ iEndMediaPort = KNotSet;
+ iMediaQoS = KNotSet;
+ iDTMFInBand = KNotSet;
+ iDTMFOutBand = KNotSet;
+ iSavedProfileId = HBufC8::NewL( 0 );
+ iSecureCallPref = KNotSet;
+ iRTCP = KNotSet;
+ iUAHTerminalType = KNotSet;
+ iUAHWLANMAC = KNotSet;
+ iUAHString = HBufC::NewL( 0 );
+ iProfileLockedToIAP = KNotSet;
+ iVoIPPluginUid = KNotSet;
+ iAllowVoIPOverWCDMA = KNotSet;
+ iVoIPDigits = KNotSet;
+ iDomainPartIgnoreRule = KNotSet;
+ iAddUserPhoneToAllNumbers = KNotSet;
+ iSIPConnTestAddress = HBufC::NewL( 0 );
+ iServiceProviderBookmark = HBufC::NewL( 0 );
+ iSIPMinSE = KNotSet;
+ iSIPSessionExpires = KNotSet;
+ iIPVoiceMailBoxURI = HBufC::NewL( 0 );
+ iVmbxListenAddress = HBufC::NewL( 0 );
+ iAutoAcceptBuddyRequest = KNotSet;
+ iBrandingDataAddress = HBufC::NewL( 0 );
+ iToNapId = HBufC8::NewL( 0 );
+ iVoipUrisToAppRef = HBufC8::NewL( 0 );
+ iUsedNatProtocol = KNotSet;
+ iAppRef = HBufC8::NewL( 0 );
+ iReSubscribeInterval = KVmbxResubscribeDefault;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::~CWPVoIPItem
+//
+// ---------------------------------------------------------------------------
+//
+CWPVoIPItem::~CWPVoIPItem()
+ {
+ DBG_PRINT( "CWPVoIPItem::~CWPVoIPItem - begin" );
+ delete iProviderId;
+ delete iName;
+ iToAppRefs.ResetAndDestroy();
+ iToAppRefs.Close();
+ delete iSavedProfileId;
+ delete iUAHString;
+ delete iSIPConnTestAddress;
+ delete iServiceProviderBookmark;
+ delete iIPVoiceMailBoxURI;
+ delete iVmbxListenAddress;
+ delete iBrandingDataAddress;
+ delete iToNapId;
+ delete iVoipUrisToAppRef;
+ delete iAppRef;
+
+ iCodecs.ResetAndDestroy();
+ iCodecs.Close();
+
+ DBG_PRINT( "CWPVoIPItem::~CWPVoIPItem - end" );
+ //lint -e{1740} iNapDef is not owned
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetAppRefL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetAppRefL( const TDesC8& aAppRef )
+ {
+ delete iAppRef;
+ iAppRef = NULL;
+ iAppRef = aAppRef.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetProviderIdL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetProviderIdL( const TDesC& aPROVIDERID )
+ {
+ delete iProviderId;
+ iProviderId = NULL;
+ iProviderId = aPROVIDERID.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetNameL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetNameL( const TDesC& aNAME )
+ {
+ delete iName;
+ iName = NULL;
+ iName = aNAME.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::AddToAppRefL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::AddToAppRefL( const TDesC8& aToAppRef )
+ {
+ // Dependencies to SIP, SCCP, NATFW and SNAP settings.
+
+ // Must put string on cleanup stack in case memory alloc fails in AppendL.
+ HBufC8* tmp = aToAppRef.AllocLC();
+ iToAppRefs.AppendL( tmp );
+ CleanupStack::Pop( tmp );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetStartMediaPort
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetStartMediaPort( TInt aStartMediaPort )
+ {
+ iStartMediaPort = aStartMediaPort;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetEndMediaPort
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetEndMediaPort( TInt aEndMediaPort )
+ {
+ iEndMediaPort = aEndMediaPort;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetMediaQoS
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetMediaQoS( TInt aMediaQoS )
+ {
+ iMediaQoS = aMediaQoS;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetDTMFInBand
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetDTMFInBand( TInt aDTMFInBand )
+ {
+ iDTMFInBand = aDTMFInBand;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetDTMFOutOfBand
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetDTMFOutBand( TInt aDTMFOutBand )
+ {
+ iDTMFOutBand = aDTMFOutBand;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::AddCodec
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::AddCodecL( const CWPVoIPCodec* aVoIPCodec )
+ {
+ iCodecs.AppendL( aVoIPCodec );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetSecureCallPref
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetSecureCallPref( TInt aSecureCallPref )
+ {
+ iSecureCallPref = aSecureCallPref;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetRTCP
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetRTCP( TInt aRTCP )
+ {
+ iRTCP = aRTCP;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetUAHTerminalType
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetUAHTerminalType( TInt aUAHTerminalType )
+ {
+ iUAHTerminalType = aUAHTerminalType;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetUAHWLANMAC
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetUAHWLANMAC( TInt aUAHWLANMAC )
+ {
+ iUAHWLANMAC = aUAHWLANMAC;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetUAHStringL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetUAHStringL( const TDesC& aUAHString )
+ {
+ delete iUAHString;
+ iUAHString = NULL;
+ iUAHString = aUAHString.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetProfileLockedToIAP
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetProfileLockedToIAP( TInt aProfileLockedToIAP )
+ {
+ iProfileLockedToIAP = aProfileLockedToIAP;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetVoIPPluginUid
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetVoIPPluginUid( TInt aVoIPPluginUid )
+ {
+ iVoIPPluginUid = aVoIPPluginUid;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetAllowVoIPOverWCDMA
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetAllowVoIPOverWCDMA( TInt aAllowVoIPOverWCDMA )
+ {
+ iAllowVoIPOverWCDMA = aAllowVoIPOverWCDMA;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetVoIPDigits
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetVoIPDigits( TInt aVoIPDigits )
+ {
+ iVoIPDigits = aVoIPDigits;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetDomainPartIgnoreRule
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetDomainPartIgnoreRule( TInt aDomainPartIgnoreRule )
+ {
+ iDomainPartIgnoreRule = aDomainPartIgnoreRule;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetAddUserPhone
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetAddUserPhone( TInt32 aAddUserPhone )
+ {
+ iAddUserPhoneToAllNumbers = aAddUserPhone;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetSipConnTestAddress
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetSipConnTestAddressL( const TDesC& aSIPConnTestAddress )
+ {
+ delete iSIPConnTestAddress;
+ iSIPConnTestAddress = NULL;
+ iSIPConnTestAddress = aSIPConnTestAddress.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetServiceProviderBookmarkL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetServiceProviderBookmarkL(
+ const TDesC& aServiceProviderBookmark )
+ {
+ delete iServiceProviderBookmark;
+ iServiceProviderBookmark = NULL;
+ iServiceProviderBookmark = aServiceProviderBookmark.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetSipMinSe
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetSipMinSe( TInt32 aSIPMinSE )
+ {
+ iSIPMinSE = aSIPMinSE;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetSipSessionExpires
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetSipSessionExpires( TInt32 aSIPSessionExpires )
+ {
+ iSIPSessionExpires = aSIPSessionExpires;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetIPVoiceMailBoxURIL
+//
+// ---------------------------------------------------------------------------
+void CWPVoIPItem::SetIPVoiceMailBoxURIL( const TDesC& aIPVoiceMailBoxURI )
+ {
+ delete iIPVoiceMailBoxURI;
+ iIPVoiceMailBoxURI = NULL;
+ iIPVoiceMailBoxURI = aIPVoiceMailBoxURI.AllocL();
+ iVmbxSettingsExist = ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetVoiceMailBoxListenURIL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetVoiceMailBoxListenURIL( const TDesC& aVmbxListenAddress )
+ {
+ delete iVmbxListenAddress;
+ iVmbxListenAddress = NULL;
+ iVmbxListenAddress = aVmbxListenAddress.AllocL();
+ iVmbxSettingsExist = ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetReSubscribeInterval
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetReSubscribeInterval( TInt32 aReSubscribeInterval )
+ {
+ iReSubscribeInterval = aReSubscribeInterval;
+ iVmbxSettingsExist = ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetBrandingDataAddressL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetBrandingDataAddressL( const TDesC& aBrandingDataAddress )
+ {
+ delete iBrandingDataAddress;
+ iBrandingDataAddress = NULL;
+ iBrandingDataAddress = aBrandingDataAddress.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetAutoAcceptBuddyRequest
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetAutoAcceptBuddyRequest( TInt32 aAutoAcceptBuddyRequest )
+ {
+ iAutoAcceptBuddyRequest = aAutoAcceptBuddyRequest;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetAutoEnableService
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetAutoEnableService( TInt32 aAutoEnableService )
+ {
+ iAutoEnableService = aAutoEnableService;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetNapDef
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetNapDef( CWPCharacteristic* aNapDef )
+ {
+ iNapDef = aNapDef;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetToNapIdL
+//
+// ---------------------------------------------------------------------------
+void CWPVoIPItem::SetToNapIdL( const TDesC8& aToNapId )
+ {
+ delete iToNapId;
+ iToNapId = NULL;
+ iToNapId = aToNapId.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetIapId
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetIapId( TUint32 aIapId )
+ {
+ iVmbxIapId = aIapId;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetStorageId
+//
+// ---------------------------------------------------------------------------
+//
+TBool CWPVoIPItem::SetStorageId( TSettingsType aProfileType,
+ TUint32 aStorageId, const TDesC8& aAppRef )
+ {
+ DBG_PRINT( "CWPVoIPItem::SetStorageId - begin" );
+ const TInt toAppRefCount = iToAppRefs.Count();
+ TInt counter( KErrNone );
+
+ //lint -e{961} No need for else statement here
+ if ( ESIP == aProfileType )
+ {
+ for ( counter = 0; counter < toAppRefCount; counter++ )
+ {
+ if ( KErrNone == iToAppRefs[counter]->CompareF( aAppRef )
+ && !iSipIdSet )
+ {
+ iSipId = aStorageId;
+ iSipIdSet = ETrue;
+ DBG_PRINT( "CWPVoIPItem::SetStorageId - SIP ID set; end" );
+ return ETrue;
+ }
+ }
+ if ( KErrNone == iVoipUrisToAppRef->CompareF( aAppRef ) )
+ {
+ iVmbxSipId = aStorageId;
+ iVmbxSipIdSet = ETrue;
+ DBG_PRINT(
+ "CWPVoIPItem::SetStorageId - SIP ID for VMBX set; end" );
+ return ETrue;
+ }
+ }
+
+ else if ( ESCCP == aProfileType )
+ {
+ for ( counter = 0; counter < toAppRefCount; counter++ )
+ {
+ if ( KErrNone == iToAppRefs[counter]->CompareF( aAppRef )
+ && !iSccpIdSet )
+ {
+ iSccpId = aStorageId;
+ iSccpIdSet = ETrue;
+ DBG_PRINT( "CWPVoIPItem::SetStorageId - SCCP ID set; end" );
+ return ETrue;
+ }
+ }
+ }
+
+ else if ( ENATFW == aProfileType )
+ {
+ for ( counter = 0; counter < toAppRefCount; counter++ )
+ {
+ if ( KErrNone == iToAppRefs[counter]->CompareF( aAppRef )
+ && !iNatFwIdSet )
+ {
+ iNatFwId = aStorageId;
+ iNatFwIdSet = ETrue;
+ DBG_PRINT(
+ "CWPVoIPItem::SetStorageId - NAT/FW ID set; end" );
+ return ETrue;
+ }
+ }
+ }
+
+ else if ( EPresence == aProfileType )
+ {
+ for ( counter = 0; counter < toAppRefCount; counter++ )
+ {
+ if ( KErrNone == iToAppRefs[counter]->CompareF( aAppRef )
+ && !iPresenceIdSet )
+ {
+ iPresenceId = aStorageId;
+ iPresenceIdSet = ETrue;
+ DBG_PRINT(
+ "CWPVoIPItem::SetStorageId - Presence ID set; end" );
+ return ETrue;
+ }
+ }
+ }
+
+ else if ( ESNAP == aProfileType )
+ {
+ for ( counter = 0; counter < toAppRefCount; counter++ )
+ {
+ if ( KErrNone == iToAppRefs[counter]->CompareF( aAppRef )
+ && !iSnapIdSet )
+ {
+ iSnapId = aStorageId;
+ iSnapIdSet = ETrue;
+ DBG_PRINT( "CWPVoIPItem::SetStorageId - SNAP ID set; end" );
+ return ETrue;
+ }
+ }
+ }
+
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetVoipUrisToAppRefL
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetVoipUrisToAppRefL( const TDesC8& aToAppRef )
+ {
+ // VMBX dependency to SIP settigns, VoIP dependency to Presence settings.
+ delete iVoipUrisToAppRef;
+ iVoipUrisToAppRef = NULL;
+ iVoipUrisToAppRef = aToAppRef.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SetUsedNatProtocol
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetUsedNatProtocol( TInt32 aUsedNatProtocol)
+ {
+ iUsedNatProtocol = aUsedNatProtocol;
+ }
+
+// Getters
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::Name
+//
+// ---------------------------------------------------------------------------
+//
+const TDesC& CWPVoIPItem::Name() const
+ {
+ return *iName;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::UAHString
+//
+// ---------------------------------------------------------------------------
+//
+const TDesC& CWPVoIPItem::UAHString() const
+ {
+ return *iUAHString;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::ToNapId
+//
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CWPVoIPItem::ToNapId() const
+ {
+ return *iToNapId;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::NapDef
+//
+// ---------------------------------------------------------------------------
+//
+CWPCharacteristic* CWPVoIPItem::NapDef()
+ {
+ return iNapDef;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::VoipUrisToAppRef
+//
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CWPVoIPItem::VoipUrisToAppRef() const
+ {
+ return *iVoipUrisToAppRef;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::StoreL
+// 1) Set VoIP parameters into the VoIP profile entry.
+// 2) Save audio codecs and add their storage ids into the VoIP profile entry
+// and VoIP item.
+// 3) Save the VoIP profile entry.
+// SIP ID's, SIP profile specific data, SCCP ID & Presence ID are not stored
+// here, nor are VoIP settings belonging to SPS. They are all stored when the
+// SavingFinalized method is called because only then it is guaranteed that
+// the data needed is received and ready for saving.
+// ---------------------------------------------------------------------------
+//
+TUint CWPVoIPItem::StoreL()
+ {
+ DBG_PRINT( "CWPVoIPItem::StoreL - begin" );
+ // Save the VoIP profile.
+ CRCSEProfileEntry* cRCSEProfileEntry = CRCSEProfileEntry::NewLC(); // CS:1
+ cRCSEProfileEntry->iId = iItemId;
+ cRCSEProfileEntry->iProviderName.Copy( iProviderId->Des() );
+ cRCSEProfileEntry->iSettingsName.Copy( iName->Des() );
+
+ // Saving the codecs and and storaging their ids in VoIP profile.
+ typedef CRCSEAudioCodecEntry AudioCodecEntry;
+ CRCSEAudioCodecRegistry* cRCSEAudioCodecRegistry =
+ CRCSEAudioCodecRegistry::NewLC(); // CS:2
+
+ CWPVoIPCodec* tmpCodec = NULL;
+ const TInt numberOfCodecs = iCodecs.Count();
+
+ for ( TInt codecIndex = 0; codecIndex < numberOfCodecs; codecIndex++ )
+ {
+ tmpCodec = iCodecs[codecIndex];
+ CRCSEAudioCodecEntry* cRCSEAudioCodecEntry =
+ CRCSEAudioCodecEntry::NewLC(); // CS:3
+
+ // Codec initiated with it's default values.
+ cRCSEAudioCodecEntry->SetDefaultCodecValueSet( tmpCodec->
+ iMediaSubtypeName->Des() );
+
+ cRCSEAudioCodecEntry->iMediaSubTypeName.Zero();
+ cRCSEAudioCodecEntry->iMediaSubTypeName.Copy( tmpCodec->
+ iMediaSubtypeName->Des() );
+
+ // Set codec values, take values only when they exist.
+
+ // JitterBufferSize
+ if ( KNotSet != tmpCodec->iJitterBufferSize )
+ {
+ cRCSEAudioCodecEntry->iJitterBufferSize =
+ tmpCodec->iJitterBufferSize;
+ }
+
+ // OctetAlign
+ if ( KNotSet != tmpCodec->iOctetAlign )
+ {
+ cRCSEAudioCodecEntry->iOctetAlign =
+ static_cast<AudioCodecEntry::TOnOff>
+ ( tmpCodec->iOctetAlign );
+ }
+
+ // ModeSet
+ TInt modeSetCount = iCodecs[codecIndex]->iModeSet.Count();
+ if ( modeSetCount > 0 )
+ {
+ // Take off default values if some values are provisioned.
+ cRCSEAudioCodecEntry->iModeSet.Reset();
+ for ( TInt modeSetIndex = 0; modeSetIndex < modeSetCount;
+ modeSetIndex++ )
+ {
+ cRCSEAudioCodecEntry->iModeSet.Append( iCodecs[codecIndex]->
+ iModeSet[modeSetIndex] );
+ }// for
+ }// if
+
+ // ModeChangePeriod
+ if ( KNotSet != tmpCodec->iModeChangePeriod )
+ {
+ cRCSEAudioCodecEntry->iModeChangePeriod =
+ tmpCodec->iModeChangePeriod;
+ }
+
+ // ModeChangeNeighbor
+ if ( KNotSet != tmpCodec->iModeChangeNeighbor )
+ {
+ cRCSEAudioCodecEntry->iModeChangeNeighbor =
+ static_cast<AudioCodecEntry::TOnOff>
+ ( tmpCodec->iModeChangeNeighbor );
+ }
+
+ // PTime
+ if ( KNotSet != tmpCodec->iPTime )
+ {
+ cRCSEAudioCodecEntry->iPtime = tmpCodec->iPTime;
+ }
+
+ // MaxPTime
+ if ( KNotSet != tmpCodec->iMaxPTime )
+ {
+ cRCSEAudioCodecEntry->iMaxptime = tmpCodec->iMaxPTime;
+ }
+
+ // VAD
+ if ( KNotSet != tmpCodec->iVAD )
+ {
+ cRCSEAudioCodecEntry->iVAD =
+ static_cast<AudioCodecEntry::TOnOff>( tmpCodec->iVAD );
+ }
+
+ // AnnexB
+ if ( KNotSet != tmpCodec->iAnnexB )
+ {
+ cRCSEAudioCodecEntry->iAnnexb =
+ static_cast<AudioCodecEntry::TOnOff>( tmpCodec->iAnnexB );
+ }
+
+ // MaxRed
+ if ( KNotSet != tmpCodec->iMaxRed )
+ {
+ cRCSEAudioCodecEntry->iMaxRed = tmpCodec->iMaxRed;
+ }
+ // Simple check, that there is at least media sub type name.
+ // If not ok, then the codec is not saved.
+ if ( tmpCodec->iMediaSubtypeName->Length() > 0 )
+ {
+ // Store the codec entry and get the storage id.
+ tmpCodec->iId = cRCSEAudioCodecRegistry->AddL(
+ *cRCSEAudioCodecEntry );
+ }// if
+
+ CleanupStack::PopAndDestroy( cRCSEAudioCodecEntry ); // CS:2
+ }// for
+
+ CleanupStack::PopAndDestroy ( cRCSEAudioCodecRegistry ); // CS:1
+
+ if ( numberOfCodecs > 1 )
+ {
+ // Sort the codec array into priority order (by PRIORITYINDEX).
+ RArray<TInt> priorityArray;
+ for ( TInt codecIndex = 0; codecIndex < numberOfCodecs; codecIndex++ )
+ {
+ priorityArray.Append( iCodecs[codecIndex]->iPriorityIndex );
+ }
+ priorityArray.Sort();
+ RPointerArray<CWPVoIPCodec> tmpArray;
+
+ for ( TInt priorityIndex = 0; priorityIndex < numberOfCodecs;
+ priorityIndex++ )
+ {
+ for ( TInt codecIndex = 0; codecIndex < numberOfCodecs;
+ codecIndex++ )
+ {
+ if ( priorityArray[priorityIndex] ==
+ iCodecs[codecIndex]->iPriorityIndex )
+
+ {
+ tmpArray.Append( iCodecs[codecIndex] );
+ }
+ }
+ }
+
+ for ( TInt codecIndex = 0; codecIndex < numberOfCodecs; codecIndex++ )
+ {
+ iCodecs[codecIndex] = tmpArray[codecIndex];
+ }
+ tmpArray.Close();
+ priorityArray.Close();
+ } // if
+
+ // Set the priority list of codecs.
+ for ( TInt codecIndex = 0; codecIndex < numberOfCodecs; codecIndex++ )
+ {
+ cRCSEProfileEntry->iPreferredCodecs.Append(
+ iCodecs[codecIndex]->iId );
+ }// for
+
+ // If no codecs exist create default codecs
+ if ( !numberOfCodecs )
+ {
+ AddDefaultCodecsL( *cRCSEProfileEntry );
+ }
+
+ // StartMediaPort
+ if ( KNotSet != iStartMediaPort )
+ {
+ cRCSEProfileEntry->iStartMediaPort = iStartMediaPort;
+ }
+
+ // EndMediaPort
+ if ( KNotSet != iEndMediaPort )
+ {
+ cRCSEProfileEntry->iEndMediaPort = iEndMediaPort;
+ }
+
+ // MediaQoS
+ if ( KNotSet != iMediaQoS )
+ {
+ cRCSEProfileEntry->iMediaQOS = iMediaQoS;
+ }
+
+ // InbandDTMF
+ if ( KNotSet != iDTMFInBand )
+ {
+ cRCSEProfileEntry->iInbandDTMF =
+ static_cast<VoIPProfileEntry::TOnOff>( iDTMFInBand );
+ }
+
+ // OutbandDTMF
+ if ( KNotSet != iDTMFOutBand )
+ {
+ cRCSEProfileEntry->iOutbandDTMF =
+ static_cast<VoIPProfileEntry::TOnOff>( iDTMFOutBand );
+ }
+
+ // SecureCallPref
+ if ( KNotSet != iSecureCallPref )
+ {
+ cRCSEProfileEntry->iSecureCallPreference = iSecureCallPref;
+ }
+
+ // RTCP
+ if ( KNotSet != iRTCP )
+ {
+ cRCSEProfileEntry->iRTCP = iRTCP;
+ }
+
+ // UAHTerminalType
+ if ( KNotSet != iUAHTerminalType )
+ {
+ cRCSEProfileEntry->iSIPVoIPUAHTerminalType = iUAHTerminalType;
+ }
+
+ // UAHWLANMAC
+ if ( KNotSet != iUAHWLANMAC )
+ {
+ cRCSEProfileEntry->iSIPVoIPUAHeaderWLANMAC = iUAHWLANMAC;
+ }
+
+ // UAHString
+ if ( iUAHString->Des().Length() > 0 )
+ {
+ cRCSEProfileEntry->iSIPVoIPUAHeaderString.Zero();
+ cRCSEProfileEntry->iSIPVoIPUAHeaderString.Insert( 0,
+ iUAHString->Des() );
+ }
+
+ // ProfileLockedToIAP
+ if ( KNotSet != iProfileLockedToIAP )
+ {
+ cRCSEProfileEntry->iProfileLockedToIAP =
+ static_cast<VoIPProfileEntry::TOnOff>( iProfileLockedToIAP );
+ }
+
+ // VoIPPluginUid
+ if ( KNotSet != iVoIPPluginUid )
+ {
+ cRCSEProfileEntry->iVoIPPluginUID = iVoIPPluginUid;
+ }
+
+ // AllowVoIPOverWCDMA
+ if ( KNotSet != iAllowVoIPOverWCDMA )
+ {
+ cRCSEProfileEntry->iAllowVoIPoverWCDMA =
+ static_cast<VoIPProfileEntry::TOnOff>( iAllowVoIPOverWCDMA );
+ }
+
+ // VoIPDigits
+ if ( KNotSet != iVoIPDigits )
+ {
+ cRCSEProfileEntry->iMeanCountOfVoIPDigits = iVoIPDigits;
+ }
+
+ // DomainPartIgnoreRule
+ if ( KNotSet != iDomainPartIgnoreRule )
+ {
+ cRCSEProfileEntry->iIgnoreAddrDomainPart = iDomainPartIgnoreRule;
+ }
+
+ // UserPhoneToAllNumbers
+ if ( KNotSet != iAddUserPhoneToAllNumbers )
+ {
+ cRCSEProfileEntry->iUserPhoneUriParameter =
+ static_cast<VoIPProfileEntry::TOnOff>
+ ( iAddUserPhoneToAllNumbers );
+ }
+
+ // SIPConnTestAddress
+ if ( iSIPConnTestAddress->Des().Length() > 0 )
+ {
+ cRCSEProfileEntry->iSIPConnTestAddress.Zero();
+ cRCSEProfileEntry->iSIPConnTestAddress.Insert( 0,
+ iSIPConnTestAddress->Des() );
+ }
+
+ // SIPMinSE
+ if ( KNotSet != iSIPMinSE )
+ {
+ cRCSEProfileEntry->iSIPMinSE = iSIPMinSE;
+ }
+
+ // SIPSessionExpires
+ if ( KNotSet != iSIPSessionExpires )
+ {
+ cRCSEProfileEntry->iSIPSessionExpires = iSIPSessionExpires;
+ }
+
+ // UsedNATProtocol
+ if ( KNotSet != iUsedNatProtocol )
+ {
+ cRCSEProfileEntry->iNATProtocol = iUsedNatProtocol;
+ }
+
+ if ( iSipIdSet )
+ {
+ TSettingIds referredIds;
+ referredIds.iProfileType = 0; // SIP.
+ referredIds.iProfileId = TInt( iSipId );
+ // Never reference to profile specific settings.
+ referredIds.iProfileSpecificSettingId = KNotSet;
+ cRCSEProfileEntry->iIds.Append( referredIds );
+ }
+
+ // Save the new profile into the registry.
+ CRCSEProfileRegistry* cRCSEProfileRegistry =
+ CRCSEProfileRegistry::NewLC();
+ // CS:2
+ CheckDuplicatesL( *cRCSEProfileEntry );
+ iItemId = cRCSEProfileRegistry->AddL( *cRCSEProfileEntry );
+
+ CleanupStack::PopAndDestroy( cRCSEProfileRegistry ); // CS:1
+ CleanupStack::PopAndDestroy( cRCSEProfileEntry ); // CS:0
+
+ // __UHEAP_MARKEND; // for testing
+
+ HBufC8* tmpId = HBufC8::NewL( KMaxCharsInTUint32 );
+ _LIT8( KFormatTxt,"%u" );
+ tmpId->Des().Format( KFormatTxt, iItemId );
+ delete iSavedProfileId;
+ iSavedProfileId = NULL;
+ iSavedProfileId = tmpId;
+ tmpId = NULL;
+ DBG_PRINT( "CWPVoIPItem::StoreL - end" );
+ return iItemId;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SaveData
+//
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CWPVoIPItem::SaveData() const
+ {
+ return *iSavedProfileId;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::SavingFinalizedL()
+// 1) Save TO-APPREF dependent data and set SIP User Agent Header in SIP
+// profile.
+// 2) Update the VoIP profile with references to the saved TO-APPREF dependent
+// data.
+// 3) Reset the data collections that are based on data received via call to
+// method SettingsSaved (i.e. APPREF related data). This is because the
+// user might for some reason save the settings twice and then the data is
+// received once again (there would be then dublicates of data).
+//
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SavingFinalizedL()
+ {
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - begin" );
+ // Load the VoIP profile for update from the registry.
+ CRCSEProfileRegistry* cRCSEProfileRegistry =
+ CRCSEProfileRegistry::NewLC();
+ // CS:1
+ CRCSEProfileEntry* cRCSEProfileEntry = CRCSEProfileEntry::NewLC(); // CS:2
+ cRCSEProfileRegistry->FindL( iItemId, *cRCSEProfileEntry );
+
+ // Data dependent on the other adapters can be saved here, because it is
+ // now quaranteed that TO-APPREF pointed information is known.
+ // Test if this VoIP settings item of type SIP or SCCP dependent.
+
+ // Save RCSE related data.
+ //lint -e{961} No need for else statement here
+ if ( iSccpIdSet )
+ {
+ TSettingIds referredIds;
+ referredIds.iProfileType = 1; // SCCP.
+ referredIds.iProfileId = TInt( iSccpId );
+ // Never reference to profile specific settings.
+ referredIds.iProfileSpecificSettingId = KNotSet;
+ cRCSEProfileEntry->iIds.Append( referredIds );
+ cRCSEProfileRegistry->UpdateL( iItemId, *cRCSEProfileEntry );
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - SCCP ID set" );
+ }
+
+ if ( iNatFwIdSet )
+ {
+ cRCSEProfileEntry->iNATSettingsStorageId = iNatFwId;
+ cRCSEProfileRegistry->UpdateL( iItemId, *cRCSEProfileEntry );
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - NAT/FW ID set" );
+ }
+
+ // Save Service Provider Settings related data if service ID exists.
+ TUint32 serviceId = cRCSEProfileEntry->iServiceProviderId;
+ if ( 0 == serviceId )
+ {
+ CleanupStack::PopAndDestroy( 2, cRCSEProfileRegistry );
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - end" );
+ return;
+ }
+ CSPSettings* spSettings = CSPSettings::NewLC(); // CS:3
+ CSPEntry* spEntry = CSPEntry::NewLC(); // CS:4
+
+ TInt err = spSettings->FindEntryL( serviceId, *spEntry );
+ User::LeaveIfError( err );
+
+ CSPProperty* property = CSPProperty::NewLC(); // CS:5
+
+ // VoiceMailBox: SIP ID
+ //lint -e{961} No need for else statement here
+ if ( iVmbxSipIdSet )
+ {
+ err = property->SetName( ESubPropertyVMBXSettingsId );
+ property->SetValue( iVmbxSipId );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyVMBXSettingsId, iVmbxSipId ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - Vmbx SIP ID set" );
+ }
+ // Use the same SIP ID as in RCSE. Store only if some
+ // vmbx settings are provisioned.
+ else if ( iSipIdSet && iVmbxSettingsExist )
+ {
+ err = property->SetName( ESubPropertyVMBXSettingsId );
+ property->SetValue( iSipId );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyVMBXSettingsId, iSipId ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - \
+ Vmbx SIP ID set (same SIP ID as in RCSE)" );
+ }
+
+ // VoiceMailBox: MWI-URI
+ if ( iIPVoiceMailBoxURI->Des().Length() > 0 )
+ {
+ err = property->SetName( ESubPropertyVMBXMWIAddress );
+ property->SetValue( iIPVoiceMailBoxURI->Des() );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyVMBXMWIAddress,
+ iIPVoiceMailBoxURI->Des() ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - Vmbx MWI-URI set" );
+ }
+
+ // VoiceMailBox: Listening URI
+ if ( !iVmbxListenAddress->Des().Length()
+ && iIPVoiceMailBoxURI->Des().Length() )
+ {
+ // Use same URI as with MWI-URI.
+ delete iVmbxListenAddress;
+ iVmbxListenAddress = NULL;
+ iVmbxListenAddress = iIPVoiceMailBoxURI->Des().AllocL();
+ }
+
+ if ( iVmbxListenAddress->Des().Length() > 0 )
+ {
+ err = property->SetName( ESubPropertyVMBXListenAddress );
+ property->SetValue( iVmbxListenAddress->Des() );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyVMBXListenAddress,
+ iVmbxListenAddress->Des() ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT(
+ "CWPVoIPItem::SavingFinalizedL - Vmbx Listening URI set" );
+ }
+
+ // VoiceMailBox: Re-Subscribe interval
+ if ( iVmbxSettingsExist )
+ {
+ err = property->SetName( ESubPropertyVMBXMWISubscribeInterval );
+ property->SetValue( iReSubscribeInterval );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyVMBXMWISubscribeInterval,
+ iReSubscribeInterval ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - \
+ Vmbx re-SUBSCRIBE interval set" );
+ }
+
+ // VoiceMailBox: Preferred IAP ID
+ if ( iVmbxIapId )
+ {
+ err = property->SetName( ESubPropertyVMBXPreferredIAPId );
+ property->SetValue( iVmbxIapId );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyVMBXPreferredIAPId, iVmbxIapId ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - Vmbx IAP ID set" );
+ }
+
+ // Service provider bookmark URI
+ if ( iServiceProviderBookmark->Des().Length() > 0 )
+ {
+ err = property->SetName( EPropertyServiceBookmarkUri );
+ property->SetValue( iServiceProviderBookmark->Des() );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ EPropertyServiceBookmarkUri,
+ iServiceProviderBookmark->Des() ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - \
+ Service provider bookmark URI set" );
+ }
+
+ // Branding data URI
+ if ( iBrandingDataAddress->Des().Length() > 0 )
+ {
+ err = property->SetName( ESubPropertyVoIPBrandDataUri );
+ property->SetValue( iBrandingDataAddress->Des() );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyVoIPBrandDataUri,
+ iBrandingDataAddress->Des() ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - Branding data URI set" );
+ }
+
+ // Presence settings ID and Presence Subservice plug-in UID
+ if ( iPresenceIdSet )
+ {
+ err = property->SetName( ESubPropertyPresenceSettingsId );
+ property->SetValue( iPresenceId );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyPresenceSettingsId, iPresenceId ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+
+ // Converged Connection Handler (CCH) Presence Subservice plug-in UID
+ err = property->SetName( EPropertyPresenceSubServicePluginId );
+ property->SetValue( KCCHPresenceSubServicePlugId );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ EPropertyPresenceSubServicePluginId,
+ KCCHPresenceSubServicePlugId ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+
+ // ***************
+ // IM settings
+ // ***************
+ //
+ if ( iImEnabled )
+ {
+ property->SetName( ESubPropertyIMEnabled );
+ property->SetValue( EOn );
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyIMEnabled, EOn ) );
+ }
+
+ property->SetName( ESubPropertyIMLaunchUid );
+ property->SetValue( KIMLaunchUid );
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyIMLaunchUid, KIMLaunchUid ) );
+ }
+
+ property->SetName( ESubPropertyIMSettingsId );
+ // The value only needs to be different from 0,
+ // no-one actually uses it.
+ property->SetValue( KIMSettingsId );
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyIMSettingsId, KIMSettingsId ) );
+ }
+
+ property->SetName( EPropertyIMSubServicePluginId );
+ property->SetValue( KIMSubServicePluginId );
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ EPropertyIMSubServicePluginId, KIMSubServicePluginId ) );
+ }
+
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - set IM tonepath" );
+
+ MVIMPSTSettingsStore* settings =
+ CVIMPSTSettingsStore::NewLC(); // CS: 1
+
+ // Set default tone.
+ TFileName toneFile;
+ toneFile.Copy( PathInfo::RomRootPath() );
+ toneFile.Append( PathInfo::DigitalSoundsPath() );
+ toneFile.Append( KDefaultTone );
+ User::LeaveIfError( settings->SetL( serviceId,
+ EServiceToneFileName, toneFile ) );
+ // settings
+ CleanupStack::PopAndDestroy(); // CS: 0
+
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - IM settings set" );
+ }
+ DBG_PRINT(
+ "CWPVoIPItem::SavingFinalizedL - Presence settings ID set" );
+ }
+
+ // AutoAcceptBuddyRequest
+ if ( KNotSet != iAutoAcceptBuddyRequest )
+ {
+ err = property->SetName( ESubPropertyPresenceRequestPreference );
+ property->SetValue( static_cast<TOnOff> ( iAutoAcceptBuddyRequest ) );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyPresenceRequestPreference,
+ static_cast<TOnOff> ( iAutoAcceptBuddyRequest ) ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - \
+ AutoAcceptBuddyRequest set" );
+ }
+
+ // AutoEnableService
+ if ( KNotSet != iAutoEnableService )
+ {
+ err = property->SetName( ESubPropertyVoIPEnabled );
+ property->SetValue( static_cast<TOnOff>( iAutoEnableService ) );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyVoIPEnabled,
+ static_cast<TOnOff> ( iAutoEnableService ) ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - \
+ voip AutoEnableService set" );
+ }
+ if ( iPresenceIdSet )
+ {
+ err = property->SetName( ESubPropertyPresenceEnabled );
+ property->SetValue(
+ static_cast<TOnOff>( iAutoEnableService ) );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyPresenceEnabled,
+ static_cast<TOnOff> ( iAutoEnableService ) ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - \
+ presence AutoEnableService set" );
+ }
+
+ }
+ if ( iVmbxSipIdSet || ( iSipIdSet && iVmbxSettingsExist )
+ && iIPVoiceMailBoxURI->Des().Length() )
+ {
+ err = property->SetName( ESubPropertyVMBXEnabled );
+ property->SetValue( static_cast<TOnOff>( iAutoEnableService ) );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyVMBXEnabled,
+ static_cast<TOnOff> ( iAutoEnableService ) ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - \
+ vmbx AutoEnableService set" );
+ }
+
+ if ( iImEnabled )
+ {
+ err = property->SetName( ESubPropertyIMEnabled );
+ property->SetValue( static_cast<TOnOff>( iAutoEnableService ) );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyIMEnabled,
+ static_cast<TOnOff> ( iAutoEnableService ) ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - \
+ im AutoEnableService set" );
+ }
+ }
+
+ // SNAP ID
+ if ( iSnapIdSet && iSipIdSet )
+ {
+ CSIPProfileRegistryObserver* sipObs =
+ CSIPProfileRegistryObserver::NewLC(); // CS:1
+ CSIPManagedProfileRegistry* sipReg =
+ CSIPManagedProfileRegistry::NewLC( *sipObs ); // CS:2
+ CSIPProfile* sipProf = NULL;
+ sipProf = sipReg->ProfileL( iSipId );
+ CleanupStack::PushL( sipProf ); // CS:3
+ CSIPManagedProfile* sipManagedProf =
+ static_cast<CSIPManagedProfile*>( sipProf );
+ CleanupStack::PushL( sipManagedProf ); // CS:4
+ sipManagedProf->SetParameter( KSIPSnapId, iSnapId );
+ sipManagedProf->SetParameter( KSIPAccessPointId, (TUint32)0 );
+ sipReg->SaveL( *sipManagedProf );
+ CleanupStack::PopAndDestroy( sipManagedProf ); // CS:3
+ CleanupStack::Pop( sipProf ); // CS:2
+ sipProf = NULL;
+ // sipReg, sipObs
+ CleanupStack::PopAndDestroy( 2, sipObs ); // CS:0
+ }
+ else if ( !iSnapIdSet && iSipIdSet )
+ {
+ CSIPProfileRegistryObserver* sipObs =
+ CSIPProfileRegistryObserver::NewLC(); // CS:1
+ CSIPManagedProfileRegistry* sipReg =
+ CSIPManagedProfileRegistry::NewLC( *sipObs ); // CS:2
+ CSIPProfile* sipProf = NULL;
+ sipProf = sipReg->ProfileL( iSipId );
+ CleanupStack::PushL( sipProf ); // CS:3
+ CSIPManagedProfile* sipManagedProf =
+ static_cast<CSIPManagedProfile*>( sipProf );
+ CleanupStack::PushL( sipManagedProf ); // CS:4
+
+ TUint32 snapId( 0 );
+ err = sipManagedProf->GetParameter( KSIPSnapId, snapId );
+ if ( KErrNone == err )
+ {
+ iSnapId = snapId;
+ iSnapIdSet = ETrue;
+ }
+ CleanupStack::PopAndDestroy( sipManagedProf ); // CS:3
+ CleanupStack::Pop( sipProf ); // CS:2
+ sipProf = NULL;
+ // sipReg, sipObs
+ CleanupStack::PopAndDestroy( 2, sipObs ); // CS:0
+ }
+
+ if ( iSnapIdSet )
+ {
+ err = property->SetName( ESubPropertyVoIPPreferredSNAPId );
+ property->SetValue( iSnapId );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyVoIPPreferredSNAPId, iSnapId ) );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - SNAP ID set" );
+ }
+ }
+
+ // ***************
+ // IM SNAP ID
+ // ***************
+ //
+ if ( iImEnabled )
+ {
+ property->SetName( ESubPropertyIMPreferredSNAPId );
+ err = property->SetValue( iSnapId );
+ if ( KErrNone == err )
+ {
+ err = spEntry->AddPropertyL( *property );
+ if ( KErrAlreadyExists == err )
+ {
+ User::LeaveIfError( spEntry->UpdateProperty(
+ ESubPropertyIMPreferredSNAPId, iSnapId ) );
+ }
+ }
+ }
+
+ User::LeaveIfError( spSettings->UpdateEntryL( *spEntry ) );
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - \
+ Service provider entry updated" );
+
+ // property, spEntry spSettings, cRCSEProfileEntry, cRCSEProfileRegistry
+ CleanupStack::PopAndDestroy( 5, cRCSEProfileRegistry ); // CS:0
+ iSipIdSet = EFalse;
+
+ DBG_PRINT( "CWPVoIPItem::SavingFinalizedL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::CheckDuplicatesL
+// Checks if duplicate provider and settings name. Renames if same.
+// ---------------------------------------------------------------------------
+//
+TBool CWPVoIPItem::CheckDuplicatesL(
+ CRCSEProfileEntry& aEntry ) const
+ {
+ DBG_PRINT( "CWPVoIPItem::CheckDuplicatesL - begin" );
+ CRCSEProfileRegistry *cRCSEProfile = CRCSEProfileRegistry::NewLC();
+
+ // Array of pointers to all profile entries.
+ CArrayPtrFlat<CRCSEProfileEntry>* profileEntries = new (ELeave)
+ CArrayPtrFlat<CRCSEProfileEntry>( 1 );
+ TCleanupItem cleanupItem( CWPVoIPItem::CleanupArrayItem, profileEntries );
+ CleanupStack::PushL( cleanupItem );
+
+ // Load profiles to pointerarray.
+ RArray<TUint32> allIds;
+ CleanupClosePushL( allIds );
+ cRCSEProfile->GetAllIdsL( allIds );
+
+ for ( TInt counter = 0; counter < allIds.Count(); counter++ )
+ {
+ CRCSEProfileEntry* profile = CRCSEProfileEntry::NewLC();
+ cRCSEProfile->FindL( allIds[counter], *profile );
+ profileEntries->AppendL( profile );
+ CleanupStack::Pop( profile );
+ }
+ CleanupStack::PopAndDestroy( &allIds );
+
+ // Check and rename duplicate provider.
+
+ TBool isValid( EFalse );
+
+ HBufC* newProviderName = HBufC::NewLC( KMaxProviderNameLength * KTwo );
+ newProviderName->Des().Copy( aEntry.iProviderName );
+
+ TInt count( profileEntries->Count() );
+
+ for ( TInt n = 0; n < count; n++ )
+ {
+ const TDesC& existingName = profileEntries->At( n )->iProviderName;
+ if ( existingName.Compare( aEntry.iProviderName ) == 0 )
+ {
+ TBool isUnique( EFalse );
+
+ for ( TInt i = 1; !isUnique; i++ )
+ {
+ TBool found( EFalse );
+ newProviderName->Des().Copy( aEntry.iProviderName );
+ newProviderName->Des().Append( KOpenParenthesis() );
+ newProviderName->Des().AppendNum( static_cast<TInt64>( i ) );
+ newProviderName->Des().Append( KClosedParenthesis() );
+ for ( TInt m = 0; m < count; m++ )
+ {
+ if ( profileEntries->At( m )->iProviderName.Compare(
+ newProviderName->Des() ) == 0 )
+ {
+ found = ETrue;
+ }
+ }
+ if ( !found )
+ {
+ isUnique = ETrue;
+ }
+ }
+ }
+ }
+
+ // Change setting only if length is smaller than max length.
+ if ( newProviderName->Length() < KMaxProviderNameLength )
+ {
+ aEntry.iProviderName.Copy( newProviderName->Des() );
+ isValid = ETrue;
+ }
+
+ // Check and rename also duplicate settingsName.
+ HBufC* newSettingsName = HBufC::NewLC( KMaxSettingsNameLength * KTwo );
+ newSettingsName->Des().Copy( aEntry.iSettingsName );
+ isValid = EFalse;
+ for ( TInt n = 0; n < count; n++ )
+ {
+ const TDesC& existingName = profileEntries->At( n )->iSettingsName;
+ if ( existingName.Compare( aEntry.iSettingsName ) == 0 )
+ {
+ TBool isUnique( EFalse );
+
+ for ( TInt i = 1; !isUnique; i++ )
+ {
+ TBool found( EFalse );
+ newSettingsName->Des().Copy( aEntry.iSettingsName );
+ newSettingsName->Des().Append( KOpenParenthesis() );
+ newSettingsName->Des().AppendNum( static_cast<TInt64>( i ) );
+ newSettingsName->Des().Append( KClosedParenthesis() );
+ for ( TInt m = 0; m < count; m++ )
+ {
+ if ( profileEntries->At( m )->iSettingsName.Compare(
+ newSettingsName->Des() ) == 0 )
+ {
+ found = ETrue;
+ } // if
+ } // for
+
+ if ( !found )
+ {
+ isUnique = ETrue;
+ }
+ } // for ( TInt m = 0; m < count; m++ )
+ } // if ( existingName.Compare( ...
+ } // for ( TInt n = 0; n < count; n++ )
+
+ // Change setting only if length is smaller than max length.
+ if ( newSettingsName->Length() < KMaxSettingsNameLength )
+ {
+ aEntry.iSettingsName.Copy( newSettingsName->Des() );
+ isValid = ETrue;
+ }
+
+ // newSettingsName, newProviderName, profileEntries, cRCSEProfile
+ CleanupStack::PopAndDestroy( 4, cRCSEProfile );
+ DBG_PRINT( "CWPVoIPItem::CheckDuplicatesL - end" );
+ return isValid;
+ }
+
+// ---------------------------------------------------------------------------
+// void CWPVoIPItem::SetTelephonyPreferenceL
+// For setting telephony preference.
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::SetTelephonyPreferenceL ( const TTelephonyPreference&
+ aTelephonyPreference ) const
+ {
+ DBG_PRINT( "CWPVoIPItem::SetTelephonyPreferenceL - begin" );
+ // Central Repository for richcall settings
+ CRepository* rep = CRepository::NewLC( KCRUidRichCallSettings );
+ //lint -e{961} No need for else statement here
+ if ( EPSPreferred == aTelephonyPreference )
+ {
+ rep->Set( KRCSEPreferredTelephony, EPSPreferred );
+ }
+ else if ( ECSPreferred == aTelephonyPreference )
+ {
+ rep->Set( KRCSEPreferredTelephony, ECSPreferred );
+ }
+
+ CleanupStack::PopAndDestroy( rep );
+
+ DBG_PRINT( "CWPVoIPItem::SetTelephonyPreferenceL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// void CWPVoIPItem::AppRef
+// ---------------------------------------------------------------------------
+//
+HBufC8* CWPVoIPItem::AppRef()
+ {
+ DBG_PRINT( "CWPVoIPItem::AppRef()" );
+ return iAppRef;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::GetTerminalTypeL
+// Collect terminal type used in SIP User Agent Header.
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::GetTerminalTypeL(
+ TBuf<KMaxTerminalTypeLength>& aTerminalType ) const
+ {
+ DBG_PRINT( "CWPVoIPItem::GetTerminalTypeL - begin" );
+
+ aTerminalType.Zero(); // Reset before use
+
+ CIpAppPhoneUtils* phoneUtils = CIpAppPhoneUtils::NewLC();
+ phoneUtils->GetTerminalTypeL( aTerminalType ); // Gets phone model + type
+ CleanupStack::PopAndDestroy( phoneUtils );
+
+ DBG_PRINT( "CWPVoIPItem::GetTerminalTypeL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::GetWlanMacAddressL
+// Gets WLAN MAC address used in SIP User Agent Header (same as *#62209526#).
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::GetWlanMacAddressL(
+ TBuf<KWlanMacAddressLength>& aMac ) const
+ {
+ DBG_PRINT( "CWPVoIPItem::GetWlanMacAddressL - begin" );
+
+ CIPAppUtilsAddressResolver* resolver =
+ CIPAppUtilsAddressResolver::NewLC();
+
+ TBuf8<KWlanMacAddressLength> wlanmac;
+ _LIT8( KFormat, "-" );
+ resolver->GetWlanMACAddress( wlanmac, KFormat );
+ // wlanmac buffer contains now the wlan mac address like 00-15-a0-99-10-ec
+ CleanupStack::PopAndDestroy( resolver );
+ aMac.Copy( wlanmac );
+
+ DBG_PRINT( "CWPVoIPItem::GetWlanMacAddressL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::GetUserAgentHeaderL
+// Gets SIP User Agent Header.
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::GetUserAgentHeaderL(
+ TBuf8<KUAHLength>& aUserAgentHeader ) const
+ {
+ DBG_PRINT( "CWPVoIPItem::GetUserAgentHeaderL - begin" );
+ // Create a CRCSEProfileEntry to get default values for User-Agent header
+ // parameters.
+ CRCSEProfileEntry* cRCSEProfileEntry = CRCSEProfileEntry::NewLC();
+
+ aUserAgentHeader.Zero(); // Reset before use
+ TBuf<KMaxTerminalTypeLength> tempTerminalType;
+ TBuf<KWlanMacAddressLength> tempWlanMac;
+ TBuf<KMaxSettingsLength32> tempFreeString;
+ tempFreeString = UAHString();
+
+ TInt uahTerminalType = iUAHTerminalType;
+ TInt uahWlanMac = iUAHWLANMAC;
+
+ if ( KNotSet == iUAHTerminalType )
+ {
+ uahTerminalType = cRCSEProfileEntry->iSIPVoIPUAHTerminalType;
+ }
+
+ if ( KNotSet == uahWlanMac )
+ {
+ uahWlanMac = cRCSEProfileEntry->iSIPVoIPUAHeaderWLANMAC;
+ }
+
+ if ( uahTerminalType || uahWlanMac || ( tempFreeString.Length() > 0 ) )
+ {
+ aUserAgentHeader.Append( KUserAgent );
+ aUserAgentHeader.Append( KColonMark );
+ aUserAgentHeader.Append( KSpaceMark );
+ }
+
+ if ( uahTerminalType )
+ {
+ GetTerminalTypeL( tempTerminalType );
+ aUserAgentHeader.Append( tempTerminalType );
+ aUserAgentHeader.Append( KSpaceMark );
+ }
+ if ( uahWlanMac )
+ {
+ GetWlanMacAddressL( tempWlanMac );
+ aUserAgentHeader.Append( tempWlanMac );
+ aUserAgentHeader.Append( KSpaceMark );
+ }
+ if ( tempFreeString.Length() > 0 )
+ {
+ aUserAgentHeader.Append( tempFreeString );
+ }
+ CleanupStack::PopAndDestroy( cRCSEProfileEntry );
+ DBG_PRINT( "CWPVoIPItem::GetUserAgentHeader - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::CleanupArrayItem
+// Cleans up an array.
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::CleanupArrayItem( TAny* aArray )
+ {
+ CArrayPtrFlat<CRCSEProfileEntry>* tempArray =
+ static_cast<CArrayPtrFlat<CRCSEProfileEntry>*>( aArray );
+ if ( tempArray )
+ {
+ tempArray->ResetAndDestroy();
+ }
+ delete tempArray;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::AddDefaultCodecsL
+// Creates default codecs.
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::AddDefaultCodecsL( CRCSEProfileEntry& aProfileEntry )
+ {
+ DBG_PRINT( "CWPVoIPItem::AddDefaultCodecsL - start" );
+
+ CRCSEAudioCodecRegistry* audioCodecRegistry =
+ CRCSEAudioCodecRegistry::NewLC();
+ CRCSEAudioCodecEntry* audioCodecEntry = CRCSEAudioCodecEntry::NewLC();
+
+ TUint32 codecId( KErrNone );
+
+ audioCodecEntry->SetDefaultCodecValueSet( KAudioCodecAMRWB() );
+ codecId = audioCodecRegistry->AddL( *audioCodecEntry );
+ aProfileEntry.iPreferredCodecs.AppendL( codecId );
+
+ audioCodecEntry->SetDefaultCodecValueSet( KAudioCodecAMR() );
+ codecId = audioCodecRegistry->AddL( *audioCodecEntry );
+ aProfileEntry.iPreferredCodecs.AppendL( codecId );
+
+ audioCodecEntry->SetDefaultCodecValueSet( KAudioCodecPCMU() );
+ codecId = audioCodecRegistry->AddL( *audioCodecEntry );
+ aProfileEntry.iPreferredCodecs.AppendL( codecId );
+
+ audioCodecEntry->SetDefaultCodecValueSet( KAudioCodecPCMA() );
+ codecId = audioCodecRegistry->AddL( *audioCodecEntry );
+ aProfileEntry.iPreferredCodecs.AppendL( codecId );
+
+ audioCodecEntry->SetDefaultCodecValueSet( KAudioCodeciLBC() );
+ codecId = audioCodecRegistry->AddL( *audioCodecEntry );
+ aProfileEntry.iPreferredCodecs.AppendL( codecId );
+
+ audioCodecEntry->SetDefaultCodecValueSet( KAudioCodecG729() );
+ codecId = audioCodecRegistry->AddL( *audioCodecEntry );
+ aProfileEntry.iPreferredCodecs.AppendL( codecId );
+
+ audioCodecEntry->SetDefaultCodecValueSet( KAudioCodecCN() );
+ codecId = audioCodecRegistry->AddL( *audioCodecEntry );
+ aProfileEntry.iPreferredCodecs.AppendL( codecId );
+
+ // audioCodecEntry, audioCodecRegistry
+ CleanupStack::PopAndDestroy( 2, audioCodecRegistry );
+
+ DBG_PRINT( "CWPVoIPItem::AddDefaultCodecsL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::ItemId
+// ---------------------------------------------------------------------------
+//
+TUint32 CWPVoIPItem::ItemId()
+ {
+ return iItemId;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPItem::EnableIm
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPItem::EnableIm()
+ {
+ iImEnabled = ETrue;
+ }
+
+// End of File