FECHeaderSupport.h
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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef __FECHEADERSUPPORT_H_62EF7504454E4B__
00042 #define __FECHEADERSUPPORT_H_62EF7504454E4B__
00043
00044
00045 #include "util/endianness.h"
00046
00047
00048 namespace famouso {
00049 namespace mw {
00050 namespace afp {
00051 namespace defrag {
00052
00053
00062 template <class DCP>
00063 class FECHeaderSupport {
00064
00065 typedef typename DCP::SizeProp::flen_t flen_t;
00066 typedef typename DCP::SizeProp::fcount_t fcount_t;
00067
00069 struct __attribute__((packed)) Header1001 {
00070 uint8_t head;
00071 uint8_t red;
00072 uint32_t k;
00073 uint16_t len_rest;
00074 };
00075
00076 uint8_t red;
00077 fcount_t k;
00078 flen_t len_rest;
00079
00080 public:
00081
00083 FECHeaderSupport()
00084 : k(0) {
00085 }
00086
00091 bool check(const uint8_t * data) {
00092 return (*data & 0xbf) == 0x29;
00093 }
00094
00100 flen_t read_header(const uint8_t * data) {
00101 const Header1001 * h = reinterpret_cast<const Header1001 *>(data);
00102
00103 red = h->red;
00104
00105
00106
00107 bool error = false;
00108
00109 uint32_t k32 = ntohl(h->k);
00110 k = k32;
00111 if (k != k32)
00112 error = true;
00113
00114 uint16_t len_rest16 = ntohs(h->len_rest);
00115 len_rest = len_rest16;
00116 if (len_rest != len_rest16)
00117 error = true;
00118
00119 return error ? 0 : sizeof(Header1001);
00120 }
00121
00125 bool occurs() const {
00126 return k != 0;
00127 }
00128
00134 uint32_t get_red() const {
00135 return red;
00136 }
00137
00143 uint32_t get_k() const {
00144 return k;
00145 }
00146
00152 uint32_t get_len_rest() const {
00153 return len_rest;
00154 }
00155 };
00156
00157
00158 }
00159 }
00160 }
00161 }
00162
00163
00164 #endif // __FECHEADERSUPPORT_H_62EF7504454E4B__
00165