src/Network/Buffer.hh
author terom
Tue, 09 Dec 2008 04:33:53 +0000
changeset 365 65295dfbbf64
parent 284 27ce69fd1e06
child 378 5589abf5e61b
permissions -rw-r--r--
fix optimization-related warnings
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     1
#ifndef NETWORK_BUFFER_HH
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     2
#define NETWORK_BUFFER_HH
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     3
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     4
#include "Socket.hh"
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     5
#include "../Error.hh"
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     6
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     7
#include <cassert>
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
     8
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
     9
/**
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    10
 * Minimum chunk size to avoid handling single bytes at a time (for resize, mainly)
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    11
 */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    12
const size_t NETWORK_BUFFER_CHUNK_SIZE = 1024;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    13
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    14
/**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    15
 * Base class of errors thrown by NetworkBuffer* methods
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    16
 */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    17
class NetworkBufferError : public Error {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    18
    public:
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    19
        NetworkBufferError (const std::string &message) : Error(message) { }
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
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    22
/**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    23
 * Base buffer-manipulation operations for buffered socket send/recv
200
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
class NetworkBufferBase {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    26
    protected:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    27
        /** The socket that we use */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    28
        NetworkSocket socket;
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    29
        
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    30
        /** The buffer itself */
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    31
        char *buf;
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    32
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    33
        /** Buffer size and current read/write offset */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    34
        size_t size, offset;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    35
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    36
    public:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    37
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    38
         * Allocate buf using the given initial size, and set offset to zero
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    39
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    40
        NetworkBufferBase (NetworkSocket &socket, size_t size_hint);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    41
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    42
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    43
         * Free()'s the buf
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    44
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    45
        ~NetworkBufferBase (void);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    46
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    47
    private:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    48
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    49
         * No copying, these are undefined
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    50
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    51
        NetworkBufferBase (const NetworkBufferBase &copy);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    52
        NetworkBufferBase& operator= (const NetworkBufferBase &copy);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    53
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    54
    protected:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    55
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    56
         * Resize the buffer, allocating enough new space to hold <item_size> bytes at the end, and leaving any
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    57
         * existing data at the beginning in-place
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    58
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    59
         * @param item_size the number of bytes that must fit at the end of the buffer
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    60
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    61
        void resize (size_t item_size);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    62
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    63
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    64
         * Trim the buffer, discarding <prefix_size> bytes at the beginning. Updates offset to match.
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    65
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    66
         * @param prefix_size the number of bytes to discard
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    67
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    68
        void trim (size_t prefix_size);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    69
};
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    70
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    71
/**
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    72
 * Buffered prefix-len socket input
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
class NetworkBufferInput : public NetworkBufferBase {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    75
    public:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    76
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    77
         * @see NetworkBufferBase
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    78
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    79
        NetworkBufferInput (NetworkSocket &socket, size_t size_hint);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    80
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    81
    private:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    82
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    83
         * Attempts to recv the given number of bytes into our buf, returning true on success
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    84
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    85
         * @param item_size minimum number of bytes of data that we need in the buffer
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    86
         * @return bool true if the buffer now contains at least item_size bytes
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    87
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    88
        bool try_read (size_t item_size);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    89
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    90
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    91
         * Tests if the buffer contains at least the given amount of data, but doesn't recv or anything
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    92
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    93
         * @param data_size number of bytes that we are expecting
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    94
         * @return bool true if the buffer contains at least data_size bytes
200
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
        bool have_data (size_t data_size);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    97
    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
    98
    public:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
    99
        // @{
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   100
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   101
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   102
         * Attempts to read the length prefix into val_ref, returning true on success, false if there's not enough data
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   103
         * in the buffer
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   104
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   105
         * @param val_ref stores the value read here if we have it
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   106
         * @return bool was val_ref set
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   107
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   108
        bool peek_prefix (uint16_t &val_ref);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   109
        bool peek_prefix (uint32_t &val_ref);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   110
        // @} 
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   111
        
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   112
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   113
         * This attempts to read a length-prefix of the given type (using peek_prefix), and then the associated data.
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   114
         * If succesful, this sets prefix to the length of the data, and buf_ref to point at the data inside our buffer
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   115
         * and returns true, else false.
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   116
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   117
         * This will try and consume data from the buffer, or recv if needed.
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   118
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   119
         * @param prefix stores the data length here
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   120
         * @param buf_ref stores a pointer to the data here
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   121
         * @return bool true if we have the full data, false if we need to wait for more data on the socket
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   122
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   123
         * @see peek_prefix
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   124
         * @see flush_data
200
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
        template <typename PrefixType> bool peek_data (PrefixType &prefix, char *&buf_ref) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   127
            size_t missing = 0;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   128
            
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   129
            do {    
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   130
                // do we have the prefix?
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   131
                if (peek_prefix(prefix)) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   132
                    // do we already have the payload?
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   133
                    if (offset >= sizeof(PrefixType) + prefix) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   134
                        break;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   135
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   136
                    } else {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   137
                        missing = (sizeof(PrefixType) + prefix) - offset;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   138
                    }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   139
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   140
                } else {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   141
                    missing = sizeof(PrefixType);
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
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   144
                // sanity-check
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   145
                // XXX: a zero-prefix will trigger this
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   146
                assert(missing);
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
                // try and read the missing data
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   149
                if (try_read(missing) == false) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   150
                    // if unable to read what we need, return zero.
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   151
                    return false;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   152
                }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   153
                
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   154
                // assess the situation again
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   155
            } while (true);
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
            // update the buf_ref to point past the prefix-length
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   158
            buf_ref = buf + sizeof(PrefixType);
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
            // return
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   161
            return true;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   162
        }
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   163
          
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   164
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   165
         * This flushes a prefix-length worth of data from the buffer, i.e. it first reads the prefix, and then trims
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   166
         * the prefix and the data away. Don't call this unless you *know* that the buffer contains enough data.
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   167
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   168
         * @see peek_data
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   169
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   170
        template <typename PrefixType> void flush_data (void) {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   171
            PrefixType prefix;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   172
            
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   173
            // we *must* have a valid prefix
365
65295dfbbf64 fix optimization-related warnings
terom
parents: 284
diff changeset
   174
            if (!peek_prefix(prefix))
65295dfbbf64 fix optimization-related warnings
terom
parents: 284
diff changeset
   175
                assert(false);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   176
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   177
            // trim the bytes out
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   178
            trim(sizeof(PrefixType) + prefix);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   179
        }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   180
};
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   181
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   182
/**
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   183
 * Buffered prefix-len socket output
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   184
 */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   185
class NetworkBufferOutput : public NetworkBufferBase {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   186
    public:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   187
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   188
         * @see NetworkBufferBase
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   189
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   190
        NetworkBufferOutput (NetworkSocket &socket, size_t size_hint);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   191
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   192
    private:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   193
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   194
         * Write the given data to the socket, either now of later. 
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   195
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   196
         * If our buffer is empty, fast-path the given buf_ptr directly to send(), then copy the remaining portion to
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   197
         * our buffer for later use with flush_write.
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   198
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   199
         * @param buf_ptr the data that we need to send
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   200
         * @param buf_size number of bytes in buf_ptr
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   201
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   202
        void push_write (char *buf_ptr, size_t buf_size);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   203
   
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   204
    public:    
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   205
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   206
         * If we have data in our buffer, flush it out using send().
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   207
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   208
        void flush_write (void);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   209
        
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   210
        // @{
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   211
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   212
         * Write out the given data, writing first the prefix, and then the data itself, using push_write.
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   213
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   214
         * @param buf the data to write
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   215
         * @param prefix the amount of data
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   216
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   217
        void write_prefix (char *buf, uint16_t prefix);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   218
        void write_prefix (char *buf, uint32_t prefix);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 200
diff changeset
   219
        // @}
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   220
};
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   221
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
diff changeset
   222
#endif