]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/communicator.h
Acutally implement Protocol::get_hash
[libs/net.git] / source / net / communicator.h
index 8530db128d26c5d168d99fb0af34e7c874484ffc..63114fd9ba18cd09caa2124cca6b2119b6e1a7e8 100644 (file)
@@ -1,12 +1,14 @@
 #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:
@@ -14,11 +16,19 @@ public:
        virtual ~sequence_error() throw() { }
 };
 
+class incompatible_protocol: public std::runtime_error
+{
+public:
+       incompatible_protocol(const std::string &w): std::runtime_error(w) { }
+       virtual ~incompatible_protocol() throw() { }
+};
+
 
 class Communicator
 {
 public:
        sigc::signal<void> signal_handshake_done;
+       sigc::signal<void, const std::exception &> signal_error;
 
 private:
        StreamSocket &socket;
@@ -40,22 +50,22 @@ 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.assemble(pkt, out_buf, buf_size);
-               socket.write(out_buf, size);
-       }
+       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