SocketHandler.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef SocketHandler_H
  2. #define SocketHandler_H
  3. #include <glibmm.h>
  4. #include <giomm.h>
  5. class SocketHandler:public Gio::SocketClient
  6. {
  7. public:
  8. enum states
  9. {
  10. CONNECTING,
  11. READY,
  12. ERROR,
  13. SHUTDOWN
  14. };
  15. virtual ~SocketHandler();
  16. SocketHandler(const Glib::ustring& host,int port);
  17. void setPatrolCounter(ssize_t counter);
  18. states status() const;
  19. bool toBeDestroyed() const;
  20. protected:
  21. virtual bool write_handler(Glib::IOCondition io_condition)=0;
  22. virtual bool read_handler(Glib::IOCondition io_condition)=0;
  23. virtual bool error_handler(Glib::IOCondition io_condition);
  24. virtual void on_connect()=0;
  25. states m_status;
  26. Glib::RefPtr< Gio::SocketConnection > m_socketclient;
  27. void selfDestroy();
  28. friend class SocketHandlerFactory;
  29. void patrol();
  30. private:
  31. virtual void onPatrol();
  32. void on_connect_async_ready(Glib::RefPtr<Gio::AsyncResult>& result);
  33. bool m_garbage;
  34. ssize_t m_patrol;
  35. };
  36. class SingleRequestSocket final:public SocketHandler
  37. {
  38. public:
  39. SingleRequestSocket(const Glib::ustring& host,int port);
  40. ~SingleRequestSocket() =default ;
  41. protected:
  42. bool write_handler(Glib::IOCondition io_condition);
  43. bool read_handler(Glib::IOCondition io_condition);
  44. void on_connect();
  45. private:
  46. void onPatrol();
  47. };
  48. class SocketHandlerFactory
  49. {
  50. public:
  51. SocketHandlerFactory(const SocketHandlerFactory&) = delete;
  52. SocketHandlerFactory& operator=(const SocketHandlerFactory&) = delete;
  53. static SocketHandlerFactory* get();
  54. ~SocketHandlerFactory()=default;
  55. void push(std::unique_ptr<SocketHandler>& source);
  56. void clean();
  57. private:
  58. SocketHandlerFactory() = default;
  59. std::list<std::unique_ptr<SocketHandler> > m_queue;
  60. static SocketHandlerFactory* m_instance;
  61. bool patrol();
  62. };
  63. #endif