fax/faxclientandserver/FAXSVR/CFAX20.CPP
changeset 20 244d7c5f118e
parent 19 1f776524b15c
child 23 6b1d113cdff3
--- a/fax/faxclientandserver/FAXSVR/CFAX20.CPP	Fri Mar 19 09:55:57 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,520 +0,0 @@
-// 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 "FAXSERV.H"
-#include "fax_reversebytes.h"
-#include "FAXMODEM.H"
-#include "FAXMDRV.H"
-
-#include "FAXLOG.H"
-
-const TInt KClass20HangupStatusTimer=20;	// < Time used to wait for final +FHS: report.  Was 5s, but typical GSM delays range between 4s and 10s.
-
-// this module has two parts
-// first receive routines rx
-// second transmit routines tx
-
-/********************************************************************/
-
-CFaxModemDriver* CFaxClass20::NewLC(TFaxServerSessionSettings * aFaxServerSessionSettings, RFax::TProgress & aProgress)
-	{
-	CFaxModemDriver* self = new(ELeave) CFaxClass20;
-	CleanupStack::PushL(self);
-	self->ConstructL(aFaxServerSessionSettings, aProgress);
-	return self;
-	}
-
-CFaxModemDriver* CFaxClass20::NewL(TFaxServerSessionSettings * aFaxServerSessionSettings, RFax::TProgress & aProgress)
-	{
-	CFaxModemDriver* self = NewLC(aFaxServerSessionSettings, aProgress);
-	CleanupStack::Pop();
-	return self;
-	}
-/********************************************************************/
-
-TInt CFaxClass20::RxConnectL()
-	{
-	__FLOG_FAXSRV( _L8("CFaxClass20::RxConnectL entering"));
-
-	CheckCadenceExportL (_L8 ("AT+FNR=1,1,1,0\r"));
-	if ((iModem->GetMatchL (_L8 ("OK"), 5)) == 0)
-		return (KFaxErrModemNotWorking);
-
-	CheckCadenceExportL(_L8("AT+FCC=?\r"));
-	if (!(iModem->ImportL (iResults, 35)))
-		return (KFaxErrModemNotWorking);
-
-	iModem->iOurMessage.Format (_L8 ("%S"), &iResults);
-	iModem->ProgressUpdateL ();
-	ParseResults (iResults);
-
-	iModem->GetMatchL (_L8 ("OK"), 2);
-
-	if (iFaxServerSessionSettings->iRxResolution == EFaxNormal)
-		iModem->iProgress.iResolution = EFaxNormal;
-	else
-		iModem->iProgress.iResolution = EFaxFine;
-
-	if (iFaxServerSessionSettings->iRxCompression == EModifiedRead)
-		iModem->iProgress.iCompression = EModifiedRead;
-	else
-		iModem->iProgress.iCompression = EModifiedHuffman;
-
-	iActualFaxSpeed = iModem->iProgress.iSpeed;
-	if (iActualFaxSpeed > iFaxServerSessionSettings->iMaxSpeed)
-		iActualFaxSpeed = iFaxServerSessionSettings->iMaxSpeed;
-
-	if (iFaxServerSessionSettings->iPreferredECM == 0)
-		iModem->iProgress.iECM = 0;
-
-	iResults.Copy(_L8("AT+FCC=0,0,0,2,0,0,0,0\r"));
-
-	iResults[7] = (TUint8) (iResults[7] + iModem->iProgress.iResolution);
-	iResults[9] = (TUint8) (((iActualFaxSpeed / 2400) - 1) + '0');
-	iResults[15] = (TUint8) (iResults[15] + iModem->iProgress.iCompression);
-	iResults[17] = (TUint8) (iModem->iProgress.iECM + '0');
-	CheckCadenceExportL(iResults);
-	if ((iModem->GetMatchL(_L8("OK"), 3)) == 0)
-		{
-		return (KFaxErrModemNotWorking);
-		}
-	CheckCadenceExportL(_L8 ("AT+FAA=0\r"));
-	if ((iModem->GetMatchL(_L8("OK"), 5)) == 0)
-		{
-		return (KFaxErrNoReceiveMode);
-		}
-
-	TBuf8<RCall::KFaxIdUserNameMaxSize> narrowBuf;
-	narrowBuf.Copy(iFaxServerSessionSettings->iFaxId);	 // convert from unicode to narrow
-	
-	//-- By Dmitry Lyokhin. concerns PIA-58ELQK defect.
-	if( narrowBuf.Length() < 1 )
-		{
-		narrowBuf.Append(' ');
-		}
-
-	if (iFaxServerSessionSettings->iMode & KFaxPoll)
-		{
-		iModem->ExportL(_L8 ("AT+FSP=1\r"));
-		if ((iModem->GetMatchL(_L8("OK"), 5)) == 0)
-			{
-			return (KFaxPollingUnsupported);
-			}
-		iModem->ExportL(_L8("AT+FPI=\""));
-		iModem->ExportL(narrowBuf);
-		iModem->ExportL(_L8 ("\"\r"));
-		if ((iModem->GetMatchL(_L8("OK"), 3)) == 0)
-			{
-			return (KFaxPollingUnsupported);
-			}
-		}
-	else
-		{
-		CheckCadenceExportL(_L8("AT+FCR=1\r"));
-		if ((iModem->GetMatchL(_L8("OK"), 5)) == 0)
-			{
-			return (KFaxErrNoReceiveMode);
-			}
-		CheckCadenceExportL(_L8("AT+FLI=\""));
-		iModem->ExportL(narrowBuf);
-		iModem->ExportL(_L8("\"\r"));
-		if ((iModem->GetMatchL(_L8("OK"), 3)) == 0)
-			{
-			return (KFaxErrModemNotWorking);
-			}
-		}
-
-	if (iFaxServerSessionSettings->iMode & KFaxWaitForRing)
-		{
-//		while ((iModem->GetMatchL(_L8("RING"), 3)) == 0);
-//		iTimeOfLastRing.UniversalTime();
-		}
-	else
-		{
-		if ((iFaxServerSessionSettings->iMode & KFaxOffHook) == 0)
-			{
-			DialFaxOnDemandL();
-			}
-		}
-
-	if ((iFaxServerSessionSettings->iMode & KFaxPoll) == 0)
-		{
-		CheckCadenceExportL(_L8("ATA\r"));
-		}
-
-	iModem->iProgress.iPhase = ECallEstablishment;
-
-	TInt pollDocsAvailable = 0;
-
-	for (;;)
-		{
-		if(!(iModem->ImportL(iResults, 35)))
-			{
-			return KFaxErrCannotAnswer;
-			}
-
-		iModem->iOurMessage.Format(_L8("%S"), &iResults);
-		iModem->ProgressUpdateL();
-
-		if ((iResults.FindF(_L8("NO DIALTONE"))) >= 0 ||
-			iResults.FindF(_L8("NO DIAL TONE")) >= 0)
-			return (KFaxErrNoDialTone);
-		if ((iResults.FindF(_L8("BUSY"))) >= 0)
-			return (KFaxErrBusy);
-		if ((iResults.FindF(_L8("NO ANSWER"))) >= 0)
-			return (KFaxErrNoAnswer);
-		if ((iResults.FindF(_L8("NO CARRIER"))) >= 0)
-			return (KFaxErrNoCarrier);
-		if ((iResults.FindF(_L8("OK"))) >= 0)
-			break;
-		if ((iResults.FindF(_L8("FHS"))) >= 0)
-			return (KFaxErrPrematureHangup);
-		if ((iResults.FindF(_L8("FCO"))) >= 0)
-			iModem->iProgress.iPhase = ESessionNegotiation;
-		else if ((iResults.FindF(_L8("FPO"))) >= 0)
-			pollDocsAvailable = 1;
-		else if ((iResults.FindF(_L8("FTI"))) >= 0)
-			ExtractAnswerback(iResults);
-		else if ((iResults.FindF(_L8("FCS"))) >= 0)
-			ParseResults(iResults);
-		}
-
-	if ((iFaxServerSessionSettings->iMode & KFaxPoll) && (pollDocsAvailable == 0))
-		return (KFaxNothingToPoll);
-
-	iModem->iOurMessage.Format(_L8 ("about to receive fax"));
-	iModem->ProgressUpdateL();
-	return RxPrePageL();
-	}
-
-/********************************************************************/
-TInt CFaxClass20::RxPrePageL()
-	{
-	__FLOG_FAXSRV( _L8("CFaxClass20::RxPrePageL entering"));
-
-	iModem->ExportL(_L8 ("AT+FDR\r"));
-	for (;;)
-		{
-		if (!(iModem->ImportL (iResults, 35)))
-			return (KFaxErrCannotConnect);
-
-		iModem->iOurMessage.Format (_L8 ("%S"), &iResults);
-		iModem->ProgressUpdateL ();
-
-		if ((iResults.FindF (_L8 ("ERROR"))) >= 0)
-			return (KFaxErrNoReceiveMode);
-		if ((iResults.FindF (_L8 ("FHS"))) >= 0)
-			return (KFaxErrPrematureHangup);
-		if ((iResults.FindF (_L8 ("CONNECT"))) >= 0)
-			break;
-		if ((iResults.FindF (_L8 ("FCS"))) >= 0)
-			ParseResults (iResults);
-		}
-
-	iModem->TxcharL (Kdc2);
-	return (RxStartPageL ());
-}
-/********************************************************************/
-TInt CFaxClass20::RxPostPageL ()
-{
-    __FLOG_FAXSRV( _L8("CFaxClass20::RxPostPageL entering"));
-
-	iModem->iProgress.iPhase = EPostPageStatus;
-	iModem->ProgressUpdateL ();
-	for (;;)
-		{
-		if (iModem->iProgress.iECM == 0)
-			{
-			if (!(iModem->ImportL (iResults, 20)))
-				return (KFaxErrModemResponse);
-			}
-        else
-            {
-            // coverity[check_return]
-            iModem->ImportL (iResults, 0x7fff);     // no timeout if ECM enabled
-            }
-
-		iModem->iOurMessage.Format (_L8 ("%S"), &iResults);
-		iModem->ProgressUpdateL ();
-
-		if ((iResults.FindF (_L8 ("OK"))) >= 0)
-			return (KFaxErrPrematureOK);
-		if ((iResults.FindF (_L8 ("FHS"))) >= 0)
-			return (KFaxErrPrematureHangup);
-		if ((iResults.FindF (_L8 ("FET"))) >= 0)
-			break;
-		}
-	if (iModem->GetMatchL (_L8 ("OK"), 5) == 0)
-		return (KFaxErrNoFinalOK);
-
-	if ((iResults.FindF (_L8 ("0"))) >= 0)
-		{
-		iModem->iOurMessage.Format (_L8 ("page %u successfully received"), iModem->iProgress.iPage);
-		iModem->ProgressUpdateL ();
-		return (RxPrePageL ());
-		}
-	if ((iResults.FindF (_L8 ("1"))) >= 0)
-		{
-		iModem->iOurMessage.Format (_L8 ("page %u successfully received : end of document"), iModem->iProgress.iPage);
-		iModem->ProgressUpdateL ();
-		iModem->iOurMessage.Format (_L8 ("Next fax awaited"));
-		iModem->ProgressUpdateL ();
-		return (RxPrePageL ());
-		}
-	if ((iResults.FindF (_L8 ("2"))) >= 0)
-		{
-		iModem->iOurMessage.Format (_L8 ("Final page %u successfully received"), iModem->iProgress.iPage);
-		iModem->ProgressUpdateL ();
-		iModem->iProgress.iPhase = EDisconnection;
-		iModem->ExportL (_L8 ("AT+FDR\r"));
-		if (iModem->GetMatchL (_L8 ("FHS"), KClass20HangupStatusTimer) == 0)
-			return (KFaxErrNoHangup);
-		if (iModem->GetMatchL (_L8 ("OK"), 5) == 0)
-			return (KFaxErrNoFinalOK);
-		return (KErrNone);
-		}
-	return (KFaxErrUnknownPageCode);
-}
-/********************************************************************/
-
-TInt CFaxClass20::TxConnectL ()
-{
-    __FLOG_FAXSRV( _L8("CFaxClass20::TxConnectL entering"));
-
-	iModem->ExportL (_L8 ("AT+FNR=1,1,1,0\r"));
-	if ((iModem->GetMatchL (_L8 ("OK"), 5)) == 0)
-		return (KFaxErrModemNotWorking);
-	TBuf8<RCall::KFaxIdUserNameMaxSize> narrowBuf;
-	narrowBuf.Copy(iFaxServerSessionSettings->iFaxId);	 // convert from unicode to narrow
-	
-	//-- By Dmitry Lyokhin. concerns PIA-58ELQK defect.
-	if( narrowBuf.Length() < 1 ) narrowBuf.Append(' ');
-
-	
-	iModem->ExportL (_L8 ("AT+FLI=\""));
-	iModem->ExportL (narrowBuf);
-	iModem->ExportL (_L8 ("\"\r"));
-	if ((iModem->GetMatchL (_L8 ("OK"), 3)) == 0)
-		return (KFaxErrModemNotWorking);
-
-	iModem->ExportL (_L8 ("AT+FCC=?\r"));
-	if (!(iModem->ImportL (iResults, 35)))
-		return (KFaxErrModemNotWorking);
-
-	iModem->iOurMessage.Format (_L8 ("%S"), &iResults);
-	iModem->ProgressUpdateL ();
-	ParseResults (iResults);
-
-	iModem->GetMatchL (_L8 ("OK"), 2);
-
-	iActualFaxSpeed = iModem->iProgress.iSpeed;
-	if (iActualFaxSpeed > iFaxServerSessionSettings->iMaxSpeed)
-		iActualFaxSpeed = iFaxServerSessionSettings->iMaxSpeed;
-
-	if (iFaxServerSessionSettings->iPreferredECM == 0)
-		iModem->iProgress.iECM = 0;
-
-	iResults.Copy (_L8 ("AT+FCC=0,0,0,2,0,0,0,0\r"));
-
-	iResults[7] = (TUint8) (iResults[7] + iFaxServerSessionSettings->iTxResolution);
-	iResults[9] = (TUint8) (((iActualFaxSpeed / 2400) - 1) + '0');
-
-	
-	// added to support 2Dfaxing using class 2.0
-	if (iModem->iProgress.iCompression)
-		iResults[15] = (TUint8) (iResults[15] + iFaxServerSessionSettings->iTxCompression);
-	else
-		iResults[15] = (TUint8) (iResults[15] + EModifiedHuffman);
-	
-	//iResults[15] = (TUint8) (iResults[15] + iFaxServerSessionSettings->iTxCompression);
-	
-		
-	iResults[17] = (TUint8) (iModem->iProgress.iECM + '0');
-	iModem->ExportL (iResults);
-	if ((iModem->GetMatchL (_L8 ("OK"), 3)) == 0)
-		return (KFaxErrModemNotWorking);
-
-	iModem->ExportL (_L8 ("ATD"));
-	if ((iFaxServerSessionSettings->iMode & KFaxOffHook) == 0)
-		iModem->ExportL (iFaxServerSessionSettings->iPhoneNumber);
-	iModem->TxcharL (Kreturn);
-
-	iModem->iProgress.iPhase = ECallEstablishment;
-	for (;;)
-		{
-		if (!(iModem->ImportL (iResults, KDialTimeout)))
-			return (KFaxErrNoDial);
-
-		iModem->iOurMessage.Format (_L8 ("%S"), &iResults);
-		iModem->ProgressUpdateL ();
-
-		if ((iResults.FindF (_L8 ("NO DIALTONE"))) >= 0 ||
-			iResults.FindF (_L8 ("NO DIAL TONE")) >= 0)
-			return (KFaxErrNoDialTone);
-		if ((iResults.FindF (_L8 ("BUSY"))) >= 0)
-			return (KFaxErrBusy);
-		if ((iResults.FindF (_L8 ("NO ANSWER"))) >= 0)
-			return (KFaxErrNoAnswer);
-		if ((iResults.FindF (_L8 ("NO CARRIER"))) >= 0)
-			return (KFaxErrNoCarrier);
-		if ((iResults.FindF (_L8 ("FHS"))) >= 0)
-			return (KFaxErrNoNegotiate);
-		if ((iResults.FindF (_L8 ("OK"))) >= 0)
-			break;
-		if ((iResults.FindF (_L8 ("FCO"))) >= 0)
-			iModem->iProgress.iPhase = ESessionNegotiation;
-		else if ((iResults.FindF (_L8 ("FCI"))) >= 0)
-			ExtractAnswerback (iResults);
-		}
-	return (TxPrePageL ());
-}
-/********************************************************************/
-TInt CFaxClass20::TxPrePageL ()
-{
-    __FLOG_FAXSRV(_L8("CFaxClass20::TxPrePageL entering"));
-
-	iModem->ExportL (_L8 ("AT+FDT\r"));
-	for (;;)
-		{
-		if (!(iModem->ImportL (iResults, 30)))
-			return (KFaxErrNoNegotiate);
-
-		iModem->iOurMessage.Format (_L8 ("%S"), &iResults);
-		iModem->ProgressUpdateL ();
-
-		if ((iResults.FindF (_L8 ("FHS"))) >= 0)
-			return (KFaxErrNoNegotiate);
-		if ((iResults.FindF (_L8 ("CONNECT"))) >= 0)
-			break;
-		if ((iResults.FindF (_L8 ("FCS"))) >= 0)
-			ParseResults (iResults);
-		}
-
-	for (;;)
-		{
-		TInt XonTimeoutSec = CLK_TCK * 3; 
-		
-		if ((iModem->RxcharWaitL(XonTimeoutSec)) == 0)
-			{
-			break;
-			}
-
-		if (iModem->iReadone[0] == Kxon)
-			{
-			break;
-			}
-		}
-	return (TxStartPageL());
-}
-/********************************************************************/
-
-//
- // TxPostPageL should return either with
- //
- // a) an error code and iPhase set to RFax::EPostPageStatus, in which case the send returns with the error
- // b) KErrNone and iPhase set to RFax::EDataTransfer, in which case we send the next page
- // c) KErrNone and iPhase set to RFax::EDisconnection, in which case the send returns with KErrNone
- //
-
-TInt CFaxClass20::TxPostPageL ()
-{
-	if (iModem->iProgress.iCompression == EModifiedRead)
-		{
-		iModem->iTransmitBuffer.Append (0x00);
-		iModem->iTransmitBuffer.Append (0x60);
-		iModem->iTransmitBuffer.Append (0x00);
-		iModem->iTransmitBuffer.Append (0x0C);
-		iModem->iTransmitBuffer.Append (0x80);
-		iModem->iTransmitBuffer.Append (0x01);
-		iModem->iTransmitBuffer.Append (0x30);
-		iModem->iTransmitBuffer.Append (0x00);
-		iModem->iTransmitBuffer.Append (0x06);
-		iModem->iTransmitBuffer.Append (0xC0);
-		}
-	else
-		{
-		for (TInt x = 3; x; x--)
-			{
-			iModem->iTransmitBuffer.Append (0x0);
-			iModem->iTransmitBuffer.Append (0x08);
-			iModem->iTransmitBuffer.Append (0x80);
-			}
-		}
-
-	iModem->iTransmitBuffer.Append (Kdle);
-	iModem->iOurMessage.Format (_L8 ("RTC transmitted after %d lines"), iModem->iProgress.iLines);
-	iModem->ProgressUpdateL ();
-	if (iFaxServerSessionSettings->iTxPages == iModem->iProgress.iPage)
-		{
-		iModem->iTransmitBuffer.Append (0x2e);
-		iModem->iOurMessage.Format (_L8 ("End of document transmitted <dle><eop>"));
-		}
-	else
-		{
-		iModem->iTransmitBuffer.Append (0x2c);
-		iModem->iOurMessage.Format (_L8 ("End of page %u transmitted <dle><mps>"), iModem->iProgress.iPage);
-		}
-    __FLOG_FAXSRV( iModem->iOurMessage);
-
-	iModem->CommitTransmitBufferL ();
-
-	iModem->iProgress.iPhase = EPostPageStatus;
-	iModem->ProgressUpdateL ();
-	while (iModem->Txstat () != 0)
-		;
-	iModem->Xonoff ();
-
-	// we've just ended phase C data, so we need to wait for the modem to respond with OK or ERROR
-
-	for (;;)
-		{
-		if (iModem->iProgress.iECM == 0)
-			{
-			if (!(iModem->ImportL (iResults, (32 * 1024) / (iModem->iProgress.iSpeed / 10))))
-				return (KFaxErrCannotEndData);
-			}
-        else
-            {
-            // coverity[check_return]
-            iModem->ImportL (iResults, 0x7fff);     // no timeout if ECM enabled, but NO CARRIER possible from some mobile phones
-            if ((iResults.FindF (_L8 ("NO CARRIER"))) >= 0)
-                return (KFaxErrCannotEndData);
-            }
-
-		iModem->iOurMessage.Format (_L8 ("%S"), &iResults);
-		iModem->ProgressUpdateL ();
-
-		if ((iResults.FindF (_L8 ("ERROR"))) >= 0)
-			break;
-		if ((iResults.FindF (_L8 ("OK"))) >= 0)
-			break;
-		}
-	if (((iResults.FindF (_L8 ("ERROR"))) >= 0) && (iRepeatPage == 0))
-		{
-		iModem->iProgress.iPhase = ESessionNegotiation;
-		iRepeatPage++;
-		iModem->iProgress.iPage--;
-		return (TxPrePageL ());
-		}
-	if (iFaxServerSessionSettings->iTxPages != iModem->iProgress.iPage)
-		{
-		iRepeatPage = 0;
-		return (TxPrePageL ());
-		}
-	iModem->iProgress.iPhase = EDisconnection;
-	return (KErrNone);
-}
-/********************************************************************/
-