Modem.h
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:6k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: Modem.h,v 1.7 2008/09/14 10:33:12 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. #ifndef _Modem_
  27. #define _Modem_
  28. /*
  29.  * HylaFAX Queue Manager Abstract Modem.
  30.  */
  31. #include "Class2Params.h"
  32. #include "Str.h"
  33. #include "faxQueueApp.h"
  34. typedef unsigned int ModemState;
  35. class UUCPLock;
  36. class RE;
  37. class REDict;
  38. class fxStackBuffer;
  39. class Modem;
  40. class ModemGroup {
  41. private:
  42.     static REDict* classes; // registered modem classes
  43. public:
  44.     static void reset();
  45.     static void set(const fxStr& name, RE* re);
  46.     static RE* find(const char* name);
  47. };
  48. /*
  49.  * NB: This should be a private nested class but various
  50.  *     C++ compilers cannot grok it.
  51.  */
  52. class ModemLockWaitHandler : public IOHandler {
  53. private:
  54.     Modem& modem;
  55. public:
  56.     ModemLockWaitHandler(Modem&);
  57.     ~ModemLockWaitHandler();
  58.     void timerExpired(long, long);
  59. };
  60. /*
  61.  * Each modem server process that has identified itself has
  62.  * an instance of this class.  It contains all the information
  63.  * needed by the queuer to select and prepare outbound jobs.
  64.  * Modem processes communicate with the queuer through FIFO
  65.  * files to exchange server and job state changes and to export
  66.  * modem/server capabilities to the queuer.
  67.  */
  68. class Modem : public QLink {
  69. public:
  70.     enum {
  71. DOWN  = 0, // modem identified, but offline
  72. READY = 1, // modem ready for use
  73. BUSY  = 2, // modem in use
  74. EXEMPT = 3 // modem exempt from sending use
  75.     };
  76. private:
  77.     int fd; // cached open FIFO file
  78.     fxStr fifoName; // modem FIFO filename
  79.     fxStr devID; // modem device identifier
  80.     fxStr number; // modem phone number
  81.     fxStr commid; // communication identifier
  82.     ModemState state; // modem state
  83.     bool canpoll; // modem is capable of polling
  84.     u_short priority; // modem priority
  85.     Class2Params caps; // modem capabilities
  86.     UUCPLock* lock; // UUCP lockfile support
  87.     QLink triggers; // waiting specifically on this modem
  88. // Dispatcher handler for lock wait thread
  89.     ModemLockWaitHandler lockHandler;
  90.     static QLink list; // list of all modems
  91.     void setCapabilities(const char*); // specify modem capabilities
  92.     void setNumber(const char*); // specify modem phone number
  93.     void setCommID(const char*); // specify modem commid
  94.     void setState(ModemState); // specify modem state
  95.     friend class faxQueueApp;
  96.     friend class Trigger; // for triggers
  97. public:
  98.     Modem(const fxStr& devid);
  99.     virtual ~Modem();
  100.     static void CLEANUP (void);
  101.     static Modem& getModemByID(const fxStr& id);
  102.     static Modem* modemExists(const fxStr& id, bool notexempt = false);
  103.     static Modem* findModem(const Job& job, bool ignorebusy);
  104.     bool isInGroup(const fxStr& mgroup);
  105.     bool assign(Job&, bool ignorebusy); // assign modem
  106.     void release(); // release modem
  107.     void startLockPolling(long sec); // initiate polling thread
  108.     void stopLockPolling(); // terminate any active thread
  109.     const fxStr& getDeviceID() const; // return modem device ID
  110.     const fxStr& getNumber() const; // return modem phone number
  111.     ModemState getState() const; // return modem state
  112.     const Class2Params& getCapabilities() const;
  113.     u_int getPriority() const; // return modem scheduling priority
  114.     const fxStr& getCommID() const; // return communication ID
  115.     bool isCapable(const Job& job) const;
  116.     bool supports2D() const; // modem supports 2D-encoded fax
  117.     bool supportsMMR() const; // modem supports 2D-MMR encoding
  118.     bool supportsJBIG() const; // modem supports JBIG encoding
  119.     bool supportsVRes(float) const; // modem supports vertical resolution
  120.     bool supportsVR(u_int) const; // modem supports VR setting
  121.     // modem support fax page width
  122.     bool supportsPageWidthInMM(u_int) const;
  123.     bool supportsPageWidthInPixels(u_int) const;
  124.     // modem supports fax page length
  125.     bool supportsPageLengthInMM(u_int) const;
  126.     bool supportsPolling() const; // modem supports fax polling
  127.     // send message to modem FIFO
  128.     bool send(const char* msg, u_int len, bool cacheFd = true);
  129.     static void broadcast(const fxStr&); // broadcast msg to all FIFOs
  130.     void encode(fxStackBuffer&) const; // encode for ModemExt
  131. };
  132. inline bool Modem::supportsPolling() const { return canpoll; }
  133. inline const fxStr& Modem::getDeviceID() const { return devID; }
  134. inline const fxStr& Modem::getNumber() const { return number; }
  135. inline ModemState Modem::getState() const { return state; }
  136. inline const Class2Params& Modem::getCapabilities() const { return caps; }
  137. inline u_int Modem::getPriority() const { return priority; }
  138. inline const fxStr& Modem::getCommID() const { return commid; }
  139. /*
  140.  * Modem iterator class; for iterating
  141.  * over the set of known modems.
  142.  */
  143. class ModemIter {
  144. private:
  145.     const QLink* head;
  146.     QLink* ql;
  147. public:
  148.     ModemIter(QLink& q) { head = &q; ql = q.next; }
  149.     ~ModemIter() {}
  150.     void operator=(QLink& q) { head = &q; ql = q.next; }
  151.     void operator++() { ql = ql->next; }
  152.     void operator++(int) { ql = ql->next; }
  153.     operator Modem&() const { return *(Modem*)ql; }
  154.     operator Modem*() const { return (Modem*) ql; }
  155.     Modem& modem() const { return *(Modem*)ql; }
  156.     bool notDone() { return ql != head; }
  157. };
  158. #endif /* _Modem_ */