src/Network/Packet.cc
changeset 391 59c2499fe7bb
parent 387 294ce7ae8140
child 400 d64bf28c4340
equal deleted inserted replaced
390:3c8078b96469 391:59c2499fe7bb
     1 
     1 
     2 #include <cassert>
     2 #include <cassert>
     3 #include <cstring>
     3 #include <cstring>
     4 
     4 
     5 #include "Packet.hh"
     5 #include "Packet.hh"
       
     6 
       
     7 #include <zlib.h>
     6 
     8 
     7 // XXX: assumes that sizeof(float32) == sizeof(int32);
     9 // XXX: assumes that sizeof(float32) == sizeof(int32);
     8 
    10 
     9 /*
    11 /*
    10  * NetworkPacketInput
    12  * NetworkPacketInput
    58     float fx = read_float32();
    60     float fx = read_float32();
    59     float fy = read_float32();
    61     float fy = read_float32();
    60 
    62 
    61     return Vector(fx, fy);
    63     return Vector(fx, fy);
    62 }
    64 }
       
    65         
       
    66 size_t NetworkPacketInput::read_uncompressed (void *buf, size_t len) {
       
    67     // given len
       
    68     unsigned long inflate_size = len;
       
    69 
       
    70     // read deflate size
       
    71     unsigned long deflate_size = read_uint32();
       
    72 
       
    73     // pointer to packet data
       
    74     const void *deflate_ptr = read_ptr(deflate_size);
       
    75 
       
    76     // uncompress the rest of the packet data
       
    77     if (uncompress((uint8_t *) buf, &inflate_size, (const uint8_t *) deflate_ptr, deflate_size) != Z_OK)
       
    78         throw Error("uncompress");
       
    79     
       
    80     // return inflated size
       
    81     return inflate_size;
       
    82 }
    63 
    83 
    64 /*
    84 /*
    65  * NetworkPacketOutput
    85  * NetworkPacketOutput
    66  */
    86  */
    67 template <typename T> void NetworkPacketOutput::write_val (const T &val) {
    87 template <typename T> void NetworkPacketOutput::write_val (const T &val) {
   111 
   131 
   112 void NetworkPacketOutput::write_packet (const NetworkPacketBuffer &pkt) {
   132 void NetworkPacketOutput::write_packet (const NetworkPacketBuffer &pkt) {
   113     // just write() it
   133     // just write() it
   114     write(pkt.get_buf(), pkt.get_data_size());
   134     write(pkt.get_buf(), pkt.get_data_size());
   115 }
   135 }
       
   136         
       
   137 void NetworkPacketOutput::write_compressed (const void *ptr, uint32_t len) {
       
   138     // full compression buffer size, including header
       
   139     unsigned long deflate_buf_size = write_compressed_size(len);
       
   140 
       
   141     // size of compressed data area after header
       
   142     unsigned long deflate_size = deflate_buf_size - sizeof(uint32_t);
       
   143     
       
   144     // packet buffer
       
   145     void *deflate_buf = write_ptr(deflate_buf_size);
       
   146 
       
   147     // compress
       
   148     if (compress((uint8_t *) deflate_buf + sizeof(uint32_t), &deflate_size, (const uint8_t *) ptr, len) != Z_OK)
       
   149        throw Error("compress failed"); 
       
   150 
       
   151     // write data size
       
   152     *((uint32_t *) deflate_buf) = htonl(deflate_size);
       
   153     
       
   154     // adjust final area
       
   155     write_ptr_adjust(deflate_buf_size, sizeof(uint32_t) + deflate_size);
       
   156 }
       
   157         
       
   158 size_t NetworkPacketOutput::write_compressed_size (uint32_t len) {
       
   159     return sizeof(uint32_t) + compressBound(len);
       
   160 }
   116 
   161 
   117 /*
   162 /*
   118  * NetworkPacketBuffer
   163  * NetworkPacketBuffer
   119  */
   164  */
   120 NetworkPacketBuffer::NetworkPacketBuffer (char *buf_ptr, size_t buf_size, size_t data_size) :
   165 NetworkPacketBuffer::NetworkPacketBuffer (char *buf_ptr, size_t buf_size, size_t data_size) :
   136         throw NetworkPacketError("not enough data to read");
   181         throw NetworkPacketError("not enough data to read");
   137 }
   182 }
   138        
   183        
   139 const void* NetworkPacketBuffer::read_ptr (size_t len) {
   184 const void* NetworkPacketBuffer::read_ptr (size_t len) {
   140     // check buffer overflow
   185     // check buffer overflow
   141     check_write_size(len);
   186     check_read_size(len);
   142 
   187 
   143     // pointer value...
   188     // pointer value...
   144     const void *ptr = buf_ptr + offset;
   189     const void *ptr = buf_ptr + offset;
   145     
   190     
   146     // update offset
   191     // update offset
   179 
   224 
   180     // copy value in
   225     // copy value in
   181     memcpy(output_ptr, ptr, len);
   226     memcpy(output_ptr, ptr, len);
   182 }
   227 }
   183         
   228         
       
   229 void NetworkPacketBuffer::write_ptr_adjust (size_t buf_len, size_t data_len) {
       
   230     assert(data_len <= buf_len);
       
   231     
       
   232     // adjust offset backwards
       
   233     offset -= (buf_len - data_len);
       
   234     data_size -= (buf_len - data_len);
       
   235 }
       
   236 
   184 size_t NetworkPacketBuffer::tell_remaining (void) {
   237 size_t NetworkPacketBuffer::tell_remaining (void) {
   185     // number of bytes in total - number of bytes read
   238     // number of bytes in total - number of bytes read
   186     return data_size - offset;
   239     return data_size - offset;
   187 }
   240 }
   188 
   241