telephonyserver/etelmultimode/DTsy/mmtsyline.cpp
changeset 0 3553901f7fa8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserver/etelmultimode/DTsy/mmtsyline.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,276 @@
+// 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"
+
+
+//
+// CLineDMmTsy
+//
+CLineDMmTsy* CLineDMmTsy::NewL(CPhoneDMmTsy *aPhone,CPhoneFactoryDummyBase* aFac)
+	{
+
+	CLineDMmTsy* line=new(ELeave) CLineDMmTsy(aPhone,aFac);
+	CleanupStack::PushL(line);
+	line->ConstructL();
+	CleanupStack::Pop();
+	return line;
+	}
+
+CLineDMmTsy::CLineDMmTsy(CPhoneDMmTsy *aPhone, CPhoneFactoryDummyBase* aFac)
+	:CLineDummyBase(aFac), iPhone(aPhone)
+	{}
+
+void CLineDMmTsy::ConstructL()
+	{
+	CLineDummyBase::ConstructL();
+	LOGTEXT(_L8("CLineDMmTsy created"));
+	}
+											  
+
+CLineDMmTsy::~CLineDMmTsy()
+	{
+	LOGTEXT(_L8("CLineDMmTsy destroyed"));
+	}
+
+
+CTelObject* CLineDMmTsy::OpenNewObjectByNameL(const TDesC& aName)
+	{
+	// An existing call opened by a client - client provides name of call to open
+	if((aName.Compare(DMMTSY_CALL_NAME1)==KErrNone) ||
+	   (aName.Compare(DMMTSY_CALL_NAME2)==KErrNone) ||
+	   (aName.Compare(DMMTSY_CALL_NAME3)==KErrNone))
+
+		return REINTERPRET_CAST(CTelObject*,CCallDMmTsy::NewL(iPhone,FacPtr()));
+	
+	return NULL;
+	}
+
+CTelObject* CLineDMmTsy::OpenNewObjectL(TDes& aNewName)
+	{
+	// A new call opened by a client will have its name allocated by the TSY
+	aNewName.Append(_L("Call"));
+	aNewName.AppendNum(++iCallObjectCount);
+
+	return CCallDMmTsy::NewL(iPhone,FacPtr());
+	}
+
+
+CTelObject::TReqMode CLineDMmTsy::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)
+		{
+//
+// Non-flow control requests
+//
+	case EMobileLineGetMobileLineStatus:
+		break;
+//
+// Notification Requests
+//
+	case EMobileLineNotifyMobileLineStatusChange:
+		ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+		break;
+//
+// Cancel Requests
+//	
+	case EMobileLineNotifyMobileLineStatusChangeCancel:
+		User::Leave(KErrNotSupported);
+		break;
+
+	default:
+		ret=CLineBase::ReqModeL(aIpc);
+		break;
+		}
+	return ret;
+	}
+
+
+TInt CLineDMmTsy::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 EMobileLineNotifyMobileLineStatusChange:
+		LOGTEXT(_L8("CLineDMmTsy: RegisterNotification - Line Status Change "));
+		return KErrNone;
+	default:
+		// Unknown or invalid sms IPC
+		return KErrNotSupported;
+		}
+	}
+
+TInt CLineDMmTsy::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 EMobileLineNotifyMobileLineStatusChange:
+		LOGTEXT(_L8("CLineDMmTsy: DeregisterNotification - Line Status Change"));
+		return KErrNone;
+	default:
+		// Unknown or invalid sms IPC
+		return KErrNotSupported;
+		}
+	}
+
+TInt CLineDMmTsy::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 EMobileLineNotifyMobileLineStatusChange:
+		LOGTEXT(_L8("CLineDMmTsy: Registered with 5 slots"));
+		numberOfSlots=5;
+		break;
+	default:
+		// Unknown or invalid Phone IPC
+		User::Leave(KErrNotSupported);
+		break;
+		}
+	return numberOfSlots;
+	}
+
+TInt CLineDMmTsy::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();
+
+	// The request data has to extracted from TDataPackage and the TAny* pointers have to
+	// be "cast" to the expected request data type
+	
+	switch (aIpc)
+		{
+//
+// Non-flow control requests
+//
+	case EMobileLineGetMobileLineStatus:
+		return GetMobileLineStatus(aTsyReqHandle,
+			REINTERPRET_CAST(RMobileCall::TMobileCallStatus*, dataPtr));
+
+//
+// Notification Requests
+//
+	case EMobileLineNotifyMobileLineStatusChange:
+		return NotifyMobileLineStatusChange(aTsyReqHandle, 
+			REINTERPRET_CAST(RMobileCall::TMobileCallStatus*, dataPtr));
+
+//
+// Cancel Requests
+//	
+	case EMobileLineNotifyMobileLineStatusChangeCancel:
+		return NotifyMobileLineStatusChangeCancel(aTsyReqHandle);
+
+	default:
+		return KErrNotSupported;
+		}
+	}
+
+TInt CLineDMmTsy::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)
+		{
+//
+// Cancel Requests
+//	
+	case EMobileLineNotifyMobileLineStatusChange:
+		return NotifyMobileLineStatusChangeCancel(aTsyReqHandle);
+	default:
+		return CLineBase::CancelService(aIpc,aTsyReqHandle);
+		}
+	}
+
+TInt CLineDMmTsy::GetCaps(const TTsyReqHandle aTsyReqHandle,RLine::TCaps* aCaps)
+	{
+	//set the aux voice bit
+	aCaps->iFlags |= DMMTSY_MOBILE_LINE_AUX_VOICE;
+
+	ReqCompleted(aTsyReqHandle,KErrNone);
+ 	return KErrNone;
+	}
+
+
+/***********************************************************************************/
+//
+// 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 CLineDMmTsy::GetMobileLineStatus(const TTsyReqHandle aTsyReqHandle,RMobileCall::TMobileCallStatus* aStatus)
+	{
+	LOGTEXT(_L8("CLineDMmTsy::GetMobileLineStatus called"));
+	*aStatus=DMMTSY_CALL_STATUS1;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CLineDMmTsy::NotifyMobileLineStatusChange(const TTsyReqHandle aTsyReqHandle, RMobileCall::TMobileCallStatus* aStatus)
+	{
+	if (!iNotifyMobileLineStatusChange++)
+		{
+		LOGTEXT(_L8("CLineDMmTsy::NotifyMobileLineStatusChange called"));
+		*aStatus=DMMTSY_CALL_STATUS2;
+		iPhone->AddDelayedReq(aTsyReqHandle,this);
+		}
+	return KErrNone;
+	}
+
+TInt CLineDMmTsy::NotifyMobileLineStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGTEXT(_L8("CLineDMmTsy::NotifyMobileLineStatusChangeCancel called"));
+	iPhone->RemoveDelayedReq(aTsyReqHandle);
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+