ECMBuffer.h
上传用户:glass0516
上传日期:2010-01-11
资源大小:104k
文件大小:3k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2. * RelayFax Open Source Project
  3. * Copyright 1996-2004 Alt-N Technologies, Ltd.
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted only as authorized by the RelayFax Open 
  8. * Source License.  A copy of this license is available in file LICENSE 
  9. * in the top-level directory of the distribution.
  10. *
  11. * RelayFax is a registered trademark of Alt-N Technologies, Ltd.
  12. *
  13. * Individual files and/or contributed packages may be copyright by
  14. * other parties and subject to additional restrictions.
  15. *****************************************************************************/
  16. #ifndef ECMBUFFER_H
  17. #define ECMBUFFER_H
  18. #define MAX_ECM_DATA 256 /* FIF */
  19. #define ECM_DATA_HDR 4 /* Address + Control + FCF + Seq */
  20. #define MAX_ECM_FRAME (ECM_DATA_HDR + MAX_ECM_DATA + 2 ) /* HDR + DATA + FCS */
  21. #define SEQ_MAP_SIZE 32
  22. #define PPPINITFCS16    0xffff  /* Initial FCS value */
  23. #define PPPGOODFCS16    0xf0b8  /* Good final FCS value */
  24. class CECMBuffer
  25. {
  26. public:
  27. CECMBuffer() { InitFrame(); InitBlock(); };
  28. bool AddByte( unsigned char nOctet );
  29. void CalcFCS( unsigned char nOctet );
  30. bool CheckFCS(void);
  31. unsigned short GetFCS(void) { return (m_FCS ^ 0xffff); };
  32. unsigned char GetControl(void) { return m_Buffer[1]; };
  33. unsigned char GetFCF(void) { return m_Buffer[2]; };
  34. int GetSeq(void) { return (int)(m_Buffer[3]); };
  35. int GetLastSeq(void) { return m_LastSeq; };
  36. int GetHighestSeq(void) { return m_HighestSeq; };
  37. unsigned char* GetData(void) { return &m_Buffer[ECM_DATA_HDR]; };
  38. unsigned int GetSize(void) { return m_nBytes; };
  39. bool IsECMBlockGood( int nFrameCount );
  40. unsigned char* GetSeqMap(void) { return m_SeqMap; };
  41. void InitFrame(void) { m_nBytes = 0; m_FCS = PPPINITFCS16; };
  42. void UpdateLastSeq(void) { m_LastSeq = GetSeq(); if( m_LastSeq > m_HighestSeq) m_HighestSeq = m_LastSeq; };
  43. void IncrementLastSeq(void) { if( m_LastSeq > m_HighestSeq) m_HighestSeq = m_LastSeq; m_LastSeq++; };
  44. void InitBlock(void) { m_LastSeq = m_HighestSeq = -1; memset( m_SeqMap, 0xff, SEQ_MAP_SIZE ); };
  45. void SetLastSeq( int nSeq ) { m_LastSeq = nSeq; };
  46. void SetHighestSeq( int nSeq ) { m_HighestSeq = nSeq; };
  47. protected:
  48. static unsigned short fcstab[256];
  49. unsigned short fcs16( register unsigned short fcs, register unsigned char* cp, register int len);
  50. unsigned int m_nBytes;
  51. int m_LastSeq;
  52. int m_HighestSeq;
  53. unsigned short m_FCS;
  54. unsigned char m_SeqMap[ SEQ_MAP_SIZE ];
  55. unsigned char m_Buffer[ MAX_ECM_FRAME ];
  56. };
  57. #endif // ECMBUFFER_H