common-functions.sh.in
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:12k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. #! @SCRIPT_SH@
  2. #    $Id: common-functions.sh.in,v 1.36 2009/09/08 03:18:43 faxguy Exp $
  3. #
  4. # This holds various functions that are common to the
  5. # various bin scripts.
  6. #
  7. #
  8. # Produce mailable encoding for binary files.
  9. #
  10. encode()
  11. {
  12.     if [ ! -f "$1" ]; then
  13. return # encode what?
  14.     fi
  15.     if [ -x "$MIMENCODE" ]; then
  16. $MIMENCODE < $1 2>$ERRORSTO
  17.     elif [ -x "$UUENCODE" ]; then
  18. if [ "$ENCODING" = "base64" ]; then
  19.     $UUENCODE -m $1 ==== | $GREP -v "====$" 2>$ERRORSTO
  20. else
  21.     $UUENCODE $1 $1 2>$ERRORSTO
  22. fi
  23.     else
  24. # Do not use "-x" for backward compatibility; even if it fails
  25. # this is last chance to encode data, so there's nothing to lose.
  26. $MIMENCODE < $1 2>$ERRORSTO
  27.     fi
  28. }
  29. #
  30. # For getting all of the "faxinfo" items to line up.  As the CallID tags
  31. # can be customized we must take unmodified faxinfo output into account.
  32. #
  33. setInfoSize()
  34. {
  35.     INFOSIZE=`$INFO -n $1 | $SED 's/:.*//g' | $SED q | wc -L`
  36.     for ITEM in DICTSENDER DICTPAGES DICTQUALITY DICTSIZE DICTRECEIVED 
  37. DICTTIMETORECV DICTSIGNALRATE DICTDATAFORMAT DICTERRCORRECT 
  38. DICTCALLID1 DICTCALLID2 DICTCALLID3 DICTCALLID4 DICTCALLID 
  39. DICTCALLID6 DICTCALLID7 DICTRECEIVEDON DICTCOMMID; do
  40. THISLEN="`eval echo \""$"$ITEM\" | wc -L | $SED 's/ //g'`"
  41. if [ $THISLEN -gt $INFOSIZE ]; then INFOSIZE=$THISLEN; fi
  42.     done
  43. }
  44. #
  45. # For getting all of the notify job items to line up.
  46. #
  47. setItemSize()
  48. {
  49.     ITEMSIZE=0
  50.     for ITEM in DICTDESTINATION DICTJOBID DICTGROUPID DICTSENDER DICTMAILADDR 
  51. DICTCOMMID DICTMODEM DICTSUBMITTEDFROM DICTPAGEWIDTH 
  52. DICTPAGELENGTH DICTRES DICTSTATUS DICTDIALOGS DICTDIALS 
  53. DICTCALLS DICTPAGES DICTATTEMPTS DICTDIRNUM DICTRECEIVER DICTQUALITY 
  54. DICTPAGEWIDTH DICTPAGELENGTH DICTDATAFORMAT DICTREMOTEEQUIPMENT 
  55. DICTREMOTESTATION DICTSIGNALRATE; do
  56. THISLEN="`eval echo \""$"$ITEM\" | wc -L | $SED 's/ //g'`"
  57. if [ $THISLEN -gt $ITEMSIZE ]; then ITEMSIZE=$THISLEN; fi
  58.     done
  59. }
  60. faxInfo()
  61. {
  62.     $INFO -n $1 | $SED -e 's/^ *//g' 
  63. -e "s/^ *Sender:/$DICTSENDER:/" 
  64. -e "s/^Pages:/$DICTPAGES:/" 
  65. -e "s/^Quality:/$DICTQUALITY:/" 
  66. -e "s/^Page:/$DICTSIZE:/" 
  67. -e "s/^Received:/$DICTRECEIVED:/" 
  68. -e "s/^TimeToRecv:/$DICTTIMETORECV:/" 
  69. -e "s/^SignalRate:/$DICTSIGNALRATE:/" 
  70. -e "s/^DataFormat:/$DICTDATAFORMAT:/" 
  71. -e "s/^ErrCorrect:/$DICTERRCORRECT:/" 
  72. -e "s/^CallID1:/$DICTCALLID1:/" 
  73. -e "s/^CallID2:/$DICTCALLID2:/" 
  74. -e "s/^CallID3:/$DICTCALLID3:/" 
  75. -e "s/^CallID4:/$DICTCALLID4:/" 
  76. -e "s/^CallID5:/$DICTCALLID5:/" 
  77. -e "s/^CallID6:/$DICTCALLID6:/" 
  78. -e "s/^CallID7:/$DICTCALLID7:/" 
  79. -e "s/ Yes$/ $DICTYES/" 
  80. -e "s/ No$/ $DICTNO/" 
  81. -e "s/ Normal$/ $DICTNORMAL/" 
  82. -e "s/ Fine$/ $DICTFINE/" 
  83. -e 's/:/|/' | 
  84. printFormatted $INFOSIZE
  85. }
  86. printFormatted()
  87. {
  88.     $AWK -F| -v s=$1 'BEGIN { size = s; } { ("echo ""$1"" | wc -L") | getline ilen; close("echo ""$1"" | wc -L"); printf "%"size-ilen"s%s:%sn", "",$1,$2 }'
  89. }
  90. #
  91. # Export qfile content to environment
  92. # parseQfile(prefix, filename)
  93. # Both parameters can be omitted. Defaults to no prefix and $QFILE.
  94. #
  95. parseQfile()
  96. {
  97.     # In shell scripts, there are no special characters in hard-quoted
  98.     # strings (quoted with (')). Single-quotes can't even be escaped
  99.     # inside such strings and must be put outside of them. We thus replace
  100.     # (') with (''') which terminates the current string, adds a single
  101.     # quote and starts a new string.
  102.     #
  103.     # We no longer escape newlines, because we don't eval
  104.     #
  105.     # print out variable name and value so we can eval it in the shell
  106.     #
  107.     VAR_PREFIX="$1"
  108.     if [ -n "$2" ] ; then
  109.         FILENAME=$2;
  110.     else
  111.         FILENAME=$QFILE;
  112.     fi
  113.     if [ ! -f "$FILENAME" ] ; then
  114.         return # cannot do much more without a file
  115.     fi
  116.     $AWK -F: '
  117.     function p(varname,val)
  118.     {
  119.         gsub(/47/, "47\4747", val);
  120.         # mawk sees 047 as decimal 47 rather than octal, so we use the decimal
  121.         # value of the quote character: 39.
  122.         printf "%s%s=%c%s%cn",var_prefix,varname,39,val,39
  123.         printf "export %s%sn",var_prefix,varname
  124.     }
  125.     BEGIN {
  126.         var_prefix="'"$VAR_PREFIX"'";
  127.         nfiles = 0;
  128.         npins = 0;
  129.     }
  130.     /^nsf/ { p("equipment", $3); p("station", $5); next; }
  131.     /^external/    { p("number", $2); next; }      # override unprocessed number
  132.     /^regarding/    { regarding = $0; sub("regarding:", "", regarding); p("regarding", regarding); next; }
  133.     /^jobtag/    { jobtag = $0; sub("jobtag:", "", jobtag); p("jobtag", jobtag); next; }
  134.     # status needs to be used in the shell as faxstatus since status is reserved word
  135.     /^status:/    { status = $0; sub("status:", "", status);
  136.               while ($0 ~ /\\$/ && getline > 0) {
  137.                   sub(/\\$/, "\n", status);
  138.                   status = status $0;
  139.               } p("faxstatus", status);
  140.               next;
  141.             }
  142.     /^[!]*post/    { p("files_"++nfiles, $4); p("filetype_"nfiles, "PostScript"); next; }
  143.     /^[!]*tiff/    { p("files_"++nfiles, $4); p("filetype_"nfiles, "TIFF"); next; }
  144.     /^[!]*pdf/    { p("files_"++nfiles, $4); p("filetype_"nfiles, "PDF"); next; }
  145.     /^[!]*pcl/    { p("files_"++nfiles, $4); p("filetype_"nfiles, "PCL"); next; }
  146.     /^page:/    { p("pins_"++npins, $4); next; }
  147.     /^data:/    { p("files_"++nfiles, $4); next; }
  148.     /^poll/        { p("poll", " -p"); next; }
  149.     # Only parse remaining valid lines and allows for colons to appear in the value part
  150.     /^[a-z]+:/     { str = $0; sub($1":", "", str); p($1, str); next; }
  151.     {printf "# Invalid line> %sn", $0;}
  152.     END { p("nfiles", nfiles); p("npins", npins) } ' $FILENAME > $TMPDIR/qfile-awk.sh
  153.     . $TMPDIR/qfile-awk.sh
  154. }
  155. #
  156. # Produce faxable TIFF (MH, MR, MMR) from a PDF or Postscript file.
  157. #
  158. gs2fax()
  159. {
  160.     test -z "$files" && files="-" # read from stdin
  161.     case "${pagewidth}x${pagelength}" in
  162. 1728x280|1728x279|2592x280|2592x279|3456x280|3456x279) # 279.4mm is actually correct...
  163.     paper=letter;;
  164. 1728x364|2592x364|3456x364) 
  165.     paper=legal;;
  166. *x296|*x297) # more roundoff problems...
  167.     paper=a4;;
  168. *x364)
  169.     paper=b4;;
  170. 2432x*|3648x*|4864x*)
  171.     paper=a3;;
  172. *)
  173.     echo "$0: Unsupported page size: $pagewidth x $pagelength";
  174.     exit 254;; # causes document to be rejected
  175.     esac
  176.     #
  177.     # The image must end up with a pixel width according to T.32 Table 21.
  178.     # Ghostscript contains code to fixate a4 and letter to 1728 pixels
  179.     # when using 196-204 dpi and tiffg3/4, it supposedly does the same for
  180.     # B4 but not for A3, thus the floats are needed (for A3's benefit).
  181.     #
  182.     # See ghostscript/doc/Devices.htm under -dAdjustWidth=1 (default).
  183.     # Use -dAdjustWidth=0 to disable.  With the right patch,
  184.     # http://bugs.ghostscript.com/show_bug.cgi?id=688064
  185.     # AdjustWidth can be made to specify the pagewidth directly and
  186.     # replace -dFIXEDMEDIA to permit TIFFs to be produced with
  187.     # varied lengths.
  188.     #
  189.     # Another alternative to -dFIXEDMEDIA is -dPDFFitPage which has the 
  190.     # difference of "resizing" images to fit the page rather than cutting
  191.     # them off.
  192.     #
  193.     # And yet another alternative is to use FIXEDWIDTH='bin/auto-rotate.ps'
  194.     # which should rotate all pages to portrait and adjust to fit A4 page
  195.     # size.  (Mixed page sizes are not supported by it.)
  196.     #
  197.     case "$paper" in
  198. a4)
  199.     case "$pagewidth" in
  200. 2592) hres=313.65;; # VR_300X300
  201. 3456) hres=418.20;; # VR_R16
  202. *) hres=209.10;; # everything else, 1728 pixels
  203.     esac;;
  204. b4)
  205.     case "$pagewidth" in
  206. 3072) hres=311.97;; # VR_300X300
  207. 4096) hres=415.95;; # VR_R16
  208. *) hres=207.98;; # everything else, 2048 pixels
  209.     esac;;
  210. a3)
  211.     case "$pagewidth" in
  212. 3648) hres=311.94;; # VR_300X300
  213. 4864) hres=415.93;; # VR_R16
  214. *) hres=207.96;; # everything else, 2432 pixels
  215.     esac;;
  216. *) # letter, legal
  217.     case "$pagewidth" in
  218. 2592) hres=304.94;; # VR_300X300
  219. 3456) hres=406.59;; # VR_R16
  220. *) hres=203.29;; # everything else, 1728 pixels
  221.     esac;;
  222.     esac
  223.     #
  224.     # The sed work fixes bug in Windows-generated
  225.     # PostScript that causes certain international
  226.     # character marks to be placed incorrectly.
  227.     #
  228.     #    | $SED -e 's/yAscent Ascent def/yAscent 0 def/g' 
  229.     #
  230.     # NB: unfortunately it appears to break valid PostScript;
  231.     #     so it's been disabled.
  232.     #
  233.     # Suggestion from "Alan Sparks" <asparks@nss.harris.com>,
  234.     # Add the -DFIXEDMEDIA argument to the last command in ps2fax.
  235.     # This prevents page sizing within the documents from altering
  236.     # the command-line page size specification.  This prevents
  237.     # TIFFs to be made with pages of varied lengths, however.
  238.     # See the comments on AdjustWidth above.
  239.     #
  240.     FIXEDWIDTH="-dFIXEDMEDIA"
  241.     #
  242.     # Ghostscript's default dithering with the fax drivers is 
  243.     # usually unsatisfactory.  So we have an option to process
  244.     # the image through libtiff's Floyd-Steinberg dithering.
  245.     # This will be a bit more costly on CPU and image preparation
  246.     # time... enable it cautiously.
  247.     #
  248.     # An alternative to libtiff Floyd-Steinberg dithering would
  249.     # be to use a threshold array based stochastic mask within
  250.     # Ghostscript.  However, this alternative may perform less 
  251.     # than ideally on unmodified Ghostscript versions prior to 8.62.
  252.     # See: http://bugs.ghostscript.com/show_bug.cgi?id=689633
  253.     #
  254.     DITHERING=default
  255.     #
  256.     # Apply customizations such as watermarking.
  257.     #
  258.     if [ -f etc/FaxModify ]; then
  259. . etc/FaxModify
  260.     fi
  261.     if [ "$DITHERING" = "gs-stocht" ]; then
  262. $CAT $files | $PS -q 
  263.     -sDEVICE=$device 
  264.     -dNOPAUSE 
  265.     -dSAFER=true 
  266.     -sPAPERSIZE=$paper 
  267.     -dBATCH 
  268.     -r$hresx$vres 
  269.     "-sOutputFile=$out" 
  270.     $FIXEDWIDTH 
  271.     stocht.ps -c "<< /HalftoneMode 1 >> setuserparams" -
  272. return
  273.     fi
  274.     if [ "$DITHERING" = "libtiff-fs" ] && ($PS -h | $GREP tiff24nc >/dev/null 2>&1) && 
  275.        [ -x $TIFFBIN/tiff2bw ] && [ -x $TIFFBIN/tiffdither ] && [ -x $TIFFBIN/tiff2ps ] && 
  276.        [ -x $TIFFBIN/tiffsplit ] && [ -x $TIFFBIN/tiffcp ]; then
  277. $PS -q -sDEVICE=tiff24nc -dNOPAUSE -dSAFER=true -sPAPERSIZE=$paper 
  278.     -dBATCH -r$hresx$vres "-sOutputFile=$out.1" $FIXEDWIDTH $files
  279. # Both tiff2bw and tiffdither only operate on single pages, so...
  280. mkdir tmpdir.$$
  281. cd tmpdir.$$
  282. $TIFFBIN/tiffsplit ../$out.1
  283. for i in *; do
  284.     $TIFFBIN/tiff2bw $i $i.2
  285.     $TIFFBIN/tiffdither $i.2 $i.3
  286.     $RM -f $i $i.2
  287. done
  288. $TIFFBIN/tiffcp * ../$out.2
  289. $RM -f *
  290. cd ..
  291. rmdir tmpdir.$$
  292. #
  293. # Unfortunately, this process leaves the image with Photometric of min-is-black, which
  294. # is opposite from what we need for faxing.  So we have to run it again through gs.
  295. #
  296. $TIFFBIN/tiff2ps -a $out.2 > $out.3
  297. files=$out.3
  298.     else
  299. DITHERING=default
  300.     fi
  301.     $PS -q 
  302. -sDEVICE=$device 
  303. -dNOPAUSE 
  304. -dSAFER=true 
  305. -sPAPERSIZE=$paper 
  306. -dBATCH 
  307. -r$hresx$vres 
  308. "-sOutputFile=$out" 
  309. $FIXEDWIDTH 
  310. $files
  311.     if [ "$DITHERING" = "libtiff-fs" ]; then
  312. $RM -f $out.1 $out.2 $out.3
  313.     fi
  314. }
  315. SetupPrivateTmp()
  316. {
  317.     if [ -d "$HYLAFAX_TMPDIR" ]; then
  318.         # Private temp area already created.
  319.         return
  320.     fi
  321.     # Would have liked to use -t, but older mktemp don't support it.
  322.     if [ -z "$TMPDIR" ] || [ ! -w "$TMPDIR" ]; then
  323.         TMPDIR="/tmp"
  324.     fi
  325.     HYLAFAX_TMPDIR=`mktemp -d $TMPDIR/hylafaxtmp-XXXXXXXX 2>/dev/null` || {
  326.         HYLAFAX_TMPDIR="$TMPDIR/hylafaxtmp-$RANDOM-$RANDOM-$RANDOM-$$"
  327.         mkdir -m 0700 "$HYLAFAX_TMPDIR"
  328.     }
  329.     if [ $? != 0 ]
  330.     then
  331. echo "Couldn't setup private temp area - exiting!" 1>&2
  332. exit 1
  333.     fi
  334.     # We want any called programs to use our tmp dir.
  335.     TMPDIR=$HYLAFAX_TMPDIR
  336.     export TMPDIR
  337.     trap cleanupExit 0
  338.     trap "hfExit 1" 1 2 15
  339. }
  340. CleanupPrivateTmp ()
  341. {
  342.     if [ -d "$HYLAFAX_TMPDIR" ]
  343.     then
  344. rm -Rf "$HYLAFAX_TMPDIR"
  345.     fi
  346. }
  347. cleanupExit ()
  348. {
  349.     trap - 0 1 2 15
  350.     CleanupPrivateTmp
  351. }
  352. hfExit ()
  353. {
  354.     cleanupExit
  355.     exit $1
  356. }