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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: SNPPJob.c++,v 1.1.1.1 2005/11/11 21:32:03 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1995-1996 Sam Leffler
  4.  * Copyright (c) 1995-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. #include "config.h"
  27. #include "Sys.h"
  28. #include <ctype.h>
  29. #include <string.h>
  30. #include <errno.h>
  31. #if CONFIG_INETTRANSPORT
  32. extern "C" {
  33. #include <sys/socket.h>
  34. #include <netinet/in.h>
  35. #include <netdb.h>            // XXX
  36. }
  37. #endif
  38. #include "SNPPClient.h"
  39. #include "FaxConfig.h"
  40. SNPPJob::SNPPJob() {}
  41. SNPPJob::SNPPJob(const SNPPJob& other)
  42.     : mailbox(other.mailbox)
  43.     , pin(other.pin)
  44.     , passwd(other.passwd)
  45.     , subject(other.subject)
  46. {
  47.     queued = other.queued;
  48.     notify = other.notify;
  49.     holdTime = other.holdTime;
  50.     retryTime = other.retryTime;
  51.     maxRetries = other.maxRetries;
  52.     maxDials = other.maxDials;
  53.     serviceLevel = other.serviceLevel;
  54. }
  55. SNPPJob::~SNPPJob() {}
  56. #define valeq(a,b) (strcasecmp(a,b)==0)
  57. #define valneq(a,b,n) (strncasecmp(a,b,n)==0)
  58. bool
  59. SNPPJob::setNotification(const char* v0)
  60. {
  61.     const char* v = v0;
  62.     if (strneq(v, "when", 4)) {
  63. for (v += 4; isspace(*v); v++)
  64.     ;
  65.     }
  66.     if (valeq(v, "done"))
  67. notify = when_done;
  68.     else if (valneq(v, "req", 3))
  69. notify = when_requeued;
  70.     else if (valeq(v, "none") || valeq(v, "off"))
  71. notify = no_notice;
  72.     else if (valeq(v, "default"))
  73. setNotification(SNPP_DEFNOTIFY);
  74.     else
  75. return (false);
  76.     return (true);
  77. }
  78. void SNPPJob::setNotification(PageNotify n) { notify = n; }
  79. /*
  80.  * Create the mail address for a local user.
  81.  */
  82. void
  83. SNPPJob::setMailbox(const char* user)
  84. {
  85.     fxStr acct(user);
  86.     if (acct != "" && acct.next(0, "@!") == acct.length()) {
  87. static fxStr domainName;
  88. if (domainName == "") {
  89.     char hostname[64];
  90.     (void) gethostname(hostname, sizeof (hostname));
  91. #if CONFIG_INETTRANSPORT
  92.     struct hostent* hp = gethostbyname(hostname);
  93.     domainName = (hp ? hp->h_name : hostname);
  94. #else
  95.     domainName = hostname;
  96. #endif
  97. }
  98. mailbox = acct | "@" | domainName;
  99.     } else
  100. mailbox = acct;
  101.     // strip leading & trailing white space
  102.     mailbox.remove(0, mailbox.skip(0, " t"));
  103.     mailbox.resize(mailbox.skipR(mailbox.length(), " t"));
  104. }
  105. u_int
  106. SNPPJob::parseTime(const char* v)
  107. {
  108.     char* cp;
  109.     u_int t = (u_int) strtoul(v, &cp, 10);
  110.     if (cp) {
  111. while (isspace(*cp))
  112.     ;
  113. if (strncasecmp(cp, "min", 3) == 0)
  114.     t *= 60;
  115. else if (strncasecmp(cp, "hour", 4) == 0)
  116.     t *= 60*60;
  117. else if (strncasecmp(cp, "day", 3) == 0)
  118.     t *= 24*60*60;
  119.     }
  120.     return (t);
  121. }
  122. void SNPPJob::setRetryTime(const char* v) { retryTime = parseTime(v); }
  123. void SNPPJob::setRetryTime(u_int v) { retryTime = v; }
  124. extern int
  125. parseAtSyntax(const char* s, const struct tm& ref, struct tm& at0, fxStr& emsg);
  126. bool
  127. SNPPJob::setHoldTime(const char* s, fxStr& emsg)
  128. {
  129.     struct tm tts;
  130.     time_t now = Sys::now();
  131.     if (!parseAtSyntax(s, *localtime(&now), tts, emsg)) {
  132. emsg.insert(fxStr::format("%s: ", s));
  133. return (false);
  134.     } else {
  135. setHoldTime((u_int) mktime(&tts));
  136. return (true);
  137.     }
  138. }
  139. void SNPPJob::setHoldTime(u_int v) { holdTime = v; }
  140. void SNPPJob::setMaxTries(u_int n) { maxRetries = n; }
  141. void SNPPJob::setMaxDials(u_int n) { maxDials = n; }
  142. void SNPPJob::setPIN(const char* s) { pin = s; }
  143. void SNPPJob::setPassword(const char* s) { passwd = s; }
  144. void SNPPJob::setQueued(bool v) { queued = v; }
  145. void SNPPJob::setSubject(const char* s) { subject = s; }
  146. void SNPPJob::setServiceLevel(u_int n) { serviceLevel = n; }
  147. #define CHECK(x) { if (!(x)) goto failure; }
  148. #define CHECKCMD(x) CHECK(client.command(x) == SNPPClient::COMPLETE)
  149. #define CHECKCMD2(x,y) CHECK(client.command(x,y) == SNPPClient::COMPLETE)
  150. #define CHECKPARM(a,b) CHECK(client.siteParm(a,b))
  151. #define IFPARM(a,b,v) { if ((b) != (v)) CHECKPARM(a,b) }
  152. bool
  153. SNPPJob::createJob(SNPPClient& client, fxStr& emsg)
  154. {
  155.     if (holdTime != 0 && !client.setHoldTime((u_int) holdTime))
  156. goto failure;
  157.     if (subject != "")
  158. CHECKCMD2("SUBJ %s", (const char*) subject)
  159.     CHECKCMD2("LEVE %u", serviceLevel)
  160.     if (client.hasSiteCmd()) {
  161. CHECKPARM("FROMUSER", client.getSenderName())
  162. if (retryTime != (u_int) -1 && !client.setRetryTime(retryTime))
  163.     goto failure;
  164. IFPARM("MODEM", client.getModem(), ""); // XXX should be per-job state
  165. IFPARM("MAXDIALS", maxDials,    (u_int) -1)
  166. IFPARM("MAXTRIES", maxRetries,    (u_int) -1)
  167. CHECKPARM("MAILADDR", mailbox)
  168. CHECKPARM("NOTIFY",
  169.     notify == when_done ?     "done" :
  170.     notify == when_requeued ? "done+requeue" :
  171.       "none")
  172. CHECKPARM("JQUEUE", queued ? "yes" : "no");
  173.     }
  174.     return (client.newPage(pin, passwd, jobid, emsg));
  175. failure:
  176.     emsg = client.getLastResponse();
  177.     return (false);
  178. }
  179. #undef IFPARM
  180. #undef CHECKPARM
  181. #undef CHECKCMD
  182. #undef CHECK
  183. fxIMPLEMENT_ObjArray(SNPPJobArray, SNPPJob)