telephonyserver/etelserverandcore/DSTD/ACQUIRE.CPP
changeset 0 3553901f7fa8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserver/etelserverandcore/DSTD/ACQUIRE.CPP	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,1202 @@
+// 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 "../DSTD/DSTD.H"
+#include "../DSTD/ACQUIRE.H"
+#include "../DSTD/DACQDEF.H"
+#include <e32def.h>
+#include <f32file.h>
+
+void TsyPanic(TTsyPanic aPanic)
+//
+// Panic in tsy
+//
+	{
+	_LIT(KTsyPanic,"Tsy Panic");
+	User::Panic(KTsyPanic,aPanic);
+	}
+
+TTsyTimer::TTsyTimer()
+	{
+	iPending=EFalse;
+	}
+//
+// CAcquireEntry class
+//
+CAcquireEntry* CAcquireEntry::NewL(const TTsyReqHandle aTsyReqHandle)
+//
+//	Create new request entry
+//
+	{
+	return new(ELeave) CAcquireEntry(aTsyReqHandle);
+	}
+
+CAcquireEntry::CAcquireEntry(const TTsyReqHandle aTsyReqHandle)
+//
+//	 constructor
+//
+	{
+	iTsyReqHandle=aTsyReqHandle;
+	}
+
+CAcquireEntry::~CAcquireEntry()
+//
+//	destructor
+//
+	{}
+
+void CAcquireEntry::Deque()
+//
+//	Deque  list
+//
+	{
+	iLink.Deque();
+	iLink.iPrev=iLink.iNext=NULL;
+	}
+
+CAcquireOwnerList::CAcquireOwnerList()
+	{}
+
+CAcquireOwnerList::~CAcquireOwnerList()
+	{}
+
+CAcquireOwnerList* CAcquireOwnerList::NewL()
+//
+//	Static function to create new call
+//
+	{
+	CAcquireOwnerList* ac=new(ELeave) CAcquireOwnerList();
+	CleanupStack::PushL(ac);
+	ac->ConstructL();
+	CleanupStack::Pop();
+	return ac;
+	}
+
+void CAcquireOwnerList::ConstructL()
+	{
+	iAcquireList.SetOffset(_FOFF(CAcquireEntry,iLink));
+	}
+
+CAcquireEntry* CAcquireOwnerList::FindByTsyReqHandle(const TTsyReqHandle aTsyReqHandle)
+	{
+	CAcquireEntry* entry;
+	TDblQueIter<CAcquireEntry> iter(iAcquireList);
+	while(entry = iter++, entry!=NULL)
+		{
+		if(entry->iTsyReqHandle==aTsyReqHandle)
+			return entry;
+		}
+	return NULL;
+	}
+
+void CAcquireOwnerList::Remove(CAcquireEntry* aEntry)
+	{
+	aEntry->Deque();
+	delete aEntry;
+	}
+
+//
+// CFaxDummyBase
+//
+CFaxDummyBase::CFaxDummyBase(CPhoneFactoryDummyBase* aFac)
+	{
+	iFac=aFac;
+	}
+
+CFaxDummyBase::~CFaxDummyBase()
+	{
+	iFac->RemoveTimer(iRead);
+	iFac->RemoveTimer(iWrite);
+	iFac->RemoveTimer(iWaitForEndOfPage);
+	iFac->RemoveTimer(iProgressNotification);
+	}
+
+TInt CFaxDummyBase::RegisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::DeregisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+
+CTelObject::TReqMode CFaxDummyBase::ReqModeL(const TInt aIpc)
+//
+//	mode request for fax
+//
+	{
+	CTelObject::TReqMode ret=0;
+	switch (aIpc)
+		{
+	case EEtelFaxTerminateFaxSession:
+	case EEtelFaxWaitForEndOfPage:
+		break;
+	case EEtelFaxRead:
+	case EEtelFaxWrite:
+		ret=KReqModeFlowControlObeyed;
+		break;
+	default:
+		User::Leave(KErrNotSupported);
+		break;
+		}
+	return ret;
+	}
+
+CFaxDummyBase* CFaxDummyBase::This(TAny* aPtr)
+	{
+	return REINTERPRET_CAST(CFaxDummyBase*,aPtr);
+	}
+
+TInt CFaxDummyBase::WaitForEndOfPageHandler(TAny* aPtr)
+//
+//	Completed	req
+//
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iWaitForEndOfPage);
+	This(aPtr)->ReqCompleted(This(aPtr)->iWaitForEndOfPage.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::WaitForEndOfPage(const TTsyReqHandle aTsyReqHandle)
+	{
+	iFac->QueueTimer(iWaitForEndOfPage,aTsyReqHandle,DACQ_ASYN_TIMEOUT,CFaxDummyBase::WaitForEndOfPageHandler,this);
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::Read(const TTsyReqHandle aTsyReqHandle,TDes8* aDes)
+//
+//	Fax	read
+//
+	{
+	iReadParams=aDes;
+	iFac->QueueTimer(iRead,aTsyReqHandle,DACQ_ASYN_TIMEOUT,CFaxDummyBase::ReadHandler,this);
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::ReadHandler(TAny* aPtr)
+//
+//	Completed Request
+//
+	{
+	This(aPtr)->iReadParams->Copy(DACQ_FAX_BUF_DATA);
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iRead);
+	This(aPtr)->ReqCompleted(This(aPtr)->iRead.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::TerminateFaxSession(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (iFac->RemoveTimer(iRead))
+		ReqCompleted(iRead.iTsyReqHandle,KErrCancel);
+
+	if (iFac->RemoveTimer(iWrite))
+		ReqCompleted(iWrite.iTsyReqHandle,KErrCancel);
+
+	if (iFac->RemoveTimer(iWaitForEndOfPage))
+		ReqCompleted(iWaitForEndOfPage.iTsyReqHandle,KErrCancel);
+
+//	if (iFac->RemoveTimer(iProgressNotification))
+//		ReqCompleted(iProgressNotification.iTsyReqHandle,KErrCancel);
+
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::Write(const TTsyReqHandle aTsyReqHandle,TDesC8* aDes)
+	{
+	if (aDes->Compare(DACQ_FAX_BUF_DATA)!=KErrNone)
+		TsyPanic(KTsyPanicDataCorrupted);
+	iFac->QueueTimer(iWrite,aTsyReqHandle,DACQ_ASYN_TIMEOUT,CFaxDummyBase::WriteHandler,this);
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::WriteHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iWrite);
+	This(aPtr)->ReqCompleted(This(aPtr)->iWrite.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::GetProgress(const TTsyReqHandle aTsyReqHandle,RFax::TProgress* aProgress)
+	{
+	aProgress->iSpeed=DACQ_GET_PROGRESS_SPEED;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::ProgressNotificationHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iProgressNotification);
+	This(aPtr)->ReqCompleted(This(aPtr)->iProgressNotification.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::ProgressNotification(const TTsyReqHandle aTsyReqHandle, RFax::TProgress* aProgress)
+	{
+	iProgressNotificationParams=aProgress;
+	iFac->QueueTimer(iProgressNotification,aTsyReqHandle,DACQ_ASYN_TIMEOUT,CFaxDummyBase::ProgressNotificationHandler,this);
+	return KErrNone;
+	}
+
+TInt CFaxDummyBase::ProgressNotificationCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if(aTsyReqHandle==iProgressNotification.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iProgressNotification);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+//
+// CCallDummyBase
+//
+CCallDummyBase::CCallDummyBase(CPhoneFactoryDummyBase* aFac)
+	{
+	iFac=aFac;
+	}
+
+void CCallDummyBase::ConstructL()
+	{
+	iList=CAcquireOwnerList::NewL();
+	}
+
+CCallDummyBase::~CCallDummyBase()
+	{
+	delete iList;
+	iFac->RemoveTimer(iNotifyHookChange);
+	iFac->RemoveTimer(iNotifyStatusChange);
+	iFac->RemoveTimer(iDial);
+	iFac->RemoveTimer(iConnect);
+	iFac->RemoveTimer(iAnswer);
+	iFac->RemoveTimer(iHangUp);
+	}
+
+TInt CCallDummyBase::RegisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+TInt CCallDummyBase::DeregisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+	
+CCallDummyBase* CCallDummyBase::This(TAny* aPtr)
+	{
+	return REINTERPRET_CAST(CCallDummyBase*,aPtr);
+	}
+
+CPhoneFactoryDummyBase* CCallDummyBase::FacPtr() const
+	{
+	return iFac;
+	}
+
+TInt CCallDummyBase::CancelSubSession()
+	{
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::ProcessingOwnership()
+	{
+	if (iList)
+		{	
+		if(iList->iAcquireList.IsEmpty()) // no one interested in this call !
+			{
+			SetUnowned();
+			return KErrNone;
+			}
+
+		CAcquireEntry* entry=iList->iAcquireList.First();
+		if (entry) // someone interested in this call
+			{
+			SetOwnership(entry->iTsyReqHandle);
+			ReqCompleted(entry->iTsyReqHandle,KErrNone);
+			iList->Remove(entry);
+			}
+		return KErrNone;
+		}
+	else
+		return KErrNotFound;
+	}
+
+TInt CCallDummyBase::RelinquishOwnership()
+	{
+	ProcessingOwnership();
+	RelinquishOwnershipCompleted(KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::TransferOwnership(const TTsyReqHandle aTsyReqHandle)
+//
+//	Transfer Call Ownership
+//
+	{
+	if (CheckOwnership(aTsyReqHandle)!=CCallBase::EOwnedTrue)
+		{
+		ReqCompleted(aTsyReqHandle,KErrEtelNotCallOwner);
+		return KErrNone;
+		}
+
+	if(iList->iAcquireList.IsEmpty()) // no one interested in this call !
+		{
+		ReqCompleted(aTsyReqHandle,KErrEtelNoClientInterestedInThisCall);
+		return KErrNone;
+		}
+
+	CAcquireEntry* entry=iList->iAcquireList.First();
+	if (entry) // someone interested in this call
+		{
+		SetOwnership(entry->iTsyReqHandle);
+		ReqCompleted(entry->iTsyReqHandle,KErrNone);
+		iList->Remove(entry);
+		ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::AcquireOwnership(const TTsyReqHandle aTsyReqHandle)
+//
+//	Acquire call Ownership
+//
+	{
+	TInt ret(KErrNone);
+	if (CheckOwnership(aTsyReqHandle)==CCallBase::EOwnedUnowned)
+		{
+		SetOwnership(aTsyReqHandle);
+		ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	else
+		{
+		if(iList->iAcquireList.IsEmpty())
+			// List is empty. Client is the first one to request ownership of the call.
+			{
+			CAcquireEntry* entry=NULL;
+			TRAP(ret, entry=CAcquireEntry::NewL(aTsyReqHandle));
+			if (ret==KErrNone)
+				iList->iAcquireList.AddLast(*entry);
+			}
+		else
+			// List is not empty. Another client has already requested to acquire ownership of the call.
+			// Only one client can be waiting to acquire ownership at any one time.
+			return KErrInUse;
+		}
+	return ret;
+	}
+
+TInt CCallDummyBase::AcquireOwnershipCancel(const TTsyReqHandle aTsyReqHandle)
+//
+//	Cancel Acquire Call Ownership
+//
+	{
+	CAcquireEntry* entry=iList->FindByTsyReqHandle(aTsyReqHandle);
+	if (entry)
+		{
+		ReqCompleted(entry->iTsyReqHandle,KErrCancel);
+		iList->Remove(entry);
+		}
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyCapsChangeHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iNotifyCapsChange);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyCapsChange.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyCapsChange(const TTsyReqHandle aTsyReqHandle,RCall::TCaps*)
+	{
+	iFac->QueueTimer(iNotifyCapsChange,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CCallDummyBase::NotifyCapsChangeHandler,this);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyCapsChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyCapsChange.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyCapsChange);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyHookChange(const TTsyReqHandle aTsyReqHandle,RCall::THookStatus* aHookStatus)
+	{
+	iNotifyHookChangeParams=aHookStatus;
+	iFac->QueueTimer(iNotifyHookChange,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CCallDummyBase::NotifyHookChangeHandler,this);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyHookChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyHookChange.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyHookChange);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyStatusChange(const TTsyReqHandle aTsyReqHandle,RCall::TStatus* aStatus)
+	{
+	iNotifyStatusChangeParams=aStatus;
+	iFac->QueueTimer(iNotifyStatusChange,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CCallDummyBase::NotifyStatusChangeHandler,this);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyStatusChange.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyStatusChange);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+
+TInt CCallDummyBase::NotifyDurationChange(const TTsyReqHandle aTsyReqHandle,TTimeIntervalSeconds*)
+	{
+	iFac->QueueTimer(iNotifyDurationChange,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CCallDummyBase::NotifyDurationChangeHandler,this);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyDurationChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyDurationChange.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyDurationChange);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyDurationChangeHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iNotifyDurationChange);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyDurationChange.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::DialHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iDial);
+	This(aPtr)->ReqCompleted(This(aPtr)->iDial.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::ConnectHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iConnect);
+	This(aPtr)->ReqCompleted(This(aPtr)->iConnect.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::AnswerHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iAnswer);
+	This(aPtr)->ReqCompleted(This(aPtr)->iAnswer.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::HangUpHandler(TAny* aPtr)
+	{
+	This(aPtr)->SetUnowned();
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iHangUp);
+	This(aPtr)->ReqCompleted(This(aPtr)->iHangUp.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyHookChangeHandler(TAny* aPtr)
+	{
+	//test server Up call
+	__ASSERT_ALWAYS(This(aPtr)->UpCallOption(20,NULL)==KErrNotSupported,TsyPanic(KTsyPanicUnexpectedReturnValue));
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iNotifyHookChange);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyHookChange.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::NotifyStatusChangeHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iNotifyStatusChange);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyStatusChange.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::LoanDataPortHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iLoanDataPortTimer);
+	This(aPtr)->ReqCompleted(This(aPtr)->iLoanDataPortTimer.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::GetInfo(const TTsyReqHandle aTsyReqHandle, RCall::TCallInfo* /*aCallInfo*/)
+	{
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::GetStatus(const TTsyReqHandle aTsyReqHandle,RCall::TStatus* aStatus)
+	{
+	*aStatus=DACQ_CALL_STATUS;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::GetCaps(const TTsyReqHandle aTsyReqHandle,RCall::TCaps*)
+	{
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::LoanDataPort(const TTsyReqHandle aTsyReqHandle,RCall::TCommPort*)
+	{
+	iFac->QueueTimer(iLoanDataPortTimer,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CCallDummyBase::LoanDataPortHandler,this);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::LoanDataPortCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iDial.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iDial);
+		SetUnowned();
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::RecoverDataPortAndRelinquishOwnership()
+	{
+	ProcessingOwnership();
+	RecoverDataPortAndRelinquishOwnershipCompleted(KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::RecoverDataPort(const TTsyReqHandle aTsyReqHandle)
+	{
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::Dial(const TTsyReqHandle aTsyReqHandle,const TDesC8* /*aParams*/,TDesC* aNumber)
+	{
+	
+	if (CheckOwnership(aTsyReqHandle)==CCallBase::EOwnedUnowned)
+		{
+		SetOwnership(aTsyReqHandle);
+		if(aNumber->Compare(DACQ_PHONE_NUMBER_TO_DIAL)!=KErrNone)
+			TsyPanic(KTsyPanicDataCorrupted);
+		iFac->QueueTimer(iDial,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CCallDummyBase::DialHandler,this);
+		}
+	else if (CheckOwnership(aTsyReqHandle)==CCallBase::EOwnedFalse)
+		ReqCompleted(aTsyReqHandle,KErrEtelNotCallOwner);
+	else
+		ReqCompleted(aTsyReqHandle,KErrEtelCallAlreadyActive);
+
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::Connect(const TTsyReqHandle aTsyReqHandle,const TDesC8*)
+	{
+	iFac->QueueTimer(iConnect,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CCallDummyBase::ConnectHandler,this);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::AnswerIncomingCall(const TTsyReqHandle aTsyReqHandle,const TDesC8*)
+	{
+	iFac->QueueTimer(iAnswer,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CCallDummyBase::AnswerHandler,this);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::HangUp(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (CheckOwnership(aTsyReqHandle)==CCallBase::EOwnedTrue)
+		{
+		iFac->QueueTimer(iHangUp,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CCallDummyBase::HangUpHandler,this);
+		return KErrNone;
+		}
+	else
+		return KErrEtelNotCallOwner;
+	}
+
+TInt CCallDummyBase::DialCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iDial.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iDial);
+		SetUnowned();
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::ConnectCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iConnect.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iConnect);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::AnswerIncomingCallCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iAnswer.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iAnswer);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::HangUpCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iHangUp.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iHangUp);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::GetBearerServiceInfo(const TTsyReqHandle aTsyReqHandle,RCall::TBearerService* aService)
+	{
+	aService->iBearerSpeed=DACQ_CALL_BEARER_SPEED;
+	aService->iBearerCaps=DACQ_CALL_BEARER_CAPS;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::GetCallParams(const TTsyReqHandle aTsyReqHandle, TDes8*)
+	{
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::GetCallDuration(const TTsyReqHandle aTsyReqHandle, TTimeIntervalSeconds* aTime)
+	{
+	*aTime = 5;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::GetFaxSettings(const TTsyReqHandle aTsyReqHandle,
+									RCall::TFaxSessionSettings* aSettings)
+	{
+	aSettings->iFaxId=DACQ_MYFAX;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CCallDummyBase::SetFaxSettings(const TTsyReqHandle aTsyReqHandle,
+									const RCall::TFaxSessionSettings* aSettings)
+	{
+	if (aSettings->iFaxId.Compare(DACQ_MYFAX)!=KErrNone)
+		TsyPanic(KTsyPanicDataCorrupted);
+
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+	
+TInt CCallDummyBase::SetFaxSharedHeaderFile(const TTsyReqHandle aTsyReqHandle, CFaxSharedFileHandles* aFaxSharedFileHandles)
+	{
+	TBuf8<25> line;
+	TInt ret = aFaxSharedFileHandles->File().Read(0, line);
+
+	if(ret!=KErrNone || line.Compare(DACQ_MFAXFILE) != KErrNone)
+		TsyPanic(KTsyPanicDataCorrupted);
+	
+	delete aFaxSharedFileHandles;
+	aFaxSharedFileHandles = NULL;
+	
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+
+//
+// CLineDummyBase
+//
+CLineDummyBase::CLineDummyBase(CPhoneFactoryDummyBase* aFac)
+	{
+	iFac=aFac;
+	}
+
+void CLineDummyBase::ConstructL()
+	{}
+
+CLineDummyBase::~CLineDummyBase()
+	{
+	iFac->RemoveTimer(iNotifyIncomingCall);
+	iFac->RemoveTimer(iNotifyHookChange);
+	iFac->RemoveTimer(iNotifyStatusChange);
+	}
+
+TInt CLineDummyBase::RegisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+TInt CLineDummyBase::DeregisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+
+CLineDummyBase* CLineDummyBase::This(TAny* aPtr)
+	{
+	return REINTERPRET_CAST(CLineDummyBase*,aPtr);
+	}
+
+TInt CLineDummyBase::CancelSubSession()
+	{
+	return KErrNone;
+	}
+
+CTelObject::TReqMode CLineDummyBase::ReqModeL(const TInt aIpc) 
+//
+//	Mode Request for Line
+//
+	{
+	CTelObject::TReqMode ret=0;
+	switch (aIpc)
+		{
+	case EEtelLineNotifyIncomingCall:
+	case EEtelLineNotifyHookChange:
+	case EEtelLineNotifyStatusChange:
+		ret=KReqModeMultipleCompletionEnabled;
+		break;
+
+
+	case EEtelLineGetHookStatus:
+	case EEtelLineGetCaps:
+	case EEtelLineGetStatus:
+	case EEtelLineGetInfo:
+	case EEtelLineEnumerateCall:
+	case EEtelLineGetCallInfo:
+		ret=KReqModeFlowControlObeyed;
+		break;
+
+	default:
+		User::Leave(KErrNotSupported); // Server error = Should not call this
+		break;
+		}
+	return ret;
+	}
+
+TInt CLineDummyBase::NotifyCapsChangeHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iNotifyCapsChange);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyCapsChange.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyCapsChange(const TTsyReqHandle aTsyReqHandle,RLine::TCaps*)
+	{
+	iFac->QueueTimer(iNotifyCapsChange,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CLineDummyBase::NotifyCapsChangeHandler,this);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyCapsChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyCapsChange.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyCapsChange);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyStatusChangeHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iNotifyStatusChange);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyStatusChange.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyStatusChange(const TTsyReqHandle aTsyReqHandle,RCall::TStatus* aStatus)
+	{
+	iStatusParams=aStatus;
+	iFac->QueueTimer(iNotifyStatusChange,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CLineDummyBase::NotifyStatusChangeHandler,this);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyStatusChange.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyStatusChange);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyIncomingCall(const TTsyReqHandle aTsyReqHandle, TName*)
+	{
+	iFac->QueueTimer(iNotifyIncomingCall,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CLineDummyBase::NotifyIncomingCallHandler,this);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyIncomingCallCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyIncomingCall.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyIncomingCall);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyIncomingCallHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iNotifyIncomingCall);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyIncomingCall.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyHookChange(const TTsyReqHandle aTsyReqHandle, RCall::THookStatus* aHookStatus)
+	{
+	iHookStatusParams=aHookStatus;
+	iFac->QueueTimer(iNotifyHookChange,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CLineDummyBase::NotifyHookChangeHandler,this);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyHookChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyHookChange.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyHookChange);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyHookChangeHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iNotifyHookChange);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyHookChange.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyCallAdded(const TTsyReqHandle aTsyReqHandle, TName* /*aName*/)
+	{
+	iFac->QueueTimer(iNotifyCallAdded,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CLineDummyBase::NotifyCallAddedHandler,this);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyCallAddedCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyCallAdded.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyCallAdded);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::NotifyCallAddedHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iNotifyCallAdded);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyCallAdded.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::GetCaps(const TTsyReqHandle aTsyReqHandle,RLine::TCaps*)
+	{
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::GetInfo(const TTsyReqHandle aTsyReqHandle, RLine::TLineInfo* /*aLineInfo*/)
+	{
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CLineDummyBase::GetStatus(const TTsyReqHandle aTsyReqHandle,RCall::TStatus* aStatus)
+	{
+	*aStatus=DACQ_LINE_STATUS;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+CPhoneFactoryDummyBase* CLineDummyBase::FacPtr() const
+	{
+	return iFac;
+	}
+
+TInt CLineDummyBase::GetHookStatus(const TTsyReqHandle aTsyReqHandle,RCall::THookStatus*)
+	{
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+//
+// CPhoneDummyBase
+//
+CPhoneDummyBase::CPhoneDummyBase(CPhoneFactoryDummyBase* aFac)
+	{
+	iFac=aFac;
+	}
+
+void CPhoneDummyBase::ConstructL()
+	{
+	}
+CPhoneDummyBase::~CPhoneDummyBase()
+	{
+	iFac->RemoveTimer(iNotifyPhoneDetected);
+	}
+
+CPhoneDummyBase* CPhoneDummyBase::This(TAny* aPtr)
+	{
+	return REINTERPRET_CAST(CPhoneDummyBase*,aPtr);
+	}
+
+TInt CPhoneDummyBase::RegisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+TInt CPhoneDummyBase::DeregisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::CancelSubSession()
+	{
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::ControlledInitialisation(const TTsyReqHandle aTsyReqHandle)
+	{
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::ControlledInitialisationCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+void CPhoneDummyBase::Dummy()
+	{
+	RPhone::TPhoneInfo dummy0;
+	TPckg<RPhone::TPhoneInfo> dummy1(dummy0);
+	dummy1.Zero();
+	}
+
+TInt CPhoneDummyBase::NotifyCapsChangeHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending( This(aPtr)->iNotifyCapsChange);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyCapsChange.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::NotifyCapsChange(const TTsyReqHandle aTsyReqHandle,RPhone::TCaps*)
+	{
+	iFac->QueueTimer(iNotifyCapsChange,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CPhoneDummyBase::NotifyCapsChangeHandler,this);
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::NotifyCapsChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyCapsChange.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyCapsChange);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::NotifyPhoneDetectedHandler(TAny* aPtr)
+	{
+	This(aPtr)->iFac->ResetPending(This(aPtr)->iNotifyPhoneDetected);
+	This(aPtr)->ReqCompleted(This(aPtr)->iNotifyPhoneDetected.iTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::NotifyModemDetected(const TTsyReqHandle aTsyReqHandle,RPhone::TModemDetection* aDetection)
+	{
+	iDetectionParams=aDetection;
+	iFac->QueueTimer(iNotifyPhoneDetected,aTsyReqHandle,DACQ_ASYN_TIMEOUT,
+						CPhoneDummyBase::NotifyPhoneDetectedHandler,this);
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::NotifyModemDetectedCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	if (aTsyReqHandle==iNotifyPhoneDetected.iTsyReqHandle)
+		{
+		iFac->RemoveTimer(iNotifyPhoneDetected);
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	TsyPanic(KTsyPanicNotRecognisedCancelHandle);
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::GetInfo(const TTsyReqHandle aTsyReqHandle, RPhone::TPhoneInfo* /*aPhoneInfo*/)
+	{
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::GetStatus(const TTsyReqHandle aTsyReqHandle,RPhone::TStatus* aPhoneStat)
+	{
+	aPhoneStat->iModemDetected=DACQ_PHONE_STATUS;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CPhoneDummyBase::GetCaps(const TTsyReqHandle aTsyReqHandle,RPhone::TCaps*)
+	{
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+CPhoneFactoryDummyBase* CPhoneDummyBase::FacPtr() const
+	{
+	return iFac;
+	}
+
+//
+//	CPhoneFactoryDummyBase
+//
+CPhoneFactoryDummyBase::CPhoneFactoryDummyBase()
+	{
+	}
+
+void CPhoneFactoryDummyBase::ConstructL()
+	{
+	iTimer=CDeltaTimer::NewL(CActive::EPriorityHigh,KEtelTimerGranularity);
+	}
+
+CPhoneFactoryDummyBase::~CPhoneFactoryDummyBase()
+	{
+	delete iTimer;
+	}
+
+void CPhoneFactoryDummyBase::QueueTimer(TTsyTimer& aTsyTimer,
+						const TTsyReqHandle aTsyReqHandle,
+						TTimeIntervalMicroSeconds32 aTimeInMicroSeconds,
+						TInt (*aFunction)(TAny *aPtr),TAny* aPtr)
+	{
+	TCallBack callBackFn(aFunction,aPtr);
+ 	aTsyTimer.iEntry.Set(callBackFn);
+
+	aTsyTimer.iPending=ETrue;
+	aTsyTimer.iTsyReqHandle=aTsyReqHandle;
+	aTimeInMicroSeconds=aTimeInMicroSeconds.Int()+(KEtelTimerGranularity>>2);
+	if(aTimeInMicroSeconds.Int()<100000)
+		aTimeInMicroSeconds=aTimeInMicroSeconds.Int()+KEtelTimerGranularity;
+	iTimer->Queue(aTimeInMicroSeconds,aTsyTimer.iEntry);
+	}
+
+TBool CPhoneFactoryDummyBase::RemoveTimer(TTsyTimer& aTsyTimer)
+	{
+	if (aTsyTimer.iPending)
+		{
+		aTsyTimer.iPending=EFalse;
+		iTimer->Remove(aTsyTimer.iEntry);
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+void CPhoneFactoryDummyBase::ResetPending(TTsyTimer& aTsyTimer)
+	{
+	aTsyTimer.iPending=EFalse;
+	}
+
+TBool CPhoneFactoryDummyBase::IsSupported(const TInt /*aMixin*/)
+	{
+	return EFalse;
+	}
+
+CSubSessionExtDummyBase::CSubSessionExtDummyBase(CPhoneFactoryDummyBase* aFac)
+	{
+	iFac=aFac;
+	}
+
+CSubSessionExtDummyBase::~CSubSessionExtDummyBase()
+	{}
+
+CPhoneFactoryDummyBase* CSubSessionExtDummyBase::FacPtr() const
+	{
+	return iFac;
+	}
+
+TInt CSubSessionExtDummyBase::CancelSubSession()
+	{
+	return KErrNone;
+	}
+
+TInt CSubSessionExtDummyBase::RegisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+TInt CSubSessionExtDummyBase::DeregisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}