#include <cstring>
#include <string>
+#include <msp/core/maputils.h>
#include <msp/strings/lexicalcast.h>
#include "protocol.h"
namespace {
+using Msp::Net::buffer_error;
+
template<typename T>
class Assembler
{
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;
{
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();
}
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;
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;
}
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
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;