]> git.tdb.fi Git - libs/net.git/blobdiff - source/protocol.cpp
Correct poll usage
[libs/net.git] / source / protocol.cpp
index 147077cc1253c3c60e7c9ab049951b0e3223445b..d56ac77a09f70eff7137da98beef2eb7112d8978 100644 (file)
@@ -1,5 +1,6 @@
 #include <cstring>
 #include <string>
+#include <msp/core/maputils.h>
 #include <msp/strings/lexicalcast.h>
 #include "protocol.h"
 
@@ -7,6 +8,8 @@ using namespace std;
 
 namespace {
 
+using Msp::Net::buffer_error;
+
 template<typename T>
 class Assembler
 {
@@ -31,7 +34,7 @@ char *Assembler<T>::assemble(const T &v, char *data, char *end)
        for(unsigned i=0; i<sizeof(T); ++i)
        {
                if(data==end)
-                       throw Msp::Exception("Out of buffer space");
+                       throw buffer_error("overflow");
                *data++ = *--ptr;
        }
        return data;
@@ -42,7 +45,7 @@ char *Assembler<string>::assemble(const string &v, char *data, char *end)
 {
        data = Assembler<unsigned short>::assemble(v.size(), data, end);
        if(end-data<static_cast<int>(v.size()))
-               throw Msp::Exception("Out of buffer space");
+               throw buffer_error("overflow");
        memcpy(data, v.data(), v.size());
        return data+v.size();
 }
@@ -63,7 +66,7 @@ const char *Assembler<T>::disassemble(T &v, const char *data, const char *end)
        for(unsigned i=0; i<sizeof(T); ++i)
        {
                if(data==end)
-                       throw Msp::Exception("Premature end of data");
+                       throw buffer_error("underflow");
                *--ptr = *data++;
        }
        return data;
@@ -75,7 +78,7 @@ const char *Assembler<string>::disassemble(string &v, const char *data, const ch
        unsigned short size;
        data = Assembler<unsigned short>::disassemble(size, data, end);
        if(end-data<size)
-               throw Msp::Exception("Premature end of data");
+               throw buffer_error("underflow");
        v.assign(data, data+size);
        return data+size;
 }
@@ -123,18 +126,12 @@ void Protocol::add_packet(PacketDefBase &pdef)
 
 const Protocol::PacketDefBase &Protocol::get_packet_by_class(unsigned id) const
 {
-       PacketMap::const_iterator i = packet_class_defs.find(id);
-       if(i==packet_class_defs.end())
-               throw KeyError("Unknown packet class", lexical_cast(id));
-       return *i->second;
+       return *get_item(packet_class_defs, id);
 }
 
 const Protocol::PacketDefBase &Protocol::get_packet_by_id(unsigned id) const
 {
-       PacketMap::const_iterator i = packet_id_defs.find(id);
-       if(i==packet_id_defs.end())
-               throw KeyError("Unknown packet ID", lexical_cast(id));
-       return *i->second;
+       return *get_item(packet_id_defs, id);
 }
 
 unsigned Protocol::disassemble(ReceiverBase &rcv, const char *data, unsigned size) const
@@ -143,7 +140,7 @@ unsigned Protocol::disassemble(ReceiverBase &rcv, const char *data, unsigned siz
        unsigned id = (udata[0]<<8)+udata[1];
        unsigned psz = (udata[2]<<8)+udata[3];
        if(psz>size)
-               throw InvalidParameterValue("Not enough data for packet");
+               throw bad_packet("truncated");
        const PacketDefBase &pdef = get_packet_by_id(id);
        const char *ptr = pdef.disassemble(rcv, data+4, data+psz);
        return ptr-data;