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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: HDLCFrame.c++,v 1.1.1.1 2005/11/11 21:32:02 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1990-1996 Sam Leffler
  4.  * Copyright (c) 1991-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.  * Raw HDLC Frame Interface.
  28.  */
  29. #include "HDLCFrame.h"
  30. #include <string.h>
  31. #include <stdlib.h>
  32. HDLCFrame::HDLCFrame(u_int fo)
  33. {
  34.     frameOverhead = fo;
  35.     base = next = buf;
  36.     end = &buf[sizeof(buf)];
  37.     amountToGrowBy = 1024;
  38.     ok = false;
  39.     crc = 0xffff;
  40. }
  41. HDLCFrame::~HDLCFrame()
  42. {
  43.     if (base != buf) free(base);
  44. }
  45. HDLCFrame::HDLCFrame(const HDLCFrame& other)
  46. {
  47.     u_int size = other.end - other.base;
  48.     u_int len = other.getLength();
  49.     if (size > sizeof(buf)) {
  50. base = (u_char*) malloc(size);
  51.     } else {
  52. base = &buf[0];
  53.     }
  54.     end = base + size;
  55.     next = base + len;
  56.     memcpy(base, other.base, len);
  57.     ok = other.ok;
  58.     frameOverhead = other.frameOverhead;
  59.     crc = 0xffff;
  60. }
  61. void
  62. HDLCFrame::addc(u_char c)
  63. {
  64.     if (next >= end)
  65. grow(amountToGrowBy);
  66.     *next++ = c;
  67. }
  68. void
  69. HDLCFrame::buildCRC(u_char c)
  70. {
  71.     /*
  72.      * This follows the "typical implementation" described
  73.      * in T.30 5.3.7.  crc is preset to 0xffff.
  74.      */
  75.     for (int i = 7; i >= 0; i--) {
  76. crc ^= (c & (1 << i)) << (15 - i);
  77. crc <<= 1;
  78. if (crc >> 16) crc ^= 0x11021;
  79.    }
  80. }
  81. void
  82. HDLCFrame::grow(u_int amount)
  83. {
  84.     // insure an acceptable amount of growth
  85.     if (amount < amountToGrowBy) amount = amountToGrowBy;
  86.     // move data into larger piece of memory
  87.     u_int size = end - base;
  88.     u_int len = getLength();
  89.     u_int newSize = size + amount;
  90.     if (base == buf) {
  91. base = (u_char*) malloc(newSize);
  92. memcpy(base, buf, sizeof(buf));
  93.     } else {
  94. base = (u_char*) realloc(base, newSize);
  95.     }
  96.     // update position pointers
  97.     end = base + newSize;
  98.     next = base + len;
  99. }
  100. void
  101. HDLCFrame::put(const u_char* c, u_int len)
  102. {
  103.     u_int remainingSpace = end - next;
  104.     if  (len > remainingSpace)
  105. grow(len - remainingSpace);
  106.     memcpy(next, c, len);
  107.     next += len;
  108. }
  109. u_int
  110. HDLCFrame::getDataWord() const
  111. {
  112.     u_int n = getFrameDataLength();
  113.     u_int w = (n >= 1) ? (*this)[3] : 0;
  114.     if (n >= 2) w = (w<<8)|(*this)[4];
  115.     if (n >= 3) w = (w<<8)|(*this)[5];
  116.     if (n >= 4) w = (w<<8)|(*this)[6];
  117.     return w;
  118. }
  119. FaxParams
  120. HDLCFrame::getDIS() const
  121. {
  122.     FaxParams dis(base+3, getFrameDataLength()-1);
  123.     return dis;
  124. }