提交 e7726c88ee6862a65f128ffb9ae56cb7f517de48

作者 LJH 李佳桓
1 个父辈 bab2831c

add

  1 +/**************************************************************************
  2 +* file: dmpserverwrapper.cpp
  3 +
  4 +* Author: wanzhongping
  5 +* Date: 2021-04-01 14:54:55
  6 +* Email: zhongpingw@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +#define BOOST_BIND_GLOBAL_PLACEHOLDERS
  10 +#include <boost/python.hpp>
  11 +#include "../dmpserverfilter.h"
  12 +#include "../dmpserverinterface.h"
  13 +#include "../dmprequesthandler.h"
  14 +#include "../dmpserverrequest.h"
  15 +#include "../dmpserverresponse.h"
  16 +#include "../dmpservice.h"
  17 +#include <boost/python/suite/indexing/map_indexing_suite.hpp>
  18 +#include <boost/python/reference_existing_object.hpp>
  19 +
  20 +using namespace boost::python;
  21 +
  22 +struct DmpServiceWrap : DmpService, wrapper<DmpService>
  23 +{
  24 + virtual std::string Name() const
  25 + {
  26 + return this->get_override("name")();
  27 + }
  28 +
  29 + virtual std::string Version() const
  30 + {
  31 + return this->get_override("version")();
  32 + }
  33 + virtual bool AllowMethod() const
  34 + {
  35 + return this->get_override("allow_method")();
  36 + }
  37 + virtual void ExecuteRequest(const DmpServerRequest &request, DmpServerResponse &response)
  38 + {
  39 + if(override function=this->get_override("execute_request"))
  40 + {
  41 + try
  42 + {
  43 + reference_existing_object::apply<DmpServerRequest&>::type converter1;
  44 + reference_existing_object::apply<DmpServerResponse&>::type converter2;
  45 + PyObject* obj_req = converter1(request);
  46 + PyObject* obj_res = converter2(response);
  47 + object real_obj1 = object(handle<>(obj_req));
  48 + object real_obj2 = object(handle<>(obj_res));
  49 + function(real_obj1,real_obj2);
  50 + }
  51 + catch (boost::python::error_already_set &e)
  52 + {
  53 + PyErr_PrintEx(0);
  54 + }
  55 + }
  56 + else
  57 + {
  58 + DmpServiceWrap::ExecuteRequest(request,response);
  59 + }
  60 + }
  61 +};
  62 +
  63 +struct DmpServerResponseWrap : DmpServerResponse, wrapper<DmpServerResponse>
  64 +{
  65 + virtual void setStatusCode(int code)
  66 + {
  67 + this->get_override("set_status_code")();
  68 + }
  69 + virtual int statusCode() const
  70 + {
  71 + return this->get_override("status_code")();
  72 + }
  73 + virtual std::string Header( const std::string &key) const
  74 + {
  75 + return this->get_override("Header")();
  76 + }
  77 + virtual void SetHeader( const std::string &key, const std::string &value )
  78 + {
  79 + this->get_override("SetHeader")();
  80 + }
  81 + virtual void RemoveHeader( const std::string &key )
  82 + {
  83 + this->get_override("RemoveHeader")();
  84 + }
  85 + virtual ParameterMap Headers() const
  86 + {
  87 + return this->get_override("Headers")();
  88 + }
  89 +
  90 + virtual void SendError( int code, const std::string &message )
  91 + {
  92 + this->get_override("SendError")();
  93 + }
  94 +
  95 + virtual void Write(const std::string data)
  96 + {
  97 + this->get_override("write")();
  98 + }
  99 +
  100 + virtual void WriteContent(const void * content, int length)
  101 + {
  102 + this->get_override("write_content")();
  103 + }
  104 +
  105 + virtual void Clear()
  106 + {
  107 + this->get_override("Clear")();
  108 + }
  109 +};
  110 +
  111 +struct DmpServerFilterWrap : DmpServerFilter, wrapper<DmpServerFilter>
  112 +{
  113 + DmpServerFilterWrap(DmpServerInterface *server_interface)
  114 + : DmpServerFilter(server_interface)
  115 + {
  116 + }
  117 +
  118 + void RequestReady()
  119 + {
  120 + this->get_override("request_ready")();
  121 + }
  122 +
  123 + void RequestReadyDefault()
  124 + {
  125 + return this->DmpServerFilter::RequestReady();
  126 + }
  127 +
  128 + void ResponseComplete()
  129 + {
  130 + this->get_override("response_complete")();
  131 + }
  132 +
  133 + void SendResponse()
  134 + {
  135 + this->get_override("send_response")();
  136 + }
  137 +};
  138 +
  139 +struct DmpServerInterfaceWrap : DmpServerInterface, wrapper<DmpServerInterface>
  140 +{
  141 + virtual DmpRequestHandler *RequestHandler()
  142 + {
  143 + return this->get_override("request_handler")();
  144 + }
  145 + virtual void RegisterFilter(DmpServerFilter *filter, int priority = 0)
  146 + {
  147 + this->get_override("register_filter")();
  148 + }
  149 + virtual DmpServiceRegistry *ServiceRegistry()
  150 + {
  151 + return this->get_override("service_registry")();
  152 + }
  153 +};
  154 +
  155 +BOOST_PYTHON_MODULE(dmap_server)
  156 +{
  157 + class_<ParameterMap>("ParameterMap")
  158 + .def(map_indexing_suite<ParameterMap,true>());
  159 +
  160 + class_<DmpServiceRegistry>("DmpServiceRegistry")
  161 + .def("register_service", &DmpServiceRegistry::RegisterService);
  162 +
  163 + class_<DmpServiceWrap, boost::noncopyable>("DmpService")
  164 + .def("name", pure_virtual(&DmpService::Name))
  165 + .def("version", pure_virtual(&DmpService::Version))
  166 + .def("allow_method", pure_virtual(&DmpService::AllowMethod))
  167 + .def("execute_request", pure_virtual(&DmpService::ExecuteRequest));
  168 +
  169 + class_<DmpServerRequest>("DmpServerRequest",init<std::string&>());
  170 +
  171 + class_<DmpServerResponseWrap, boost::noncopyable>("DmpServerResponse")
  172 + .add_property("status_code", &DmpServerResponse::statusCode, &DmpServerResponse::setStatusCode)
  173 + .def("header", pure_virtual(&DmpServerResponse::Header))
  174 + .def("write", pure_virtual(&DmpServerResponse::Write))
  175 + .def("write_content", pure_virtual(&DmpServerResponse::WriteContent))
  176 + .def("set_header", pure_virtual(&DmpServerResponse::SetHeader));
  177 +
  178 + class_<DmpRequestHandler>("DmpRequestHandler",init<DmpServerRequest&, DmpServerResponse&>())
  179 + .def("parameters", &DmpRequestHandler::Parameters)
  180 + .def("set_parameter", &DmpRequestHandler::SetParameter)
  181 + .def("request_headers", &DmpRequestHandler::RequestHeaders)
  182 + .def("clear", &DmpRequestHandler::Clear)
  183 + .def("set_response_header", &DmpRequestHandler::set_response_header)
  184 + .def("append_body", &DmpRequestHandler::AppendBody);
  185 +
  186 + class_<DmpServerFilterWrap, boost::noncopyable>("DmpServerFilter",init<DmpServerInterface*>())
  187 + .def("request_ready", &DmpServerFilterWrap::RequestReady, &DmpServerFilterWrap::RequestReadyDefault)
  188 + .def("response_complete", &DmpServerFilterWrap::ResponseComplete)
  189 + .def("send_response", &DmpServerFilterWrap::SendResponse)
  190 + .def("server_interface", &DmpServerFilterWrap::server_interface, return_internal_reference<>());
  191 +
  192 + class_<DmpServerInterfaceWrap, boost::noncopyable>("DmpServerInterface")
  193 + .def("register_filter", pure_virtual(&DmpServerInterface::RegisterFilter))
  194 + .def("request_handler", pure_virtual(&DmpServerInterface::RequestHandler), return_internal_reference<>())
  195 + .def("service_registry", pure_virtual(&DmpServerInterface::ServiceRegistry), return_internal_reference<>());
  196 +}
\ No newline at end of file
... ...
注册登录 后发表评论