--- /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;
+ }