![]() |
Hi All! I try to setup Ecoin Diva 4 BRI ISDN card under Linux for Hylafax. Diva card give nice CID and DAD numbers in the RING string via /dev/ttydsXX inteface: RING CID: 5300 DAD: 5777 Unfortunately hylafax do not recognize this format. Howto get these two parameters to bin/faxrecvq ? I write simple hack against hylafax-4.1.8 , which one relace CIDNumber and CIDName with Diva CID and DAD. You can read and applay patch bellow. To activate feature add line in Your etc/config.ttydsXX file ModemResetCmds: "AT#CID=7" CIDNumber: "CID: [0-9]+" CIDName: "DAD: [0-9]+" where CIDNumber, CIDName is regular expressions. After Your bin/faxrecvq have two parameters more "CID: 5300" "DAD: 5777" Both parameters are very usable for fax dispatching. My Diva have empty MSN field and so i can receive calls to multiple numbers, how many local PBX administrator allow. I can setup more incoming fax numbers as Diva card line count, which is main idea to develop this. I hope in future Hylafax developers add CID and DAD number recognize for Diva and another ISDN cards. Aivils Stoss diff -Nurp hylafax-4.1.8/faxd/ClassModem.c++ hylafax-4.1.8-chg/faxd/ClassModem.c++ --- hylafax-4.1.8/faxd/ClassModem.c++ 2003-04-19 00:03:40.000000000 +0300 +++ hylafax-4.1.8-chg/faxd/ClassModem.c++ 2004-03-03 16:35:53.000000000 +0200 @@ -750,7 +750,7 @@ ClassModem::atResponse(char* buf, long m lastResponse = AT_OFFHOOK; break; case 'R': - if (streq(buf, "RING")) // NB: avoid match of RINGING + if (strneq(buf, "RING", 4)) // NB: avoid match of RINGING lastResponse = AT_RING; break; case '\020': @@ -1220,8 +1220,10 @@ ClassModem::waitForRings(u_int n, CallTy // to hear DTMF tones which are DID data, and we configure // RingExtended to be FAXCNG to then trigger ATA. atCmd(conf.ringResponse); - else + else { n--; + conf.parseCID(rbuf, cid); + } break; case AT_NOANSWER: case AT_NOCARRIER: diff -Nurp hylafax-4.1.8/faxd/ModemConfig.c++ hylafax-4.1.8-chg/faxd/ModemConfig.c++ --- hylafax-4.1.8/faxd/ModemConfig.c++ 2003-03-26 06:41:55.000000000 +0200 +++ hylafax-4.1.8-chg/faxd/ModemConfig.c++ 2004-03-04 12:59:48.000000000 +0200 @@ -521,10 +521,59 @@ ModemConfig::getRTNHandling(const char* void ModemConfig::parseCID(const char* rbuf, CallerID& cid) const { - if (strneq(rbuf, cidName, cidName.length())) - cid.name = cid.name | rbuf+cidName.length(); - if (strneq(rbuf, cidNumber, cidNumber.length())) - cid.number = cid.number | rbuf+cidNumber.length(); + int ret; + regmatch_t matchp[1]; + static char errbuf[256]; + static char cidname[256]; + static char cidnumber[256]; + + cidname[0] = '\0'; + cidnumber[0] = '\0'; + cid.name = cidname; + cid.number = cidnumber; + + ret = regexec( &cidNameReg, rbuf, 1, matchp, REG_EXTENDED); + if (ret && ret != REG_NOMATCH) { + regerror( ret, &cidNameReg, errbuf, 256 ); + cid.name = errbuf; + } + else if (matchp[0].rm_so > 0) { + strncpy(cidname, rbuf + matchp[0].rm_so, matchp[0].rm_eo - matchp[0].rm_so); + *(cidname + matchp[0].rm_eo - matchp[0].rm_so + 1) = '\0'; + } + + ret = regexec( &cidNumberReg, rbuf, 1, matchp, REG_EXTENDED); + if (ret && ret != REG_NOMATCH) { + regerror( ret, &cidNumberReg, errbuf, 256 ); + cid.number = errbuf; + } + else if (matchp[0].rm_so > 0) { + strncpy(cidnumber, rbuf + matchp[0].rm_so, matchp[0].rm_eo \ + - matchp[0].rm_so); + *(cidnumber + matchp[0].rm_eo - matchp[0].rm_so + 1) = '\0'; + } + cid.name = cidname; + cid.number = cidnumber; + +// if (strneq(rbuf, cidName, cidName.length())) +// cid.name = cid.name | rbuf+cidName.length(); +// if (strneq(rbuf, cidNumber, cidNumber.length())) +// cid.number = cid.number | rbuf+cidNumber.length(); +} + +void +ModemConfig::setRegex(regex_t *Reg, const char *value) +{ + int ret; + char errbuf[256]; + regfree(Reg); + ret = regcomp(Reg, value, REG_EXTENDED); + if (ret) { + regerror(ret, Reg, errbuf, 256); + configError("Unable copile regular expresion \"%s\", error: \"%s\"",\ + value, errbuf); + regfree(Reg); + } } bool @@ -533,8 +582,15 @@ ModemConfig::setConfigItem(const char* t u_int ix; if (findTag(tag, (const tags*)atcmds, N(atcmds), ix)) (*this).*atcmds[ix].p = parseATCmd(value); - else if (findTag(tag, (const tags*)strcmds, N(strcmds), ix)) + else if (findTag(tag, (const tags*)strcmds, N(strcmds), ix)) { (*this).*strcmds[ix].p = value; + if (streq(tag, "cidname")) { + setRegex(&cidNameReg, value); + } + else if (streq(tag, "cidnumber")) { + setRegex(&cidNumberReg, value); + } + } else if (findTag(tag, (const tags*)fillorders, N(fillorders), ix)) (*this).*fillorders[ix].p = getFill(value); else if (findTag(tag, (const tags*)numbers, N(numbers), ix)) diff -Nurp hylafax-4.1.8/faxd/ModemConfig.h hylafax-4.1.8-chg/faxd/ModemConfig.h --- hylafax-4.1.8/faxd/ModemConfig.h 2003-02-09 04:03:13.000000000 +0200 +++ hylafax-4.1.8-chg/faxd/ModemConfig.h 2004-03-04 12:19:30.000000000 +0200 @@ -30,6 +30,7 @@ */ #include "FaxConfig.h" #include "FaxModem.h" +#include "regex.h" struct ModemConfig : public FaxConfig { private: @@ -102,6 +103,8 @@ public: fxStr cidNumber; // pattern for number info u_int cidNameAnswerLength; // answer when CID received u_int cidNumberAnswerLength; // answer when CID received + regex_t cidNameReg; + regex_t cidNumberReg; // protocol timers u_int t1Timer; // T.30 T1 timer (ms) @@ -194,5 +197,6 @@ public: void parseCID(const char*, CallerID&) const; const fxStr& getFlowCmd(FlowControl) const; + void setRegex(regex_t *, const char *); }; #endif /* _ModemConfig_ */ ____________________ HylaFAX(tm) Users Mailing List _______________________ To subscribe/unsubscribe, click http://lists.hylafax.org/cgi-bin/lsg2.cgi On UNIX: mail -s unsubscribe hylafax-users-request@xxxxxxxxxxx < /dev/null *To learn about commercial HylaFAX(tm) support, mail sales@xxxxxxxxxxxx*