Mercurial > hg > orthanc-stone
comparison Framework/Toolbox/OrthancApiClient.cpp @ 383:939f626eb6d7
removing converters in OrthancApiClient
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 06 Nov 2018 20:12:42 +0100 |
parents | dd4c7e82b4be |
children | aee3d7941c9b |
comparison
equal
deleted
inserted
replaced
382:dd4c7e82b4be | 383:939f626eb6d7 |
---|---|
64 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | 64 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
65 } | 65 } |
66 } | 66 } |
67 | 67 |
68 | 68 |
69 class OrthancApiClient::WebServicePayload : public Orthanc::IDynamicObject | |
70 { | |
71 private: | |
72 std::auto_ptr< MessageHandler<EmptyResponseReadyMessage> > emptyHandler_; | |
73 std::auto_ptr< MessageHandler<JsonResponseReadyMessage> > jsonHandler_; | |
74 std::auto_ptr< MessageHandler<BinaryResponseReadyMessage> > binaryHandler_; | |
75 std::auto_ptr< MessageHandler<IWebService::HttpRequestErrorMessage> > failureHandler_; | |
76 std::auto_ptr< Orthanc::IDynamicObject > userPayload_; | |
77 | |
78 void NotifyConversionError(const IWebService::HttpRequestSuccessMessage& message) const | |
79 { | |
80 if (failureHandler_.get() != NULL) | |
81 { | |
82 failureHandler_->Apply(IWebService::HttpRequestErrorMessage | |
83 (message.GetUri(), userPayload_.get())); | |
84 } | |
85 } | |
86 | |
87 public: | |
88 WebServicePayload(MessageHandler<EmptyResponseReadyMessage>* handler, | |
89 MessageHandler<IWebService::HttpRequestErrorMessage>* failureHandler, | |
90 Orthanc::IDynamicObject* userPayload) : | |
91 emptyHandler_(handler), | |
92 failureHandler_(failureHandler), | |
93 userPayload_(userPayload) | |
94 { | |
95 if (handler == NULL) | |
96 { | |
97 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
98 } | |
99 } | |
100 | |
101 WebServicePayload(MessageHandler<BinaryResponseReadyMessage>* handler, | |
102 MessageHandler<IWebService::HttpRequestErrorMessage>* failureHandler, | |
103 Orthanc::IDynamicObject* userPayload) : | |
104 binaryHandler_(handler), | |
105 failureHandler_(failureHandler), | |
106 userPayload_(userPayload) | |
107 { | |
108 if (handler == NULL) | |
109 { | |
110 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
111 } | |
112 } | |
113 | |
114 WebServicePayload(MessageHandler<JsonResponseReadyMessage>* handler, | |
115 MessageHandler<IWebService::HttpRequestErrorMessage>* failureHandler, | |
116 Orthanc::IDynamicObject* userPayload) : | |
117 jsonHandler_(handler), | |
118 failureHandler_(failureHandler), | |
119 userPayload_(userPayload) | |
120 { | |
121 if (handler == NULL) | |
122 { | |
123 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
124 } | |
125 } | |
126 | |
127 void HandleSuccess(const IWebService::HttpRequestSuccessMessage& message) const | |
128 { | |
129 if (emptyHandler_.get() != NULL) | |
130 { | |
131 emptyHandler_->Apply(OrthancApiClient::EmptyResponseReadyMessage | |
132 (message.GetUri(), userPayload_.get())); | |
133 } | |
134 else if (binaryHandler_.get() != NULL) | |
135 { | |
136 binaryHandler_->Apply(OrthancApiClient::BinaryResponseReadyMessage | |
137 (message.GetUri(), message.GetAnswer(), | |
138 message.GetAnswerSize(), userPayload_.get())); | |
139 } | |
140 else if (jsonHandler_.get() != NULL) | |
141 { | |
142 Json::Value response; | |
143 if (MessagingToolbox::ParseJson(response, message.GetAnswer(), message.GetAnswerSize())) | |
144 { | |
145 jsonHandler_->Apply(OrthancApiClient::JsonResponseReadyMessage | |
146 (message.GetUri(), response, userPayload_.get())); | |
147 } | |
148 else | |
149 { | |
150 NotifyConversionError(message); | |
151 } | |
152 } | |
153 else | |
154 { | |
155 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
156 } | |
157 } | |
158 | |
159 void HandleFailure(const IWebService::HttpRequestErrorMessage& message) const | |
160 { | |
161 if (failureHandler_.get() != NULL) | |
162 { | |
163 failureHandler_->Apply(IWebService::HttpRequestErrorMessage | |
164 (message.GetUri(), userPayload_.get())); | |
165 } | |
166 } | |
167 }; | |
168 | |
169 | |
69 OrthancApiClient::OrthancApiClient(MessageBroker& broker, | 170 OrthancApiClient::OrthancApiClient(MessageBroker& broker, |
70 IWebService& orthanc) : | 171 IWebService& orthanc) : |
71 IObservable(broker), | 172 IObservable(broker), |
173 IObserver(broker), | |
72 orthanc_(orthanc) | 174 orthanc_(orthanc) |
73 { | 175 { |
74 } | 176 } |
75 | 177 |
76 // performs the translation between IWebService messages and OrthancApiClient messages | 178 |
77 // TODO: handle destruction of this object (with shared_ptr ?::delete_later ???) | 179 void OrthancApiClient::GetJsonAsync( |
78 class HttpResponseToJsonConverter : public IObserver, IObservable | 180 const std::string& uri, |
79 { | 181 MessageHandler<JsonResponseReadyMessage>* successCallback, |
80 private: | 182 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, |
81 std::auto_ptr<MessageHandler<OrthancApiClient::JsonResponseReadyMessage> > orthancApiSuccessCallback_; | 183 Orthanc::IDynamicObject* payload) |
82 std::auto_ptr<MessageHandler<IWebService::HttpRequestErrorMessage> > orthancApiFailureCallback_; | 184 { |
83 | 185 orthanc_.GetAsync(uri, IWebService::Headers(), |
84 public: | 186 new WebServicePayload(successCallback, failureCallback, payload), |
85 HttpResponseToJsonConverter(MessageBroker& broker, | 187 new Callable<OrthancApiClient, IWebService::HttpRequestSuccessMessage> |
86 MessageHandler<OrthancApiClient::JsonResponseReadyMessage>* orthancApiSuccessCallback, | 188 (*this, &OrthancApiClient::NotifyHttpSuccess), |
87 MessageHandler<IWebService::HttpRequestErrorMessage>* orthancApiFailureCallback) | 189 new Callable<OrthancApiClient, IWebService::HttpRequestErrorMessage> |
88 : IObserver(broker), | 190 (*this, &OrthancApiClient::NotifyHttpError)); |
89 IObservable(broker), | 191 } |
90 orthancApiSuccessCallback_(orthancApiSuccessCallback), | 192 |
91 orthancApiFailureCallback_(orthancApiFailureCallback) | 193 |
92 { | 194 void OrthancApiClient::GetBinaryAsync( |
93 } | 195 const std::string& uri, |
94 | 196 const std::string& contentType, |
95 void ConvertResponseToJson(const IWebService::HttpRequestSuccessMessage& message) | 197 MessageHandler<BinaryResponseReadyMessage>* successCallback, |
96 { | 198 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, |
97 Json::Value response; | 199 Orthanc::IDynamicObject* payload) |
98 if (MessagingToolbox::ParseJson(response, message.GetAnswer(), message.GetAnswerSize())) | |
99 { | |
100 if (orthancApiSuccessCallback_.get() != NULL) | |
101 { | |
102 orthancApiSuccessCallback_->Apply(OrthancApiClient::JsonResponseReadyMessage | |
103 (message.GetUri(), response, message.GetPayloadPointer())); | |
104 } | |
105 } | |
106 else if (orthancApiFailureCallback_.get() != NULL) | |
107 { | |
108 orthancApiFailureCallback_->Apply(IWebService::HttpRequestErrorMessage | |
109 (message.GetUri(), message.GetPayloadPointer())); | |
110 } | |
111 | |
112 delete this; // hack untill we find someone to take ownership of this object (https://isocpp.org/wiki/faq/freestore-mgmt#delete-this) | |
113 } | |
114 | |
115 void ConvertError(const IWebService::HttpRequestErrorMessage& message) | |
116 { | |
117 if (orthancApiFailureCallback_.get() != NULL) | |
118 { | |
119 orthancApiFailureCallback_->Apply(IWebService::HttpRequestErrorMessage(message.GetUri(), message.GetPayloadPointer())); | |
120 } | |
121 | |
122 delete this; // hack untill we find someone to take ownership of this object (https://isocpp.org/wiki/faq/freestore-mgmt#delete-this) | |
123 } | |
124 }; | |
125 | |
126 // performs the translation between IWebService messages and OrthancApiClient messages | |
127 // TODO: handle destruction of this object (with shared_ptr ?::delete_later ???) | |
128 class HttpResponseToBinaryConverter : public IObserver, IObservable | |
129 { | |
130 private: | |
131 std::auto_ptr<MessageHandler<OrthancApiClient::BinaryResponseReadyMessage> > orthancApiSuccessCallback_; | |
132 std::auto_ptr<MessageHandler<IWebService::HttpRequestErrorMessage> > orthancApiFailureCallback_; | |
133 | |
134 public: | |
135 HttpResponseToBinaryConverter(MessageBroker& broker, | |
136 MessageHandler<OrthancApiClient::BinaryResponseReadyMessage>* orthancApiSuccessCallback, | |
137 MessageHandler<IWebService::HttpRequestErrorMessage>* orthancApiFailureCallback) | |
138 : IObserver(broker), | |
139 IObservable(broker), | |
140 orthancApiSuccessCallback_(orthancApiSuccessCallback), | |
141 orthancApiFailureCallback_(orthancApiFailureCallback) | |
142 { | |
143 } | |
144 | |
145 void ConvertResponseToBinary(const IWebService::HttpRequestSuccessMessage& message) | |
146 { | |
147 if (orthancApiSuccessCallback_.get() != NULL) | |
148 { | |
149 orthancApiSuccessCallback_->Apply(OrthancApiClient::BinaryResponseReadyMessage | |
150 (message.GetUri(), message.GetAnswer(), | |
151 message.GetAnswerSize(), message.GetPayloadPointer())); | |
152 } | |
153 else if (orthancApiFailureCallback_.get() != NULL) | |
154 { | |
155 orthancApiFailureCallback_->Apply(IWebService::HttpRequestErrorMessage | |
156 (message.GetUri(), message.GetPayloadPointer())); | |
157 } | |
158 | |
159 delete this; // hack untill we find someone to take ownership of this object (https://isocpp.org/wiki/faq/freestore-mgmt#delete-this) | |
160 } | |
161 | |
162 void ConvertError(const IWebService::HttpRequestErrorMessage& message) | |
163 { | |
164 if (orthancApiFailureCallback_.get() != NULL) | |
165 { | |
166 orthancApiFailureCallback_->Apply(IWebService::HttpRequestErrorMessage(message.GetUri(), message.GetPayloadPointer())); | |
167 } | |
168 | |
169 delete this; // hack untill we find someone to take ownership of this object (https://isocpp.org/wiki/faq/freestore-mgmt#delete-this) | |
170 } | |
171 }; | |
172 | |
173 // performs the translation between IWebService messages and OrthancApiClient messages | |
174 // TODO: handle destruction of this object (with shared_ptr ?::delete_later ???) | |
175 class HttpResponseToEmptyConverter : public IObserver, IObservable | |
176 { | |
177 private: | |
178 std::auto_ptr<MessageHandler<OrthancApiClient::EmptyResponseReadyMessage> > orthancApiSuccessCallback_; | |
179 std::auto_ptr<MessageHandler<IWebService::HttpRequestErrorMessage> > orthancApiFailureCallback_; | |
180 | |
181 public: | |
182 HttpResponseToEmptyConverter(MessageBroker& broker, | |
183 MessageHandler<OrthancApiClient::EmptyResponseReadyMessage>* orthancApiSuccessCallback, | |
184 MessageHandler<IWebService::HttpRequestErrorMessage>* orthancApiFailureCallback) | |
185 : IObserver(broker), | |
186 IObservable(broker), | |
187 orthancApiSuccessCallback_(orthancApiSuccessCallback), | |
188 orthancApiFailureCallback_(orthancApiFailureCallback) | |
189 { | |
190 } | |
191 | |
192 void ConvertResponseToEmpty(const IWebService::HttpRequestSuccessMessage& message) | |
193 { | |
194 if (orthancApiSuccessCallback_.get() != NULL) | |
195 { | |
196 orthancApiSuccessCallback_->Apply(OrthancApiClient::EmptyResponseReadyMessage | |
197 (message.GetUri(), message.GetPayloadPointer())); | |
198 } | |
199 else if (orthancApiFailureCallback_.get() != NULL) | |
200 { | |
201 orthancApiFailureCallback_->Apply(IWebService::HttpRequestErrorMessage | |
202 (message.GetUri(), message.GetPayloadPointer())); | |
203 } | |
204 | |
205 delete this; // hack untill we find someone to take ownership of this object (https://isocpp.org/wiki/faq/freestore-mgmt#delete-this) | |
206 } | |
207 | |
208 void ConvertError(const IWebService::HttpRequestErrorMessage& message) | |
209 { | |
210 if (orthancApiFailureCallback_.get() != NULL) | |
211 { | |
212 orthancApiFailureCallback_->Apply(IWebService::HttpRequestErrorMessage(message.GetUri(), message.GetPayloadPointer())); | |
213 } | |
214 | |
215 delete this; // hack untill we find someone to take ownership of this object (https://isocpp.org/wiki/faq/freestore-mgmt#delete-this) | |
216 } | |
217 }; | |
218 | |
219 | |
220 void OrthancApiClient::GetJsonAsync(const std::string& uri, | |
221 MessageHandler<JsonResponseReadyMessage>* successCallback, | |
222 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, | |
223 Orthanc::IDynamicObject* payload) | |
224 { | |
225 HttpResponseToJsonConverter* converter = new HttpResponseToJsonConverter(broker_, successCallback, failureCallback); // it is currently deleting itself after being used | |
226 orthanc_.GetAsync(uri, IWebService::Headers(), payload, | |
227 new Callable<HttpResponseToJsonConverter, IWebService::HttpRequestSuccessMessage>(*converter, &HttpResponseToJsonConverter::ConvertResponseToJson), | |
228 new Callable<HttpResponseToJsonConverter, IWebService::HttpRequestErrorMessage>(*converter, &HttpResponseToJsonConverter::ConvertError)); | |
229 | |
230 } | |
231 | |
232 | |
233 void OrthancApiClient::GetBinaryAsync(const std::string& uri, | |
234 const std::string& contentType, | |
235 MessageHandler<BinaryResponseReadyMessage>* successCallback, | |
236 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, | |
237 Orthanc::IDynamicObject* payload) | |
238 { | 200 { |
239 IWebService::Headers headers; | 201 IWebService::Headers headers; |
240 headers["Accept"] = contentType; | 202 headers["Accept"] = contentType; |
241 GetBinaryAsync(uri, headers, successCallback, failureCallback, payload); | 203 GetBinaryAsync(uri, headers, successCallback, failureCallback, payload); |
242 } | 204 } |
243 | 205 |
244 | 206 |
245 void OrthancApiClient::GetBinaryAsync(const std::string& uri, | 207 void OrthancApiClient::GetBinaryAsync( |
246 const IWebService::Headers& headers, | 208 const std::string& uri, |
247 MessageHandler<BinaryResponseReadyMessage>* successCallback, | 209 const IWebService::Headers& headers, |
248 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, | 210 MessageHandler<BinaryResponseReadyMessage>* successCallback, |
249 Orthanc::IDynamicObject* payload) | 211 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, |
250 { | 212 Orthanc::IDynamicObject* payload) |
251 HttpResponseToBinaryConverter* converter = new HttpResponseToBinaryConverter(broker_, successCallback, failureCallback); // it is currently deleting itself after being used | 213 { |
252 orthanc_.GetAsync(uri, headers, payload, | 214 orthanc_.GetAsync(uri, headers, |
253 new Callable<HttpResponseToBinaryConverter, IWebService::HttpRequestSuccessMessage>(*converter, &HttpResponseToBinaryConverter::ConvertResponseToBinary), | 215 new WebServicePayload(successCallback, failureCallback, payload), |
254 new Callable<HttpResponseToBinaryConverter, IWebService::HttpRequestErrorMessage>(*converter, &HttpResponseToBinaryConverter::ConvertError)); | 216 new Callable<OrthancApiClient, IWebService::HttpRequestSuccessMessage> |
255 } | 217 (*this, &OrthancApiClient::NotifyHttpSuccess), |
256 | 218 new Callable<OrthancApiClient, IWebService::HttpRequestErrorMessage> |
257 | 219 (*this, &OrthancApiClient::NotifyHttpError)); |
258 void OrthancApiClient::PostBinaryAsyncExpectJson(const std::string& uri, | 220 } |
259 const std::string& body, | 221 |
260 MessageHandler<JsonResponseReadyMessage>* successCallback, | 222 |
261 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, | 223 void OrthancApiClient::PostBinaryAsyncExpectJson( |
262 Orthanc::IDynamicObject* payload) | 224 const std::string& uri, |
263 { | 225 const std::string& body, |
264 HttpResponseToJsonConverter* converter = new HttpResponseToJsonConverter(broker_, successCallback, failureCallback); // it is currently deleting itself after being used | 226 MessageHandler<JsonResponseReadyMessage>* successCallback, |
265 orthanc_.PostAsync(uri, IWebService::Headers(), body, payload, | 227 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, |
266 new Callable<HttpResponseToJsonConverter, IWebService::HttpRequestSuccessMessage>(*converter, &HttpResponseToJsonConverter::ConvertResponseToJson), | 228 Orthanc::IDynamicObject* payload) |
267 new Callable<HttpResponseToJsonConverter, IWebService::HttpRequestErrorMessage>(*converter, &HttpResponseToJsonConverter::ConvertError)); | 229 { |
268 | 230 orthanc_.PostAsync(uri, IWebService::Headers(), body, |
269 } | 231 new WebServicePayload(successCallback, failureCallback, payload), |
270 | 232 new Callable<OrthancApiClient, IWebService::HttpRequestSuccessMessage> |
271 | 233 (*this, &OrthancApiClient::NotifyHttpSuccess), |
272 void OrthancApiClient::PostJsonAsyncExpectJson(const std::string& uri, | 234 new Callable<OrthancApiClient, IWebService::HttpRequestErrorMessage> |
273 const Json::Value& data, | 235 (*this, &OrthancApiClient::NotifyHttpError)); |
274 MessageHandler<JsonResponseReadyMessage>* successCallback, | 236 |
275 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, | 237 } |
276 Orthanc::IDynamicObject* payload) | 238 |
239 | |
240 void OrthancApiClient::PostJsonAsyncExpectJson( | |
241 const std::string& uri, | |
242 const Json::Value& data, | |
243 MessageHandler<JsonResponseReadyMessage>* successCallback, | |
244 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, | |
245 Orthanc::IDynamicObject* payload) | |
277 { | 246 { |
278 std::string body; | 247 std::string body; |
279 MessagingToolbox::JsonToString(body, data); | 248 MessagingToolbox::JsonToString(body, data); |
280 return PostBinaryAsyncExpectJson(uri, body, successCallback, failureCallback, payload); | 249 return PostBinaryAsyncExpectJson(uri, body, successCallback, failureCallback, payload); |
281 } | 250 } |
282 | 251 |
283 | 252 |
284 void OrthancApiClient::DeleteAsync(const std::string& uri, | 253 void OrthancApiClient::DeleteAsync( |
285 MessageHandler<EmptyResponseReadyMessage>* successCallback, | 254 const std::string& uri, |
286 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, | 255 MessageHandler<EmptyResponseReadyMessage>* successCallback, |
287 Orthanc::IDynamicObject* payload) | 256 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, |
288 { | 257 Orthanc::IDynamicObject* payload) |
289 HttpResponseToEmptyConverter* converter = new HttpResponseToEmptyConverter(broker_, successCallback, failureCallback); // it is currently deleting itself after being used | 258 { |
290 orthanc_.DeleteAsync(uri, IWebService::Headers(), payload, | 259 orthanc_.DeleteAsync(uri, IWebService::Headers(), |
291 new Callable<HttpResponseToEmptyConverter, IWebService::HttpRequestSuccessMessage>(*converter, &HttpResponseToEmptyConverter::ConvertResponseToEmpty), | 260 new WebServicePayload(successCallback, failureCallback, payload), |
292 new Callable<HttpResponseToEmptyConverter, IWebService::HttpRequestErrorMessage>(*converter, &HttpResponseToEmptyConverter::ConvertError)); | 261 new Callable<OrthancApiClient, IWebService::HttpRequestSuccessMessage> |
293 } | 262 (*this, &OrthancApiClient::NotifyHttpSuccess), |
294 | 263 new Callable<OrthancApiClient, IWebService::HttpRequestErrorMessage> |
295 | 264 (*this, &OrthancApiClient::NotifyHttpError)); |
296 class OrthancApiClient::WebServicePayload : public boost::noncopyable | 265 } |
297 { | 266 |
298 private: | 267 |
299 std::auto_ptr< MessageHandler<EmptyResponseReadyMessage> > emptyHandler_; | 268 void OrthancApiClient::NotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message) |
300 std::auto_ptr< MessageHandler<JsonResponseReadyMessage> > jsonHandler_; | 269 { |
301 std::auto_ptr< MessageHandler<BinaryResponseReadyMessage> > binaryHandler_; | 270 if (message.HasPayload()) |
302 std::auto_ptr< Orthanc::IDynamicObject > userPayload; | 271 { |
303 }; | 272 dynamic_cast<const WebServicePayload&>(message.GetPayload()).HandleSuccess(message); |
273 } | |
274 else | |
275 { | |
276 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
277 } | |
278 } | |
279 | |
280 | |
281 void OrthancApiClient::NotifyHttpError(const IWebService::HttpRequestErrorMessage& message) | |
282 { | |
283 if (message.HasPayload()) | |
284 { | |
285 dynamic_cast<const WebServicePayload&>(message.GetPayload()).HandleFailure(message); | |
286 } | |
287 else | |
288 { | |
289 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
290 } | |
291 } | |
304 } | 292 } |