terom@89: terom@89: #include saiam@118: #include terom@89: terom@89: #include "NetworkPacket.hh" terom@89: terom@89: terom@89: NetworkPacket::NetworkPacket (void) : terom@89: buf_size(NETWORK_PACKET_SIZE), data_size(0), offset(0) { terom@89: terom@89: // nothing terom@89: } terom@89: terom@89: void NetworkPacket::check_write_size (size_t item_size) { terom@89: if (offset + item_size > buf_size) terom@89: throw NetworkPacketError("not enough space to write"); terom@89: terom@89: } terom@89: terom@89: void NetworkPacket::check_read_size (size_t item_size) { terom@89: if (offset + item_size > data_size) terom@89: throw NetworkPacketError("not enough data to read"); terom@89: } terom@89: terom@89: void NetworkPacket::write (const void *ptr, size_t len) { terom@89: // check buffer overflow terom@89: check_write_size(len); terom@89: terom@89: // set value terom@89: memcpy(buf + offset, ptr, len); terom@89: terom@89: // update offset and size terom@89: offset += len; terom@89: data_size += len; terom@89: } terom@89: terom@89: void NetworkPacket::read (void *ptr, size_t len) { terom@89: // check buffer underflow terom@89: check_read_size(len); terom@89: terom@89: // set value terom@89: memcpy(ptr, buf + offset, len); terom@89: terom@89: // update offset terom@89: offset += len; terom@89: } terom@89: terom@89: template T NetworkPacket::read_val (void) { terom@89: T val; terom@89: terom@89: // read terom@89: read(&val, sizeof(T)); terom@89: terom@89: // return terom@89: return val; terom@89: } terom@89: terom@89: template void NetworkPacket::write_val (const T &val) { terom@89: // write terom@89: write(&val, sizeof(T)); terom@89: } terom@89: terom@89: uint32_t NetworkPacket::read_uint32 (void) { terom@89: return ntohl(read_val()); terom@89: } terom@89: terom@89: uint16_t NetworkPacket::read_uint16 (void) { terom@89: return ntohs(read_val()); terom@89: } terom@89: terom@89: uint8_t NetworkPacket::read_uint8 (void) { terom@89: return read_val(); terom@89: } terom@89: terom@89: int32_t NetworkPacket::read_int32 (void) { terom@89: return ntohl(read_val()); terom@89: } terom@89: terom@89: int16_t NetworkPacket::read_int16 (void) { terom@89: return ntohs(read_val()); terom@89: } terom@89: terom@89: int8_t NetworkPacket::read_int8 (void) { terom@89: return read_val(); terom@89: } terom@89: terom@89: float NetworkPacket::read_float32 (void) { terom@89: int32_t ival = read_int32(); terom@89: terom@89: return *((float *) &ival); terom@89: } terom@89: terom@89: Vector NetworkPacket::read_vector (void) { terom@89: float fx = read_float32(); terom@89: float fy = read_float32(); terom@89: terom@89: return Vector(fx, fy); terom@89: } terom@89: terom@89: void NetworkPacket::write_uint32 (uint32_t val) { terom@89: write_val(htonl(val)); terom@89: } terom@89: terom@89: void NetworkPacket::write_uint16 (uint16_t val) { terom@89: write_val(htons(val)); terom@89: } terom@89: terom@89: void NetworkPacket::write_uint8 (uint8_t val) { terom@89: write_val(val); terom@89: } terom@89: terom@89: void NetworkPacket::write_int32 (int32_t val) { terom@89: write_val(htonl(val)); terom@89: } terom@89: terom@89: void NetworkPacket::write_int16 (int16_t val) { terom@89: write_val(htons(val)); terom@89: } terom@89: terom@89: void NetworkPacket::write_int8 (int8_t val) { terom@89: write_val(val); terom@89: } terom@89: terom@89: void NetworkPacket::write_float32 (float val) { terom@89: write_int32(*((int32_t *) &val)); terom@89: } terom@89: terom@89: void NetworkPacket::write_vector (const Vector &vec) { terom@89: write_float32(vec.x); terom@89: write_float32(vec.y); terom@89: } terom@89: terom@89: void NetworkPacket::write_packet (const NetworkPacket &pkt) { terom@89: // check buffer size terom@89: check_write_size(pkt.get_data_size()); terom@89: terom@89: // copy terom@89: memcpy(buf + offset, pkt.get_buf(), pkt.get_data_size()); terom@89: terom@89: // update offset/data_size terom@89: offset += pkt.get_data_size(); terom@89: data_size += pkt.get_data_size(); terom@89: } terom@89: