Menu

FECHeaderSupport.h

Go to the documentation of this file.
00001 /*******************************************************************************
00002  *
00003  * Copyright (c) 2009-2010 Philipp Werner <philipp.werner@st.ovgu.de>
00004  * All rights reserved.
00005  *
00006  *    Redistribution and use in source and binary forms, with or without
00007  *    modification, are permitted provided that the following conditions
00008  *    are met:
00009  *
00010  *    * Redistributions of source code must retain the above copyright
00011  *      notice, this list of conditions and the following disclaimer.
00012  *
00013  *    * Redistributions in binary form must reproduce the above copyright
00014  *      notice, this list of conditions and the following disclaimer in
00015  *      the documentation and/or other materials provided with the
00016  *      distribution.
00017  *
00018  *    * Neither the name of the copyright holders nor the names of
00019  *      contributors may be used to endorse or promote products derived
00020  *      from this software without specific prior written permission.
00021  *
00022  *
00023  *    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00024  *    IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00025  *    TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00026  *    PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00027  *    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00028  *    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00029  *    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00030  *    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00031  *    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00032  *    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00033  *    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00034  *
00035  *
00036  * $Id$
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                             // If fcount_t or flen_t are to small we may cut
00106                             // away information... check this.
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             } // namespace defrag
00159         } // namespace afp
00160     } // namespace mw
00161 } // namespace famouso
00162 
00163 
00164 #endif // __FECHEADERSUPPORT_H_62EF7504454E4B__
00165