--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/voipadapters/cpvoipadapter/src/CWPVoIPAdapter.cpp Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,1210 @@
+/*
+* Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Receives and stores VoIP settings.
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <CWPAdapter.h>
+#include <CWPCharacteristic.h>
+#include <CWPParameter.h>
+#include <wpvoipadapter.rsg>
+#include <WPAdapterUtil.h> // Adapter utils
+#include <s32mem.h> // RDesWriteStream
+#include <s32strm.h>
+#include <e32des8.h>
+#include <utf.h> // Unicode conversion
+#include <featmgr.h>
+#include <cmmanagerext.h>
+#include <cmdestinationext.h>
+#include <cmconnectionmethoddef.h>
+#include <crcseprofileentry.h>
+#include <crcseprofileregistry.h>
+#include <crcseaudiocodecentry.h>
+#include <crcseaudiocodecregistry.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+
+#include "CWPVoIPAdapter.h"
+#include "CWPVoIPItem.h"
+
+// The following four includes are because of SIP User Agent Header.
+#include "CSIPProfileRegistryObserver.h"
+#include <sipmanagedprofile.h>
+#include <sipprofileregistryobserver.h>
+#include <sipmanagedprofileregistry.h>
+
+// LOCAL CONSTANTS
+// Application related constants
+_LIT( KVoIPAdapterName, "WPVoIPAdapter");
+_LIT( KVoIPAppID, "w9013" ); // OMA CP registration document for VoIP
+_LIT8( KVoIPAppID8, "w9013" ); // OMA CP registration document for VoIP
+_LIT8( KSIPAppID8, "w9010" ); // OMA CP registration document for SIP
+_LIT8( KSCCPAppID8, "w9018" ); // OMA CP registration document for SCCP
+_LIT8( KNATFWAppID8, "w902E" ); // OMA CP registration document for NATFW
+_LIT8( KPresenceAppId8, "ap0002" ); // OMA CP registration document for
+ // SIMPLE Presence
+_LIT8( KSNAPAppID8, "w904C" ); // OMA CP registration document for
+ // Destination Networks
+// Characterictic clear text names.
+_LIT( KCODEC16, "CODEC" );
+_LIT( KVOIPURIS16, "VOIPURIS" );
+
+// VoIP profile parameters.
+// OMA CP registration document for VoIP, w9013.txt.
+_LIT( KParmSMPORT, "SMPORT" );
+_LIT( KParmEMPORT, "EMPORT" );
+_LIT( KParmMEDIAQOS, "MEDIAQOS" );
+_LIT( KParmNODTMFIB, "NODTMFIB" );
+_LIT( KParmNODTMFOOB, "NODTMFOOB" );
+_LIT( KParmSECURECALLPREF, "SECURECALLPREF" );
+_LIT( KParmRTCP, "RTCP" );
+_LIT( KParmUAHTERMINALTYPE, "UAHTERMINALTYPE" );
+_LIT( KParmUAHWLANMAC, "UAHWLANMAC" );
+_LIT( KParmUAHSTRING, "UAHSTRING" );
+_LIT( KParmPROFILELOCKEDTOIAP, "PROFILELOCKEDTOIAP" );
+_LIT( KParmVOIPPLUGINUID, "VOIPPLUGINUID" );
+_LIT( KParmALLOWVOIPOVERWCDMA, "ALLOWVOIPOVERWCDMA" );
+_LIT( KParmVOIPDIGITS, "VOIPDIGITS" );
+_LIT( KParmIGNDOMPART, "IGNDOMPART" );
+_LIT( KParmAABUDDYREQUEST, "AABUDDYREQUEST" );
+_LIT( KParmADDUSERPHONE, "ADDUSERPHONE" );
+_LIT( KParmSIPCONNTESTURI, "SIPCONNTESTURI" );
+_LIT( KParmPROVIDERURI, "PROVIDERURI" );
+_LIT( KParmMINSE, "MINSE" );
+_LIT( KParmSESSIONEXP, "SESSIONEXP" );
+_LIT( KParmBRANDINGURI, "BRANDINGURI" );
+_LIT( KParmNATPROTOCOL, "NATPROTOCOL" );
+_LIT( KParmAUTOENABLE, "AUTOENABLE" );
+_LIT( KParmIMENABLED, "IMENABLED" );
+
+// RESOURCE parameters.
+// OMA CP registration document for VoIP, w9013.txt.
+// RESOURCETYPE indicates if the following parameters are for a codec, SIP
+// specific (URIs), Handover or VoIP Presence settings.
+_LIT( KParmMEDIASUBTYPE, "MEDIASUBTYPE" );// Codec.
+_LIT( KParmPRIORITYINDEX, "PRIORITYINDEX" );// Codec.
+_LIT( KParmJITTERBUFFERSIZE, "JITTERBUFFERSIZE" );// Codec.
+_LIT( KParmOCTETALIGN, "OCTET-ALIGN" );// Codec.
+_LIT( KParmMODESET, "MODE-SET" );// Codec.
+_LIT( KParmMODECHANGEPERIOD, "MODE-CHANGE-PERIOD" );// Codec.
+_LIT( KParmMODECHANGENEIGHBOR, "MODE-CHANGE-NEIGHBOR" );// Codec.
+_LIT( KParmPTIME, "PTIME" );// Codec.
+_LIT( KParmMAXPTIME, "MAXPTIME" );// Codec.
+_LIT( KParmVAD, "VAD" );// Codec.
+_LIT( KParmANNEXB, "ANNEXB" );// Codec.
+_LIT( KParmMAXRED, "MAXRED" );// Codec.
+_LIT( KParmIPVOICEMAILBOXURI, "IPVOICEMAILBOXURI" );// VMBX.
+_LIT( KParmVMBXLISTENURI, "VMBXLISTENURI" );// VMBX.
+_LIT( KParmRESUBSCRIBE, "RESUBSCRIBE" );// VMBX.
+
+// For other purposes.
+_LIT8( KHexPrefix, "0x" ); // For parsing PLUGINUID.
+const TUint KTempStringlength( 200 ); // For SIP User-Agent Header.
+const TInt KMaxCharsInTUint32( 10 );
+const TInt KTen( 10 );
+
+static const TInt32 KNotSaved( -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
+
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::CWPVoIPAdapter
+// ---------------------------------------------------------------------------
+//
+CWPVoIPAdapter::CWPVoIPAdapter() : CWPAdapter()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPAdapter::ConstructL()
+ {
+ DBG_PRINT( "CWPVoIPAdapter::ConstructL - begin" );
+ TFileName fileName;
+ Dll::FileName( fileName );
+ iTitle = WPAdapterUtil::ReadHBufCL( fileName, KVoIPAdapterName,
+ R_QTN_SM_HEAD_VOIP );
+ iUids = HBufC8::NewL( 0 );
+ iCurrentVoIPItem = NULL;
+
+ FeatureManager::InitializeLibL();
+ iFeatMgrInitialized = ETrue;
+
+ DBG_PRINT( "CWVoIPAdapter::ConstructL - Checking VoIP support." );
+ if ( !FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) )
+ {
+ DBG_PRINT( "CWVoIPAdapter::ConstructL - VoIP not supported; leave." );
+ User::Leave( KErrNotSupported );
+ }
+ DBG_PRINT( "CWPVoIPAdapter::ConstructL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::NewL
+// ---------------------------------------------------------------------------
+//
+CWPVoIPAdapter* CWPVoIPAdapter::NewL()
+ {
+ DBG_PRINT( "CWPVoIPAdapter::NewL - begin" );
+ CWPVoIPAdapter* self = new (ELeave) CWPVoIPAdapter;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ DBG_PRINT( "CWVoIPAdapter::NewL - end" );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::~CWPVoIPAdapter
+// ---------------------------------------------------------------------------
+//
+CWPVoIPAdapter::~CWPVoIPAdapter()
+ {
+ DBG_PRINT( "CWVoIPAdapter::~CWPVoIPAdapter - begin" );
+ delete iTitle;
+ delete iUids;
+ iDatas.ResetAndDestroy();
+ iDatas.Close();
+
+ if ( iFeatMgrInitialized )
+ {
+ FeatureManager::UnInitializeLib();
+ }
+
+ DBG_PRINT( "CWVoIPAdapter::~CWPVoIPAdapter - end" );
+ //lint -e{1740} iCurrentCodec is deleted in another class
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::ContextExtension
+// ---------------------------------------------------------------------------
+//
+TInt CWPVoIPAdapter::ContextExtension( MWPContextExtension*& aExtension )
+ {
+ aExtension = this;
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::SaveDataL
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CWPVoIPAdapter::SaveDataL( TInt aIndex ) const
+ {
+ return iDatas[aIndex]->SaveData();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::DeleteL
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPAdapter::DeleteL( const TDesC8& aSaveData )
+ {
+ DBG_PRINT( "CWVoIPAdapter::DeleteL - begin" );
+ TUint tId;
+ TLex8 lex( aSaveData );
+ TInt err( KErrNone );
+ err = lex.Val( tId );
+ if ( KErrNone == err )
+ {
+ CRCSEProfileRegistry* cRCSEProfileRegistry =
+ CRCSEProfileRegistry::NewLC();
+ cRCSEProfileRegistry->DeleteL( tId );
+
+ // set CS preferred if last VoIP profile deleted
+ RArray<TUint32> voipIds;
+ cRCSEProfileRegistry->GetAllIdsL( voipIds );
+ if ( KErrNone == voipIds.Count() )
+ {
+ CWPVoIPItem* cVoIPItem = CWPVoIPItem::NewL();
+ CleanupStack::PushL( cVoIPItem );
+ cVoIPItem->SetTelephonyPreferenceL( CWPVoIPItem::ECSPreferred );
+ CleanupStack::PopAndDestroy( cVoIPItem );
+ }
+ voipIds.Close();
+ CleanupStack::PopAndDestroy( cRCSEProfileRegistry );
+ }// if
+ DBG_PRINT( "CWVoIPAdapter::DeleteL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::Uid
+// ---------------------------------------------------------------------------
+//
+TUint32 CWPVoIPAdapter::Uid() const
+ {
+ return iDtor_ID_Key.iUid;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::DetailsL
+// ---------------------------------------------------------------------------
+//
+TInt CWPVoIPAdapter::DetailsL( TInt /*aItem*/, MWPPairVisitor& /*aVisitor */ )
+ {
+ return KErrNotSupported;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::SummaryCount
+// ---------------------------------------------------------------------------
+//
+TInt CWPVoIPAdapter::ItemCount() const
+ {
+ return iDatas.Count();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::SummaryTitle
+// ---------------------------------------------------------------------------
+//
+const TDesC16& CWPVoIPAdapter::SummaryTitle( TInt /*aIndex*/ ) const
+ {
+ return *iTitle;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::SummaryText
+// ---------------------------------------------------------------------------
+//
+const TDesC16& CWPVoIPAdapter::SummaryText( TInt aIndex ) const
+ {
+ return iDatas[aIndex]->Name();
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::SaveL
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPAdapter::SaveL( TInt aIndex )
+ {
+ DBG_PRINT( "CWVoIPAdapter::SaveL - begin" );
+
+ CWPVoIPItem* voipItem = iDatas[aIndex];
+
+ if ( voipItem->NapDef() && voipItem->NapDef()->Data().Length() <=
+ KMaxCharsInTUint32 )
+ {
+ // Get WAP ID.
+ TPckgBuf<TUint32> uid;
+ uid.Copy( voipItem->NapDef()->Data( 0 ) );
+ TUint32 wapId( uid() );
+ // Get corresponding IAP ID.
+ TUint32 iapId = IapIdFromWapIdL( wapId );
+ voipItem->SetIapId( iapId );
+ }
+
+ voipItem->StoreL();
+ voipItem = NULL;
+ DBG_PRINT( "CWVoIPAdapter::SaveL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::CanSetAsDefault
+// ---------------------------------------------------------------------------
+//
+TBool CWPVoIPAdapter::CanSetAsDefault( TInt /*aIndex*/ ) const
+ {
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::SetAsDefaultL
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPAdapter::SetAsDefaultL( TInt /*aIndex*/ )
+ {
+ // From VoIP release 3.0 onwards VoIP profiles cannot be set as default
+ // => this mehod does nothing but is present because of inheritance.
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::VisitL
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPAdapter::VisitL( CWPCharacteristic& aCharacteristic )
+ {
+ DBG_PRINT( "CWVoIPAdapter::VisitL( characteristic ) - begin" );
+
+ switch( aCharacteristic.Type() )
+ {
+ // Core VoIP settings.
+ case KWPApplication:
+ {
+ DBG_PRINT(
+ "CWVoIPAdapter::VisitL(characteristic) - case APPLICATION" );
+ iCurrentCharacteristic = KWPApplication;
+ iCurrentVoIPItem = CWPVoIPItem::NewL();
+ aCharacteristic.AcceptL( *this );
+ // If VoIP settings, append the item into iDatas array and leave
+ // iCurrentVoIPItem to point to it.
+ if ( iAppID == KVoIPAppID )
+ {
+ User::LeaveIfError( iDatas.Append( iCurrentVoIPItem ) );
+ }
+ else // else the settigs are no longer of type VoIP.
+ {
+ DBG_PRINT(
+ "CWVoIPAdapter::VisitL( characteristic ) - no VoIP." );
+ delete iCurrentVoIPItem;
+ iCurrentVoIPItem = NULL;
+ }
+ break;
+ }
+ // Codec and SIP profile specific settings.
+ case KWPNamedCharacteristic:
+ {
+ iCurrentCharacteristic = KWPNamedCharacteristic;
+ //lint -e{961} No need for else statement here
+ if ( aCharacteristic.Name().Compare( KCODEC16() ) == 0 )
+ {
+ DBG_PRINT(
+ "CWVoIPAdapter::VisitL( characteristic ) - case CODEC" );
+ iCurrentCodec = CWPVoIPCodec::NewL();
+ iSetCodec = ETrue;
+ aCharacteristic.AcceptL( *this );
+ iCurrentVoIPItem->AddCodecL( iCurrentCodec );
+ iSetCodec = EFalse;
+ }
+ else if ( aCharacteristic.Name().Compare( KVOIPURIS16() ) == 0 )
+ {
+ DBG_PRINT(
+ "CWVoIPAdapter::VisitL(characteristic) - case VOIPURIS" );
+ iSetVoipUris = ETrue;
+ aCharacteristic.AcceptL( *this );
+ iSetVoipUris = EFalse;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ DBG_PRINT( "CWVoIPAdapter::VisitL( characteristic ) - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::GetSavingInfoL
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPAdapter::GetSavingInfoL( TInt aIndex,
+ RPointerArray<HBufC8>& aSavingInfo )
+ {
+ CleanupResetAndDestroyPushL( aSavingInfo );
+
+ // APPID into place [0].
+ HBufC8* temp = KVoIPAppID8().AllocLC();
+ aSavingInfo.AppendL( temp );
+ CleanupStack::Pop();
+
+ // APPREF into place [1].
+ temp = iDatas[aIndex]->AppRef()->AllocLC();
+ aSavingInfo.AppendL( temp );
+ CleanupStack::Pop();
+
+ // Profile id into place [2].
+ temp = iDatas[aIndex]->SaveData().AllocLC();
+ aSavingInfo.AppendL( temp );
+ CleanupStack::Pop();
+
+ CleanupStack::Pop( &aSavingInfo );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::VisitL
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPAdapter::VisitL( CWPParameter& aParameter )
+ {
+ DBG_PRINT( "CWVoIPAdapter::VisitL( parameter ) - begin" );
+ // tmpValue holds the value converted from Unicode to UTF8.
+ HBufC8* tmpValue = HBufC8::NewLC( aParameter.Value().Length() ); // CS:1
+ TPtr8 ptrTmpValue( tmpValue->Des() );
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( ptrTmpValue,
+ aParameter.Value() );
+ TInt tIntParameterValue( 0 );
+
+ switch( aParameter.ID() )
+ {
+ case EWPParameterAppRef:
+ {
+ iCurrentVoIPItem->SetAppRefL( tmpValue->Des() );
+ break;
+ }
+ case EWPParameterAppID:
+ {
+ iAppID.Set( aParameter.Value() );
+ break;
+ }
+ // Here case 0 are handled the VoIP parameters that are extensions
+ // to OMA Client Provisioning parameter set.
+ case 0:
+ //lint -e{961} No need for else statement here
+ if ( aParameter.Name().Compare( KParmSMPORT ) == 0 )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetStartMediaPort( tIntParameterValue );
+ }// if
+ }
+ else if ( aParameter.Name().Compare( KParmEMPORT ) == 0 )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetEndMediaPort( tIntParameterValue );
+ }//if
+ }// else if
+ else if ( aParameter.Name().Compare( KParmMEDIAQOS ) == 0 )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetMediaQoS( tIntParameterValue );
+ }// if
+ }// else if
+ else if ( aParameter.Name().Compare( KParmNODTMFIB ) == 0 )
+ {
+ iCurrentVoIPItem->SetDTMFInBand( 0 );
+ }// else if
+ else if ( aParameter.Name().Compare( KParmNODTMFOOB ) == 0 )
+ {
+ iCurrentVoIPItem->SetDTMFOutBand( 0 );
+ }
+ else if ( aParameter.Name().Compare( KParmSECURECALLPREF ) == 0 )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetSecureCallPref( tIntParameterValue );
+ }// if
+ }// else if
+
+ else if ( aParameter.Name().Compare( KParmRTCP ) == 0 )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetRTCP( tIntParameterValue );
+ }// if
+ }// else if
+
+ else if ( aParameter.Name().Compare(
+ KParmUAHTERMINALTYPE ) == 0 )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetUAHTerminalType(
+ tIntParameterValue );
+ }// if
+ }// else if
+
+ else if ( aParameter.Name().Compare( KParmUAHWLANMAC ) == 0 )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetUAHWLANMAC( tIntParameterValue );
+ }// if
+ }// else if
+
+ else if ( aParameter.Name().Compare( KParmUAHSTRING ) == 0 )
+ {
+ iCurrentVoIPItem->SetUAHStringL( aParameter.Value() );
+ }
+
+ else if ( aParameter.Name().Compare(
+ KParmPROFILELOCKEDTOIAP ) == 0 )
+ {
+ iCurrentVoIPItem->SetProfileLockedToIAP( 1 );
+ }
+
+ else if ( aParameter.Name().Compare( KParmVOIPPLUGINUID ) == 0 )
+ {
+ TInt hexStart ( tmpValue->Find( KHexPrefix() ) );
+ if ( hexStart == KErrNotFound )
+ {
+ hexStart = KErrNone;
+ }
+ else
+ {
+ hexStart = KHexPrefix().Length();
+ }
+ TUint32 paramValue;
+ TLex8 lex( tmpValue->Des().Mid( hexStart ));
+ TInt err( KErrNone );
+ err = lex.Val( paramValue, EHex );
+ if ( KErrNone == err && paramValue <= KMaxTInt )
+ {
+ iCurrentVoIPItem->SetVoIPPluginUid( paramValue );
+ }// if
+ }// else if
+
+ else if ( aParameter.Name().Compare(
+ KParmALLOWVOIPOVERWCDMA ) == 0 )
+ {
+ iCurrentVoIPItem->SetAllowVoIPOverWCDMA( 1 );
+ }
+
+ else if ( aParameter.Name().Compare( KParmVOIPDIGITS ) == 0 )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetVoIPDigits( tIntParameterValue );
+ }
+ }
+
+ else if ( aParameter.Name().Compare( KParmIGNDOMPART ) == 0 )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetDomainPartIgnoreRule(
+ tIntParameterValue );
+ }
+ }
+
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmADDUSERPHONE ) )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetAddUserPhone( tIntParameterValue );
+ }
+ }
+
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmSIPCONNTESTURI ) )
+ {
+ iCurrentVoIPItem->SetSipConnTestAddressL(
+ aParameter.Value() );
+ }
+
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmPROVIDERURI ) )
+ {
+ iCurrentVoIPItem->SetServiceProviderBookmarkL(
+ aParameter.Value() );
+ }
+
+ else if ( KErrNone == aParameter.Name().Compare( KParmMINSE ) )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetSipMinSe( tIntParameterValue );
+ }
+ }
+
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmSESSIONEXP ) )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetSipSessionExpires(
+ tIntParameterValue );
+ }
+ }
+
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmBRANDINGURI ) )
+ {
+ iCurrentVoIPItem->SetBrandingDataAddressL(
+ aParameter.Value() );
+ }
+
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmAABUDDYREQUEST ) )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetAutoAcceptBuddyRequest(
+ tIntParameterValue );
+ }
+ }
+
+ // VoiceMailBox parameter.
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmIPVOICEMAILBOXURI ) )
+ {
+ iCurrentVoIPItem->SetIPVoiceMailBoxURIL(
+ aParameter.Value() );
+ }
+
+ // VoiceMailBox parameter.
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmVMBXLISTENURI ) )
+ {
+ iCurrentVoIPItem->SetVoiceMailBoxListenURIL(
+ aParameter.Value() );
+ }
+
+ // VoiceMailBox parameter.
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmRESUBSCRIBE ) )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetReSubscribeInterval(
+ tIntParameterValue );
+ }
+ }
+
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmNATPROTOCOL ) )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetUsedNatProtocol(
+ tIntParameterValue );
+ }
+ }
+
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmAUTOENABLE ) )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentVoIPItem->SetAutoEnableService(
+ tIntParameterValue );
+ }
+ }
+ else if ( KErrNone == aParameter.Name().Compare(
+ KParmIMENABLED ) )
+ {
+ iCurrentVoIPItem->EnableIm();
+ }
+
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmMEDIASUBTYPE ) == 0
+ && iSetCodec )
+ {
+ typedef CWPVoIPCodec CMediaSubType;
+ // don't need to check value because of switch-default:
+ // coverity[check_return] coverity[unchecked_value]
+ DescToInt( tmpValue, tIntParameterValue );
+
+ switch ( tIntParameterValue )
+ {
+ case CMediaSubType::EAMR:
+ {
+ iCurrentCodec->SetMediaSubtypeNameL(
+ KAudioCodecAMR() );
+ }
+ break;
+
+ case CMediaSubType::EiLBC:
+ {
+ iCurrentCodec->SetMediaSubtypeNameL(
+ KAudioCodeciLBC() );
+ }
+ break;
+
+ case CMediaSubType::EPCMA:
+ {
+ iCurrentCodec->SetMediaSubtypeNameL(
+ KAudioCodecPCMA() );
+ }
+ break;
+
+ case CMediaSubType::EPCMU:
+ {
+ iCurrentCodec->SetMediaSubtypeNameL(
+ KAudioCodecPCMU() );
+ }
+ break;
+
+ case CMediaSubType::ECN:
+ {
+ iCurrentCodec->SetMediaSubtypeNameL(
+ KAudioCodecCN() );
+ }
+ break;
+
+ case CMediaSubType::EG729:
+ {
+ iCurrentCodec->SetMediaSubtypeNameL(
+ KAudioCodecG729() );
+ }
+ break;
+
+ case CMediaSubType::EAMRWB:
+ {
+ iCurrentCodec->SetMediaSubtypeNameL(
+ KAudioCodecAMRWB() );
+ }
+ break;
+
+ case CMediaSubType::EVMRWB:
+ case CMediaSubType::EEVRC:
+ case CMediaSubType::EEVRC0:
+ case CMediaSubType::ESMV:
+ case CMediaSubType::ESMV0:
+ case CMediaSubType::EG726_40:
+ case CMediaSubType::EG726_32:
+ case CMediaSubType::EG726_24:
+ case CMediaSubType::EG726_16:
+ case CMediaSubType::EGSMEFR:
+ case CMediaSubType::EGSMFR:
+ default:
+ {
+ // Error or not supported => Codec deleted later.
+ iCurrentCodec->SetMediaSubtypeNameL(
+ KNullDesC() );
+ }
+ }// switch
+ }
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmPRIORITYINDEX ) == 0
+ && iSetCodec )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentCodec->iPriorityIndex = tIntParameterValue;
+ }
+ }
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmJITTERBUFFERSIZE ) == 0
+ && iSetCodec )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentCodec->iJitterBufferSize = tIntParameterValue;
+ }
+ }
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmOCTETALIGN ) == 0
+ && iSetCodec )
+ {
+ iCurrentCodec->iOctetAlign = 1;
+ }
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmMODESET ) == 0
+ && iSetCodec )
+ {
+ TLex8 lexModeSet( tmpValue->Des() );
+ TChar tmpChar;
+
+ while ( lexModeSet.Peek() != 0 )
+ {
+ TInt32 tmpModeSetValue ( 0 );
+ TBool cycle ( ETrue );
+ TBool stateDigit ( ETrue );
+ TBool numberExists ( EFalse );
+
+ while ( cycle )
+ {
+ switch( stateDigit )
+ {
+ case ETrue:
+ {
+ if ( lexModeSet.Peek() != 0 )
+ {
+ tmpChar = lexModeSet.Get();
+ if ( tmpChar.IsDigit() )
+ {
+ // for example: 25 = 2 * 10 + 5
+ // 257 = 25 * 10 + 7
+ tmpModeSetValue = tmpModeSetValue * KTen
+ + tmpChar.GetNumericValue();
+ numberExists = ETrue;
+ }
+ else
+ {
+ stateDigit = EFalse;
+ }
+ }
+ else
+ {
+ stateDigit = EFalse;
+ }
+ break;
+ }
+
+ case EFalse:
+ {
+ cycle = EFalse;
+ break;
+ }
+ }
+ }
+ if ( numberExists )
+ {
+ iCurrentCodec->iModeSet.Append( tmpModeSetValue );
+ }
+ }
+ }
+
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmMODECHANGEPERIOD ) == 0
+ && iSetCodec )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentCodec->iModeChangePeriod = tIntParameterValue;
+ }
+ }
+ // Codec parameter.
+ else if (
+ aParameter.Name().Compare( KParmMODECHANGENEIGHBOR ) == 0
+ && iSetCodec )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentCodec->iModeChangeNeighbor = tIntParameterValue;
+ }
+ }
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmPTIME ) == 0
+ && iSetCodec )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentCodec->iPTime = tIntParameterValue;
+ }
+ }
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmMAXPTIME ) == 0
+ && iSetCodec )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentCodec->iMaxPTime = tIntParameterValue;
+ }
+ }
+
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmVAD ) == 0
+ && iSetCodec )
+ {
+ iCurrentCodec->iVAD = 1;
+ }
+
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmANNEXB ) == 0
+ && iSetCodec )
+ {
+ iCurrentCodec->iAnnexB = 1;
+ }
+ // Codec parameter.
+ else if ( aParameter.Name().Compare( KParmMAXRED ) == 0
+ && iSetCodec )
+ {
+ if ( KErrNone == DescToInt( tmpValue, tIntParameterValue ) )
+ {
+ iCurrentCodec->iMaxRed = tIntParameterValue;
+ }
+ }
+ break; // case 0:
+
+ case EWPParameterProviderID: // APPLICATION/PROVIDER-ID
+ iCurrentVoIPItem->SetProviderIdL( aParameter.Value() );
+ break;
+
+ case EWPParameterName: // APPLICATION/NAME
+ iCurrentVoIPItem->SetNameL( aParameter.Value() );
+ break;
+
+ case EWPParameterToAppRef: // TO-APPREF
+ {
+ // APPLICATION/TO-APPREF
+ if ( !iSetVoipUris )
+ {
+ iCurrentVoIPItem->AddToAppRefL( tmpValue->Des() );
+ }
+ else
+ {
+ if ( iCurrentVoIPItem &&
+ iCurrentVoIPItem->VoipUrisToAppRef().Length() == 0 )
+ {
+ iCurrentVoIPItem->SetVoipUrisToAppRefL( tmpValue->Des() );
+ }
+ }// else if
+ } //case
+ break;
+
+ // VOIPURIS/TO-NAPID
+ case EWPParameterToNapID:
+ {
+ if ( iCurrentVoIPItem && iSetVoipUris
+ && iCurrentVoIPItem->ToNapId().Length() == 0 )
+ {
+ iCurrentVoIPItem->SetToNapIdL( tmpValue->Des() );
+ }
+ break;
+ }
+
+ default:
+ break;
+ }// switch
+ CleanupStack::PopAndDestroy( tmpValue );
+ DBG_PRINT( "CWVoIPAdapter::VisitL( parameter ) - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::VisitLinkL
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPAdapter::VisitLinkL( CWPCharacteristic& aLink )
+ {
+ DBG_PRINT( "CWVoIPAdapter::VisitLinkL - begin" );
+ switch( aLink.Type() )
+ {
+ case KWPNapDef:
+ {
+ if ( !iCurrentVoIPItem->NapDef() )
+ {
+ iCurrentVoIPItem->SetNapDef( &aLink );
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ DBG_PRINT( "CWVoIPAdapter::VisitLinkL - end" );
+ }
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::SettingsSavedL
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPAdapter::SettingsSavedL ( const TDesC8& aAppIdOfSavingItem,
+ const TDesC8& aAppRef, const TDesC8& aStorageIdValue )
+ {
+ DBG_PRINT( "CWVoIPAdapter::SettingsSavedL - begin" );
+
+ if ( !aAppIdOfSavingItem.Length() || !aAppRef.Length() ||
+ !aStorageIdValue.Length() )
+ {
+ DBG_PRINT( "CWVoIPAdapter::SettingsSavedL - end" );
+ return;
+ }
+
+ HBufC8* tmpAppId = aAppIdOfSavingItem.AllocLC(); // CS:1
+
+ TUint32 storageId( 0 );
+ TLex8 lex( aStorageIdValue );
+ User::LeaveIfError( lex.Val( storageId, EDecimal ) );
+
+ const TInt itemCount = iDatas.Count();
+
+ //lint -e{961} No need for else statement here
+ if ( KErrNone == KSIPAppID8().CompareF( tmpAppId->Des() ) )
+ {
+ for ( TInt itemIndex = 0; itemIndex < itemCount; itemIndex++ )
+ {
+ TBool setOk = iDatas[itemIndex]->SetStorageId( CWPVoIPItem::ESIP,
+ storageId, aAppRef );
+
+ TBuf8<KTempStringlength> userAgentHeader;
+ iDatas[itemIndex]->GetUserAgentHeaderL( userAgentHeader );
+ if ( setOk && storageId > 0 )
+ {
+ TUint32 itemId = iDatas[itemIndex]->ItemId();
+ if ( TUint( KNotSaved ) != itemId )
+ {
+ // First update RCSE so that service will be created.
+ DBG_PRINT( "CWVoIPAdapter::SettingsSavedL - update RCSE..." );
+ CRCSEProfileRegistry* rcseReg =
+ CRCSEProfileRegistry::NewLC();
+ CRCSEProfileEntry* rcseProf = CRCSEProfileEntry::NewLC();
+ rcseReg->FindL( itemId, *rcseProf );
+ TSettingIds referredIds;
+ referredIds.iProfileType = 0; // SIP.
+ referredIds.iProfileId = TInt( storageId );
+ // Never reference to profile specific settings.
+ referredIds.iProfileSpecificSettingId = KNotSet;
+ rcseProf->iIds.Append( referredIds );
+ rcseReg->UpdateL( itemId, *rcseProf );
+ CleanupStack::PopAndDestroy( 2, rcseReg );
+ }
+
+ // Then set SIP user-agent header
+ DBG_PRINT(
+ "CWVoIPAdapter::SettingsSavedL - \
+ create SIP User-Agent Header..." );
+ CSIPProfileRegistryObserver* cSIPProfRegObserver =
+ CSIPProfileRegistryObserver::NewLC(); // CS:2
+ CSIPManagedProfileRegistry* cSIPManagedProfileRegistry =
+ CSIPManagedProfileRegistry::NewLC(
+ *cSIPProfRegObserver ); // CS:3
+ CSIPProfile* cSIPProfile = NULL;
+ cSIPProfile = cSIPManagedProfileRegistry->ProfileL(
+ storageId );
+ CleanupStack::PushL( cSIPProfile ); // CS:4
+ CSIPManagedProfile* cSIPManagedProfile =
+ static_cast<CSIPManagedProfile*>( cSIPProfile );
+ CleanupStack::PushL( cSIPManagedProfile ); // CS:5
+ // Create an array for setting the user agent header.
+ // Granularity is 1 since only one item is appended into
+ // the array.
+ CDesC8ArrayFlat* uahArray =
+ new ( ELeave ) CDesC8ArrayFlat( 1 );
+ CleanupStack::PushL( uahArray ); // CS:6
+ uahArray->AppendL( userAgentHeader );
+ if ( userAgentHeader.Length() > 0 )
+ {
+ User::LeaveIfError( cSIPManagedProfile->SetParameter(
+ KSIPHeaders, *uahArray ) );
+ }
+
+ cSIPManagedProfileRegistry->SaveL( *cSIPManagedProfile );
+ uahArray->Reset();
+ CleanupStack::PopAndDestroy( uahArray ); // CS:5
+ CleanupStack::PopAndDestroy( cSIPManagedProfile ); // CS:4
+ CleanupStack::Pop( cSIPProfile ); // CS:3
+ cSIPProfile = NULL;
+ CleanupStack::PopAndDestroy(
+ cSIPManagedProfileRegistry );// CS:2
+ CleanupStack::PopAndDestroy( cSIPProfRegObserver );// CS:1
+ DBG_PRINT(
+ "CWVoIPAdapter::SettingsSavedL - \
+ SIP User-Agent Header created and set." );
+ } // if ( matches ... )
+ } // for
+ }
+ else if ( KErrNone == KSCCPAppID8().CompareF( tmpAppId->Des() ) )
+ {
+ for ( TInt itemIndex = 0; itemIndex < iDatas.Count(); itemIndex++ )
+ {
+ iDatas[itemIndex]->SetStorageId( CWPVoIPItem::ESCCP, storageId,
+ aAppRef );
+ }
+ }
+ else if ( KErrNone == KNATFWAppID8().CompareF( tmpAppId->Des() ) )
+ {
+ for ( TInt itemIndex = 0; itemIndex < iDatas.Count(); itemIndex++ )
+ {
+ iDatas[itemIndex]->SetStorageId( CWPVoIPItem::ENATFW, storageId,
+ aAppRef );
+ }
+ }
+ else if ( KErrNone == KPresenceAppId8().CompareF( tmpAppId->Des() ) )
+ {
+ for ( TInt itemIndex = 0; itemIndex < iDatas.Count(); itemIndex++ )
+ {
+ iDatas[itemIndex]->SetStorageId( CWPVoIPItem::EPresence,
+ storageId, aAppRef );
+ }
+ }
+ else if ( KErrNone == KSNAPAppID8().CompareF( tmpAppId->Des() ) )
+ {
+ for ( TInt itemIndex = 0; itemIndex < iDatas.Count(); itemIndex++ )
+ {
+ iDatas[itemIndex]->SetStorageId( CWPVoIPItem::ESNAP, storageId,
+ aAppRef );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( tmpAppId ); // CS:0
+ DBG_PRINT( "CWVoIPAdapter::SettingsSavedL - end" );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::SavingFinalizedL()
+// ---------------------------------------------------------------------------
+//
+void CWPVoIPAdapter::SavingFinalizedL()
+ {
+ DBG_PRINT( "CWVoIPAdapter::SavingFinalizedL - begin" );
+ // Prerequisites: All data received and is stored at least transiently in
+ // the data structures in VoIP items. Call SavingFinalized for everyone to
+ // make them update the APPREF/TO-APPREF linkage data.
+ for ( TInt itemIndex = 0; itemIndex < iDatas.Count(); itemIndex++ )
+ {
+ iDatas[itemIndex]->SavingFinalizedL();
+ }// for
+ DBG_PRINT( "CWVoIPAdapter::SavingFinalizedL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::DescToInt()
+// ---------------------------------------------------------------------------
+//
+TInt CWPVoIPAdapter::DescToInt( HBufC8* aDescValue, TInt& aIntValue ) const
+ {
+ TInt err( KErrNotFound );
+ if ( aDescValue )
+ {
+ TLex8 lex( aDescValue->Des() );
+ err = lex.Val( aIntValue );
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// CWPVoIPAdapter::IapIdFromWapIdL
+// Returns IAP ID from WAP ID.
+// ---------------------------------------------------------------------------
+//
+TUint32 CWPVoIPAdapter::IapIdFromWapIdL( TUint32 aWapId )
+ {
+ DBG_PRINT( "CWPVoIPAdapter::IapIdFromWapIdL - begin" );
+ RCmManagerExt cmManager;
+ cmManager.OpenLC(); // CS:1
+ RArray<TUint32> iapIds;
+ TUint32 iapId( 0 );
+
+ // First get all free IAP ID's.
+ cmManager.ConnectionMethodL( iapIds );
+ CleanupClosePushL( iapIds ); // CS:2
+
+ // Then get IAP ID's from all destinations.
+ RArray<TUint32> destIds;
+ cmManager.AllDestinationsL( destIds );
+ CleanupClosePushL( destIds ); // CS:3
+
+ TInt destCount = destIds.Count();
+
+ for ( TInt destIndex = 0; destIndex < destCount; destIndex++ )
+ {
+ RCmDestinationExt dest = cmManager.DestinationL(
+ destIds[destIndex] );
+ CleanupClosePushL( dest ); // CS:4
+ TInt cmCount = dest.ConnectionMethodCount();
+ for ( TInt cmIndex = 0; cmIndex < cmCount; cmIndex++ )
+ {
+ TUint32 apId = dest.ConnectionMethodL(
+ cmIndex ).GetIntAttributeL( CMManager::ECmIapId );
+ iapIds.AppendL( apId );
+ }
+ CleanupStack::PopAndDestroy( &dest ); // CS:3
+ }
+ // Finally, go through all connection methods and find correct IAP ID.
+ const TInt cmCount = iapIds.Count();
+ for ( TInt counter = 0; counter < cmCount; counter++ )
+ {
+ TUint32 id = cmManager.GetConnectionMethodInfoIntL(
+ iapIds[counter], CMManager::ECmWapId );
+
+ if ( id == aWapId )
+ {
+ iapId = iapIds[counter];
+ // No need to go through rest of IAPs.
+ break;
+ }
+ }
+
+ // PopAndDestroy destIds, iapIds, cmManager.
+ CleanupStack::PopAndDestroy( 3, &cmManager ); // CS:0
+
+ DBG_PRINT( "CWPVoIPAdapter::IapIdFromWapIdL - end" );
+ return iapId;
+ }
+
+// End of File