正在显示
1 个修改的文件
包含
196 行增加
和
0 行删除
src/server/python/dmpserverwrapper.cpp
0 → 100644
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 | +} |
请
注册
或
登录
后发表评论