Chatsync  bbffde5c0c672a526bdc83637acf66dc20a80fbf
channel.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <string>
3 #include <iostream>
4 #include <vector>
5 #include <map>
6 #include <future>
7 
8 #include "message.hpp"
9 #include "hub.hpp"
10 #include "config.hpp"
11 #include "logging.hpp"
12 
13 namespace channeling {
14  using namespace messaging;
15 
19  class channel_error: public std::runtime_error {
20  public:
21  const std::string _name;
22  channel_error(std::string const& name, std::string const& message) :
23  std::runtime_error(message),
24  _name(name)
25  {};
26  };
27 
31  class activate_error: public channel_error {
32  public:
33  activate_error(std::string const& name, std::string const& message) :
34  channel_error(name, message) {};
35  };
36 
41  public:
42  connection_error(std::string const& name, std::string const& message) :
43  channel_error(name, message) {};
44  };
45 
63  class Channel {
64  unsigned int _reconnect_attempt;
71  void reconnect();
72 
73  std::shared_ptr<std::atomic<bool> > _hub_alive;
74  protected:
75  std::atomic_bool _active;
77  /* Polling functions */
78  std::unique_ptr<std::thread> _thread;
79  std::atomic_bool _pipeRunning;
80  virtual void pollThread();
81  int _fd;
84  const std::string _name;
86  Hub::Hub * const _hub;
95  virtual void incoming(const message_ptr&& msg) = 0;
96 
105  virtual const message_ptr parse(const char* line) const = 0;
106 
113  void startPolling();
114 
118  void stopPolling();
119 
120  public:
121  const uint16_t _id;
127  Channel(Hub::Hub * const hub, const std::string& config);
128 
129  virtual ~Channel();
130 
136  virtual std::string const& name() const;
137 
142  virtual std::string type() const = 0;
143 
149  ChannelDirection direction() const {return _direction; };
150 
159  virtual std::future<void> activate() = 0;
160 
170  friend Channel& operator>> (const message_ptr, Channel& channel);
171 
180  virtual int connect(const std::string& hostname, const uint32_t port) const;
181 
190  virtual int send(const uint32_t fd, const std::string& msg) const;
191 
197  virtual int send(const std::string& msg) const {return send(_fd, msg); };
198 
204  virtual int disconnect(const uint32_t fd) const;
205 
209  virtual int disconnect() const {return disconnect(_fd); };
210 
214  virtual void tick() { DEBUG << "Empty tick in " << _name; };
215  };
216 
218  {
219  public:
220  ChannelCreator(const std::string& classname);
221  virtual Channel * create(Hub::Hub * const hub, const std::string& config) = 0;
222  };
223 
224  template <class T>
226  {
227  public:
228  ChannelCreatorImpl(const std::string& classname) : ChannelCreator(classname) {}
229 
230  virtual Channel * create(Hub::Hub * const hub, const std::string& config) { return new T(hub, config); }
231  };
232 
234  {
235  public:
236  static Channel * create(const std::string& classname, Hub::Hub * const hub, const std::string& config);
237  static void registerClass(const std::string& classname, ChannelCreator* creator);
238  static uint16_t nextId() { return id++; }
239 
240  private:
241  static std::atomic_int id;
242  static std::map<std::string, ChannelCreator *>& get_table();
243  };
244 }
channel_error(std::string const &name, std::string const &message)
Definition: channel.hpp:22
virtual int disconnect() const
Definition: channel.hpp:209
std::shared_ptr< std::atomic< bool > > _hub_alive
Definition: channel.hpp:73
virtual int send(const std::string &msg) const
Definition: channel.hpp:197
activate_error(std::string const &name, std::string const &message)
Definition: channel.hpp:33
ChannelDirection direction() const
Definition: channel.hpp:149
std::unique_ptr< std::thread > _thread
Definition: channel.hpp:78
const ChannelDirection _direction
Definition: channel.hpp:85
unsigned int _reconnect_attempt
Definition: channel.hpp:64
Definition: channel.hpp:31
Definition: channel.hpp:233
Hub::Hub *const _hub
Definition: channel.hpp:86
Definition: config.cpp:10
const config::ConfigParser _config
Definition: channel.hpp:83
const std::string _name
Definition: channel.hpp:84
Definition: channel.hpp:217
std::shared_ptr< const Message > message_ptr
Definition: message.hpp:36
Definition: channel.hpp:225
static uint16_t nextId()
Definition: channel.hpp:238
Definition: channel.cpp:11
#define DEBUG
Definition: logging.hpp:14
static std::atomic_int id
Definition: channel.hpp:241
const std::string _name
Definition: channel.hpp:21
Definition: channel.hpp:40
const uint16_t _id
Definition: channel.hpp:121
Definition: message.hpp:6
std::atomic_bool _pipeRunning
Definition: channel.hpp:79
connection_error(std::string const &name, std::string const &message)
Definition: channel.hpp:42
Definition: channel.hpp:63
Definition: channel.hpp:19
std::atomic_bool _active
Definition: channel.hpp:75
Definition: hub.hpp:24
ChannelCreatorImpl(const std::string &classname)
Definition: channel.hpp:228
virtual void tick()
Definition: channel.hpp:214
Channel & operator>>(const message_ptr msg, Channel &channel)
Definition: channel.cpp:39
virtual Channel * create(Hub::Hub *const hub, const std::string &config)
Definition: channel.hpp:230
Definition: config.hpp:114
int _fd
Definition: channel.hpp:81
ChannelDirection
Definition: config.hpp:13