telephonyserver/etelmultimode/DTsy/mmtsycall.cpp
changeset 0 3553901f7fa8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserver/etelmultimode/DTsy/mmtsycall.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,1857 @@
+// Copyright (c) 1997-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:
+//
+
+#include "mmtsy.h"
+#include "testdef.h"
+#include "ETELMM.H"
+#include <et_clsvr.h>
+#include "Dmmlog.h"
+
+//#define ASYNC_TIMEOUT 300000	// 0.3s
+
+//
+//	CCallDMmTsy
+//
+CCallDMmTsy* CCallDMmTsy::NewL(CPhoneDMmTsy *aPhone, CPhoneFactoryDummyBase* aFac)
+	{
+	CCallDMmTsy* call=new(ELeave) CCallDMmTsy(aPhone,aFac);
+	CleanupStack::PushL(call);
+	call->ConstructL();
+	CleanupStack::Pop();
+	return call;
+	}
+
+CCallDMmTsy::CCallDMmTsy(CPhoneDMmTsy *aPhone, CPhoneFactoryDummyBase* aFac)
+	:CCallDummyBase(aFac), iPhone(aPhone)
+	{}
+
+void CCallDMmTsy::ConstructL()
+	{
+	CCallDummyBase::ConstructL();
+	LOGTEXT(_L8("CCallDMmTsy created"));
+	}
+
+CCallDMmTsy::~CCallDMmTsy()
+	{
+	LOGTEXT(_L8("CCallDMmTsy destroyed"));
+	}
+
+CTelObject* CCallDMmTsy::OpenNewObjectByNameL(const TDesC& aName)
+	{
+	// only fax objects can be opened from call objects
+	if (aName.Compare(_L("FAX"))==KErrNone)
+		return REINTERPRET_CAST(CTelObject*, CFaxDMmTsy::NewL(FacPtr()));
+	else
+		return NULL;
+	}
+
+CTelObject* CCallDMmTsy::OpenNewObjectL(TDes& /*aNewName*/)
+	{
+	// opening fax without a name is not supported
+	User::Leave(KErrNotSupported);
+	return NULL;
+	}
+
+CTelObject::TReqMode CCallDMmTsy::ReqModeL(const TInt aIpc)
+	{
+	// ReqModeL is called from the server's CTelObject::ReqAnalyserL
+	// in order to check the type of request it has
+
+	// The following are example request types for this dummy TSY
+	// All TSYs do not have to have these request types but they have been given
+	// "sensible" values in this test code
+
+	CTelObject::TReqMode ret=0;
+	switch (aIpc)
+		{
+//
+// No Flow Control NOR Multiple Completion
+//
+	case EMobileCallGetMobileCallCaps:
+	case EMobileCallGetMobileCallStatus:
+	case EMobileCallGetMobileCallInfo:
+	case EMobileCallGetMobileDataCallCaps:
+	case EMobileCallGetMobileDataCallRLPRange:
+	case EMobileCallSetDynamicHscsdParams:
+	case EMobileCallGetCurrentHscsdInfo:
+	case EMobileCallSwitchAlternatingCall:
+	case EMobileCallDeflect:
+	case EMobileCallTransfer:
+	case EMobileCallGoOneToOne:
+	case EMobileCallActivateCCBS:
+	case EMobileCallRejectCCBS:
+	case EMobileCallSetPrivacy:
+	case EMobileCallSetTrafficChannel:
+	case EMobileCallNotifyTrafficChannelConfirmation:
+	case EMobileCallGetUUSCaps:
+	case EMobileCallActivateUUS:
+	case EMobileCallSendUUI:
+	case EMobileCallReceiveUUI:
+	case EMobileCallHangupWithUUI:
+	case EMobileCallAnswerWithUUI:
+	case EMobileCallAnswerMultimediaCallAsVoice:
+	case EMobileCallAnswerISV:
+		break;
+//
+// Flow Controlled Services
+//
+	case EMobileCallHold:
+	case EMobileCallResume:
+	case EMobileCallSwap:
+	case EMobileCallDialEmergencyCall:
+	case EMobileCallDialNoFdnCheck:
+	case EMobileCallDialISV:
+	case EMobileCallDialCallControl:
+		ret=KReqModeFlowControlObeyed;
+		break;
+
+//
+// Multiple Completion Services with Immediate Server Repost
+// (Usually Notifications)
+//
+	case EMobileCallNotifyMobileCallStatusChange:
+	case EMobileCallNotifyMobileCallCapsChange:
+	case EMobileCallNotifyCallEvent:
+	case EMobileCallNotifyRemotePartyInfoChange:
+	case EMobileCallNotifyMobileDataCallCapsChange:
+	case EMobileCallNotifyHscsdInfoChange:
+	case EMobileCallNotifyVoiceFallback:
+	case EMobileCallNotifyAlternatingCallSwitch:
+	case EMobileCallNotifyPrivacyConfirmation:
+	case EMobileCallNotifyUUSCapsChange:
+	case EMobileCallNotifyAudioToneEvent:
+		ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+		break;
+//
+// Not Supported
+//
+	case EMobileCallNotifyMobileCallStatusChangeCancel:
+	case EMobileCallHoldCancel:
+	case EMobileCallResumeCancel:
+	case EMobileCallSwapCancel:
+	case EMobileCallNotifyMobileCallCapsChangeCancel:
+	case EMobileCallNotifyCallEventCancel:
+	case EMobileCallDialEmergencyCallCancel:
+	case EMobileCallGetMobileCallInfoCancel:
+	case EMobileCallNotifyRemotePartyInfoChangeCancel:
+	case EMobileCallNotifyMobileDataCallCapsChangeCancel:
+	case EMobileCallGetMobileDataCallRLPRangeCancel:
+	case EMobileCallSetDynamicHscsdParamsCancel:
+	case EMobileCallSwitchAlternatingCallCancel:
+	case EMobileCallActivateCCBSCancel:
+	case EMobileCallNotifyPrivacyConfirmationCancel:
+	case EMobileCallNotifyTrafficChannelConfirmationCancel:
+	case EMobileCallNotifyVoiceFallbackCancel:
+	case EMobileCallNotifyUUSCapsChangeCancel:
+	case EMobileCallActivateUUSCancel:
+	case EMobileCallSendUUICancel:
+	case EMobileCallReceiveUUICancel:
+	case EMobileCallHangupWithUUICancel:
+	case EMobileCallAnswerWithUUICancel:
+	case EMobileCallDialNoFdnCheckCancel:
+	case EMobileCallDialCallControlCancel:
+	case EMobileCallAnswerMultimediaCallAsVoiceCancel:
+	case EMobileCallNotifyAudioToneEventCancel:
+	case EMobileCallDialISVCancel:
+	case EMobileCallAnswerISVCancel:
+		User::Leave(KErrNotSupported);
+		break;
+
+	default:
+		ret=CCallBase::ReqModeL(aIpc);
+		break;
+		}
+	return ret;
+	}
+
+
+TInt CCallDMmTsy::RegisterNotification(const TInt aIpc)
+	{
+	// RegisterNotification is called when the server recognises that this notification
+	// is being posted for the first time on this sub-session object.
+
+	// It enables the TSY to "turn on" any regular notification messages that it may 
+	// receive from the phone
+
+	switch (aIpc)
+		{
+	case EMobileCallNotifyMobileCallStatusChange:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Call Status Change "));
+		return KErrNone;
+	case EMobileCallNotifyMobileCallCapsChange:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Call Control Caps Change "));
+		return KErrNone;
+	case EMobileCallNotifyCallEvent:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Call Event "));
+		return KErrNone;
+	case EMobileCallNotifyRemotePartyInfoChange:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Remote Party Info Change "));
+		return KErrNone;
+	case EMobileCallNotifyMobileDataCallCapsChange:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Data Call Caps Change "));
+		return KErrNone;
+	case EMobileCallNotifyHscsdInfoChange:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Notify Hscsd Info Change "));
+		return KErrNone;
+	case EMobileCallNotifyVoiceFallback:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Notify Voice Fallback "));
+		return KErrNone;
+	case EMobileCallNotifyAlternatingCallSwitch:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Notify Alternating Call Switch "));
+		return KErrNone;
+	case EMobileCallNotifyPrivacyConfirmation:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Notify Privacy Confirmation "));
+		return KErrNone;
+	case EMobileCallNotifyTrafficChannelConfirmation:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Notify Traffic Channel Confirmation "));
+		return KErrNone;
+	case EMobileCallNotifyUUSCapsChange:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Notify UUS Caps Change "));
+		return KErrNone;
+	case EMobileCallNotifyAudioToneEvent:
+		LOGTEXT(_L8("CCallDMmTsy: RegisterNotification - Notify Audio Tone Event "));
+		return KErrNone;
+	default:
+		// Unknown or invalid IPC
+		LOGTEXT(_L8("CCallDMmTsy: Register error, unknown IPC"));
+		return KErrNotSupported;
+		}
+	}
+
+TInt CCallDMmTsy::DeregisterNotification(const TInt aIpc)
+	{
+	// DeregisterNotification is called when the server recognises that this notification
+	// will not be posted again because the last client to have a handle on this sub-session
+	// object has just closed the handle.
+
+	// It enables the TSY to "turn off" any regular notification messages that it may 
+	// receive from the phone
+
+	switch (aIpc)
+		{
+	case EMobileCallNotifyMobileCallStatusChange:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Call Status Change "));
+		return KErrNone;
+	case EMobileCallNotifyMobileCallCapsChange:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Call Control Caps Change "));
+		return KErrNone;
+	case EMobileCallNotifyCallEvent:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Call Event "));
+		return KErrNone;
+	case EMobileCallNotifyRemotePartyInfoChange:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Remote Party Info Change "));
+		return KErrNone;
+	case EMobileCallNotifyMobileDataCallCapsChange:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Data Call Caps Change "));
+		return KErrNone;
+	case EMobileCallNotifyHscsdInfoChange:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Notify Hscsd Info Change "));
+		return KErrNone;
+	case EMobileCallNotifyVoiceFallback:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Notify Voice Fallback "));
+		return KErrNone;
+	case EMobileCallNotifyAlternatingCallSwitch:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Notify Alternating Call Switch "));
+		return KErrNone;
+	case EMobileCallNotifyPrivacyConfirmation:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Notify Privacy Confirmation "));
+		return KErrNone;
+	case EMobileCallNotifyTrafficChannelConfirmation:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Notify Traffic Channel Confirmation "));
+		return KErrNone;
+	case EMobileCallNotifyUUSCapsChange:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Notify UUS Caps Change "));
+		return KErrNone;
+	case EMobileCallNotifyAudioToneEvent:
+		LOGTEXT(_L8("CCallDMmTsy: DeregisterNotification - Notify Audio Tone Event "));
+		return KErrNone;
+	default:
+		// Unknown or invalid IPC
+		LOGTEXT(_L8("CCallDMmTsy: Deregister error, unknown IPC"));
+		return KErrNotSupported;
+		}
+	}
+
+TInt CCallDMmTsy::NumberOfSlotsL(const TInt aIpc)
+	{
+	// NumberOfSlotsL is called by the server when it is registering a new notification
+	// It enables the TSY to tell the server how many buffer slots to allocate for
+	// "repost immediately" notifications that may trigger before clients collect them
+
+	TInt numberOfSlots=1;
+	switch (aIpc)
+		{
+	case EMobileCallNotifyMobileCallStatusChange:
+	case EMobileCallNotifyMobileCallCapsChange:
+	case EMobileCallNotifyCallEvent:
+	case EMobileCallNotifyMobileDataCallCapsChange:
+	case EMobileCallNotifyHscsdInfoChange:
+	case EMobileCallNotifyVoiceFallback:
+	case EMobileCallNotifyAlternatingCallSwitch:
+	case EMobileCallNotifyPrivacyConfirmation:
+	case EMobileCallNotifyTrafficChannelConfirmation:
+	case EMobileCallNotifyUUSCapsChange:
+	case EMobileCallNotifyAudioToneEvent:
+		LOGTEXT(_L8("CCallDMmTsy: Registered with 5 slots"));
+		numberOfSlots=5;
+		break;
+	case EMobileCallNotifyRemotePartyInfoChange:
+	
+		LOGTEXT(_L8("CCallDMmTsy: Registered with 1 slot"));
+		break;
+	default:
+		// Unknown or invalid Phone IPC
+		LOGTEXT(_L8("CCallDMmTsy: Number of Slots error, unknown IPC"));
+		User::Leave(KErrNotSupported);
+		break;
+		}
+	return numberOfSlots;
+	}
+
+
+TInt CCallDMmTsy::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,
+						const TDataPackage& aPackage)
+	{
+	// ExtFunc is called by the server when it has a "extended", i.e. non-core ETel request 
+	// for the TSY to process
+	// A request handle, request type and request data are passed to the TSY
+
+	TAny* dataPtr=aPackage.Ptr1();
+	TAny* dataPtr2=aPackage.Ptr2();
+
+	// The request data has to extracted from TDataPackage and the TAny* pointers have to
+	// be "cast" to the expected request data type
+
+	switch (aIpc)
+		{
+//
+// No Flow Control NOR Multiple Completion
+//
+	case EMobileCallGetMobileCallCaps:
+		return GetMobileCallCaps(aTsyReqHandle, aPackage.Des1n());
+
+	case EMobileCallGetMobileCallStatus:
+		return GetMobileCallStatus(aTsyReqHandle,
+			REINTERPRET_CAST(RMobileCall::TMobileCallStatus*,dataPtr));
+
+	case EMobileCallGetMobileCallInfo:
+		return GetMobileCallInfo(aTsyReqHandle, aPackage.Des1n());
+
+	case EMobileCallGetMobileDataCallCaps:
+		return GetMobileDataCallCaps(aTsyReqHandle, aPackage.Des1n());
+
+	case EMobileCallGetMobileDataCallRLPRange:
+		return GetMobileDataCallRLPRange(aTsyReqHandle,
+			REINTERPRET_CAST(TInt *, dataPtr), 
+            aPackage.Des2n());
+
+	case EMobileCallSetDynamicHscsdParams:
+		return SetDynamicHscsdParams(aTsyReqHandle,
+			REINTERPRET_CAST(TInt*,dataPtr),
+			REINTERPRET_CAST(TInt*,dataPtr2));
+
+	case EMobileCallGetCurrentHscsdInfo:
+		return GetCurrentHscsdInfo(aTsyReqHandle,aPackage.Des1n());
+
+	case EMobileCallSwitchAlternatingCall:
+		return SwitchAlternatingCall(aTsyReqHandle);
+
+	case EMobileCallDeflect:
+		return Deflect(aTsyReqHandle,
+			REINTERPRET_CAST(RMobileCall::TMobileCallDeflect*, dataPtr),
+			REINTERPRET_CAST(RMobilePhone::TMobileAddress*, dataPtr2));
+
+	case EMobileCallTransfer:
+		return Transfer(aTsyReqHandle);
+
+	case EMobileCallGoOneToOne:
+		return GoOneToOne(aTsyReqHandle);
+
+	case EMobileCallActivateCCBS:
+		return ActivateCCBS(aTsyReqHandle, 
+			REINTERPRET_CAST(TInt*, dataPtr));
+	
+	case EMobileCallRejectCCBS:
+		return RejectCCBS(aTsyReqHandle);
+
+	case EMobileCallSetPrivacy:
+		return SetPrivacySetting(aTsyReqHandle, 
+			REINTERPRET_CAST(RMobilePhone::TMobilePhonePrivacy*, dataPtr));
+
+	case EMobileCallNotifyPrivacyConfirmation:
+		return NotifyPrivacyConfirmation(aTsyReqHandle, 
+			REINTERPRET_CAST(RMobilePhone::TMobilePhonePrivacy*, dataPtr));
+
+	case EMobileCallSetTrafficChannel:
+		return SetTrafficChannel(aTsyReqHandle,
+			REINTERPRET_CAST(RMobileCall::TMobileCallTch*, dataPtr));
+
+	case EMobileCallNotifyTrafficChannelConfirmation:
+		return NotifyTrafficChannelConfirmation(aTsyReqHandle,
+			REINTERPRET_CAST(RMobileCall::TMobileCallTch*,dataPtr));
+
+	case EMobileCallGetUUSCaps:
+		return GetUUSCaps(aTsyReqHandle,
+			REINTERPRET_CAST(TUint32*,dataPtr));
+
+	case EMobileCallActivateUUS:
+		return ActivateUUS(aTsyReqHandle, aPackage.Des1n());
+
+	case EMobileCallSendUUI:
+		return SendUUI(aTsyReqHandle,
+			REINTERPRET_CAST(TInt*,dataPtr), aPackage.Des2u());
+
+	case EMobileCallReceiveUUI:
+		return ReceiveUUI(aTsyReqHandle, aPackage.Des1u());
+
+	case EMobileCallHangupWithUUI:
+		return HangupWithUUI(aTsyReqHandle, aPackage.Des1u());
+
+	case EMobileCallAnswerWithUUI:
+		return AnswerIncomingCallWithUUI(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2u()); 
+	
+	case EMobileCallAnswerMultimediaCallAsVoice:
+		return AnswerMultimediaCallAsVoice(aTsyReqHandle, 
+				aPackage.Des1n(), aPackage.Des2u());
+
+	case EMobileCallAnswerISV:
+		return AnswerIncomingCallISV(aTsyReqHandle, aPackage.Des1n());
+
+//
+// Flow Controlled Services
+//
+	case EMobileCallHold:
+		return Hold(aTsyReqHandle);
+
+	case EMobileCallResume:
+		return Resume(aTsyReqHandle);
+
+	case EMobileCallSwap:
+		return Swap(aTsyReqHandle);
+
+	case EMobileCallDialEmergencyCall:
+		return DialEmergencyCall(aTsyReqHandle, aPackage.Des1u());
+
+	case EMobileCallDialNoFdnCheck:
+		return DialNoFdnCheck(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2u());
+	
+	case EMobileCallDialISV:
+		return DialISV(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2u());
+		
+	case EMobileCallDialCallControl:
+		return DialCallControl(aTsyReqHandle, aPackage.Des1n(), aPackage.Des2u());
+
+//
+// Multiple Completion Services with Immediate Server Repost
+// (Usually Notifications)
+//
+	case EMobileCallNotifyMobileCallStatusChange:
+		return NotifyMobileCallStatusChange(aTsyReqHandle,
+			REINTERPRET_CAST(RMobileCall::TMobileCallStatus*, dataPtr));
+
+	case EMobileCallNotifyMobileCallCapsChange:
+		return NotifyMobileCallCapsChange(aTsyReqHandle, aPackage.Des1n());
+
+	case EMobileCallNotifyCallEvent:
+		return NotifyCallEvent(aTsyReqHandle,
+			REINTERPRET_CAST(RMobileCall::TMobileCallEvent*, dataPtr));
+
+	case EMobileCallNotifyRemotePartyInfoChange:
+		return NotifyRemotePartyInfoChange(aTsyReqHandle, aPackage.Des1n());
+
+	case EMobileCallNotifyMobileDataCallCapsChange:
+		return NotifyMobileDataCallCapsChange(aTsyReqHandle, aPackage.Des1n());
+
+	case EMobileCallNotifyHscsdInfoChange:
+		return NotifyHscsdInfoChange(aTsyReqHandle, aPackage.Des1n());
+
+	case EMobileCallNotifyVoiceFallback:
+		return NotifyVoiceFallback(aTsyReqHandle, aPackage.Des1u());
+
+	case EMobileCallNotifyAlternatingCallSwitch:
+		return NotifyAlternatingCallSwitch(aTsyReqHandle);
+
+	case EMobileCallNotifyUUSCapsChange:
+		return NotifyUUSCapsChange(aTsyReqHandle,
+			REINTERPRET_CAST(TUint32*, dataPtr));
+			
+	case EMobileCallNotifyAudioToneEvent:
+		return NotifyAudioToneEvent(aTsyReqHandle, aPackage.Des1n());
+//
+// Cancels
+//
+	case EMobileCallNotifyMobileCallStatusChangeCancel:
+		return NotifyMobileCallStatusChangeCancel(aTsyReqHandle);
+	case EMobileCallHoldCancel:
+		return HoldCancel(aTsyReqHandle);
+	case EMobileCallGetMobileCallInfoCancel:
+		return GetMobileCallInfoCancel(aTsyReqHandle);
+	case EMobileCallResumeCancel:
+		return ResumeCancel(aTsyReqHandle);
+	case EMobileCallSwapCancel:
+		return SwapCancel(aTsyReqHandle);
+	case EMobileCallNotifyMobileCallCapsChangeCancel:
+		return NotifyMobileCallCapsChangeCancel(aTsyReqHandle);
+	case EMobileCallNotifyCallEventCancel:
+		return NotifyCallEventCancel(aTsyReqHandle);
+	case EMobileCallDialEmergencyCallCancel:
+		return DialEmergencyCallCancel(aTsyReqHandle);
+	case EMobileCallNotifyRemotePartyInfoChangeCancel:
+		return NotifyRemotePartyInfoChangeCancel(aTsyReqHandle);
+	case EMobileCallNotifyVoiceFallbackCancel:
+		return NotifyVoiceFallbackCancel(aTsyReqHandle);
+	case EMobileCallNotifyUUSCapsChangeCancel:
+		return NotifyUUSCapsChangeCancel(aTsyReqHandle);
+	case EMobileCallDialNoFdnCheckCancel:
+		return DialNoFdnCheckCancel(aTsyReqHandle);
+	case EMobileCallDialCallControlCancel:
+		return DialCallControlCancel(aTsyReqHandle);
+	case EMobileCallNotifyAudioToneEventCancel:
+		return NotifyAudioToneEventCancel(aTsyReqHandle);
+	case EMobileCallDialISVCancel:
+		return DialISVCancel(aTsyReqHandle);
+	case EMobileCallAnswerISVCancel:
+		return AnswerIncomingCallISVCancel(aTsyReqHandle);
+	default:
+		return KErrNotSupported;
+		}
+	}
+
+TInt CCallDMmTsy::CancelService(const TInt aIpc, const TTsyReqHandle aTsyReqHandle)
+	{
+	// CancelService is called by the server when it is "cleaning-up" any still outstanding
+	// asynchronous requests before closing a client's sub-session.
+	// This will happen if a client closes its R-class handle without cancelling outstanding
+	// asynchronous requests.
+
+	switch (aIpc)
+		{
+	case EMobileCallNotifyMobileCallStatusChange:
+		return NotifyMobileCallStatusChangeCancel(aTsyReqHandle);
+	case EMobileCallHold:
+		return HoldCancel(aTsyReqHandle);
+	case EMobileCallGetMobileCallInfo:
+		return GetMobileCallInfoCancel(aTsyReqHandle);
+	case EMobileCallResume:
+		return ResumeCancel(aTsyReqHandle);
+	case EMobileCallSwap:
+		return SwapCancel(aTsyReqHandle);
+	case EMobileCallNotifyMobileCallCapsChange:
+		return NotifyMobileCallCapsChangeCancel(aTsyReqHandle);
+	case EMobileCallNotifyCallEvent:
+		return NotifyCallEventCancel(aTsyReqHandle);
+	case EMobileCallDialEmergencyCall:
+		return DialEmergencyCallCancel(aTsyReqHandle);
+	case EMobileCallNotifyRemotePartyInfoChange:
+		return NotifyRemotePartyInfoChangeCancel(aTsyReqHandle);
+	case EMobileCallNotifyMobileDataCallCapsChange:
+		return NotifyMobileDataCallCapsChangeCancel(aTsyReqHandle);
+	case EMobileCallGetMobileDataCallRLPRange:
+		return GetMobileDataCallRLPRangeCancel(aTsyReqHandle);
+	case EMobileCallSetDynamicHscsdParams:
+		return SetDynamicHscsdParamsCancel(aTsyReqHandle);
+	case EMobileCallNotifyHscsdInfoChange:
+		return NotifyHscsdInfoChangeCancel(aTsyReqHandle);
+	case EMobileCallNotifyVoiceFallback:
+		return NotifyVoiceFallbackCancel(aTsyReqHandle);
+	case EMobileCallNotifyAlternatingCallSwitch:
+		return NotifyAlternatingCallSwitchCancel(aTsyReqHandle);
+	case EMobileCallDeflect:
+		return DeflectCancel(aTsyReqHandle);
+	case EMobileCallTransfer:
+		return TransferCancel(aTsyReqHandle);
+	case EMobileCallGoOneToOne:
+		return GoOneToOneCancel(aTsyReqHandle);
+	case EMobileCallSwitchAlternatingCall:
+		return SwitchAlternatingCallCancel(aTsyReqHandle);
+	case EMobileCallActivateCCBS:
+		return ActivateCCBSCancel(aTsyReqHandle);
+	case EMobileCallNotifyPrivacyConfirmation:
+		return NotifyPrivacyConfirmationCancel(aTsyReqHandle);
+	case EMobileCallNotifyTrafficChannelConfirmation:
+		return NotifyTrafficChannelConfirmationCancel(aTsyReqHandle);
+	case EMobileCallNotifyUUSCapsChange:
+		return NotifyUUSCapsChangeCancel(aTsyReqHandle);
+	case EMobileCallActivateUUS:
+		return ActivateUUSCancel(aTsyReqHandle);
+	case EMobileCallSendUUI:
+		return SendUUICancel(aTsyReqHandle);
+	case EMobileCallReceiveUUI:
+		return ReceiveUUICancel(aTsyReqHandle);
+	case EMobileCallHangupWithUUI:
+		return HangupWithUUICancel(aTsyReqHandle);
+	case EMobileCallAnswerWithUUI:
+		return AnswerIncomingCallWithUUICancel(aTsyReqHandle);
+	case EMobileCallDialNoFdnCheck:
+		return DialNoFdnCheckCancel(aTsyReqHandle);
+	case EMobileCallDialCallControl:
+		return DialCallControlCancel(aTsyReqHandle);
+	case EMobileCallAnswerMultimediaCallAsVoice:
+		return AnswerMultimediaCallAsVoiceCancel(aTsyReqHandle);
+	case EMobileCallNotifyAudioToneEvent:
+		return NotifyAudioToneEventCancel(aTsyReqHandle);
+	case EMobileCallDialISV:
+		return DialISVCancel(aTsyReqHandle);
+    case EMobileCallAnswerISV:
+		return AnswerIncomingCallISVCancel(aTsyReqHandle);
+	default:
+		return CCallBase::CancelService(aIpc,aTsyReqHandle);
+		}
+	}
+
+/***********************************************************************************/
+//
+// The following methods are called from ExtFunc and/or CancelService.
+// Each of these will process a TSY request or cancel a TSY request
+// Here, example values are returned or checked within this dummy TSY in order to ensure
+// that the integrity of the data passed to/from client is maintained
+//
+/***********************************************************************************/
+
+
+TInt CCallDMmTsy::GetMobileDataCallCaps(const TTsyReqHandle aTsyReqHandle, TDes8* aCaps)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::GetMobileDataCallCaps called"));
+	InitialiseDataCallCaps(aCaps);
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyMobileDataCallCapsChange(const TTsyReqHandle aTsyReqHandle, TDes8* aCaps)
+	{
+	if (!iNotifyMobileDataCallCapsChange++)
+		{
+		LOGTEXT(_L8("CCallDMmTsy::NotifyMobileDataCallCapsChange called"));
+		InitialiseDataCallCaps(aCaps);
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyMobileDataCallCapsChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyMobileDataCallCapsChangeCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+void CCallDMmTsy::InitialiseDataCallCaps(TDes8* aCallCaps)
+	{
+	RMobileCall::TMobileCallDataCapsV1Pckg* callCapsV1Pckg = REINTERPRET_CAST(RMobileCall::TMobileCallDataCapsV1Pckg*,aCallCaps);
+	RMobileCall::TMobileCallDataCapsV1& callCapsV1 = (*callCapsV1Pckg)();
+	
+	callCapsV1.iSpeedCaps = DMMTSY_CALL_DATA_CAPS_SPEED;
+	callCapsV1.iProtocolCaps = DMMTSY_CALL_DATA_CAPS_CARRIER;
+	callCapsV1.iServiceCaps = DMMTSY_CALL_DATA_CAPS_SERVICE;
+	callCapsV1.iHscsdSupport = DMMTSY_CALL_DATA_CAPS_HSCSD;
+	callCapsV1.iMClass = DMMTSY_CALL_DATA_CAPS_MCLASS;
+	callCapsV1.iMaxRxTimeSlots = DMMTSY_CALL_DATA_CAPS_MAXRXTS;
+	callCapsV1.iMaxTxTimeSlots = DMMTSY_CALL_DATA_CAPS_MAXTXTS;
+	callCapsV1.iTotalRxTxTimeSlots = DMMTSY_CALL_DATA_CAPS_TOTRXTXTS;
+	callCapsV1.iCodingCaps = DMMTSY_CALL_DATA_CAPS_CODING;
+	callCapsV1.iAsymmetryCaps = DMMTSY_CALL_DATA_CAPS_ASYMETRY;
+	callCapsV1.iUserInitUpgrade = DMMTSY_CALL_DATA_CAPS_USERIMI;
+	}
+
+TInt CCallDMmTsy::GetMobileDataCallRLPRange(const TTsyReqHandle aTsyReqHandle, TInt* aRLPVersion, TDes8* aRLPRange)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::GetMobileDataCallRLPRange called"));
+
+	RMobileCall::TMobileDataRLPRangesV1Pckg* rlpRangeV1Pckg = REINTERPRET_CAST(RMobileCall::TMobileDataRLPRangesV1Pckg*, aRLPRange);
+	RMobileCall::TMobileDataRLPRangesV1& rlpRangeV1 = (*rlpRangeV1Pckg)();
+
+	if(*aRLPVersion == DMMTSY_CALL_RLP_VERSION1)
+		{
+		rlpRangeV1.iIWSMax = DMMTSY_CALL_DATA_RLP_WSMAX;
+		rlpRangeV1.iIWSMin = DMMTSY_CALL_DATA_RLP_WSMIN;
+		rlpRangeV1.iMWSMax = DMMTSY_CALL_DATA_RLP_MWSMAX;
+		rlpRangeV1.iMWSMin = DMMTSY_CALL_DATA_RLP_MWSMIN;
+		rlpRangeV1.iN2Max = DMMTSY_CALL_DATA_RLP_N2MAX;
+		rlpRangeV1.iN2Min = DMMTSY_CALL_DATA_RLP_N2MIN;
+		rlpRangeV1.iT1Max = DMMTSY_CALL_DATA_RLP_T1MAX;
+		rlpRangeV1.iT1Min = DMMTSY_CALL_DATA_RLP_T1MIN;
+		rlpRangeV1.iT4Max = DMMTSY_CALL_DATA_RLP_T4MAX;
+		rlpRangeV1.iT4Min = DMMTSY_CALL_DATA_RLP_T4MIN;
+
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+	
+TInt CCallDMmTsy::GetMobileDataCallRLPRangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::GetMobileDataCallRLPRangeCancel called"));
+
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::SetDynamicHscsdParams(const TTsyReqHandle aTsyReqHandle, TInt* aAiur, TInt* aRxTimeslots)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::SetHscsdParams called"));
+
+	if ((*aAiur != DMMTSY_CALL_HCSD_AIUR) ||
+		(*aRxTimeslots != DMMTSY_CALL_HCSD_TS))
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::SetDynamicHscsdParamsCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::SetHscsdParamsCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::GetCurrentHscsdInfo(const TTsyReqHandle aTsyReqHandle, TDes8* aHSCSDInfo)
+	{
+	RMobileCall::TMobileCallHscsdInfoV1Pckg* HSCSDInfoPckg = REINTERPRET_CAST(RMobileCall::TMobileCallHscsdInfoV1Pckg*,aHSCSDInfo);
+	RMobileCall::TMobileCallHscsdInfoV1& hscsdInfo = (*HSCSDInfoPckg)();
+	LOGTEXT(_L8("CCallDMmTsy::GetCurrentHscsdInfo called"));
+	InitialiseHscsdInfo(hscsdInfo);
+	
+	if ((hscsdInfo.ExtensionId() == KEtelExtMultimodeV7) ||
+		(hscsdInfo.ExtensionId() == KEtelExtMultimodeV8))
+		{
+		RMobileCall::TMobileCallHscsdInfoV7Pckg* HSCSDInfoV7Pckg = REINTERPRET_CAST(RMobileCall::TMobileCallHscsdInfoV7Pckg*,aHSCSDInfo);
+		RMobileCall::TMobileCallHscsdInfoV7& hscsdInfoV7 = (*HSCSDInfoV7Pckg)();
+		
+		hscsdInfoV7.iCallParamOrigin           = DMMTSY_CALL_PARAM_ORIGIN;
+		hscsdInfoV7.iIconId.iQualifier         = DMMTSY_CALL_ICON_ID_QUALIFIER;
+		hscsdInfoV7.iIconId.iIdentifier        = DMMTSY_CALL_ICON_ID_IDENTIFIER;
+		hscsdInfoV7.iAlphaId                   = DMMTSY_CALL_ALPHA_ID;
+		hscsdInfoV7.iParamsCallControlModified = DMMTSY_CALL_PARAMS_CALL_CONTROL_MODIFIED;
+		}
+	if (hscsdInfo.ExtensionId() == KEtelExtMultimodeV8)
+		{
+		RMobileCall::TMobileCallHscsdInfoV8Pckg* HSCSDInfoV8Pckg = REINTERPRET_CAST(RMobileCall::TMobileCallHscsdInfoV8Pckg*,aHSCSDInfo);
+		RMobileCall::TMobileCallHscsdInfoV8& hscsdInfoV8 = (*HSCSDInfoV8Pckg)();
+		
+		hscsdInfoV8.iSubAddress        = DMMTSY_CALL_SUBADDRESS;
+		hscsdInfoV8.iBearerCap1        = DMMTSY_CALL_BEARER_CAP1;
+		hscsdInfoV8.iBearerCap2        = DMMTSY_CALL_BEARER_CAP2;
+		hscsdInfoV8.iBCRepeatIndicator = DMMTSY_CALL_BC_REPEAT_INDICATOR;
+		}
+
+
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyHscsdInfoChange(const TTsyReqHandle aTsyReqHandle, TDes8* aHSCSDInfo)
+	{
+	if (!iNotifyHscsdInfoChange++)
+		{
+		RMobileCall::TMobileCallHscsdInfoV1Pckg* HSCSDInfoPckg = REINTERPRET_CAST(RMobileCall::TMobileCallHscsdInfoV1Pckg*,aHSCSDInfo);
+		RMobileCall::TMobileCallHscsdInfoV1& HSCSDInfo = (*HSCSDInfoPckg)();
+
+		LOGTEXT(_L8("CCallDMmTsy::NotifyHscsdInfoChange called"));
+		InitialiseHscsdInfo(HSCSDInfo);
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyHscsdInfoChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyHscsdInfoChangeCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+void CCallDMmTsy::InitialiseHscsdInfo(RMobileCall::TMobileCallHscsdInfoV1& aHSCSDInfo)
+	{
+	aHSCSDInfo.iAiur = DMMTSY_CALL_HCSD_AIUR;
+	aHSCSDInfo.iRxTimeSlots = DMMTSY_CALL_HCSD_TS;
+	aHSCSDInfo.iTxTimeSlots = DMMTSY_CALL_HCSD_TS;
+	aHSCSDInfo.iCodings = DMMTSY_CALL_HCSD_CODING;
+	}
+
+TInt CCallDMmTsy::NotifyVoiceFallback(const TTsyReqHandle aTsyReqHandle, TDes* aCallName)
+	{
+	if (!iNotifyVoiceFallback++)
+		{
+		LOGTEXT(_L8("CCallDMmTsy::NotifyVoiceFallback Called"));
+		*aCallName = DMMTSY_VOICE_FALLBACK_CALL_NAME;
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyVoiceFallbackCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyVoiceFallbackCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::SwitchAlternatingCall(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::SwitchAlternatingCall called"));
+	iPhone->AddDelayedReq(aTsyReqHandle,this);
+	return KErrNone;	
+	}
+
+TInt CCallDMmTsy::SwitchAlternatingCallCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::SwitchAlternatingCallCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyAlternatingCallSwitch(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (!iNotifyAlternatingCallSwitch++)
+		{
+		LOGTEXT(_L8("CCallDMmTsy::NotifyAlternatingCallSwitch called"));
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyAlternatingCallSwitchCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyAlternatingCallSwitchCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+
+
+TInt CCallDMmTsy::GetMobileCallCaps(const TTsyReqHandle aTsyReqHandle, TDes8* aCaps)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::GetMobileCallCaps called"));
+	RMobileCall::TMobileCallCapsV1Pckg *capsPckg = REINTERPRET_CAST(RMobileCall::TMobileCallCapsV1Pckg *,aCaps);
+	RMobileCall::TMobileCallCapsV1& caps = (*capsPckg)();
+	caps.iCallControlCaps=DMMTSY_CALL_CONTROL_CAPS1;
+	caps.iCallEventCaps=DMMTSY_CALL_EVENT_CAPS1;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyMobileCallCapsChange(const TTsyReqHandle aTsyReqHandle, TDes8* aCaps)
+	{
+	if(!iNotifyMobileCallCapsChange++)
+		{
+		LOGTEXT(_L8("CCallDMmTsy::NotifyMobileCallCapsChange called"));
+		RMobileCall::TMobileCallCapsV1Pckg *capsPckg = REINTERPRET_CAST(RMobileCall::TMobileCallCapsV1Pckg *,aCaps);
+		RMobileCall::TMobileCallCapsV1& caps = (*capsPckg)();
+		caps.iCallControlCaps=DMMTSY_CALL_CONTROL_CAPS2;
+		caps.iCallEventCaps=DMMTSY_CALL_EVENT_CAPS2;
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyMobileCallCapsChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyMobileCallCapsChangeCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+	
+TInt CCallDMmTsy::GetMobileCallStatus(const TTsyReqHandle aTsyReqHandle,RMobileCall::TMobileCallStatus* aStatus)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::GetMobileCallStatus called"));
+	*aStatus=DMMTSY_CALL_STATUS1;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyMobileCallStatusChange(const TTsyReqHandle aTsyReqHandle,RMobileCall::TMobileCallStatus* aStatus)
+	{
+	if (iNotifyMobileCallStatusChange<DMMTSY_NUMBER_OF_SLOTS_STATUS)
+		{
+		LOGTEXT(_L8("CCallDMmTsy::NotifyMobileCallStatusChange called"));
+		switch(iNotifyMobileCallStatusChange)
+			{
+		case 0:
+			*aStatus=DMMTSY_CALL_STATUS2;
+			break;
+		case 1:
+			*aStatus=DMMTSY_CALL_STATUS3;
+			break;
+		case 2:
+			*aStatus=DMMTSY_CALL_STATUS4;
+			break;
+		default:
+			break;
+			}
+		iNotifyMobileCallStatusChange++;
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyMobileCallStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyMobileCallStatusChangeCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::Hold(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::Hold called"));
+	iPhone->AddDelayedReq(aTsyReqHandle,this);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::HoldCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::HoldCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::Resume(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::Resume called"));
+	iPhone->AddDelayedReq(aTsyReqHandle,this);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::ResumeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::ResumeCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::Swap(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::Swap called"));
+	iPhone->AddDelayedReq(aTsyReqHandle,this);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::SwapCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::SwapCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::Deflect(const TTsyReqHandle aTsyReqHandle, RMobileCall::TMobileCallDeflect* aDeflectType, RMobilePhone::TMobileAddress* aDestination)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::Deflect called"));
+
+	if ((*aDeflectType != DMMTSY_CALL_DEFLECT_TYPE) ||
+		(aDestination->iNumberPlan != DMMTSY_PHONE_NPI) || 
+	    (aDestination->iTypeOfNumber != DMMTSY_PHONE_TON) ||
+		(aDestination->iTelNumber.Compare(DMMTSY_PHONE_TEL_NUMBER) != 0))
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::DeflectCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::DeflectCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::Transfer(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::Transfer called"));
+	iPhone->AddDelayedReq(aTsyReqHandle,this);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::TransferCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::TransferCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::GoOneToOne(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::GoOneToOne called"));
+	iPhone->AddDelayedReq(aTsyReqHandle,this);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::GoOneToOneCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::GoOneToOneCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyCallEvent(const TTsyReqHandle aTsyReqHandle, RMobileCall::TMobileCallEvent* aEvent)
+	{
+	if(!iNotifyCallEvent++)
+		{
+		LOGTEXT(_L8("CCallDMmTsy::NotifyCallEvent called"));
+		*aEvent=DMMTSY_CALL_EVENT1;
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyCallEventCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyCallEventCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::SetPrivacySetting(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TMobilePhonePrivacy* aPrivacySetting)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::Set Privacy called"));
+	if (*aPrivacySetting != DMMTSY_CALL_SET_PRIVACY)
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else
+		ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyPrivacyConfirmation(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TMobilePhonePrivacy* aPrivacySetting)
+	{
+	if(!iNotifyPrivacyConfirmation++)
+		{
+		LOGTEXT(_L8("CCallDMmTsy::Notify Privacy Confirmation Change"));
+		*aPrivacySetting = DMMTSY_CALL_SET_PRIVACY;
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyPrivacyConfirmationCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::Notify Privacy Confirmation Cancel"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::SetTrafficChannel(const TTsyReqHandle aTsyReqHandle, RMobileCall::TMobileCallTch* aTchRequest)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::Set Traffic Channel called"));
+	if (*aTchRequest != DMMTSY_CALL_TCH_REQUEST)
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else
+		ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyTrafficChannelConfirmation(const TTsyReqHandle aTsyReqHandle, RMobileCall::TMobileCallTch* aTchType)
+	{
+	if (!iNotifyTrafficChannelConfirmation++)
+		{
+		LOGTEXT(_L8("CCallDMmTsy::Notify Traffic Channel Confirmation"));
+		*aTchType = DMMTSY_CALL_TCH_SETTING;
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyTrafficChannelConfirmationCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::Notify Traffic Channel Confirmation Cancel"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::GetMobileCallInfo(const TTsyReqHandle aTsyReqHandle, TDes8* aInfo)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::GetMobileCallInfo called"));
+	RMobileCall::TMobileCallInfoV1Pckg* infoV1Pckg = (RMobileCall::TMobileCallInfoV1Pckg*)aInfo;
+	RMobileCall::TMobileCallInfoV1& infoV1 = (*infoV1Pckg)();
+
+	infoV1.iCallName=DMMTSY_CALL_NAME1;
+	infoV1.iLineName=DMMTSY_LINE_VOICE_NAME;
+	infoV1.iStatus=DMMTSY_CALL_STATUS4;
+	infoV1.iDuration=DMMTSY_CALL_DURATION1;
+	infoV1.iCallId=DMMTSY_CALL_ID1;
+	infoV1.iRemoteParty.iRemoteIdStatus=DMMTSY_CALL_REMOTEPARTYSTATUS1;
+	infoV1.iRemoteParty.iRemoteNumber.iTelNumber=DMMTSY_CALL_REMOTEPARTYNUMBER1;
+	infoV1.iRemoteParty.iDirection=DMMTSY_CALL_REMOTEPARTYDIRECTION1;
+	infoV1.iRemoteParty.iCallingName=DMMTSY_CALL_REMOTEPARTYNAME;
+	infoV1.iExitCode=DMMTSY_CALL_EXIT_CODE;
+	infoV1.iEmergency=DMMTSY_CALL_EMERGENCY_FLAG;
+	infoV1.iForwarded=DMMTSY_CALL_FORWARDED_FLAG;
+	infoV1.iService = DMMTSY_CALL_SERVICE;
+	infoV1.iValid = DMMTSY_CALL_VALID_FLAG;
+	infoV1.iPrivacy = DMMTSY_CALL_PRIVACY;
+	infoV1.iTch = DMMTSY_CALL_CHANNEL;
+	infoV1.iAlternatingCall = DMMTSY_CALL_ALTERNATING;
+	infoV1.iStartTime.Set(DMMTSY_PHONE_NWTINFO_YEAR,DMMTSY_PHONE_NWTINFO_MONTH,DMMTSY_PHONE_NWTINFO_DAY,
+		DMMTSY_PHONE_NWTINFO_HOUR, DMMTSY_PHONE_NWTINFO_MINUTE, DMMTSY_PHONE_NWTINFO_SECOND,
+		DMMTSY_PHONE_NWTINFO_MICRO);
+		
+	if (infoV1.ExtensionId() == KETelExtMultimodeV3 ||
+	   (infoV1.ExtensionId() == KETelExtMultimodeV4))
+		{
+		RMobileCall::TMobileCallInfoV3Pckg* infoV3Pckg = (RMobileCall::TMobileCallInfoV3Pckg*)aInfo;
+		RMobileCall::TMobileCallInfoV3& infoV3 = (*infoV3Pckg)();
+		infoV3.iSecurity = DMMTSY_CALL_SECURITY;
+		}
+
+	if (infoV1.ExtensionId() == KEtelExtMultimodeV7)
+		{
+		RMobileCall::TMobileCallInfoV7Pckg* infoV7Pckg = (RMobileCall::TMobileCallInfoV7Pckg*)aInfo;
+		RMobileCall::TMobileCallInfoV7& infoV7 = (*infoV7Pckg)();
+		infoV7.iSecurity = DMMTSY_CALL_SECURITY;
+		infoV7.iCallParamOrigin = DMMTSY_CALL_ORIGIN;
+		infoV7.iIconId.iQualifier  = DMMTSY_CALL_ICON_ID_QUALIFIER;
+		infoV7.iIconId.iIdentifier  = DMMTSY_CALL_ICON_ID_IDENTIFIER;	
+		infoV7.iAlphaId = DMMTSY_CALL_ALPHA_ID;
+		infoV7.iParamsCallControlModified = DMMTSY_CALL_PARAMS_CALL_CONTROL_MODIFIED;
+		}
+	if (infoV1.ExtensionId() == KEtelExtMultimodeV8)
+		{
+		RMobileCall::TMobileCallInfoV8Pckg* infoV8Pckg = (RMobileCall::TMobileCallInfoV8Pckg*)aInfo;
+		RMobileCall::TMobileCallInfoV8& infoV8 = (*infoV8Pckg)();
+		infoV8.iSecurity = DMMTSY_CALL_SECURITY;
+		infoV8.iCallParamOrigin = DMMTSY_CALL_ORIGIN;
+		infoV8.iIconId.iQualifier  = DMMTSY_CALL_ICON_ID_QUALIFIER;
+		infoV8.iIconId.iIdentifier  = DMMTSY_CALL_ICON_ID_IDENTIFIER;	
+		infoV8.iAlphaId = DMMTSY_CALL_ALPHA_ID;
+		infoV8.iParamsCallControlModified = DMMTSY_CALL_PARAMS_CALL_CONTROL_MODIFIED;
+		infoV8.iSubAddress = DMMTSY_CALL_SUBADDRESS;
+		infoV8.iBearerCap1 = DMMTSY_CALL_BEARER_CAP1;
+		infoV8.iBearerCap2 = DMMTSY_CALL_BEARER_CAP2;
+		infoV8.iBCRepeatIndicator = DMMTSY_CALL_BC_REPEAT_INDICATOR;
+		}
+
+	iPhone->AddDelayedReq(aTsyReqHandle,this);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::GetMobileCallInfoCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::GetMobileCallInfoCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyRemotePartyInfoChange(const TTsyReqHandle aTsyReqHandle, TDes8* aRemotePartyInfo)
+	{
+	if (!iNotifyRemotePartyInfoChange++)
+		{
+		LOGTEXT(_L8("CCallDMmTsy::NotifyRemotePartyInfoChange called"));
+		RMobileCall::TMobileCallRemotePartyInfoV1Pckg* infoV1Pckg = (RMobileCall::TMobileCallRemotePartyInfoV1Pckg*)aRemotePartyInfo;
+		RMobileCall::TMobileCallRemotePartyInfoV1& infoV1 = (*infoV1Pckg)();
+
+		infoV1.iRemoteIdStatus=DMMTSY_CALL_REMOTEPARTYSTATUS2;
+		infoV1.iRemoteNumber.iTelNumber=DMMTSY_CALL_EMPTY_STRING;
+		infoV1.iDirection=DMMTSY_CALL_REMOTEPARTYDIRECTION2;
+		infoV1.iCallingName=DMMTSY_CALL_EMPTY_STRING;
+
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyRemotePartyInfoChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyRemotePartyInfoChangeCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::DialNoFdnCheck(const TTsyReqHandle aTsyReqHandle, TDesC8* aCallParams, TDesC* aNumber)
+	/**
+	* This method dials the number specified by aNumber. The number used for dialling  
+	* is not checked against those in the Fixed Dialling Number list even if the FDN service is enabled
+	*
+	* @param aCallParams Supplies the call parameters for the dial request
+	* @param aNumber Supplies the number to dial
+	*/
+
+	{
+	LOGTEXT(_L8("CCallDMmTsy::DialNoFdnCheck called"));
+
+	TInt error = ValidateCallParams(aCallParams);
+
+	if((error != KErrNone) || (aNumber->Compare(DMMTSY_PHONE_TEL_NUMBER) != 0))
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else		
+		{
+		LOGTEXT(_L8("CCallDMmTsy::DialNoFdnCheck CallParams and DialNumber validated"));
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+	}
+
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::DialNoFdnCheckCancel(const TTsyReqHandle aTsyReqHandle)
+	/**
+	* This method cancels the dialling of the number specified by aNumber. The number used for dialling  
+	* is not checked against those in the Fixed Dialling Number list even if the FDN service is enabled
+	*/
+	{
+	LOGTEXT(_L8("CCallDMmTsy::DialNoFdnCheckCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::DialCallControl(const TTsyReqHandle aTsyReqHandle, TDesC8* aCallParams, TDesC* aNumber)
+/**
+ * This method dials the number specified by aNumber. Dialling via
+ * this function allows the TSY to know that the dial request is
+ * the result of call control.
+ *
+ * @param aCallParams Supplies the call parameters for the dial request
+ * @param aNumber Supplies the number to dial
+ */
+
+	{
+	LOGTEXT(_L8("CCallDMmTsy::DialCallControl called"));
+
+	TInt error = ValidateCallParams(aCallParams); // Check V1 params
+
+	// TODO need to validate the other params
+	
+	if((error != KErrNone) || (aNumber->Compare(DMMTSY_PHONE_TEL_NUMBER) != 0))
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else		
+		{
+		LOGTEXT(_L8("CCallDMmTsy::DialCallControl CallParams and DialNumber validated"));
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::DialCallControlCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * This method cancels the dialling of the number specified by aNumber. 
+ */
+	{
+	LOGTEXT(_L8("CCallDMmTsy::DialCallControlCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::DialEmergencyCall(const TTsyReqHandle aTsyReqHandle, TDesC* aNumber)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::DialEmergencyCall called"));
+	if(aNumber->Compare(DMMTSY_EN_STORE_AMBULANCE_NUM) != 0)
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else
+		ReqCompleted(aTsyReqHandle,KErrNone);
+
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::DialEmergencyCallCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::DialEmergencyCallCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::DialISV(const TTsyReqHandle aTsyReqHandle, TDesC8* aCallParams, TDesC* aNumber)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::DialISV called"));
+
+	TInt error = KErrNone;
+ 
+	if(aCallParams)
+		{  
+		
+		RMobileCall::TEtel3rdPartyMobileCallParamsV1Pckg* callparamsPckg=
+				reinterpret_cast<RMobileCall::TEtel3rdPartyMobileCallParamsV1Pckg*>(const_cast<TDesC8*>(aCallParams));
+ 		RMobileCall::TEtel3rdPartyMobileCallParamsV1& callparams=(*callparamsPckg)();
+	
+		// check that the request is a 3rd party request
+		if(callparams.ExtensionId() == RMobileCall::KETel3rdPartyCallParamsV1)	
+	  		{
+			LOGTEXT(_L8("CCallDMmTsy::DIALISV,  request from 3rd party."));
+			
+			//Validate parameters
+			if ((aNumber->Compare(DMMTSY_PHONE_TEL_NUMBER)!=KErrNone) ||
+				(callparams.iIdRestrict != DMMTSY_CALL_CLI_RESTRICT_SETTING1) ||
+				(callparams.iAutoRedial != DMMTSY_CALL_AUTO_REDIAL_FLAG))
+				{
+			 	error=KErrCorrupt;	
+				}
+			}			
+		else 
+			{
+			LOGTEXT(_L8("CCallDMmTsy::DIALISV, request from non-3rd party."));
+			error = KErrAccessDenied;
+			}
+		}
+		
+	 else
+		{	// No call parms data
+			error = KErrCorrupt;
+		} 
+		 
+
+	if (error != KErrNone)
+		ReqCompleted(aTsyReqHandle,error);
+	else
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+
+	return KErrNone;
+ 
+	}
+
+TInt CCallDMmTsy::DialISVCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::DialISVCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+	
+		
+
+TInt CCallDMmTsy::ActivateCCBS(const TTsyReqHandle aTsyReqHandle, TInt* aIndex)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::ActivateCCBS called"));
+	*aIndex=DMMTSY_PHONE_CCC_INDEX1;
+	iPhone->AddDelayedReq(aTsyReqHandle,this);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::ActivateCCBSCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::ActivateCCBSCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::RejectCCBS(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::RejectCCBS called"));
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::GetUUSCaps(const TTsyReqHandle aTsyReqHandle, TUint32* aCaps)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::GetUUSCaps called"));
+	*aCaps = DMMTSY_CALL_UUS_CAPS;
+	
+	iPhone->AddDelayedReq(aTsyReqHandle,this);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyUUSCapsChange(const TTsyReqHandle aTsyReqHandle, TUint32* aCaps)
+	{
+	if (!iNotifyUUSCapsChange++)
+		{
+		LOGTEXT(_L8("CCallDMmTsy::NotifyUUSCapsChange called"));
+		*aCaps = DMMTSY_CALL_UUS_CAPS;
+
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyUUSCapsChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyUUSCapsChangeCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::ValidateCallParams(TDesC8* aCallParams)
+	{
+	TInt error = KErrNone;
+
+	RCall::TCallParamsPckg* paramsPckgV1 = (RCall::TCallParamsPckg*)aCallParams;
+	RCall::TCallParams& paramsV1 = (*paramsPckgV1)();
+
+	iDataCallParams.iSpeakerControl = paramsV1.iSpeakerControl;
+	iDataCallParams.iSpeakerVolume = paramsV1.iSpeakerVolume;
+	iDataCallParams.iInterval = paramsV1.iInterval;
+	iDataCallParams.iWaitForDialTone = paramsV1.iWaitForDialTone;
+	iMobileCallParams.iSpeakerControl = paramsV1.iSpeakerControl;
+	iMobileCallParams.iSpeakerVolume = paramsV1.iSpeakerVolume;
+	iMobileCallParams.iInterval = paramsV1.iInterval;
+	iMobileCallParams.iWaitForDialTone = paramsV1.iWaitForDialTone;
+
+	if(paramsV1.ExtensionId()==RMobileCall::KETelMobileCallParamsV1)
+		{
+		if (iMobileCallParams.iInterval != DMMTSY_CALL_INTERVAL)
+			error=KErrCorrupt;
+
+		RMobileCall::TMobileCallParamsV1Pckg* mmParamsPckgV1 = (RMobileCall::TMobileCallParamsV1Pckg*)aCallParams;
+		RMobileCall::TMobileCallParamsV1& mmParamsV1 = (*mmParamsPckgV1)();
+
+		iMobileCallParams.iIdRestrict = mmParamsV1.iIdRestrict;
+		iMobileCallParams.iCug = mmParamsV1.iCug;
+		iMobileCallParams.iAutoRedial = mmParamsV1.iAutoRedial;
+
+		if ((iMobileCallParams.iIdRestrict != DMMTSY_CALL_CLI_RESTRICT_SETTING1) ||
+			(iMobileCallParams.iCug.iExplicitInvoke != DMMTSY_CALL_CUG_INVOKE) ||
+			(iMobileCallParams.iCug.iCugIndex != DMMTSY_CALL_CUG_INDEX) ||
+			(iMobileCallParams.iCug.iSuppressOA != DMMTSY_CALL_CUG_OA) ||
+			(iMobileCallParams.iCug.iSuppressPrefCug != DMMTSY_CALL_CUG_PREF) ||
+			(iMobileCallParams.iAutoRedial != DMMTSY_CALL_AUTO_REDIAL_FLAG))
+			
+			error=KErrCorrupt;
+		}
+	else if(paramsV1.ExtensionId()==RMobileCall::KETelMobileCallParamsV2)
+		{
+		if (iMobileCallParams.iInterval != DMMTSY_CALL_INTERVAL)
+			error=KErrCorrupt;
+
+		RMobileCall::TMobileCallParamsV2Pckg* mmParamsPckgV2 = (RMobileCall::TMobileCallParamsV2Pckg*)aCallParams;
+		RMobileCall::TMobileCallParamsV2& mmParamsV2 = (*mmParamsPckgV2)();
+
+		iMobileCallParams.iIdRestrict = mmParamsV2.iIdRestrict;
+		iMobileCallParams.iCug = mmParamsV2.iCug;
+		iMobileCallParams.iAutoRedial = mmParamsV2.iAutoRedial;
+		iMobileCallParams.iBearerMode = mmParamsV2.iBearerMode;
+
+		if ((iMobileCallParams.iIdRestrict != DMMTSY_CALL_CLI_RESTRICT_SETTING1) ||
+			(iMobileCallParams.iCug.iExplicitInvoke != DMMTSY_CALL_CUG_INVOKE) ||
+			(iMobileCallParams.iCug.iCugIndex != DMMTSY_CALL_CUG_INDEX) ||
+			(iMobileCallParams.iCug.iSuppressOA != DMMTSY_CALL_CUG_OA) ||
+			(iMobileCallParams.iCug.iSuppressPrefCug != DMMTSY_CALL_CUG_PREF) ||
+			(iMobileCallParams.iAutoRedial != DMMTSY_CALL_AUTO_REDIAL_FLAG) ||
+			(iMobileCallParams.iBearerMode != DMMTSY_CALL_NEW_BEARER))
+			{
+			error=KErrCorrupt;
+			}
+		}
+	else if (paramsV1.ExtensionId()==RMobileCall::KETelMobileCallParamsV7)
+		{
+		if (iMobileCallParams.iInterval != DMMTSY_CALL_INTERVAL)
+			error=KErrCorrupt;
+
+		RMobileCall::TMobileCallParamsV7Pckg* mmParamsPckgV7 = (RMobileCall::TMobileCallParamsV7Pckg*)aCallParams;
+		RMobileCall::TMobileCallParamsV7& mmParamsV7 = (*mmParamsPckgV7)();
+
+		iMobileCallParams.iIdRestrict = mmParamsV7.iIdRestrict;
+		iMobileCallParams.iCug = mmParamsV7.iCug;
+		iMobileCallParams.iAutoRedial = mmParamsV7.iAutoRedial;
+		iMobileCallParams.iBearerMode = mmParamsV7.iBearerMode;
+		iMobileCallParams.iCallParamOrigin = mmParamsV7.iCallParamOrigin;
+		iMobileCallParams.iSubAddress = mmParamsV7.iSubAddress;
+		iMobileCallParams.iBearerCap1 = mmParamsV7.iBearerCap1;
+		iMobileCallParams.iBearerCap2 = mmParamsV7.iBearerCap2;
+		iMobileCallParams.iBCRepeatIndicator = mmParamsV7.iBCRepeatIndicator;
+		iMobileCallParams.iIconId.iQualifier = mmParamsV7.iIconId.iQualifier;
+		iMobileCallParams.iIconId.iIdentifier = mmParamsV7.iIconId.iIdentifier;
+		iMobileCallParams.iAlphaId = mmParamsV7.iAlphaId;
+
+		if ((iMobileCallParams.iIdRestrict != DMMTSY_CALL_CLI_RESTRICT_SETTING1) ||
+			(iMobileCallParams.iCug.iExplicitInvoke != DMMTSY_CALL_CUG_INVOKE) ||
+			(iMobileCallParams.iCug.iCugIndex != DMMTSY_CALL_CUG_INDEX) ||
+			(iMobileCallParams.iCug.iSuppressOA != DMMTSY_CALL_CUG_OA) ||
+			(iMobileCallParams.iCug.iSuppressPrefCug != DMMTSY_CALL_CUG_PREF) ||
+			(iMobileCallParams.iAutoRedial != DMMTSY_CALL_AUTO_REDIAL_FLAG) ||
+			(iMobileCallParams.iBearerMode != DMMTSY_CALL_NEW_BEARER) ||
+			(iMobileCallParams.iSubAddress != DMMTSY_CALL_SUBADDRESS) ||
+			(iMobileCallParams.iBearerCap1 != DMMTSY_CALL_BEARER_CAP1) ||
+			(iMobileCallParams.iBearerCap2 != DMMTSY_CALL_BEARER_CAP2) ||
+			(iMobileCallParams.iBCRepeatIndicator != DMMTSY_CALL_BC_REPEAT_INDICATOR) ||
+			(iMobileCallParams.iIconId.iQualifier != DMMTSY_CALL_ICON_ID_QUALIFIER) ||
+			(iMobileCallParams.iIconId.iIdentifier != DMMTSY_CALL_ICON_ID_IDENTIFIER) ||
+			(iMobileCallParams.iAlphaId != DMMTSY_CALL_ALPHA_ID))
+			{
+			error=KErrCorrupt;
+			}
+		}
+	
+	if ((paramsV1.ExtensionId()==RMobileCall::KETelMobileDataCallParamsV1) ||
+		(paramsV1.ExtensionId()==RMobileCall::KETelMobileDataCallParamsV2) ||
+		(paramsV1.ExtensionId()==RMobileCall::KETelMobileDataCallParamsV8))
+		{
+		RMobileCall::TMobileDataCallParamsV1Pckg* dataParamsPckgV1 = (RMobileCall::TMobileDataCallParamsV1Pckg*)aCallParams;
+		RMobileCall::TMobileDataCallParamsV1& dataParamsV1 = (*dataParamsPckgV1)();
+
+		iDataCallParams.iService = dataParamsV1.iService;
+		iDataCallParams.iSpeed = dataParamsV1.iSpeed;
+		iDataCallParams.iProtocol = dataParamsV1.iProtocol;
+		iDataCallParams.iQoS = dataParamsV1.iQoS;
+		iDataCallParams.iRLPVersion = dataParamsV1.iRLPVersion;
+		iDataCallParams.iV42bisReq = dataParamsV1.iV42bisReq;
+ 		iDataCallParams.iUseEdge = dataParamsV1.iUseEdge;
+
+		if ((iDataCallParams.iService != DMMTSY_DATA_CALL_SERVICE) ||
+		    (iDataCallParams.iSpeed != DMMTSY_DATA_CALL_SPEED) ||
+		    (iDataCallParams.iProtocol != DMMTSY_DATA_CALL_PROTOCOL) ||
+			(iDataCallParams.iQoS != DMMTSY_DATA_CALL_QOS) || 
+			(iDataCallParams.iRLPVersion != DMMTSY_DATA_CALL_RLP) ||
+			(iDataCallParams.iV42bisReq != DMMTSY_DATA_CALL_V42BIS) ||
+ 			(iDataCallParams.iUseEdge != DMMTSY_DATA_CALL_EGPRS_REQUIRED))
+			
+			error=KErrCorrupt;
+		}
+	
+	if ((paramsV1.ExtensionId()==RMobileCall::KETelMobileDataCallParamsV2) ||
+		(paramsV1.ExtensionId()==RMobileCall::KETelMobileDataCallParamsV8))
+		{
+		RMobileCall::TMobileDataCallParamsV2Pckg* dataParamsPckgV2 = (RMobileCall::TMobileDataCallParamsV2Pckg*)aCallParams;
+		RMobileCall::TMobileDataCallParamsV2& dataParamsV2 = (*dataParamsPckgV2)();
+
+		iDataCallParams.iBearerMode = dataParamsV2.iBearerMode;
+	
+		if (iDataCallParams.iBearerMode != DMMTSY_PHONE_MULTICALLBEARERMODE_NOTSUPPORTED)
+		
+			error=KErrCorrupt;
+		}
+	if (paramsV1.ExtensionId()==RMobileCall::KETelMobileDataCallParamsV8)
+		{
+		RMobileCall::TMobileDataCallParamsV8Pckg* dataParamsPckgV8 = (RMobileCall::TMobileDataCallParamsV8Pckg*)aCallParams;
+		RMobileCall::TMobileDataCallParamsV8& dataParamsV8 = (*dataParamsPckgV8)();
+
+		iDataCallParams.iCallParamOrigin = dataParamsV8.iCallParamOrigin;
+		iDataCallParams.iSubAddress = dataParamsV8.iSubAddress;
+		iDataCallParams.iBearerCap1 = dataParamsV8.iBearerCap1;
+		iDataCallParams.iBearerCap2 = dataParamsV8.iBearerCap2;
+		iDataCallParams.iBCRepeatIndicator = dataParamsV8.iBCRepeatIndicator;
+		iDataCallParams.iIconId.iIdentifier = dataParamsV8.iIconId.iIdentifier;
+		iDataCallParams.iIconId.iQualifier = dataParamsV8.iIconId.iQualifier;
+		iDataCallParams.iAlphaId = dataParamsV8.iAlphaId;
+		
+		if ((iDataCallParams.iCallParamOrigin != DMMTSY_CALL_PARAM_ORIGIN) ||
+		    (iDataCallParams.iSubAddress != DMMTSY_CALL_SUBADDRESS) ||
+		    (iDataCallParams.iBearerCap1 != DMMTSY_CALL_BEARER_CAP1) ||
+			(iDataCallParams.iBearerCap2 != DMMTSY_CALL_BEARER_CAP2) || 
+			(iDataCallParams.iBCRepeatIndicator != DMMTSY_CALL_BC_REPEAT_INDICATOR)||
+			(iDataCallParams.iIconId.iIdentifier != DMMTSY_CALL_ICON_ID_IDENTIFIER) ||
+		    (iDataCallParams.iIconId.iQualifier != DMMTSY_CALL_ICON_ID_QUALIFIER) ||
+		    (iDataCallParams.iAlphaId != DMMTSY_CALL_ALPHA_ID))
+			
+			error=KErrCorrupt;
+		}
+
+	if ((paramsV1.ExtensionId()==RMobileCall::KETelMobileHscsdCallParamsV1) || 
+	    (paramsV1.ExtensionId()==RMobileCall::KETelMobileHscsdCallParamsV2) ||
+	    (paramsV1.ExtensionId()==RMobileCall::KETelMobileHscsdCallParamsV7) ||
+	    (paramsV1.ExtensionId()==RMobileCall::KETelMobileHscsdCallParamsV8))
+		{
+		RMobileCall::TMobileHscsdCallParamsV1Pckg* hscsdParamsPckgV1 = (RMobileCall::TMobileHscsdCallParamsV1Pckg*)aCallParams;
+		RMobileCall::TMobileHscsdCallParamsV1& hscsdParamsV1 = (*hscsdParamsPckgV1)();
+
+		iDataCallParams.iWantedAiur = hscsdParamsV1.iWantedAiur;
+		iDataCallParams.iWantedRxTimeSlots = hscsdParamsV1.iWantedRxTimeSlots;
+		iDataCallParams.iMaxTimeSlots = hscsdParamsV1.iMaxTimeSlots;
+		iDataCallParams.iCodings = hscsdParamsV1.iCodings;
+		iDataCallParams.iAsymmetry = hscsdParamsV1.iAsymmetry;
+		iDataCallParams.iUserInitUpgrade = hscsdParamsV1.iUserInitUpgrade;
+
+		if ((iDataCallParams.iWantedAiur != DMMTSY_CALL_HCSD_AIUR) ||
+		    (iDataCallParams.iWantedRxTimeSlots != DMMTSY_CALL_HCSD_TS) ||
+		    (iDataCallParams.iMaxTimeSlots != DMMTSY_CALL_HCSD_MAXTS) ||
+		    (iDataCallParams.iCodings != DMMTSY_CALL_HCSD_CODING) ||
+			(iDataCallParams.iAsymmetry != DMMTSY_CALL_HCSD_ASYMMETRY) ||
+			(iDataCallParams.iUserInitUpgrade != DMMTSY_CALL_HCSD_USER_IMI))
+
+			error=KErrCorrupt;
+		}
+	if ((paramsV1.ExtensionId()==RMobileCall::KETelMobileHscsdCallParamsV2) ||
+		(paramsV1.ExtensionId()==RMobileCall::KETelMobileHscsdCallParamsV7) ||
+		(paramsV1.ExtensionId()==RMobileCall::KETelMobileHscsdCallParamsV8))
+		{
+		RMobileCall::TMobileHscsdCallParamsV2Pckg* hscsdParamsPckgV2 = (RMobileCall::TMobileHscsdCallParamsV2Pckg*)aCallParams;
+		RMobileCall::TMobileHscsdCallParamsV2& hscsdParamsV2 = (*hscsdParamsPckgV2)();
+
+		iDataCallParams.iBearerMode = hscsdParamsV2.iBearerMode;
+		
+		if ((iDataCallParams.iBearerMode != DMMTSY_CALL_NEW_BEARER))
+
+			error=KErrCorrupt;
+		}
+	
+	if ((paramsV1.ExtensionId()==RMobileCall::KETelMobileHscsdCallParamsV7) ||
+		(paramsV1.ExtensionId()==RMobileCall::KETelMobileHscsdCallParamsV8))
+		{
+		RMobileCall::TMobileHscsdCallParamsV7Pckg* hscsdParamsPckgV7 = (RMobileCall::TMobileHscsdCallParamsV7Pckg*)aCallParams;
+		RMobileCall::TMobileHscsdCallParamsV7& hscsdParamsV7 = (*hscsdParamsPckgV7)();
+
+		iDataCallParams.iCallParamOrigin = hscsdParamsV7.iCallParamOrigin;
+		iDataCallParams.iIconId =  hscsdParamsV7.iIconId;
+		iDataCallParams.iAlphaId = hscsdParamsV7.iAlphaId;
+			
+		if ((iDataCallParams.iCallParamOrigin != DMMTSY_CALL_PARAM_ORIGIN) ||
+			(iDataCallParams.iAlphaId != DMMTSY_CALL_ALPHA_ID))
+
+			error=KErrCorrupt;
+		}
+
+	if (paramsV1.ExtensionId()==RMobileCall::KETelMobileHscsdCallParamsV8)
+		{
+		RMobileCall::TMobileHscsdCallParamsV8Pckg* hscsdParamsPckgV8 = (RMobileCall::TMobileHscsdCallParamsV8Pckg*)aCallParams;
+		RMobileCall::TMobileHscsdCallParamsV8& hscsdParamsV8 = (*hscsdParamsPckgV8)();
+		
+		iDataCallParams.iBearerMode = hscsdParamsV8.iBearerMode;
+		iDataCallParams.iCallParamOrigin = hscsdParamsV8.iCallParamOrigin;
+		iDataCallParams.iIconId.iIdentifier = hscsdParamsV8.iIconId.iIdentifier;
+		iDataCallParams.iIconId.iQualifier = hscsdParamsV8.iIconId.iQualifier;
+		iDataCallParams.iAlphaId = hscsdParamsV8.iAlphaId;
+		iDataCallParams.iSubAddress = hscsdParamsV8.iSubAddress;
+		iDataCallParams.iBearerCap1 = hscsdParamsV8.iBearerCap1;
+		iDataCallParams.iBearerCap2 = hscsdParamsV8.iBearerCap2;
+		iDataCallParams.iBCRepeatIndicator = hscsdParamsV8.iBCRepeatIndicator;
+					
+		if ((iDataCallParams.iBearerMode != DMMTSY_CALL_NEW_BEARER) ||
+			(iDataCallParams.iCallParamOrigin != DMMTSY_CALL_PARAM_ORIGIN) ||
+			(iDataCallParams.iIconId.iIdentifier != DMMTSY_CALL_ICON_ID_IDENTIFIER) ||
+			(iDataCallParams.iIconId.iQualifier != DMMTSY_CALL_ICON_ID_QUALIFIER) ||
+			(iDataCallParams.iAlphaId != DMMTSY_CALL_ALPHA_ID)||
+			(iDataCallParams.iSubAddress != DMMTSY_CALL_SUBADDRESS) ||
+			(iDataCallParams.iBearerCap1 != DMMTSY_CALL_BEARER_CAP1) ||
+			(iDataCallParams.iBearerCap2 != DMMTSY_CALL_BEARER_CAP2) || 
+			(iDataCallParams.iBCRepeatIndicator != DMMTSY_CALL_BC_REPEAT_INDICATOR))
+			{
+			error = KErrCorrupt;
+			}
+		}
+
+	return error;
+	}
+
+TInt CCallDMmTsy::ActivateUUS(const TTsyReqHandle aTsyReqHandle, TDes8* aUUIRequest)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::ActivateUUS called"));
+
+	RMobileCall::TMobileCallUUSRequestV1Pckg* uuiReqPckg = (RMobileCall::TMobileCallUUSRequestV1Pckg*)aUUIRequest;
+	RMobileCall::TMobileCallUUSRequestV1& uuiReq = (*uuiReqPckg)();
+
+	if((uuiReq.iServiceReq != DMMTSY_CALL_UUI_SERVICE_REQ) || 
+	   (uuiReq.iUUI.Compare(DMMTSY_CALL_UUI_INFO_DIAL) !=0 ))
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::ActivateUUSCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::ActivateUUSDuringCallCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::SendUUI(const TTsyReqHandle aTsyReqHandle, TBool* aMore, TDesC16* aUUI)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::SendUUI called"));
+	if( (aUUI->Compare(DMMTSY_CALL_UUI_INFO) != 0) ||
+	    (*aMore != DMMTSY_CALL_UUI_MORE_INFO) )
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::SendUUICancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::SendUUICancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::ReceiveUUI(const TTsyReqHandle aTsyReqHandle, TDes16* aUUI)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::ReceiveUUI called"));
+
+	aUUI->Copy(DMMTSY_CALL_UUI_INFO);
+		
+	iPhone->AddDelayedReq(aTsyReqHandle,this);
+
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::ReceiveUUICancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::ReceiveUUICancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::HangupWithUUI(const TTsyReqHandle aTsyReqHandle, TDesC16* aUUI)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::HangupWithUUI called"));
+
+	if(aUUI->Compare(DMMTSY_CALL_UUI_INFO_HANGUP) != 0)
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else
+		iPhone->AddDelayedReq(aTsyReqHandle, this);
+
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::HangupWithUUICancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::HangupWithUUICancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::AnswerIncomingCallWithUUI(const TTsyReqHandle aTsyReqHandle, TDesC8* aCallParams, TDesC16* aUUI)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::AnswerIncomingCallWithUUI called"));
+	
+	TInt error = ValidateCallParams(aCallParams);
+
+	if((error != KErrNone) || (aUUI->Compare(DMMTSY_CALL_UUI_INFO_ANSWER) != 0))
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::AnswerIncomingCallWithUUICancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::AnswerIncomingCallWithUUICancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+
+TInt CCallDMmTsy::AnswerMultimediaCallAsVoice(const TTsyReqHandle aTsyReqHandle, TDesC8* aCallParams, TDes16* aCallName)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::AnswerMultimediaCallAsVoice called"));
+	
+	TInt error = ValidateCallParams(aCallParams);
+	
+	*aCallName=DMMTSY_LINE_VOICE_NAME;
+	if(error != KErrNone)
+		ReqCompleted(aTsyReqHandle,KErrCorrupt);
+	else
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::AnswerMultimediaCallAsVoiceCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::AnswerMultimediaCallAsVoiceCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+	
+TInt CCallDMmTsy::AnswerIncomingCallISV(const TTsyReqHandle aTsyReqHandle, TDesC8* aCallParams)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::AnswerIncomingCallISV called"));
+ 
+ 	TInt error = KErrNone;
+ 		
+ 	if(aCallParams)
+		{  
+		
+		RMobileCall::TEtel3rdPartyMobileCallParamsV1Pckg* callparamsPckg=
+				reinterpret_cast<RMobileCall::TEtel3rdPartyMobileCallParamsV1Pckg*>(const_cast<TDesC8*>(aCallParams));
+ 		RMobileCall::TEtel3rdPartyMobileCallParamsV1& callparams=(*callparamsPckg)();
+	
+		// check that the request is a 3rd party request
+		if(callparams.ExtensionId() == RMobileCall::KETel3rdPartyCallParamsV1)	
+	  		{
+			LOGTEXT(_L8("CCallDMmTsy::ANSWERINCOMINGCALLISV,  request from 3rd party."));   
+			}
+		else 
+		   {
+		   	LOGTEXT(_L8("CCallDMmTsy::ANSWERINCOMINGCALLISV, request from non-3rd party."));
+		   	error = KErrAccessDenied;
+		   }
+		}
+		
+	 	else
+		{	// No call parms data
+			error = KErrCorrupt;
+		} 
+		 
+
+	if (error != KErrNone)
+		ReqCompleted(aTsyReqHandle,error);
+	else
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+
+	return KErrNone;
+ 
+	}
+
+TInt CCallDMmTsy::AnswerIncomingCallISVCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::AnswerIncomingCallISVCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+	
+TInt CCallDMmTsy::NotifyAudioToneEvent(const TTsyReqHandle aTsyReqHandle, TDes8* aAudioTone)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyAudioToneEventChange called"));
+	
+	RMobileCall::TAudioToneV3Pckg* audioPckgV3 = (RMobileCall::TAudioToneV3Pckg*)aAudioTone;
+	RMobileCall::TAudioToneV3& audioTone = (*audioPckgV3)();
+		
+	switch(iNotifyAudioToneEvent++)
+		{
+	case 0:
+		audioTone.iEvent = DMMTSY_AUDIO_START_TONE;
+		audioTone.iTone = DMMTSY_AUDIO_CONGESTION_TONE;
+		audioTone.iPlayedLocally = DMMTSY_AUDIO_PLAYED_LOCALLY;
+		ReqCompleted(aTsyReqHandle,KErrNone);
+		break;
+	case 1:
+		audioTone.iEvent = DMMTSY_AUDIO_STOP_TONE;
+		audioTone.iTone = DMMTSY_AUDIO_NO_TONE;
+		audioTone.iPlayedLocally = DMMTSY_AUDIO_PLAYED_LOCALLY;
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		break;
+	default:	
+		break;
+		}	
+	return KErrNone;
+	}
+
+TInt CCallDMmTsy::NotifyAudioToneEventCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CCallDMmTsy::NotifyAudioToneEventChangeCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}