GComm  0.2.3
gmcast_proto.hpp
1 /*
2  * Copyright (C) 2009 Codership Oy <info@codership.com>
3  */
4 
5 #include "gu_datetime.hpp"
6 #include "gcomm/uuid.hpp"
7 #include "gcomm/util.hpp"
8 #include "socket.hpp"
9 #include "gmcast_message.hpp"
10 #include "gmcast_link.hpp"
11 
12 namespace gcomm
13 {
14 
15  namespace gmcast
16  {
17  class Proto;
18  class ProtoMap;
19  std::ostream& operator<<(std::ostream& os, const Proto& p);
20  }
21 }
22 
23 
25 {
26 public:
27 
28  enum State
29  {
30  S_INIT,
31  S_HANDSHAKE_SENT,
32  S_HANDSHAKE_WAIT,
33  S_HANDSHAKE_RESPONSE_SENT,
34  S_OK,
35  S_FAILED,
36  S_CLOSED
37  };
38 
39 
40 public:
41 
42  void set_state(State new_state);
43  State state() const
44  {
45  return state_;
46  }
47 
48  static std::string to_string (State s)
49  {
50  switch (s)
51  {
52  case S_INIT: return "INIT";
53  case S_HANDSHAKE_SENT: return "HANDSHAKE_SENT";
54  case S_HANDSHAKE_WAIT: return "HANDSHAKE_WAIT";
55  case S_HANDSHAKE_RESPONSE_SENT: return "HANDSHAKE_RESPONSE_SENT";
56  case S_OK: return "OK";
57  case S_FAILED: return "FAILED";
58  case S_CLOSED: return "CLOSED";
59  default: return "UNKNOWN";
60  }
61  }
62 
63 
64 
65  Proto (int v,
66  SocketPtr tp,
67  const std::string& local_addr,
68  const std::string& remote_addr,
69  const std::string& mcast_addr,
70  const gcomm::UUID& local_uuid,
71  uint8_t local_segment,
72  const std::string& group_name)
73  :
74  version_(v),
75  handshake_uuid_ (),
76  local_uuid_ (local_uuid),
77  remote_uuid_ (),
78  local_segment_ (local_segment),
79  remote_segment_ (0),
80  local_addr_ (local_addr),
81  remote_addr_ (remote_addr),
82  mcast_addr_ (mcast_addr),
83  group_name_ (group_name),
84  changed_ (false),
85  state_ (S_INIT),
86  propagate_remote_ (false),
87  tp_ (tp),
88  link_map_ (),
89  tstamp_ (gu::datetime::Date::now())
90  { }
91 
92  ~Proto() { tp_->close(); }
93 
94  void send_msg(const Message& msg);
95  void send_handshake();
96  void wait_handshake();
97  void handle_handshake(const Message& hs);
98  void handle_handshake_response(const Message& hs);
99  void handle_ok(const Message& hs);
100  void handle_failed(const Message& hs);
101  void handle_topology_change(const Message& msg);
102  void handle_keepalive(const Message& msg);
103  void send_topology_change(LinkMap& um);
104  void handle_message(const Message& msg);
105  void send_keepalive();
106 
107  const gcomm::UUID& handshake_uuid() const { return handshake_uuid_; }
108  const gcomm::UUID& local_uuid() const { return local_uuid_; }
109  const gcomm::UUID& remote_uuid() const { return remote_uuid_; }
110  uint8_t remote_segment() const { return remote_segment_; }
111 
112  SocketPtr socket() const { return tp_; }
113 
114  const std::string& remote_addr() const { return remote_addr_; }
115  const std::string& mcast_addr() const { return mcast_addr_; }
116  const LinkMap& link_map() const { return link_map_; }
117 
118  bool changed()
119  {
120  bool ret = changed_;
121  changed_ = false;
122  return ret;
123  }
124  int version() const { return version_; }
125  void set_tstamp(gu::datetime::Date ts) { tstamp_ = ts; }
126  gu::datetime::Date tstamp() const { return tstamp_; }
127 private:
128  friend std::ostream& operator<<(std::ostream&, const Proto&);
129  Proto(const Proto&);
130  void operator=(const Proto&);
131 
132  int version_;
133  gcomm::UUID handshake_uuid_;
134  gcomm::UUID local_uuid_; // @todo: do we need it here?
135  gcomm::UUID remote_uuid_;
136  uint8_t local_segment_;
137  uint8_t remote_segment_;
138  std::string local_addr_;
139  std::string remote_addr_;
140  std::string mcast_addr_;
141  std::string group_name_;
142  bool changed_;
143  State state_;
144  bool propagate_remote_;
145  SocketPtr tp_;
146  LinkMap link_map_;
147  gu::datetime::Date tstamp_;
148 };
149 
150 
151 inline std::ostream& gcomm::gmcast::operator<<(std::ostream& os, const Proto& p)
152 {
153  os << "v=" << p.version_ << ","
154  << "lu=" << p.local_uuid_ << ","
155  << "ru=" << p.remote_uuid_ << ","
156  << "ls=" << static_cast<int>(p.local_segment_) << ","
157  << "rs=" << static_cast<int>(p.remote_segment_) << ","
158  << "la=" << p.local_addr_ << ","
159  << "ra=" << p.remote_addr_ << ","
160  << "mc=" << p.mcast_addr_ << ","
161  << "gn=" << p.group_name_ << ","
162  << "ch=" << p.changed_ << ","
163  << "st=" << gcomm::gmcast::Proto::to_string(p.state_) << ","
164  << "pr=" << p.propagate_remote_ << ","
165  << "tp=" << p.tp_ << ","
166  << "ts=" << p.tstamp_;
167  return os;
168 }
169 
170 class gcomm::gmcast::ProtoMap : public Map<const SocketId, Proto*> { };
Definition: map.hpp:210
Definition: gmcast_link.hpp:56
Definition: gmcast_proto.hpp:24
Definition: gmcast_message.hpp:22
Definition: gmcast_proto.hpp:170
Definition: uuid.hpp:26