ChipMaster's trial hacks on C++CMS starting with v1.2.1. Not sure I'll follow on with the v2 since it looks to be breaking and mostly frivolous.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

189 lines
4.3 KiB

  1. #ifndef CPPCMS_RPC_JSON_OBJECT_H
  2. #define CPPCMS_RPC_JSON_OBJECT_H
  3. #include "application.h"
  4. namespace cppcms {
  5. namespace rpc {
  6. class CPPCMS_API json_call : public refcounted {
  7. public:
  8. json_call(intrusive_ptr<http::context> context);
  9. ~json_call();
  10. std::string method();
  11. json::array const &params();
  12. bool is_notification();
  13. json::value &result();
  14. json::value &error();
  15. void on_drop(util::callback0 const &handler)
  16. void submit();
  17. private:
  18. intrusive_ptr<http::context> context_;
  19. struct data;
  20. util::hold_ptr<data> d;
  21. };
  22. namespace json_details {
  23. typedef intrusive_ptr<json::call> json_ptr;
  24. template<typename Class,typename Pointer>
  25. struct binder0 {
  26. public:
  27. typedef Pointer pointer_type;
  28. typedef (Class::*member_type)(json_ptr);
  29. binder0(member_type m,pointer_type o) : object_(o), member_(m) {}
  30. void operator()(json_ptr p) const
  31. {
  32. if(p->params.size()!=0) {
  33. throw json::bad_value_cast();
  34. }
  35. ((*object_).*member_)(p);
  36. }
  37. private:
  38. pointer_type object_;
  39. member_type meber_;
  40. };
  41. template<typename Class,typename Pointer,typename P1>
  42. struct binder1 {
  43. public:
  44. typedef Pointer pointer_type;
  45. typedef (Class::*member_type)(json_ptr,P1 const &);
  46. binder1(member_type m,pointer_type o) : object_(o), member_(m) {}
  47. void operator()(json_ptr p) const
  48. {
  49. if(p->params.size()!=1) {
  50. throw json::bad_value_cast();
  51. }
  52. P1 p1=p->params[0].get<P1>();
  53. ((*object_).*member_)(p,p1);
  54. }
  55. private:
  56. pointer_type object_;
  57. member_type meber_;
  58. };
  59. template<typename Class,typename Pointer,typename P1,typename P2>
  60. struct binder2 {
  61. public:
  62. typedef Pointer pointer_type;
  63. typedef (Class::*member_type)(json_ptr,P1 const &,P2 const &);
  64. binder2(member_type m,pointer_type o) : object_(o), member_(m) {}
  65. void operator()(json_ptr p) const
  66. {
  67. if(p->params.size()!=2) {
  68. throw json::bad_value_cast();
  69. }
  70. P1 p1=p->params[0].get<P1>();
  71. P2 p2=p->params[1].get<P2>();
  72. ((*object_).*member_)(p,p1,p2);
  73. }
  74. private:
  75. pointer_type object_;
  76. member_type meber_;
  77. };
  78. template<typename Class,typename Pointer,typename P1,typename P2,typename P3>
  79. struct binder3 {
  80. public:
  81. typedef Pointer pointer_type;
  82. typedef (Class::*member_type)(json_ptr,P1 const &,P2 const &,P3 const &);
  83. binder3(member_type m,pointer_type o) : object_(o), member_(m) {}
  84. void operator()(json_ptr p) const
  85. {
  86. if(p->params.size()!=3) {
  87. throw json::bad_value_cast();
  88. }
  89. P1 p1=p->params[0].get<P1>();
  90. P2 p2=p->params[1].get<P2>();
  91. P3 p3=p->params[2].get<P3>();
  92. ((*object_).*member_)(p,p1,p2,p3);
  93. }
  94. private:
  95. pointer_type object_;
  96. member_type meber_;
  97. };
  98. template<typename Class,typename Pointer,typename P1,typename P2,typename P3,typename P4>
  99. struct binder4 {
  100. public:
  101. typedef Pointer pointer_type;
  102. typedef (Class::*member_type)(json_ptr,P1 const &,P2 const &,P3 const &,P4 const &);
  103. binder2(member_type m,pointer_type o) : object_(o), member_(m) {}
  104. void operator()(json_ptr p) const
  105. {
  106. if(p->params.size()!=3) {
  107. throw json::bad_value_cast();
  108. }
  109. P1 p1=p->params[0].get<P1>();
  110. P2 p2=p->params[1].get<P2>();
  111. P3 p3=p->params[2].get<P3>();
  112. P4 p4=p->params[3].get<P4>();
  113. ((*object_).*member_)(p,p1,p2,p3,p4);
  114. }
  115. private:
  116. pointer_type object_;
  117. member_type meber_;
  118. };
  119. } // json details
  120. class json_object : public application {
  121. public:
  122. typedef intrusive_ptr<json::call> json_ptr;
  123. void add_method(std::string name,util::callback1<json_ptr> handler);
  124. void add_method_description(std::string name,json::value const &schema);
  125. template<typename Class,typename Pointer>
  126. void add_method(std::string name,void (Class::*member)(json_ptr),Pointer object)
  127. {
  128. add_method(name,json_details::binder0<Class,Pointer>(member,object));
  129. json::value description;
  130. description.set("type","method");
  131. description.set("params",json::array());
  132. add_method_description(name,description);
  133. }
  134. template<typename Class,typename Pointer,typename P1>
  135. void add_method(std::string name,void (Class::*member)(json_ptr,P1 const &),Pointer object)
  136. {
  137. add_method(name,json_details::binder1<Class,Pointer,P1>(member,object));
  138. description.set("type","method");
  139. description.set("params",json::array());
  140. add_method_description(name,description);
  141. }
  142. };
  143. } // rpc
  144. } // cppcms
  145. #endif