diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-05-21 12:25:08 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-05-21 12:25:08 +0300 |
commit | fe02a19f1795429c110e6c7ed76d333cb42a3072 (patch) | |
tree | fb422c8acb96aea2d814b44ceb86c28f8ceb0e4c /src | |
parent | 3b707b8a4a52a88da4398ec9b32109c073683a76 (diff) | |
download | minetest-fe02a19f1795429c110e6c7ed76d333cb42a3072.tar.gz minetest-fe02a19f1795429c110e6c7ed76d333cb42a3072.tar.bz2 minetest-fe02a19f1795429c110e6c7ed76d333cb42a3072.zip |
Cleaned networking code a bit (had this one on the to-do list for like 4 months already)
Diffstat (limited to 'src')
-rw-r--r-- | src/connection.cpp | 26 | ||||
-rw-r--r-- | src/connection.h | 19 | ||||
-rw-r--r-- | src/main.cpp | 9 | ||||
-rw-r--r-- | src/utility.h | 36 |
4 files changed, 45 insertions, 45 deletions
diff --git a/src/connection.cpp b/src/connection.cpp index b07e0de90..548a7f532 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -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) diff --git a/src/connection.h b/src/connection.h index 0b5d5e230..6eb2f2824 100644 --- a/src/connection.h +++ b/src/connection.h @@ -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); diff --git a/src/main.cpp b/src/main.cpp index 7b33bdb84..202c5e75e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -81,6 +81,8 @@ SUGG: Calculate lighting per vertex to get a lighting effect like in SUGG: Background music based on cellular automata?
http://www.earslap.com/projectslab/otomata
+SUGG: Simple light color information to air
+
Gaming ideas:
-------------
@@ -135,8 +137,6 @@ Build system / running: Networking and serialization:
-----------------------------
-TODO: Get rid of GotSplitPacketException
-
User Interface:
---------------
@@ -164,11 +164,6 @@ TODO: A setting for enabling bilinear filtering for textures TODO: Better control of draw_control.wanted_max_blocks
-TODO: Get player texture (and some others) from the specified texture
- directory
-
-SUGG: Simple light color information to air
-
TODO: Block mesh generator to tile properly on smooth lighting
Configuration:
diff --git a/src/utility.h b/src/utility.h index cc8891a07..0df43a31b 100644 --- a/src/utility.h +++ b/src/utility.h @@ -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; } } |