00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef __OPAL_Q922_H
00034 #define __OPAL_Q922_H
00035
00036 #ifdef P_USE_PRAGMA
00037 #pragma interface
00038 #endif
00039
00040 #ifndef _PTLIB_H
00041 #include <ptlib.h>
00042 #endif
00043
00044 #define Q922_HEADER_SIZE 3
00045
00046 class Q922_Frame : public PBYTEArray
00047 {
00048 PCLASSINFO(Q922_Frame, PBYTEArray);
00049
00050 public:
00051
00052 Q922_Frame(PINDEX informationFieldSize = 260);
00053 ~Q922_Frame();
00054
00055 BYTE GetHighOrderAddressOctet() const { return theArray[0]; }
00056 BYTE GetLowOrderAddressOctet() const { return theArray[1]; }
00057 void SetHighOrderAddressOctet(BYTE octet) { theArray[0] = octet; }
00058 void SetLowOrderAddressOctet(BYTE octet) { theArray[1] = octet; }
00059
00060 BYTE GetControlFieldOctet() const { return theArray[2]; }
00061 void SetControlFieldOctet(BYTE octet) { theArray[2] = octet; }
00062
00063 BYTE *GetInformationFieldPtr() const { return (BYTE *)(theArray + Q922_HEADER_SIZE); }
00064
00065 PINDEX GetInformationFieldSize() const { return informationFieldSize; }
00066 void SetInformationFieldSize(PINDEX size);
00067
00070 BOOL Decode(const BYTE *data, PINDEX size);
00071
00075 PINDEX GetEncodedSize() const;
00076
00080 BOOL Encode(BYTE *buffer, PINDEX & size) const;
00081
00089 BOOL Encode(BYTE *buffer, PINDEX & size, BYTE & bitPosition) const;
00090
00091 protected:
00092
00093 PINDEX informationFieldSize;
00094
00095 private:
00096
00097 inline BOOL FindFlagEnd(const BYTE *buffer, PINDEX bufferSize, PINDEX & octetIndex, BYTE & bitIndex);
00098 inline BYTE DecodeByte(const BYTE *buffer, BYTE *destination, PINDEX & octetIndex, BYTE & bitIndex, BYTE & onesCounter);
00099 inline BYTE DecodeBit(const BYTE *buffer, PINDEX & octetIndex, BYTE & bitIndex);
00100
00101 inline void EncodeOctet(BYTE octet, BYTE *buffer, PINDEX & octetIndex, BYTE & bitIndex, BYTE & onesCounter) const;
00102 inline void EncodeOctetNoEscape(BYTE octet, BYTE *buffer, PINDEX & octetIndex, BYTE & bitIndex) const;
00103 inline void EncodeBit(BYTE bit, BYTE *buffer, PINDEX & octetIndex, BYTE & bitIndex) const;
00104
00105 inline WORD CalculateFCS(const BYTE*data, PINDEX length) const;
00106 };
00107
00108 #endif // __OPAL_Q922_H
00109