Go to the documentation of this file.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 #include "pppfilter.h"
00026 #include <string.h>
00027
00028 namespace Barry {
00029
00030
00031
00032
00033 PppFilter::PppFilter()
00034 : m_ppp_mode(false)
00035 , m_last(0x7e)
00036 {
00037 }
00038
00039
00040
00041
00042
00043
00044
00045
00046 void PppFilter::Filter(Data &dest, const Data &src, unsigned int destoffset)
00047 {
00048 const unsigned char *b = src.GetData(), *e = src.GetData() + src.GetSize();
00049 size_t needed = src.GetSize() / 2 * 3 + 4 + destoffset;
00050 unsigned char *buf = dest.GetBuffer(needed) + destoffset;
00051 unsigned char *put = buf;
00052
00053 while( b != e ) {
00054
00055
00056 if( m_last == 0x7e ) {
00057 m_last = 0;
00058 if( *b != 0x7e )
00059 *put++ = 0x7e;
00060 else
00061 *put++ = *b++;
00062 }
00063
00064
00065 while( b != e && *b != 0x7e ) {
00066 *put++ = *b++;
00067 }
00068
00069 if( b != e ) {
00070 *put++ = *b++;
00071 m_last = 0x7e;
00072 }
00073 }
00074
00075 dest.ReleaseBuffer(put - buf + destoffset);
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 const Data& PppFilter::Write(const Data &data)
00087 {
00088 if( data.GetSize() == 0 )
00089 return data;
00090
00091 const unsigned char *b = data.GetData();
00092
00093 if( !m_ppp_mode ) {
00094 if( *b == 0x7e ) {
00095 m_ppp_mode = true;
00096
00097 }
00098 else {
00099
00100
00101 return data;
00102 }
00103 }
00104
00105 Filter(m_writeBuf, data, 0);
00106 return m_writeBuf;
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116 Data& PppFilter::Write(const Data &data, unsigned int prepend)
00117 {
00118 const unsigned char *b = data.GetData(), *e = data.GetData() + data.GetSize();
00119
00120 if( !m_ppp_mode ) {
00121 if( b != e && *b == 0x7e ) {
00122 m_ppp_mode = true;
00123
00124 }
00125 else {
00126
00127 unsigned int size = data.GetSize() + prepend;
00128 unsigned char *buf = m_writeBuf.GetBuffer(size);
00129 memcpy(&buf[prepend], data.GetData(), data.GetSize());
00130 m_writeBuf.ReleaseBuffer(size);
00131 return m_writeBuf;
00132 }
00133 }
00134
00135 Filter(m_writeBuf, data, prepend);
00136 return m_writeBuf;
00137 }
00138
00139 }
00140