* Mark Hunting <mark@xxxxxxxxxx> [051125 08:34]:
To summarize:
For me the RetryNoAnswer setting works now. In Class2Modem.c++,
Class2Modem::dialResponse I changed:
case 11: return (NOFCON); // No answer (T.30 timeout)
into:
case 11: return (NOANSWER); // No answer (T.30 timeout)
Doh! I was even looking here and completely overlooked that... Sory.
Is this an error in Hylafax, or gives my modem the wrong error message?
Then, in FaxSend.c++, FaxServer::sendFax I changed:
[SNIP]
Apparently Hylafax knows it has called my cell phone before. This is a
bit strange behaviour. It has called my cell phone before, but of course
it can't have delivered any faxes to it. So IMO that's no reason to
ignore RetryNoAnswer and call it over and over again?
What is at issue here is that the "Class2" device isn't properly
reporting the real problems.
FHNG: responses of 10-19 are:
"Transmit Phase A & miscellaneous errors"
A value of 5 means:
"Ringback detected: Answer with no CED".
So, what we are getting from the device when we get the FHNG:11 is that
we are in Transmit Phase A and something went wrong. The only correct
assumption for HylaFAX at this point is:
- A carrier was seen, but we there was an issue.
This is why 11 is translated as NOFCON, which is:
NOFCON = 7, // carrier established, but phase A failure
The NOFCON is what is setting calledBefore() to true.
That results the behaviour that HylaFAX is giving you.
So, instead of setting JobRetryNoFCON instead of JobRetryNoANSWER work
if you use the following patch:
===== faxd/FaxSend.c++ 1.42 vs edited =====
--- 1.42/faxd/FaxSend.c++ 2005-09-27 15:33:19 -04:00
+++ edited/faxd/FaxSend.c++ 2005-11-25 08:59:52 -05:00
@@ -331,7 +331,12 @@ FaxServer::sendFax(FaxRequest& fax, FaxM
case ClassModem::NOCARRIER: // no carrier detected on remote side
case ClassModem::BUSY: // busy signal
case ClassModem::NOANSWER: // no answer or ring back
- if (!clientInfo.getCalledBefore() && fax.ndials > retryMAX[callstat])
+ // If we are NOFCON, then we *know* we've called before, and want
+ // to error out on retryMAX[NOFCON].
+ // If we've actually called before, then we don't want to give up
+ // on BUSY/NOANSWER/NOCARRIER/DATACONN from retryMAX[*]
+ if ((callstat == ClassModem::NOFCON || !clientInfo.getCalledBefore())
+ && fax.ndials > retryMAX[callstat])
sendFailed(fax, send_failed, notice);
else if (fax.retrytime != 0)
sendFailed(fax, send_retry, notice, fax.retrytime);