]> git.ipfire.org Git - thirdparty/HylaFAX.git/commitdiff
Bug 420. Adds SaveUnconfirmedPages option - defaults to true.
authorLee Howard <faxguy@howardsilvan.com>
Tue, 8 Jul 2003 18:36:29 +0000 (18:36 +0000)
committerLee Howard <faxguy@howardsilvan.com>
Tue, 8 Jul 2003 18:36:29 +0000 (18:36 +0000)
faxd/Class1Recv.c++
faxd/Class2Recv.c++
faxd/FaxRecv.c++
faxd/ModemConfig.c++
faxd/ModemConfig.h
man/hylafax-config.4f

index 62578da4c4bd2ec8d91927d1dbc7e63c34c3e9ee..0da6c32f20a5f226cb334eb1e42a645490483319 100644 (file)
@@ -498,6 +498,7 @@ top:
        if (recvFrame(frame, timer)) {
            switch (lastPPM = frame.getFCF()) {
            case FCF_DIS:                       // XXX no support
+               if (prevPage && !pageGood) recvResetPage(tif);
                protoTrace("RECV DIS/DTC");
                emsg = "Can not continue after DIS/DTC";
                return (false);
@@ -506,6 +507,7 @@ top:
            case FCF_NSS:
            case FCF_TSI:
            case FCF_DCS:
+               if (prevPage && !pageGood) recvResetPage(tif);
                // look for high speed carrier only if training successful
                messageReceived = !(
                       FaxModem::recvBegin(emsg)
@@ -519,6 +521,7 @@ top:
            case FCF_PRI_MPS:                   // PRI-MPS
            case FCF_PRI_EOM:                   // PRI-EOM
            case FCF_PRI_EOP:                   // PRI-EOP
+               if (prevPage && !pageGood) recvResetPage(tif);
                tracePPM("RECV recv", lastPPM);
                if (!prevPage) {
                    /*
@@ -591,7 +594,6 @@ top:
                     * Reset the TIFF-related state so that subsequent
                     * writes will overwrite the previous data.
                     */
-                   recvResetPage(tif);
                    messageReceived = true;     // expect DCS next
                }
                break;
@@ -599,8 +601,14 @@ top:
                protoTrace("RECV recv DCN");
                emsg = "COMREC received DCN";
                recvdDCN = true;
+               if (prevPage && conf.saveUnconfirmedPages) {
+                   TIFFWriteDirectory(tif);
+                   protoTrace("RECV keeping unconfirmed page");
+                   return (true);
+               }
                return (false);
            default:
+               if (prevPage && !pageGood) recvResetPage(tif);
                emsg = "COMREC invalid response received";
                return (false);
            }
@@ -634,8 +642,14 @@ top:
         */
        if (atCmd(thCmd, AT_NOTHING) && atResponse(rbuf, 0) == AT_CONNECT && recvBegin(emsg))
            goto top;
-    } else
+    } else {
        emsg = "T.30 T2 timeout, expected page not received";
+       if (prevPage && conf.saveUnconfirmedPages) {
+           TIFFWriteDirectory(tif);
+           protoTrace("RECV keeping unconfirmed page");
+           return (true);
+       }
+    }
     return (false);
 }
 
index 3d8d5021097dbe0888f928be5698f3c647fafdf1..931bf3259cbf23722e9378b88b0daa448bae7f3a 100644 (file)
@@ -129,6 +129,8 @@ bool
 Class2Modem::recvPage(TIFF* tif, u_int& ppm, fxStr& emsg)
 {
     int ppr;
+    bool prevPage = false;
+    bool pageGood = false; 
 
     do {
        ppm = PPM_EOP;
@@ -145,20 +147,25 @@ Class2Modem::recvPage(TIFF* tif, u_int& ppm, fxStr& emsg)
        do {
            switch (r = atResponse(rbuf, conf.pageStartTimeout)) {
            case AT_FDCS:                       // inter-page DCS
+               if (prevPage && !pageGood) recvResetPage(tif);
                (void) recvDCS(rbuf);
                break;
            case AT_FTSI:
+               if (prevPage && !pageGood) recvResetPage(tif);
                recvTSI(stripQuotes(skipStatus(rbuf)));
                break;
        case AT_FSA:
+               if (prevPage && !pageGood) recvResetPage(tif);
                recvSUB(stripQuotes(skipStatus(rbuf)));
                break;
 #ifdef notdef
        case AT_FPA:
+               if (prevPage && !pageGood) recvResetPage(tif);
                recvSEP(stripQuotes(skipStatus(rbuf)));
                break;
 #endif
        case AT_FPW:
+               if (prevPage && !pageGood) recvResetPage(tif);
                recvPWD(stripQuotes(skipStatus(rbuf)));
                break;
            case AT_TIMEOUT:
@@ -177,8 +184,15 @@ Class2Modem::recvPage(TIFF* tif, u_int& ppm, fxStr& emsg)
         *     don't understand the FillOrder tag!
         */
        recvSetupTIFF(tif, group3opts, FILLORDER_LSB2MSB);
-       if (!recvPageData(tif, emsg) || !recvPPM(tif, ppr))
+       if (!recvPageData(tif, emsg)) {
+           prevPage = false;
            goto bad;
+       }
+       else {
+           prevPage = true;
+           if (!recvPPM(tif, ppr))
+               goto bad;
+       }
        if (!waitFor(AT_FET))           // post-page message status
            goto bad;
        ppm = atoi(skipStatus(rbuf));
@@ -218,10 +232,11 @@ Class2Modem::recvPage(TIFF* tif, u_int& ppm, fxStr& emsg)
          */
         ppr = PPR_RTN;
 #endif
-       if (ppr & 1)
+       if (ppr & 1) {
+           pageGood = true;
            TIFFWriteDirectory(tif);    // complete page write
-       else
-           recvResetPage(tif);         // reset to overwrite data
+       else
+           pageGood = false;
        tracePPR("RECV send", ppr);
        if (ppr & 1)                    // page good, work complete
            return (true);
@@ -230,6 +245,11 @@ bad:
     if (hangupCode[0] == 0)
        processHangup("90");                    // "Unspecified Phase C error"
     emsg = hangupCause(hangupCode);
+    if (prevPage && conf.saveUnconfirmedPages) {
+       TIFFWriteDirectory(tif);
+       protoTrace("RECV keeping unconfirmed page");
+       return (true);
+    }
     return (false);
 }
 
index 996f985c2ed649c383a3f123eab1c68db8af9569..4c83e4fc59531fd1d7f5694b436082cbb080059b 100644 (file)
@@ -46,7 +46,7 @@ FaxServer::recvFax(const CallerID& cid)
 {
     traceProtocol("RECV FAX: begin");
 
-    fxStr emsg;
+    fxStr emsg = "";
     FaxRecvInfoArray docs;
     FaxRecvInfo info;
     bool faxRecognized = false;
@@ -258,6 +258,7 @@ FaxServer::recvFaxPhaseD(TIFF* tif, FaxRecvInfo& info, u_int& ppm, fxStr& emsg)
        info.time = (u_int) getPageTransferTime();
        info.params = modem->getRecvParams();
        notifyPageRecvd(tif, info, ppm);
+       if (emsg != "") return (false);         // got page with fatal error
        if (PPM_PRI_MPS <= ppm && ppm <= PPM_PRI_EOP) {
            emsg = "Procedure interrupt received, job terminated";
            return (false);
index 4cdb601f9dfb371aa90c353a0fe7f0a6317ec27c..0e5fac631764c0f76fa44d81eba764712dcd21d9 100644 (file)
@@ -230,6 +230,7 @@ ModemConfig::setupConfig()
     setVolumeCmds("ATM0 ATL0M1 ATL1M1 ATL2M1 ATL3M1");
     recvDataFormat     = DF_ALL;               // default to no transcoding
     rtnHandling         = FaxModem::RTN_RETRANSMIT; // retransmit until MCF/MPS
+    saveUnconfirmedPages = true;               // keep unconfirmed pages
 }
 
 void
@@ -564,6 +565,8 @@ ModemConfig::setConfigItem(const char* tag, const char* value)
        class2UseHex = getBoolean(value);
     else if (streq(tag, "class2rtfcc"))
        class2RTFCC = getBoolean(value);
+    else if (streq(tag, "saveunconfirmedpages"))
+       saveUnconfirmedPages = getBoolean(value);
     else
        return (false);
     return (true);
index 1f10c2333a0c68e02a6b59df8be4d49e97ac434b..22dfc949321a1c822ee49abe1abc4e4de826cf30 100644 (file)
@@ -189,6 +189,7 @@ public:
     u_int      recvDataFormat;         // received facsimile data format
 
     RTNHandling rtnHandling;            // RTN signal handling method
+    bool       saveUnconfirmedPages;   // don't delete unconfirmed pages
     
         virtual ~ModemConfig();
 
index 48eccb57049121e806e1e90401480001d781378f..e078d322dff22e94653a479c7968ceaba3689389 100644 (file)
@@ -181,6 +181,7 @@ RingsBeforeAnswer   integer \s-10\s+1       rings to wait before answering phone
 RingTimout     integer \s-16000\s+1    timeout in ms after RING before reset
 RingVoice      string  \-      distinctive ring voice call identifier
 RTNHandlingMethod      string  \s-1Retransmit\s+1      RTN signal handling method      
+SaveUnconfirmedPages   boolean \s-1true\s+1    save or delete unconfirmed pages
 SendFaxCmd\(S1 string  \s-1bin/faxsend\s+1     fax transmit command script
 SendPageCmd\(S1        string  \s-1bin/pagesend\s+1    pager transmit command script
 SendUUCPCmd\(S1        string  \s-1bin/uucpsend\s+1    \s-1UUCP\s+1 transmit command script
@@ -1116,6 +1117,12 @@ remote to decide what to do (accept our decision or hang up). Thus one page will
 (or will not) be missed but we have a chance to successfully send all other pages.
 This behaviour can be activated by ``Ignore'' value.
 .TP
+.B SaveUnconfirmedPages
+Whether or not to save a received facsimile image page if the sender disconnects
+without sending the post-page message, without hearing our message confirmation,
+without retraining as requested, or otherwise breaks fax protocol following such
+pages for which the sender should not have a ``receipt confirmation''.
+.TP
 .B SendFaxCmd\(S1
 The command to use to process outbound facsimile jobs; see
 .IR faxsend (${MANNUM1_8}).