- HandshakeProtocol hsproto;
- unsigned size = hsproto.serialize(shake, out_buf, buf_size);
- socket.write(out_buf, size);
+Communicator::ActiveProtocol::ActiveProtocol(uint16_t b, const Protocol &p, ReceiverBase &r):
+ hash(p.get_hash()),
+ base(b),
+ last(base+p.get_max_packet_id()),
+ protocol(&p),
+ receiver(&r)
+{ }
+
+Communicator::ActiveProtocol::ActiveProtocol(uint16_t b, uint64_t h):
+ hash(h),
+ base(b),
+ last(base)
+{ }
+
+
+void Communicator::Handshake::receive(const PrepareProtocol &prepare)
+{
+ auto i = lower_bound_member(communicator.protocols, prepare.base, &ActiveProtocol::base);
+ if(i!=communicator.protocols.end() && i->base==prepare.base)
+ communicator.accept_protocol(*i);
+ else
+ communicator.protocols.emplace(i, prepare.base, prepare.hash);
+}
+
+void Communicator::Handshake::receive(const AcceptProtocol &accept)
+{
+ auto i = find_member(communicator.protocols, accept.hash, &ActiveProtocol::hash);
+ if(i==communicator.protocols.end())
+ throw key_error(accept.hash);
+
+
+ if(i->ready)
+ return;
+
+ i->ready = true;
+ if(!i->accepted)
+ communicator.accept_protocol(*i);
+ if(i->protocol==&protocol)
+ {
+ for(const ActiveProtocol &p: communicator.protocols)
+ if(!p.ready)
+ communicator.prepare_protocol(p);
+ }
+ else
+ communicator.signal_protocol_ready.emit(*i->protocol);