]> git.tdb.fi Git - libs/net.git/blob - source/communicator.h
Exception changes
[libs/net.git] / source / communicator.h
1 #ifndef MSP_NET_COMMUNICATOR_H_
2 #define MSP_NET_COMMUNICATOR_H_
3
4 #include "protocol.h"
5 #include "streamsocket.h"
6
7 namespace Msp {
8 namespace Net {
9
10 class sequence_error: public std::logic_error
11 {
12 public:
13         sequence_error(const std::string &w): std::logic_error(w) { }
14         virtual ~sequence_error() throw() { }
15 };
16
17
18 class Communicator
19 {
20 public:
21         sigc::signal<void> signal_handshake_done;
22
23 private:
24         StreamSocket &socket;
25         const Protocol &protocol;
26         ReceiverBase &receiver;
27         int handshake_status;
28         unsigned buf_size;
29         char *in_buf;
30         char *in_begin;
31         char *in_end;
32         char *out_buf;
33
34 public:
35         Communicator(StreamSocket &, const Protocol &, ReceiverBase &);
36         ~Communicator();
37
38         void initiate_handshake();
39         bool is_handshake_done() const { return handshake_status==2; }
40
41         template<typename P>
42         void send(const P &pkt)
43         {
44                 if(handshake_status!=2)
45                         throw sequence_error("handshaking not done");
46                 unsigned size = protocol.assemble(pkt, out_buf, buf_size);
47                 socket.write(out_buf, size);
48         }
49
50 private:
51         void data_available();
52         bool receive_packet(const Protocol &, ReceiverBase &);
53         void send_handshake();
54 };
55
56 } // namespace Net
57 } // namespace Msp
58
59 #endif