telephonyserverplugins/multimodetsy/hayes/FAX.CPP
changeset 0 3553901f7fa8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/multimodetsy/hayes/FAX.CPP	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,187 @@
+// 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 "NOTIFY.H"
+#include "ETELFAX.H"
+#include "FAX.H"
+#include "mSLOGGER.H"
+
+//
+// CFaxHayes - Fax functionality
+//
+
+void CFaxHayes::CloseFax(TAny* aObj)
+//
+// Utility func for cleanup stack
+//
+	{
+	((CObject*)aObj)->Close();
+	}
+
+CFaxHayes* CFaxHayes::NewL(CCallMobileFax* aCallFaxHayes,CPhoneGlobals* aPhoneGlobals)
+//
+//	Completes successfully if fax call has already been dialled creating a CETelFaxBase 
+//  instance, and is not called if that is not true.
+//
+	{
+	CFaxHayes* fax=new(ELeave) CFaxHayes(aCallFaxHayes,aPhoneGlobals);
+	TCleanupItem newFaxHayesClose(CloseFax,fax);
+	CleanupStack::PushL(newFaxHayesClose);
+	fax->ConstructL();
+    CleanupStack::Pop();
+	return fax;
+	}
+	
+RHandleBase* CFaxHayes::GlobalKernelObjectHandle()
+	{	
+	return iOwner->GlobalKernelObjectHandle();
+	}
+
+CFaxHayes::CFaxHayes(CCallMobileFax* aCallFaxHayes,CPhoneGlobals* aPhoneGlobals)
+								 : iPhoneGlobals(aPhoneGlobals), iOwner(aCallFaxHayes)
+	{}
+
+void CFaxHayes::ConstructL()
+//
+//	Used to be that CFaxHayes could not be constructed before a call had been initiated
+//  ie the fax server was started and the call had a pointer to CETelFaxBase.
+//	Now, to solve the problem of the fax progress being only available after phase C, 
+//  RFax can be opened before a call has begun to connect. So in the event of this happening,
+//  each function of CFaxHayes must check that the fax server has been started.
+//	
+//	
+	{
+	LOGTEXT(_L8("CFaxHayes::ConstructL()"));
+	iDataDirection = EUnknown;
+	}
+
+CFaxHayes::~CFaxHayes()
+	{
+	iOwner->RemoveFax(this);
+	iPhoneGlobals->iNotificationStore->RemoveClientFromLastEvents(this);
+	}
+
+CTelObject::TReqMode CFaxHayes::ReqModeL(const TInt aIpc)
+	{
+	TReqMode reqMode = CFaxBase::ReqModeL(aIpc);
+	if ((reqMode & KReqModeFlowControlObeyed) && iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
+		{
+		LOGTEXT2(_L8("ReqModeL Leaving with KErrInUse as data port is loaned (aIpc=%d)"),aIpc);
+		User::Leave(KErrInUse);
+		}
+	return reqMode;
+	}
+
+TInt CFaxHayes::RegisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+TInt CFaxHayes::DeregisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+
+void CFaxHayes::Init()
+	{}
+
+TInt CFaxHayes::CheckAndSetRegistrationParams(const TInt /*aIpc*/,const TDes8* /*aDes1*/,const TDes8* /*aDes2*/)
+	{
+	return KErrNone;
+	}
+
+TInt CFaxHayes::Read(const TTsyReqHandle aTsyReqHandle, TDes8* aDes)
+//
+//	Read fax data into descriptor, asynchronously. Use NotificationStore to notify client 
+//	when completed
+//
+    {
+	if (iOwner->iFaxSession==NULL)
+		{
+		ReqCompleted(aTsyReqHandle,KErrNotReady);
+		return KErrNone;
+		}	
+	LOGTEXT(_L8("Fax:\tCalling RxFaxData"));
+	iDataDirection = EReceiveData;
+	CFaxSession* session = iOwner->iFaxSession;
+
+	iPhoneGlobals->iNotificationStore->RegisterNotification(EReadOrWriteFax,aTsyReqHandle,this);
+	session->RxFaxData(*aDes);
+	return KErrNone;
+	}
+
+TInt CFaxHayes::Write(const TTsyReqHandle aTsyReqHandle, TDesC8* aDes)
+//
+//	Send fax data in descriptor to fax module, asynchronously
+//
+    {
+	if (iOwner->iFaxSession==NULL)
+		{
+		ReqCompleted(aTsyReqHandle,KErrNotReady);
+		return KErrNone;
+		}	
+	LOGTEXT(_L8("Fax:\tCalling TxFaxData"));
+	iDataDirection = ESendData;
+	CFaxSession* session = iOwner->iFaxSession;
+	iPhoneGlobals->iNotificationStore->RegisterNotification(EReadOrWriteFax,aTsyReqHandle,this);
+	session->TxFaxData(*aDes);
+	return KErrNone;
+	}
+
+TInt CFaxHayes::WaitForEndOfPage(const TTsyReqHandle aTsyReqHandle)
+//
+//	Send request for notification of end of page to fax module
+//
+    {
+	if (iOwner->iFaxSession==NULL)
+		{
+		ReqCompleted(aTsyReqHandle,KErrNotReady);
+		return KErrNone;
+		}	
+	LOGTEXT(_L8("Fax:\tCalling Wait for end of page"));
+	CFaxSession* session = iOwner->iFaxSession;
+	if (iDataDirection==EUnknown)
+		{
+		ReqCompleted(aTsyReqHandle,KErrUnknown); // client hasn't read or written data yet
+		return KErrNone;
+		}
+	iPhoneGlobals->iNotificationStore->RegisterNotification(EEndOfFaxPage,aTsyReqHandle,this);
+	LOGTEXT(_L8("Fax:\tEnd Of Page Notification lodged"));	
+	if (iDataDirection==EReceiveData)
+		session->RxPostPage();
+	else 
+		session->TxPostPage();
+	return KErrNone;
+	}
+
+TInt CFaxHayes::TerminateFaxSession(const TTsyReqHandle aTsyReqHandle)
+//
+//	Cancel the entire fax session. Server completes fax notification requests that it knows
+//	as notifications. TSY treats ReadOrWrite and EndOfPage as notifications although they 
+//  have no Cancel function, so it must remove them from its notification list here 
+//	explicitly
+//
+    {
+	if (iOwner->iFaxSession==NULL)
+		{
+		ReqCompleted(aTsyReqHandle,KErrNotReady);
+		return KErrNone;
+		}	
+	LOGTEXT(_L8("Fax:\tCancelling fax session"));
+	CFaxSession* session= iOwner->iFaxSession;
+	session->Cancel();
+	iPhoneGlobals->iNotificationStore->CheckNotification(session,EFaxSessionTerminated,KErrCancel);
+	ReqCompleted(aTsyReqHandle,KErrNone);	
+	return KErrNone;
+	}