eris  1.4.0
A WorldForge client library.
Response.h
1 #ifndef ERIS_RESPONSE_H
2 #define ERIS_RESPONSE_H
3 
4 #include "Router.h"
5 
6 #include <Atlas/Objects/ObjectsFwd.h>
7 #include <unordered_map>
8 #include <functional>
9 #include <memory>
10 #include <cstdint>
11 #include <string>
12 
13 namespace Eris
14 {
15 
16 std::string getErrorMessage(const Atlas::Objects::Operation::RootOperation & err);
17 
18 
20 {
21 public:
22  virtual ~ResponseBase();
23 
27  virtual Router::RouterResult responseReceived(const Atlas::Objects::Operation::RootOperation& op) = 0;
28 };
29 
30 class NullResponse : public ResponseBase
31 {
32 public:
33  Router::RouterResult responseReceived(const Atlas::Objects::Operation::RootOperation&) override;
34 };
35 
36 void* clearMemberResponse(void*);
37 
38 template <class T>
40 {
41 public:
42  typedef void (T::*T_method)(const Atlas::Objects::Operation::RootOperation& op);
43 
44  MemberResponse(T *obj, void (T::*method)(const Atlas::Objects::Operation::RootOperation& op)) :
45  m_object(obj),
46  m_func(method)
47  {
48  obj->add_destroy_notify_callback(&m_object, &clearMemberResponse);
49  }
50 
51  ~MemberResponse() override {
52  if (m_object) m_object->remove_destroy_notify_callback(&m_object);
53  }
54 
55  Router::RouterResult responseReceived(const Atlas::Objects::Operation::RootOperation& op) override {
56  if (m_object) (m_object->*m_func)(op);
57  return Router::HANDLED;
58  }
59 
60 private:
61  T* m_object;
62  T_method m_func;
63 };
64 
66 {
67 public:
68 
69  typedef std::function<Router::RouterResult(const Atlas::Objects::Operation::RootOperation& op)> Callback;
70 
71  ~ResponseTracker();
72 
73  void await(std::int64_t serialno, std::unique_ptr<ResponseBase>);
74 
75  void await(std::int64_t serial, Callback callback);
76 
77  template <class T>
78  void await(std::int64_t serial, T* ins, void (T::*method)(const Atlas::Objects::Operation::RootOperation& op) )
79  {
80  await(serial, std::make_unique<MemberResponse<T>>(ins, method));
81  }
82 
83  void ignore(std::int64_t serial)
84  {
85  await(serial, std::make_unique<NullResponse>());
86  }
87 
88  Router::RouterResult handleOp(const Atlas::Objects::Operation::RootOperation& op);
89 
90 private:
91  std::unordered_map<std::int64_t, Callback> m_pending;
92 };
93 
94 } // of namespace
95 
96 #endif // of ERIS_RESPONSE_H
Router::RouterResult responseReceived(const Atlas::Objects::Operation::RootOperation &op) override
Definition: Response.h:55
Router::RouterResult responseReceived(const Atlas::Objects::Operation::RootOperation &) override
Definition: Response.cpp:76
virtual Router::RouterResult responseReceived(const Atlas::Objects::Operation::RootOperation &op)=0
Definition: Account.cpp:33