src/Network/Buffer.cc
author Tero Marttila <terom@fixme.fi>
Thu, 22 Jan 2009 01:53:05 +0200
branchnew_graphics
changeset 417 c503e0c6a740
parent 399 c7295b72731a
child 441 f769fab21a6c
permissions -rw-r--r--
support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     1
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     2
#include "Buffer.hh"
417
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 399
diff changeset
     3
#include "../Config.hh"
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     4
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     5
#include <ClanLib/core.h>
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     6
#include <cstdlib>
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     7
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     8
/*
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     9
 * NetworkBufferBase
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    10
 */
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
    11
NetworkBufferBase::NetworkBufferBase (NetworkSocket *socket, size_t size_hint) :
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    12
    socket(socket), buf(0), size(0), offset(0) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    13
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    14
    // allocate initial buffer
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    15
    if ((buf = (char *) malloc(size_hint)) == NULL)
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    16
       throw NetworkBufferError("malloc failed");
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    17
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    18
    // remember size
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    19
    size = size_hint;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    20
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    21
        
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    22
NetworkBufferBase::~NetworkBufferBase (void) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    23
    free(buf);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    24
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    25
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    26
void NetworkBufferBase::resize (size_t item_size) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    27
    size_t new_size = size;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    28
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    29
    // make sure that new_size isn't zero, because zero times two is zero, even if you try and calculate that in an
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    30
    // infinite loop :)
329
42ad4965424f fix infinite loop in NetworkBuffer
terom
parents: 200
diff changeset
    31
    if (new_size == 0)
42ad4965424f fix infinite loop in NetworkBuffer
terom
parents: 200
diff changeset
    32
        new_size = 1;
42ad4965424f fix infinite loop in NetworkBuffer
terom
parents: 200
diff changeset
    33
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    34
    // grow new_size until item_size fits
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    35
    while (offset + item_size > new_size)
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    36
        new_size *= 2;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    37
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    38
    // grow if needed
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    39
    if (new_size != size) {
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    40
        char *temp = buf;
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    41
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    42
        // realloc buffer
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    43
        if ((buf = (char *) realloc((void *) buf, new_size)) == NULL) {
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    44
            // restore temp, but the buffer may be corrupted now
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    45
            buf = temp;
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    46
            
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    47
            // raise error
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    48
            throw NetworkBufferError("realloc failed");
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    49
        }
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    50
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    51
        // update size
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    52
        size = new_size;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    53
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
    54
    } else if (size > (offset + item_size) * 4) {
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    55
        // XXX: shrink?
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    56
    }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    57
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    58
        
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    59
void NetworkBufferBase::trim (size_t prefix_size) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    60
    // update offset
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    61
    offset -= prefix_size;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    62
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    63
    // shift the buffer forwards from (buf + prefix) -> (buf), copying (old_offset - prefix) bytes
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    64
    memmove(buf, buf + prefix_size, offset);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    65
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    66
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    67
/*
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    68
 * NetworkBufferInput
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    69
 */
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
    70
NetworkBufferInput::NetworkBufferInput (NetworkSocket *socket, size_t size_hint) :
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    71
    NetworkBufferBase(socket, size_hint)
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    72
{
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    73
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    74
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    75
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    76
bool NetworkBufferInput::try_read (size_t item_size) {
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
    77
    size_t ret, to_read = item_size;
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    78
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    79
    // keept reads at at least NETWORK_BUFFER_CHUNK_SIZE bytes
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    80
    if (to_read < NETWORK_BUFFER_CHUNK_SIZE)
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    81
        to_read = NETWORK_BUFFER_CHUNK_SIZE;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    82
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    83
    // resize buffer if needed
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    84
    resize(to_read);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    85
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    86
    // read once
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
    87
    ret = socket->recv(buf + offset, to_read);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    88
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
    89
    // nothing left?
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    90
    if (ret == 0)
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
    91
        return false;
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    92
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    93
    // update offset
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    94
    offset += ret;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    95
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    96
    // did we get enough?
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    97
    if ((unsigned int) ret < item_size)
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    98
        return false;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    99
    else
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   100
        return true;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   101
} 
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   102
        
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   103
bool NetworkBufferInput::have_data (size_t data_size) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   104
    return (offset >= data_size);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   105
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   106
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   107
bool NetworkBufferInput::peek_prefix (uint16_t &val_ref) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   108
    if (!have_data(sizeof(uint16_t)))
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   109
        return false;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   110
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   111
    val_ref = ntohs(*((uint16_t *) (buf)));
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   112
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   113
    return true;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   114
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   115
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   116
bool NetworkBufferInput::peek_prefix (uint32_t &val_ref) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   117
    if (!have_data(sizeof(uint32_t)))
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   118
        return false;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   119
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   120
    val_ref = ntohl(*((uint32_t *) (buf)));
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   121
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   122
    return true;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   123
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   124
   
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   125
/*
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   126
 * NetworkBufferOutput
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   127
 */
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
   128
NetworkBufferOutput::NetworkBufferOutput (NetworkSocket *socket, size_t size_hint) :
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   129
    NetworkBufferBase(socket, size_hint)
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   130
{
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   131
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   132
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   133
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   134
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   135
void NetworkBufferOutput::push_write (char *buf_ptr, size_t buf_size) {
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
   136
    size_t ret;
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   137
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   138
    // try and short-circuit writes unless we have already buffered data
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   139
    if (offset == 0) {
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
   140
        // attempt to send something
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
   141
        ret = socket->send(buf_ptr, buf_size);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   142
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   143
        // if we managed to send something, adjust buf/size and buffer
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   144
        if (ret > 0) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   145
            // sanity-check
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   146
            assert(buf_size >= (unsigned int) ret);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   147
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   148
            buf_ptr += ret;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   149
            buf_size -= ret;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   150
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   151
            // if that was all, we're done
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   152
            if (buf_size == 0)
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   153
                return;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   154
        }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   155
    }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   156
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   157
    // resize to fit buf_size more bytes
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   158
    resize(buf_size);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   159
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   160
    // copy into our internal buffer
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   161
    memcpy(buf + offset, buf_ptr, buf_size);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   162
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   163
        
380
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   164
bool NetworkBufferOutput::flush_write (void) {
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
   165
    size_t ret;
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   166
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   167
    // ignore if we don't have any data buffered
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   168
    if (offset == 0)
380
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   169
        return false;
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   170
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   171
    // attempt to write as much as possible
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
   172
    ret = socket->send(buf, offset);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   173
378
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
   174
    // busy?
5589abf5e61b break the network code. Too late to set up a branch for this now
terom
parents: 329
diff changeset
   175
    if (ret == 0)
380
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   176
        return true;
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   177
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   178
    // trim the buffer
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   179
    trim(ret);
380
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   180
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   181
    // anything left?
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   182
    return (offset > 0);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   183
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   184
        
380
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   185
bool NetworkBufferOutput::write_prefix (char *buf, uint16_t prefix) {
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   186
    uint16_t nval = htons(prefix);
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
   187
    
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
   188
    // XXX: not exception-safe
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   189
    push_write((char*) &nval, sizeof(uint16_t)); 
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   190
    push_write(buf, prefix);
380
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   191
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   192
    // anything in the buffer?
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   193
    return (offset > 0);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   194
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   195
380
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   196
bool NetworkBufferOutput::write_prefix (char *buf, uint32_t prefix) {
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   197
    uint32_t nval = htonl(prefix);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   198
399
c7295b72731a documentation work on Network
Tero Marttila <terom@fixme.fi>
parents: 380
diff changeset
   199
    // XXX: not exception-safe
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   200
    push_write((char*) &nval, sizeof(uint32_t)); 
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   201
    push_write(buf, prefix);
380
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   202
    
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   203
    // anything in the buffer?
d193dd1d8a7e new NetworkReactor, fix everything to actually work
terom
parents: 378
diff changeset
   204
    return (offset > 0);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   205
}
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   206