#include <cstring>
#include "communicator.h"
+#include "streamsocket.h"
using namespace std;
handshake_status = 1;
}
+void Communicator::send_data(unsigned size)
+{
+ if(!good)
+ throw sequence_error("connection aborted");
+ if(handshake_status!=2)
+ throw sequence_error("handshake incomplete");
+
+ try
+ {
+ socket.write(out_buf, size);
+ }
+ catch(const std::exception &e)
+ {
+ good = false;
+ if(signal_error.empty())
+ throw;
+ signal_error.emit(e);
+ }
+}
+
void Communicator::data_available()
{
if(!good)
#ifndef MSP_NET_COMMUNICATOR_H_
#define MSP_NET_COMMUNICATOR_H_
+#include <sigc++/signal.h>
#include "protocol.h"
-#include "streamsocket.h"
namespace Msp {
namespace Net {
+class StreamSocket;
+
class sequence_error: public std::logic_error
{
public:
bool is_handshake_done() const { return handshake_status==2; }
template<typename P>
- 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(unsigned);
+
void data_available();
bool receive_packet(const Protocol &, ReceiverBase &);
void send_handshake();
};
+template<typename P>
+void Communicator::send(const P &pkt)
+{
+ send_data(protocol.serialize(pkt, out_buf, buf_size));
+}
+
} // namespace Net
} // namespace Msp