src/Network/Packet.hh
author Tero Marttila <terom@fixme.fi>
Tue, 13 Jan 2009 21:14:12 +0200
changeset 391 59c2499fe7bb
parent 387 294ce7ae8140
child 400 d64bf28c4340
permissions -rw-r--r--
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     1
#ifndef NETWORK_PACKET_HH
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     2
#define NETWORK_PACKET_HH
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     3
186
0738f2949a2b move src/Network% to src/Network/%
terom
parents: 185
diff changeset
     4
#include "Config.hh"
300
417183866f35 suicide key and respawning
terom
parents: 296
diff changeset
     5
#include "../Types.hh"
186
0738f2949a2b move src/Network% to src/Network/%
terom
parents: 185
diff changeset
     6
#include "../Error.hh"
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     7
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
     8
/**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
     9
 * Base class of errors thrown by NetworkPacket* methods
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    10
 */
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    11
class NetworkPacketError : public Error {
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    12
    public:
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    13
        NetworkPacketError (const std::string &message) : Error(message) { }
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    14
};
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    15
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    16
// forward-declare for write_packet
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    17
class NetworkPacketBuffer;
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    18
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    19
/**
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    20
 * Read-interface for network packets
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    21
 */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    22
class NetworkPacketInput {
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    23
    public:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    24
        /**
387
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    25
         * Abstract method to get a pointer to \a len bytes of raw in-memory binary data, advancing the read offset
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    26
         *
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    27
         * @param len the number of bytes to consume
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    28
         */
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    29
        virtual const void* read_ptr (size_t len) = 0;
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    30
 
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    31
        /**
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    32
         * Abstract method that copies len bytes from the packet to ptr, first testing that they exist
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    33
         */
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    34
        virtual void read (
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    35
                void *ptr,      //<<< where to copy
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    36
                size_t len      //<<< number of bytes to copy
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    37
        ) = 0;
391
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
    38
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
    39
        /**
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
    40
         * Abstract method to get the number of input bytes remaining.
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
    41
         *
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
    42
         * @return number of input bytes still readable
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
    43
         */
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
    44
        virtual size_t tell_remaining (void) = 0;
387
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    45
      
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    46
        /**
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    47
         * Convenience function to read() and return the value of the given type
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    48
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    49
         * @return T The value
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    50
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    51
        template <typename T> T read_val (void);
296
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 284
diff changeset
    52
        
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 284
diff changeset
    53
        // @{
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    54
        /**
296
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 284
diff changeset
    55
         * Collection of methods to write out simple types, these convert from network-endianness and return the value
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    56
         */
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    57
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    58
        /** 32-bit unsigned int */
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    59
        uint32_t read_uint32 (void);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    60
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    61
        /** 16-bit unsigned int */
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    62
        uint16_t read_uint16 (void);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    63
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    64
        /** 8-bit unsigned int */
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    65
        uint8_t read_uint8 (void);
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    66
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    67
        /** 32-bit signed int */
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    68
        int32_t read_int32 (void);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    69
        
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    70
        /** 16-bit signed int */
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    71
        int16_t read_int16 (void);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    72
        
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    73
        /** 8-bit signed int */
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    74
        int8_t read_int8 (void);
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    75
        
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    76
        /** 32-bit float */
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    77
        float read_float32 (void);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    78
296
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 284
diff changeset
    79
        // @}
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    80
        
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    81
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    82
         * Read a Vector from the packet:
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    83
         *  float32     vec_x
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    84
         *  float32     vec_y
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    85
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    86
         * @return Vector (vec_x, vec_y)
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    87
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    88
        Vector read_vector (void);
387
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    89
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    90
        /**
391
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
    91
         * Read compressed data written with write_compressed. The given buffer must be the same size as passed to
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
    92
         * write_compressed. Returns the number of bytes that were decompressed into buf.
387
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
    93
         */
391
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
    94
        size_t read_uncompressed (void *buf, size_t len);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    95
};
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    96
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
    97
/**
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    98
 * Write-interface for network packets
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
    99
 */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   100
class NetworkPacketOutput {
391
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   101
    protected:
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   102
        /**
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   103
         * Adjust size of the most recent write_ptr area of buf_len bytes to data_len bytes.
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   104
         */
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   105
        virtual void write_ptr_adjust (size_t buf_len, size_t data_len) = 0;
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   106
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   107
    public:    
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   108
        /**
387
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   109
         * Abstract method to get a pointer to \a len bytes of raw in-memory binary data, advancing the write offset
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   110
         *
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   111
         * @param len number of bytes to commit
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   112
         */
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   113
        virtual void* write_ptr (size_t len) = 0;
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   114
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   115
        /**
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   116
         * Abstract method that copies len bytes from ptr to the packet, first testing that they fit
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   117
         */
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   118
        virtual void write (
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   119
                const void *ptr,    //<<< where to copy from
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   120
                size_t len          //<<< number of bytes to copy
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   121
        ) = 0;
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   122
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   123
        /**
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   124
         * Convenience function to write() the value of the given type-value
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   125
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   126
         * @param val The value
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   127
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   128
        template <typename T> void write_val (const T &val);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   129
        
296
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 284
diff changeset
   130
        // @{        
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   131
        /**
296
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 284
diff changeset
   132
         * Collection of methods to write out simple types, these convert the given value to network-byte-order
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   133
         */
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   134
        void write_uint32 (uint32_t val);
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   135
        void write_uint16 (uint16_t val);
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   136
        void write_uint8 (uint8_t val);
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   137
        void write_int32 (int32_t val);
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   138
        void write_int16 (int16_t val);
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   139
        void write_int8 (int8_t val);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   140
        void write_float32 (float val);
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   141
        
296
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 284
diff changeset
   142
        // @{ 
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   143
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   144
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   145
         * Write a vector to the packet:
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   146
         *  float32     vec_x
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   147
         *  float32     vec_y
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   148
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   149
         *  @param vec a Vector(vec_x, vec_y)
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   150
         */
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   151
        void write_vector (const Vector &vec);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   152
        
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   153
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   154
         * This write()s the contents of the given NetworkPacketBuffer to this packet.
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   155
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   156
         * @param pkt the sub-packet to write()
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   157
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   158
        void write_packet (const NetworkPacketBuffer &pkt);
391
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   159
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   160
        /**
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   161
         * This will compress the given data buffer into this packet for reading with read_compressed. The compressed
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   162
         * data will use at most write_compressed_size(len) bytes of data.
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   163
         */
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   164
        void write_compressed (const void *ptr, uint32_t len);
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   165
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   166
        /**
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   167
         * Return upper bound on packet size of compressed data, including header.
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   168
         */
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   169
        static size_t write_compressed_size (uint32_t len);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   170
};
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   171
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   172
/**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   173
 * Implements an in-memory seekable buffer used by NetworkPackets
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   174
 *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   175
 * @see NetworkPacketInput
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   176
 * @see NetworkPacketOutput
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   177
 */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   178
class NetworkPacketBuffer : public NetworkPacketInput, public NetworkPacketOutput {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   179
    protected:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   180
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   181
         * Pointer to the packet data
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   182
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   183
        char *buf_ptr;
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   184
        
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   185
        // the buffer size, the amount of data in the buffer, and the current read/write offset
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   186
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   187
         * The size of the memory region pointed to by buf_ptr
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   188
         */
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   189
        size_t buf_size;
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   190
        
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   191
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   192
         * The number of bytes of read()-able data stored at buf_ptr
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   193
         */
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   194
        size_t data_size;
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   195
        
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   196
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   197
         * The current offset at which to run the next read/write
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   198
         */
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   199
        size_t offset;
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   200
        
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   201
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   202
         * Assert that the given number of bytes fits into the buffer at offset. Throws NetworkPacketError if not.
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   203
         *
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   204
         * The default implementation just checks offset and buf_size
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   205
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   206
         * @param item_size the size of the item that should to be written
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   207
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   208
        virtual void check_write_size (size_t item_size);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   209
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   210
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   211
         * Assert that the given number of bytes is available from the buffer. Throws NetworkPacketError if not
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   212
         *
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   213
         * The default implementation just checks offset and data_size
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   214
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   215
         * @param item_size the size of the item that should be read
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   216
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   217
        virtual void check_read_size (size_t item_size);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   218
         
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   219
    public:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   220
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   221
         * Construct the NetworkPacketBuffer using the given buf_ptr, buf_size and data_size
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   222
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   223
        NetworkPacketBuffer (char *buf_ptr, size_t buf_size, size_t data_size);
387
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   224
 
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   225
        /**
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   226
         * Returns a read-only pointer to \a len bytes of internal buffer memory, calling check_read_size first and
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   227
         * updating offset
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   228
         *
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   229
         * @param len number of bytes from the buffer to consume
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   230
         */
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   231
        virtual const void* read_ptr (size_t len);
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   232
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   233
        /**
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   234
         * Returns a read-write pointer to \a len bytes of internal buffer memory, calling check_write_size first and
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   235
         * updating offset+data_size
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   236
         *
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   237
         * @param len number of bytes in the buffer to commit
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   238
         */
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   239
        virtual void* write_ptr (size_t len);
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   240
       
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   241
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   242
         * Copy bytes from the packet buffer to ptr using memcpy(), calling check_read_size first.
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   243
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   244
         * @param ptr where to copy the data to
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   245
         * @param len number of bytes to copy
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   246
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   247
        virtual void read (void *ptr, size_t len);
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   248
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   249
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   250
         * Copy bytes from ptr to the packet buffer using memcpy(), calling check_write_size first
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   251
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   252
         * @param ptr where to copy the data from
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   253
         * @param len number of bytes to copy
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   254
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   255
        virtual void write (const void *ptr, size_t len);
387
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   256
        
391
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   257
        virtual void write_ptr_adjust (size_t buf_len, size_t data_len);
59c2499fe7bb add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents: 387
diff changeset
   258
        
387
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   259
        /**
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   260
         * Returns our data_size - read-offset
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   261
         */
294ce7ae8140 dirty implementation of compressed terrain array data
terom
parents: 300
diff changeset
   262
        virtual size_t tell_remaining (void);
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   263
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   264
        /*
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   265
         * Accessor functions, used by the actual socket code to read/write the buffer
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   266
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   267
        char* get_buf (void) { return buf_ptr; }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   268
        const char* get_buf (void) const { return buf_ptr; }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   269
        size_t get_data_size (void) const { return data_size; }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   270
        size_t get_buf_size (void) const { return buf_size; }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   271
        
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   272
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   273
         * If the contents of buf_ptr is replaced with a new packet, call this to update offset/data_size
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   274
         *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   275
         * @param size new amount of data in the buffer
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   276
         */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   277
        void set_data_size (size_t size) { offset = 0; data_size = size; }
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   278
};
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   279
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   280
/**
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   281
 * The common case is a packet that fits in a single UDP packet, so this just uses a static buffer of a fixed size,
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   282
 * NETWORK_PACKET_SIZE.
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   283
 *
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   284
 * @see NetworkPacketBuffer
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   285
 * @see NETWORK_PACKET_SIZE
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   286
 */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   287
class NetworkPacket : public NetworkPacketBuffer {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   288
    private:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   289
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   290
         * The static buffer, NETWORK_PACKET_SIZE bytes
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   291
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   292
        char _buf[NETWORK_PACKET_SIZE];
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   293
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   294
    public:
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   295
        NetworkPacket (void);
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   296
};
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   297
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   298
/**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   299
 * This is intended for sending bigger packets via TCP; a buffer of the given size is allocated on the heap.
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   300
 *
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   301
 * @see NetworkPacketBuffer
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   302
 */
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   303
class BigNetworkPacket : public NetworkPacketBuffer {
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   304
    public:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   305
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   306
         * Allocates a buffer of the given size on the heap and uses it for NetworkPacketBuffer
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   307
         */
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 186
diff changeset
   308
        BigNetworkPacket (size_t size);
202
b3f5d766391e support sending of raw packets
terom
parents: 200
diff changeset
   309
b3f5d766391e support sending of raw packets
terom
parents: 200
diff changeset
   310
    private:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   311
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   312
         * Object must not be copied
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   313
         */
202
b3f5d766391e support sending of raw packets
terom
parents: 200
diff changeset
   314
        BigNetworkPacket (const BigNetworkPacket &pkt);
b3f5d766391e support sending of raw packets
terom
parents: 200
diff changeset
   315
        BigNetworkPacket& operator= (const BigNetworkPacket &pkt);
b3f5d766391e support sending of raw packets
terom
parents: 200
diff changeset
   316
203
3ec7ab40755f send initial terrain data to clients using a new NETCHAN_TERRAIN_ARRAY channel using raw BigNetworkPacket
terom
parents: 202
diff changeset
   317
    public:
284
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   318
        /**
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   319
         * Frees the heap buffer
27ce69fd1e06 work on Network doxygen docs
terom
parents: 203
diff changeset
   320
         */
202
b3f5d766391e support sending of raw packets
terom
parents: 200
diff changeset
   321
        virtual ~BigNetworkPacket (void);
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   322
};
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   323
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   324
#endif /* NETWORK_PACKET_HH */