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