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