Class0.c++
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:4k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: Class0.c++,v 1.4 2006/12/07 19:27:54 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1994-1996 Sam Leffler
  4.  * Copyright (c) 1994-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. /*
  27.  * Class 0 (data) Modem Driver Interface.
  28.  */
  29. #include "Class0.h"
  30. #include "ModemServer.h"
  31. #include "class2.h" // XXX for SERVICE_DATA
  32. Class0Modem::Class0Modem(ModemServer& s, const ModemConfig& c)
  33.     : ClassModem(s, c)
  34. {
  35. }
  36. Class0Modem::~Class0Modem()
  37. {
  38. }
  39. bool
  40. Class0Modem::setupModem(bool isSetup)
  41. {
  42.     if (!selectBaudRate(conf.maxRate, conf.flowControl, conf.flowControl))
  43. return (false);
  44.     // Query service support information
  45.     fxStr s;
  46.     if (doQuery(conf.classQueryCmd, s, 5000) && parseRange(s, modemServices))
  47. traceBits(modemServices & SERVICE_ALL, serviceNames);
  48.     if ((modemServices & SERVICE_DATA) == 0)
  49. return (false);
  50.     atCmd(conf.class0Cmd);
  51.     setupFlowControl(flowControl);
  52.     /*
  53.      * Query manufacturer, model, and firmware revision.
  54.      * We use the manufacturer especially as a key to
  55.      * working around firmware bugs (yech!).
  56.      */
  57.     if (setupManufacturer(modemMfr)) {
  58. modemCapability("Mfr " | modemMfr);
  59. modemMfr.raisecase();
  60.     }
  61.     (void) setupModel(modemModel);
  62.     (void) setupRevision(modemRevision);
  63.     if (modemModel != "")
  64. modemCapability("Model " | modemModel);
  65.     if (modemRevision != "")
  66. modemCapability("Revision " | modemRevision);
  67.     return (true);
  68. }
  69. /*
  70.  * Send the modem any commands needed to force use of
  71.  * the specified flow control scheme.
  72.  */
  73. bool
  74. Class0Modem::setupFlowControl(FlowControl fc)
  75. {
  76.     switch (fc) {
  77.     case FLOW_NONE: return atCmd(conf.noFlowCmd);
  78.     case FLOW_XONXOFF: return atCmd(conf.softFlowCmd);
  79.     case FLOW_RTSCTS: return atCmd(conf.hardFlowCmd);
  80.     }
  81.     return (true);
  82. }
  83. CallStatus
  84. Class0Modem::dial(const char* number, const char* origin, fxStr& emsg)
  85. {
  86.     return (ClassModem::dial(number, origin, emsg));
  87. }
  88. /*
  89.  * Wait-for and process a dial command response.
  90.  */
  91. CallStatus
  92. Class0Modem::dialResponse(fxStr&)
  93. {
  94.     ATResponse r;
  95.     do {
  96. r = atResponse(rbuf, conf.dialResponseTimeout);
  97. switch (r) {
  98. case AT_ERROR:     return (ERROR); // error in dial command
  99. case AT_BUSY:     return (BUSY); // busy signal
  100. case AT_NOCARRIER:  return (NOCARRIER); // no carrier detected
  101. case AT_OK:     return (NOCARRIER); // (for AT&T DataPort)
  102. case AT_NODIALTONE: return (NODIALTONE);// local phone connection hosed
  103. case AT_NOANSWER:   return (NOANSWER); // no answer or ring back
  104. case AT_TIMEOUT:    return (FAILURE); // timed out w/o response
  105. case AT_CONNECT:    return (OK); // data connection
  106. }
  107.     } while (r == AT_OTHER && isNoise(rbuf));
  108.     return (FAILURE);
  109. }
  110. bool Class0Modem::isFaxModem() const { return false; }