X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprotocol.cpp;h=d56ac77a09f70eff7137da98beef2eb7112d8978;hb=823208d633b0c7352e436513990ecf81d9e67fd4;hp=147077cc1253c3c60e7c9ab049951b0e3223445b;hpb=a81c41acd873cda7f40bca634782230d9e57dc4f;p=libs%2Fnet.git diff --git a/source/protocol.cpp b/source/protocol.cpp index 147077c..d56ac77 100644 --- a/source/protocol.cpp +++ b/source/protocol.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include "protocol.h" @@ -7,6 +8,8 @@ using namespace std; namespace { +using Msp::Net::buffer_error; + template class Assembler { @@ -31,7 +34,7 @@ char *Assembler::assemble(const T &v, char *data, char *end) for(unsigned i=0; i::assemble(const string &v, char *data, char *end) { data = Assembler::assemble(v.size(), data, end); if(end-data(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::disassemble(T &v, const char *data, const char *end) for(unsigned i=0; i::disassemble(string &v, const char *data, const ch unsigned short size; data = Assembler::disassemble(size, data, end); if(end-datasecond; + 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;