Cleaned networking code a bit (had this one on the to-do list for like 4 months already)
authorPerttu Ahola <celeron55@gmail.com>
Sat, 21 May 2011 09:25:08 +0000 (12:25 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 21 May 2011 09:25:08 +0000 (12:25 +0300)
src/connection.cpp
src/connection.h
src/main.cpp
src/utility.h

index b07e0de906124fad5c9400f7070e31f44640b000..548a7f532fa58ddb483ad7eb9e04d69523f3730b 100644 (file)
@@ -320,7 +320,7 @@ IncomingSplitBuffer::~IncomingSplitBuffer()
        This will throw a GotSplitPacketException when a full
        split packet is constructed.
 */
-void IncomingSplitBuffer::insert(BufferedPacket &p, bool reliable)
+SharedBuffer<u8> IncomingSplitBuffer::insert(BufferedPacket &p, bool reliable)
 {
        u32 headersize = BASE_HEADER_SIZE + 7;
        assert(p.data.getSize() >= headersize);
@@ -363,9 +363,9 @@ void IncomingSplitBuffer::insert(BufferedPacket &p, bool reliable)
        // Set chunk data in buffer
        sp->chunks[chunk_num] = chunkdata;
        
-       // If not all chunks are received, return
+       // If not all chunks are received, return empty buffer
        if(sp->allReceived() == false)
-               return;
+               return SharedBuffer<u8>();
 
        // Calculate total size
        u32 totalsize = 0;
@@ -392,8 +392,8 @@ void IncomingSplitBuffer::insert(BufferedPacket &p, bool reliable)
        // Remove sp from buffer
        m_buf.remove(seqnum);
        delete sp;
-       
-       throw GotSplitPacketException(fulldata);
+
+       return fulldata;
 }
 void IncomingSplitBuffer::removeUnreliableTimedOuts(float dtime, float timeout)
 {
@@ -709,21 +709,17 @@ SharedBuffer<u8> Channel::ProcessPacket(
                                con->GetProtocolID(),
                                peer_id,
                                channelnum);
-               try{
-                       // Buffer the packet
-                       incoming_splits.insert(packet, reliable);
-               }
-               // This exception happens when all the pieces of a packet
-               // are collected.
-               catch(GotSplitPacketException &e)
+               // Buffer the packet
+               SharedBuffer<u8> data = incoming_splits.insert(packet, reliable);
+               if(data.getSize() != 0)
                {
                        con->PrintInfo();
                        dout_con<<"RETURNING TYPE_SPLIT: Constructed full data, "
-                                       <<"size="<<e.getData().getSize()<<std::endl;
-                       return e.getData();
+                                       <<"size="<<data.getSize()<<std::endl;
+                       return data;
                }
                con->PrintInfo();
-               dout_con<<"BUFFERING TYPE_SPLIT"<<std::endl;
+               dout_con<<"BUFFERED TYPE_SPLIT"<<std::endl;
                throw ProcessedSilentlyException("Buffered a split packet chunk");
        }
        else if(type == TYPE_RELIABLE)
index 0b5d5e23019266e4496ffd5e2edcf512548bc7c5..6eb2f2824642cc86661fd4c788e5c090d515e366 100644 (file)
@@ -99,19 +99,6 @@ public:
        {}
 };
 
-class GotSplitPacketException
-{
-       SharedBuffer<u8> m_data;
-public:
-       GotSplitPacketException(SharedBuffer<u8> data):
-               m_data(data)
-       {}
-       SharedBuffer<u8> getData()
-       {
-               return m_data;
-       }
-};
-
 inline u16 readPeerId(u8 *packetdata)
 {
        return readU16(&packetdata[4]);
@@ -314,10 +301,10 @@ class IncomingSplitBuffer
 public:
        ~IncomingSplitBuffer();
        /*
-               This will throw a GotSplitPacketException when a full
-               split packet is constructed.
+               Returns a reference counted buffer of length != 0 when a full split
+               packet is constructed. If not, returns one of length 0.
        */
-       void insert(BufferedPacket &p, bool reliable);
+       SharedBuffer<u8> insert(BufferedPacket &p, bool reliable);
        
        void removeUnreliableTimedOuts(float dtime, float timeout);
        
index 7b33bdb84dd82816b5dfc6b41861629a0bc716c5..202c5e75ec70ea3465b3c8fadc9fc5dfe2e5b0fd 100644 (file)
@@ -81,6 +81,8 @@ SUGG: Calculate lighting per vertex to get a lighting effect like in
 SUGG: Background music based on cellular automata?\r
       http://www.earslap.com/projectslab/otomata\r
 \r
+SUGG: Simple light color information to air\r
+\r
 Gaming ideas:\r
 -------------\r
 \r
@@ -135,8 +137,6 @@ Build system / running:
 Networking and serialization:\r
 -----------------------------\r
 \r
-TODO: Get rid of GotSplitPacketException\r
-\r
 User Interface:\r
 ---------------\r
 \r
@@ -164,11 +164,6 @@ TODO: A setting for enabling bilinear filtering for textures
 \r
 TODO: Better control of draw_control.wanted_max_blocks\r
 \r
-TODO: Get player texture (and some others) from the specified texture\r
-      directory\r
-\r
-SUGG: Simple light color information to air\r
-\r
 TODO: Block mesh generator to tile properly on smooth lighting\r
 \r
 Configuration:\r
index cc8891a0797c1345d0325460c8a4821c373528c9..0df43a31b5b5225b01d58e95ba2c552a564c57bd 100644 (file)
@@ -371,10 +371,20 @@ template <typename T>
 class SharedBuffer
 {
 public:
+       SharedBuffer()
+       {
+               m_size = 0;
+               data = NULL;
+               refcount = new unsigned int;
+               (*refcount) = 1;
+       }
        SharedBuffer(unsigned int size)
        {
                m_size = size;
-               data = new T[size];
+               if(m_size != 0)
+                       data = new T[m_size];
+               else
+                       data = NULL;
                refcount = new unsigned int;
                (*refcount) = 1;
        }
@@ -404,8 +414,13 @@ public:
        SharedBuffer(T *t, unsigned int size)
        {
                m_size = size;
-               data = new T[size];
-               memcpy(data, t, size);
+               if(m_size != 0)
+               {
+                       data = new T[m_size];
+                       memcpy(data, t, m_size);
+               }
+               else
+                       data = NULL;
                refcount = new unsigned int;
                (*refcount) = 1;
        }
@@ -414,9 +429,14 @@ public:
        */
        SharedBuffer(const Buffer<T> &buffer)
        {
-               m_size = buffer.m_size;
-               data = new T[buffer.getSize()];
-               memcpy(data, *buffer, buffer.getSize());
+               m_size = buffer.getSize();
+               if(m_size != 0)
+               {
+                       data = new T[m_size];
+                       memcpy(data, *buffer, buffer.getSize());
+               }
+               else
+                       data = NULL;
                refcount = new unsigned int;
                (*refcount) = 1;
        }
@@ -426,6 +446,7 @@ public:
        }
        T & operator[](unsigned int i) const
        {
+               //assert(i < m_size)
                return data[i];
        }
        T * operator*() const
@@ -443,7 +464,8 @@ private:
                (*refcount)--;
                if(*refcount == 0)
                {
-                       delete[] data;
+                       if(data)
+                               delete[] data;
                        delete refcount;
                }
        }