src/proto2/NetworkPacket.cc
author terom
Mon, 10 Nov 2008 18:21:23 +0000
branchno-netsession
changeset 32 2ff929186c90
parent 31 d0d7489d4e8b
child 33 e53f09b378f4
permissions -rw-r--r--
write some mode code...
31
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
     1
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
     2
#include "NetworkPacket.hh"
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
     3
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
     4
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
     5
NetworkPacket::NetworkPacket (void) :
32
2ff929186c90 write some mode code...
terom
parents: 31
diff changeset
     6
    size(NETWORK_PACKET_SIZE), offset(0) {
31
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
     7
    
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
     8
    // nothing
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
     9
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    10
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    11
template <typename T> T NetworkPacket::read_val (void) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    12
    T val;
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    13
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    14
    // check size
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    15
    if (offset + sizeof(T) > size)
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    16
        throw CL_Error("not enough data to read");
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    17
    
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    18
    // set value
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    19
    val = *((T*) (buf + offset));
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    20
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    21
    // update offset
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    22
    offset += sizeof(T);
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    23
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    24
    // return
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    25
    return val;
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    26
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    27
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    28
template <typename T> void NetworkPacket::write_val (const T &val) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    29
    // check max size
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    30
    if (offset + sizeof(T) > NETWORK_PACKET_SIZE)
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    31
        throw CL_Error("not enough space to write");
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    32
    
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    33
    // set value
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    34
    *((T*) (buf + offset)) = val;
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    35
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    36
    // update offset and size
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    37
    offset += sizeof(T);
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    38
    size += sizeof(T);
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    39
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    40
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    41
uint32_t NetworkPacket::read_uint32 (void) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    42
    return ntohl(read_val<uint32_t>());
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    43
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    44
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    45
uint16_t NetworkPacket::read_uint16 (void) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    46
    return ntohs(read_val<uint16_t>());
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    47
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    48
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    49
uint8_t NetworkPacket::read_uint8 (void) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    50
    return read_val<uint8_t>();
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    51
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    52
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    53
int32_t NetworkPacket::read_int32 (void) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    54
    return ntohl(read_val<int32_t>());
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    55
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    56
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    57
int16_t NetworkPacket::read_int16 (void) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    58
    return ntohs(read_val<int16_t>());
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    59
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    60
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    61
int8_t NetworkPacket::read_int8 (void) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    62
    return read_val<int8_t>();
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    63
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    64
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    65
void NetworkPacket::write_uint32 (uint32_t val) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    66
    write_val<uint32_t>(htonl(val));
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    67
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    68
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    69
void NetworkPacket::write_uint16 (uint16_t val) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    70
    write_val<uint16_t>(htons(val));
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    71
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    72
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    73
void NetworkPacket::write_uint8 (uint8_t val) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    74
    write_val<uint8_t>(val);
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    75
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    76
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    77
void NetworkPacket::write_int32 (int32_t val) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    78
    write_val<int32_t>(htonl(val));
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    79
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    80
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    81
void NetworkPacket::write_int16 (int16_t val) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    82
    write_val<int16_t>(htons(val));
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    83
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    84
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    85
void NetworkPacket::write_int8 (int8_t val) {
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    86
    write_val<int8_t>(val);
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    87
}
d0d7489d4e8b add initial code written so far
terom
parents:
diff changeset
    88