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

传真(Fax)编程

开发平台:

C/C++

  1. /*
  2.  * Copyright (c) 1990-1996 Sam Leffler
  3.  * Copyright (c) 1991-1996 Silicon Graphics, Inc.
  4.  * HylaFAX is a trademark of Silicon Graphics
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and 
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the names of
  10.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Sam Leffler and Silicon Graphics.
  13.  * 
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  17.  * 
  18.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  19.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  20.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  22.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  23.  * OF THIS SOFTWARE.
  24.  */
  25. #include "FaxParams.h"
  26. #include "Class2Params.h"
  27. #include "SystemLog.h"
  28. const int FaxParams::BITNUM_V8_CAPABLE =  6;
  29. const int FaxParams::BITNUM_FRAMESIZE_DIS =  7;
  30. const int FaxParams::BITNUM_T4XMTR =  9;
  31. const int FaxParams::BITNUM_T4RCVR = 10;
  32. const int FaxParams::BITNUM_SIGRATE_11 = 11;
  33. const int FaxParams::BITNUM_SIGRATE_12 = 12;
  34. const int FaxParams::BITNUM_SIGRATE_13 = 13;
  35. const int FaxParams::BITNUM_SIGRATE_14 = 14;
  36. const int FaxParams::BITNUM_VR_FINE = 15;
  37. const int FaxParams::BITNUM_2DMR = 16;
  38. const int FaxParams::BITNUM_WIDTH_17 = 17;
  39. const int FaxParams::BITNUM_WIDTH_18 = 18;
  40. const int FaxParams::BITNUM_LENGTH_19 = 19;
  41. const int FaxParams::BITNUM_LENGTH_20 = 20;
  42. const int FaxParams::BITNUM_ST_21 = 21;
  43. const int FaxParams::BITNUM_ST_22 = 22;
  44. const int FaxParams::BITNUM_ST_23 = 23;
  45. const int FaxParams::BITNUM_ECM = 27;
  46. const int FaxParams::BITNUM_FRAMESIZE_DCS = 28;
  47. const int FaxParams::BITNUM_2DMMR = 31;
  48. const int FaxParams::BITNUM_JBIG = 36;
  49. const int FaxParams::BITNUM_VR_R8 = 41;
  50. const int FaxParams::BITNUM_VR_300X300 = 42;
  51. const int FaxParams::BITNUM_VR_R16 = 43;
  52. const int FaxParams::BITNUM_INCH_RES = 44;
  53. const int FaxParams::BITNUM_METRIC_RES = 45;
  54. const int FaxParams::BITNUM_SEP = 47;
  55. const int FaxParams::BITNUM_SUB = 49;
  56. const int FaxParams::BITNUM_PWD = 50;
  57. const int FaxParams::BITNUM_JPEG = 68;
  58. const int FaxParams::BITNUM_FULLCOLOR = 69;
  59. const int FaxParams::BITNUM_LETTER_SIZE = 76;
  60. const int FaxParams::BITNUM_LEGAL_SIZE = 77;
  61. const int FaxParams::BITNUM_JBIG_BASIC = 78;
  62. const int FaxParams::BITNUM_JBIG_L0 = 79;
  63. FaxParams::FaxParams()
  64. {
  65.     initializeBitString();
  66. }
  67. FaxParams::FaxParams(u_char* pBits, int length)
  68. {
  69.     setupT30(pBits, length);
  70. }
  71. FaxParams::~FaxParams (void)
  72. {
  73. }
  74. /*
  75.  * Convert old dis+xinfo into FaxParams.  This should go away eventually.
  76.  */
  77. FaxParams::FaxParams(u_int disDcs, u_int xinfo)
  78. {
  79.     setupT30(disDcs, xinfo);
  80. }
  81. /*
  82.  * Set all bits to zero.  According to Table 2 T.30 NOTE 1, reserved
  83.  * bits should also be set to zero.
  84.  */
  85. void FaxParams::initializeBitString()
  86. {
  87.     for (int i = 0; i < MAX_BITSTRING_BYTES; i++) m_bits[i] = 0;
  88. }
  89. void FaxParams::setupT30(u_char* pBits, int length)
  90. {
  91.     initializeBitString();
  92.     bool lastbyte = false;
  93.     for (int byte = 0; byte < MAX_BITSTRING_BYTES && byte < length; byte++) {
  94. if (!lastbyte) m_bits[byte] = pBits[byte];
  95. else m_bits[byte] = 0; // clear bits when they have no meaning
  96. if (byte > 2 && !(m_bits[byte] & 0x01)) lastbyte = true;
  97.     }
  98.     // Don't allow the last byte to have the extend bit set.
  99.     m_bits[MAX_BITSTRING_BYTES-1] = m_bits[MAX_BITSTRING_BYTES-1] & 0xFE;
  100. }
  101. void FaxParams::setupT30 (u_int disDcs, u_int xinfo)
  102. {
  103.     initializeBitString();
  104.     m_bits[0] = (disDcs&0xFF0000) >> 16;
  105.     m_bits[1] = (disDcs&0x00FF00) >>  8;
  106.     m_bits[2] = (disDcs&0x0000FF) >>  0;
  107.     m_bits[3] = (xinfo&0xFF000000) >> 24;
  108.     m_bits[4] = (xinfo&0x00FF0000) >> 16;
  109.     m_bits[5] = (xinfo&0x0000FF00) >>  8;
  110.     m_bits[6] = (xinfo&0x000000FF) >>  0;
  111. }
  112. /*
  113.  * Table 2 T.30  defines bit numbers 1 ... 127.  
  114.  * Anything else is invalid and should not be used.
  115.  */
  116. bool FaxParams::validBitNumber(int bitNum)
  117. {
  118.     return ((bitNum >= 1) && (bitNum <= 127));
  119. }
  120. bool FaxParams::isBitEnabled(int bitNum)
  121. {
  122.     if (!validBitNumber(bitNum)) return false;
  123.     return m_bits[calculateByteNumber(bitNum)] & calculateMask(bitNum);
  124. }
  125. void FaxParams::setExtendBits(int byteNum)
  126. {
  127.     if (byteNum >= 3) {
  128. for (int byte = byteNum-1; byte >= 2; byte--)
  129.     m_bits[byte] = m_bits[byte] | 0x01;
  130.     }
  131. }
  132. void FaxParams::unsetExtendBits()
  133. {
  134.     for (int byte = MAX_BITSTRING_BYTES-1; byte >= 2; byte--) {
  135. if (m_bits[byte] & 0xFF) {
  136.     //extend field is needed in previous byte
  137.     break;
  138. } else {
  139.     //extend field NOT needed in previous byte
  140.     //so unset it
  141.     m_bits[byte-1] = m_bits[byte-1] & 0xFE;
  142. }
  143.     }
  144. }
  145. void FaxParams::setBit(int bitNum, bool val)
  146. {
  147.     if (!validBitNumber(bitNum)) return;
  148.     int byteNum = calculateByteNumber(bitNum);
  149.     u_char mask = calculateMask(bitNum);
  150.     if (val) {
  151. m_bits[byteNum] = m_bits[byteNum] | mask;
  152. setExtendBits(byteNum);
  153.     } else {
  154. m_bits[byteNum] = m_bits[byteNum] & ~mask;
  155. unsetExtendBits();
  156.     }
  157. }
  158. int FaxParams::calculateByteNumber(int bitNum)
  159. {
  160.     //Subtract 1 from bitNum because Table 2 T.30 indexes 
  161.     //bit numbers from 1 and C indexes everything from 0.
  162.     return (bitNum-1)/8;
  163. }
  164. u_char FaxParams::calculateMask(int bitNum)
  165. {
  166.     //Subtract 1 from bitNum because Table 2 T.30 indexes 
  167.     //bit numbers from 1 and C indexes everything from 0.
  168.     int shiftLeft = 7-((bitNum-1)%8);
  169.     u_char mask = 0x01 << shiftLeft;
  170.     return mask;
  171. }
  172. bool FaxParams::hasNextByte(int byteNum) const
  173. {
  174.     return (byteNum <= 1 || (m_bits[byteNum] & 0x01));
  175. }
  176. u_char FaxParams::getByte(int byteNum) const
  177. {
  178.     return m_bits[byteNum];
  179. }
  180. /*
  181.  * Convert FaxParams and return a formatted ASCII DCS/DIS equivalent.
  182.  */
  183. void FaxParams::asciiEncode(fxStr& response) const
  184. {
  185.     u_int byte = 0;
  186.     do {
  187. if (byte) response.append(" ");
  188. response.append(fxStr::format("%.2X", getByte(byte)));
  189.     } while (hasNextByte(byte++));
  190. }
  191. /*
  192.  * Reverse of asciiEncode, take ASCII string and make it into FaxParams
  193.  */
  194. void FaxParams::asciiDecode(const char* dcs)
  195. {
  196.     u_int byte = 0;
  197.     while (dcs[0] != '' && dcs[1] != '') {
  198. m_bits[byte] = ((dcs[0] - (dcs[0] > 64 ? 55 : 48)) << 4) + (dcs[1] - (dcs[1] > 64 ? 55 : 48));
  199. setExtendBits(byte++);
  200. dcs += 2;
  201. if (dcs[0] == ' ') dcs++;
  202.     }
  203. }
  204. bool FaxParams::operator==(const FaxParams& operand) const
  205. {
  206.     bool equals = true;
  207.     u_short byte = 0;
  208.     // We do not compare the next bytes if the extend-bit is not set.
  209.     while (equals && byte < MAX_BITSTRING_BYTES && (byte < 3 || m_bits[byte] & 0x01)) {
  210. if (m_bits[byte] != operand.m_bits[byte]) equals = false;
  211. byte++;
  212.     }
  213.     return equals;
  214. }
  215. bool FaxParams::operator!=(const FaxParams& operand) const
  216. {
  217.     return !operator==(operand);
  218. }
  219. FaxParams& FaxParams::assign(const FaxParams& operand)
  220. {
  221.     memcpy(m_bits, operand.m_bits, sizeof(m_bits));
  222.     return *this;
  223. }
  224. void FaxParams::update(bool isDIS)
  225. {
  226. }