ANNA Suite  2020b
Multipurpose development suite for Telco applications
Communicator.hpp
Go to the documentation of this file.
1 // ANNA - Anna is Not Nothingness Anymore //
2 // //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
4 // //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7 
8 
9 #ifndef anna_comm_Communicator_hpp
10 #define anna_comm_Communicator_hpp
11 
12 #include <vector>
13 
14 #include <anna/config/defines.hpp>
15 #include <anna/core/DataBlock.hpp>
18 
19 #include <anna/app/Component.hpp>
20 
22 #include <anna/comm/Socket.hpp>
23 #include <anna/comm/Status.hpp>
24 
26 
28 
29 namespace anna {
30 
31 // MT
32 class ThreadManager;
33 
34 namespace xml {
35 class Node;
36 }
37 
38 namespace comm {
39 
40 class Application;
41 class Transport;
42 class Message;
43 class ServerSocket;
44 class ClientSocket;
45 class LocalConnection;
46 class RemoteConnection;
47 class DatagramSocket;
48 class INetAddress;
49 class Handler;
50 class Server;
51 class Service;
52 class BinderSocket;
53 class ConnectionRecover;
54 
55 namespace handler {
56 class LocalConnection;
57 class RemoteConnection;
58 class ClientSocket;
59 }
60 
61 // ST
62 class Poll;
63 
79 class Communicator : public app::Component {
80  struct SortByFileDescriptor {
81  static int value(const Handler*) ;
82  };
83 
88  static Millisecond st_ReceivingChunkSize;
89 
90 public:
96  struct WorkMode {
97  enum _v {
116  Clone
117  };
118  };
119 
125 
131 
137 
143 
149 
155 
159  static const int MinReceivingChunkSize = 2 * 1024;
160 
164  static const int MaxReceivingChunkSize = 64 * 1024;
165 
171 
175  static const int DefaultChunkSize = 16 * 1024;
176 
181  typedef std::vector <const Service*> Services;
182  typedef Services::const_iterator const_service_iterator;
188  Communicator(const WorkMode::_v acceptMode = WorkMode::Single);
189 
193  virtual ~Communicator();
194 
201  const Millisecond &getRecoveryTime() const { return a_recoveryTime; }
202 
207  const Status& getStatus() const { return a_status; }
208 
215  const Millisecond &getTimeout() const { return a_timeout; }
216 
220  WorkMode::_v getWorkMode() const { return a_workMode; }
221 
228  bool isServing() const { return a_isServing; }
229 
234  bool hasRequestedStop() const { return a_requestedStop; }
235 
239  void notifyPendingClose() { a_pendingClose = true; }
240 
250  void setRecoveryTime(const Millisecond &recoveryTime) noexcept(false);
251 
261  void setTryingConnectionTime(const Millisecond &tryingConnectionTime) noexcept(false);
262 
266  const Millisecond &getTryingConnectionTime() const { return a_tryingConnectionTime; }
267 
279  static void setReceivingChunkSize(const int receivingChunkSize) noexcept(false);
280 
285  static int getReceivingChunkSize() { return st_ReceivingChunkSize; }
286 
292  void setTimeout(const Millisecond & timeout) { a_timeout = timeout; }
293 
302  void setLevelOfDenialService(const int levelOfDenialService) noexcept(false);
303 
308  int getLevelOfDenialService() const { return a_levelOfDenialService; }
309 
318  void attach(ServerSocket* serverSocket) noexcept(false);
319 
332  void attach(LocalConnection* localConnection) noexcept(false);
333 
340  void attach(ClientSocket* clientSocket) noexcept(false);
341 
348  void attach(DatagramSocket* datagramSocket) noexcept(false);
349 
355  void attach(Handler* handler) noexcept(false);
356 
364  void attach(Service* service) noexcept(false);
365 
372  void detach(ServerSocket* serverSocket) ;
373 
380  void detach(ClientSocket* clientSocket) ;
381 
391  void detach(Handler* handler) ;
392 
398  const Handler* getHandler(const ClientSocket& clientSocket) noexcept(false);
399 
407  void accept() noexcept(false);
408 
412  void requestStop() ;
413 
423  bool isUsable(const ClientSocket* clientSocket) ;
424 
429  int handler_size() const { return a_handlers.size(); }
430 
435  handler_iterator handler_begin() { return a_handlers.begin(); }
436 
441  handler_iterator handler_end() { return a_handlers.end(); }
442 
447  const_handler_iterator handler_begin() const { return a_handlers.begin(); }
448 
453  const_handler_iterator handler_end() const { return a_handlers.end(); }
454 
459  const_service_iterator service_begin() const { return a_services.begin(); }
460 
465  const_service_iterator service_end() const { return a_services.end(); }
466 
483  virtual void eventUser(const char* id, const void* context) {;}
484 
498  virtual void eventBreakAddress(const in_addr_t& address) ;
499 
513  virtual void eventRecoverAddress(const in_addr_t& address) ;
514 
530  virtual bool eventAcceptConnection(const ClientSocket& clientSocket) noexcept(false);
531 
547  virtual void eventCreateConnection(const Server* server) ;
548 
564  virtual void eventCreateConnection(const Service* service) ;
565 
584  virtual void eventReceiveMessage(ClientSocket& clientSocket, const Message& message)
585  noexcept(false) { ; }
586 
592  virtual void eventOverQuota(const ClientSocket& clientSocket) {;}
593 
600  virtual void eventDiscardConnection(const ClientSocket& clientSocket) {;}
601 
608  virtual void eventIgnoreBurst(const ClientSocket& clientSocket, const DataBlock& burst) {;}
609 
614  std::string asString() const ;
615 
621  virtual xml::Node* asXML(xml::Node* parent) const ;
622 
628  static Handler* handler(handler_iterator& ii) { return Handlers::data(ii); }
629 
635  static const Handler* handler(const_handler_iterator& ii) { return Handlers::data(ii); }
636 
642  static const Service* service(const_service_iterator& ii) { return *ii; }
643 
649  static const char* getClassName() { return "anna::comm::Communicator"; }
650 
651 protected:
665  virtual void eventBreakConnection(const ClientSocket& clientSocket) {;}
666 
676  virtual void eventBreakLocalConnection(const ClientSocket& clientSocket) {;}
677 
678 
702  virtual void eventBreakConnection(const Server* server) ;
703 
712  virtual void eventBreakConnection(const Service* service) ;
713 
721  virtual void do_initialize() noexcept(false) {;}
722 
727  void do_stop() { requestStop(); }
728 
733  virtual void setStatus(const Status& status) ;
734 
744  void attach(BinderSocket* binderSocket) noexcept(false);
745 
751  void detach(BinderSocket* binderSocket) ;
752 
764  virtual void eventStartup() noexcept(false) {;}
765 
773  virtual void eventShutdown() ;
774 
775 private:
776  const WorkMode::_v a_workMode;
777  bool a_isServing;
778  bool a_requestedStop;
779  Handlers a_handlers;
780  Millisecond a_recoveryTime;
781  Status a_status;
782  Services a_services;
783  Millisecond a_timeout;
784  comm::Handler* a_mainHandler;
785  ConnectionRecover* a_connectionRecover;
786  bool a_pendingClose;
787  Millisecond a_tryingConnectionTime;
788  int a_levelOfDenialService;
789 
790  // ST
791  Poll* a_poll;
792  Handlers a_timedouts;
793  void singlethreadedAccept() noexcept(false);
794 
795  // MT
796  ThreadManager* a_threadManager;
797  void multithreadedAccept() noexcept(false);
798 
799  ConnectionRecover* getConnectionRecover() { return a_connectionRecover; }
800 
801  void attach(RemoteConnection* remoteConnection) noexcept(false);
802 
803  void insert(Handler*) noexcept(false);
804  Handler* find(const int fd) { return a_handlers.find(fd); }
805 
806  // Reimplementado de app::Component
807  void do_cloneParent() noexcept(false);
808  void do_cloneChild() ;
809 
810  friend class Handler;
811 
812  friend class Server;
813  // attach (RemoteConnection)
814 
816  // getConnectionRecover, eventBreakConnection
817 
818  friend class handler::ClientSocket;
819  // eventBreakConnection
820 
821  // EDU
823  // eventBreakLocalConnection
824 };
825 
826 }
827 }
828 
829 #endif
830 
Definition: ClientSocket.hpp:22
container::iterator iterator
Definition: SortedVector.hpp:33
const_handler_iterator handler_end() const
Definition: Communicator.hpp:453
Definition: Communicator.hpp:79
virtual void eventBreakLocalConnection(const ClientSocket &clientSocket)
Definition: Communicator.hpp:676
Handlers::iterator handler_iterator
Definition: Communicator.hpp:179
Definition: Millisecond.hpp:24
virtual void eventBreakConnection(const ClientSocket &clientSocket)
Definition: Communicator.hpp:665
Definition: Status.hpp:21
static const Millisecond MaxTryingConnectionTime
Definition: Communicator.hpp:154
Handlers::const_iterator const_handler_iterator
Definition: Communicator.hpp:178
static const Millisecond MaxRecoveryTime
Definition: Communicator.hpp:136
static const Handler * handler(const_handler_iterator &ii)
Definition: Communicator.hpp:635
virtual void eventStartup() noexcept(false)
Definition: Communicator.hpp:764
Definition: ThreadManager.hpp:27
virtual void eventDiscardConnection(const ClientSocket &clientSocket)
Definition: Communicator.hpp:600
const Millisecond & getTimeout() const
Definition: Communicator.hpp:215
virtual void eventUser(const char *id, const void *context)
Definition: Communicator.hpp:483
Definition: Server.hpp:53
static const Millisecond MinTryingConnectionTime
Definition: Communicator.hpp:142
Definition: Node.hpp:56
Definition: LocalConnection.hpp:31
virtual void do_initialize() noexcept(false)
Definition: Communicator.hpp:721
Definition: LocalConnection.hpp:22
const_service_iterator service_begin() const
Definition: Communicator.hpp:459
bool hasRequestedStop() const
Definition: Communicator.hpp:234
virtual void eventOverQuota(const ClientSocket &clientSocket)
Definition: Communicator.hpp:592
int handler_size() const
Definition: Communicator.hpp:429
_v
Definition: Communicator.hpp:97
Definition: ClientSocket.hpp:38
Services::const_iterator const_service_iterator
Definition: Communicator.hpp:182
static const Millisecond DefaultTryingConnectionTime
Definition: Communicator.hpp:148
bool isServing() const
Definition: Communicator.hpp:228
void notifyPendingClose()
Definition: Communicator.hpp:239
Definition: Poll.hpp:31
virtual void eventReceiveMessage(ClientSocket &clientSocket, const Message &message) noexcept(false)
Definition: Communicator.hpp:584
Definition: Message.hpp:26
virtual void eventIgnoreBurst(const ClientSocket &clientSocket, const DataBlock &burst)
Definition: Communicator.hpp:608
const Status & getStatus() const
Definition: Communicator.hpp:207
static const Millisecond DefaultRecoveryTime
Definition: Communicator.hpp:130
WorkMode::_v getWorkMode() const
Definition: Communicator.hpp:220
Definition: Communicator.hpp:104
handler_iterator handler_end()
Definition: Communicator.hpp:441
Definition: BinderSocket.hpp:27
static int getReceivingChunkSize()
Definition: Communicator.hpp:285
Definition: ServerSocket.hpp:37
static const Service * service(const_service_iterator &ii)
Definition: Communicator.hpp:642
xml::Node Node
Definition: Node.hpp:21
const_handler_iterator handler_begin() const
Definition: Communicator.hpp:447
container::const_iterator const_iterator
Definition: SortedVector.hpp:34
Definition: DatagramSocket.hpp:21
Definition: app.hpp:12
const Millisecond & getRecoveryTime() const
Definition: Communicator.hpp:201
Definition: Component.hpp:44
int getLevelOfDenialService() const
Definition: Communicator.hpp:308
Definition: Communicator.hpp:96
void setTimeout(const Millisecond &timeout)
Definition: Communicator.hpp:292
static const Millisecond DefaultTimeout
Definition: Communicator.hpp:170
Definition: RemoteConnection.hpp:23
Definition: Handler.hpp:33
static Handler * handler(handler_iterator &ii)
Definition: Communicator.hpp:628
Definition: RemoteConnection.hpp:22
static const char * getClassName()
Definition: Communicator.hpp:649
const Millisecond & getTryingConnectionTime() const
Definition: Communicator.hpp:266
Definition: ConnectionRecover.hpp:27
handler_iterator handler_begin()
Definition: Communicator.hpp:435
SortedVector< Handler, SortByFileDescriptor > Handlers
Definition: Communicator.hpp:177
Definition: DataBlock.hpp:24
T * find(const TKey key)
Definition: SortedVector.hpp:113
void do_stop()
Definition: Communicator.hpp:727
std::vector< const Service * > Services
Definition: Communicator.hpp:181
static const Millisecond MinRecoveryTime
Definition: Communicator.hpp:124
Definition: Service.hpp:28
const_service_iterator service_end() const
Definition: Communicator.hpp:465