X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fnet%2Fcommunicator.h;h=62521ee8926346fed24dabccc9a7af3189efff39;hb=6df110603b3a1248f52741e9d68d0bd032171b60;hp=5921767e6a37ada58ba91876f5a2b80a30c3c59a;hpb=3c2a877580e234df5fcbe06bf2850cd29f875e28;p=libs%2Fnet.git diff --git a/source/net/communicator.h b/source/net/communicator.h index 5921767..62521ee 100644 --- a/source/net/communicator.h +++ b/source/net/communicator.h @@ -1,17 +1,24 @@ #ifndef MSP_NET_COMMUNICATOR_H_ #define MSP_NET_COMMUNICATOR_H_ +#include #include "protocol.h" -#include "streamsocket.h" namespace Msp { namespace Net { +class StreamSocket; + class sequence_error: public std::logic_error { public: sequence_error(const std::string &w): std::logic_error(w) { } - virtual ~sequence_error() throw() { } +}; + +class incompatible_protocol: public std::runtime_error +{ +public: + incompatible_protocol(const std::string &w): std::runtime_error(w) { } }; @@ -26,7 +33,7 @@ private: const Protocol &protocol; ReceiverBase &receiver; int handshake_status; - unsigned buf_size; + std::size_t buf_size; char *in_buf; char *in_begin; char *in_end; @@ -41,32 +48,22 @@ public: bool is_handshake_done() const { return handshake_status==2; } template - void send(const P &pkt) - { - if(!good) - throw sequence_error("connection aborted"); - if(handshake_status!=2) - throw sequence_error("handshaking not done"); - unsigned size = protocol.serialize(pkt, out_buf, buf_size); - try - { - socket.write(out_buf, size); - } - catch(const std::exception &e) - { - good = false; - if(signal_error.empty()) - throw; - signal_error.emit(e); - } - } + void send(const P &); private: + void send_data(std::size_t); + void data_available(); bool receive_packet(const Protocol &, ReceiverBase &); void send_handshake(); }; +template +void Communicator::send(const P &pkt) +{ + send_data(protocol.serialize(pkt, out_buf, buf_size)); +} + } // namespace Net } // namespace Msp