Mercurial > hg > orthanc-stone
annotate Framework/Oracle/WebAssemblyOracle.cpp @ 933:f75f6cb69c1b
Commented-out traces for debug
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Fri, 26 Jul 2019 20:09:42 +0200 |
parents | 67f9c27214c5 |
children | a7351ad54960 |
rev | line source |
---|---|
825 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium | |
6 * | |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #include "WebAssemblyOracle.h" | |
23 | |
24 #include "SleepOracleCommand.h" | |
25 | |
26 #include <Core/OrthancException.h> | |
27 #include <Core/Toolbox.h> | |
28 | |
29 #include <emscripten.h> | |
30 #include <emscripten/html5.h> | |
31 #include <emscripten/fetch.h> | |
32 | |
33 | |
34 namespace OrthancStone | |
35 { | |
36 class WebAssemblyOracle::TimeoutContext | |
37 { | |
38 private: | |
39 WebAssemblyOracle& oracle_; | |
40 const IObserver& receiver_; | |
41 std::auto_ptr<SleepOracleCommand> command_; | |
42 | |
43 public: | |
44 TimeoutContext(WebAssemblyOracle& oracle, | |
45 const IObserver& receiver, | |
46 IOracleCommand* command) : | |
47 oracle_(oracle), | |
48 receiver_(receiver) | |
49 { | |
50 if (command == NULL) | |
51 { | |
52 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
53 } | |
54 else | |
55 { | |
56 command_.reset(dynamic_cast<SleepOracleCommand*>(command)); | |
57 } | |
58 } | |
59 | |
60 void EmitMessage() | |
61 { | |
62 SleepOracleCommand::TimeoutMessage message(*command_); | |
63 oracle_.EmitMessage(receiver_, message); | |
64 } | |
65 | |
66 static void Callback(void *userData) | |
67 { | |
68 std::auto_ptr<TimeoutContext> context(reinterpret_cast<TimeoutContext*>(userData)); | |
69 context->EmitMessage(); | |
70 } | |
71 }; | |
72 | |
73 | |
74 class WebAssemblyOracle::Emitter : public IMessageEmitter | |
75 { | |
76 private: | |
77 WebAssemblyOracle& oracle_; | |
78 | |
79 public: | |
80 Emitter(WebAssemblyOracle& oracle) : | |
81 oracle_(oracle) | |
82 { | |
83 } | |
84 | |
85 virtual void EmitMessage(const IObserver& receiver, | |
86 const IMessage& message) | |
87 { | |
88 oracle_.EmitMessage(receiver, message); | |
89 } | |
90 }; | |
91 | |
92 | |
93 class WebAssemblyOracle::FetchContext : public boost::noncopyable | |
94 { | |
95 private: | |
96 Emitter emitter_; | |
97 const IObserver& receiver_; | |
98 std::auto_ptr<IOracleCommand> command_; | |
99 std::string expectedContentType_; | |
100 | |
101 public: | |
102 FetchContext(WebAssemblyOracle& oracle, | |
103 const IObserver& receiver, | |
104 IOracleCommand* command, | |
105 const std::string& expectedContentType) : | |
106 emitter_(oracle), | |
107 receiver_(receiver), | |
108 command_(command), | |
109 expectedContentType_(expectedContentType) | |
110 { | |
111 if (command == NULL) | |
112 { | |
113 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
114 } | |
115 } | |
116 | |
117 const std::string& GetExpectedContentType() const | |
118 { | |
119 return expectedContentType_; | |
120 } | |
121 | |
122 void EmitMessage(const IMessage& message) | |
123 { | |
124 emitter_.EmitMessage(receiver_, message); | |
125 } | |
126 | |
127 IMessageEmitter& GetEmitter() | |
128 { | |
129 return emitter_; | |
130 } | |
131 | |
132 const IObserver& GetReceiver() const | |
133 { | |
134 return receiver_; | |
135 } | |
136 | |
137 IOracleCommand& GetCommand() const | |
138 { | |
139 return *command_; | |
140 } | |
141 | |
142 template <typename T> | |
143 const T& GetTypedCommand() const | |
144 { | |
145 return dynamic_cast<T&>(*command_); | |
146 } | |
147 | |
148 static void SuccessCallback(emscripten_fetch_t *fetch) | |
149 { | |
150 /** | |
151 * Firstly, make a local copy of the fetched information, and | |
152 * free data associated with the fetch. | |
153 **/ | |
154 | |
155 std::auto_ptr<FetchContext> context(reinterpret_cast<FetchContext*>(fetch->userData)); | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
156 if (fetch->userData == NULL) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
157 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
158 LOG(ERROR) << "WebAssemblyOracle::FetchContext::SuccessCallback fetch->userData is NULL!!!!!!!"; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
159 } |
825 | 160 |
161 std::string answer; | |
162 if (fetch->numBytes > 0) | |
163 { | |
164 answer.assign(fetch->data, fetch->numBytes); | |
165 } | |
166 | |
167 /** | |
168 * TODO - HACK - As of emscripten-1.38.31, the fetch API does | |
169 * not contain a way to retrieve the HTTP headers of the | |
170 * answer. We make the assumption that the "Content-Type" header | |
171 * of the response is the same as the "Accept" header of the | |
172 * query. This should be fixed in future versions of emscripten. | |
173 * https://github.com/emscripten-core/emscripten/pull/8486 | |
174 **/ | |
175 | |
176 HttpHeaders headers; | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
177 if (fetch->userData != NULL) |
825 | 178 { |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
179 if (!context->GetExpectedContentType().empty()) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
180 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
181 headers["Content-Type"] = context->GetExpectedContentType(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
182 } |
825 | 183 } |
184 | |
185 emscripten_fetch_close(fetch); | |
186 | |
187 | |
188 /** | |
189 * Secondly, use the retrieved data. | |
190 **/ | |
191 | |
192 try | |
193 { | |
194 if (context.get() == NULL) | |
195 { | |
196 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
197 } | |
198 else | |
199 { | |
200 switch (context->GetCommand().GetType()) | |
201 { | |
202 case IOracleCommand::Type_OrthancRestApi: | |
203 { | |
204 OrthancRestApiCommand::SuccessMessage message | |
205 (context->GetTypedCommand<OrthancRestApiCommand>(), headers, answer); | |
206 context->EmitMessage(message); | |
207 break; | |
208 } | |
209 | |
210 case IOracleCommand::Type_GetOrthancImage: | |
211 { | |
212 context->GetTypedCommand<GetOrthancImageCommand>().ProcessHttpAnswer | |
213 (context->GetEmitter(), context->GetReceiver(), answer, headers); | |
214 break; | |
215 } | |
216 | |
217 case IOracleCommand::Type_GetOrthancWebViewerJpeg: | |
218 { | |
219 context->GetTypedCommand<GetOrthancWebViewerJpegCommand>().ProcessHttpAnswer | |
220 (context->GetEmitter(), context->GetReceiver(), answer); | |
221 break; | |
222 } | |
223 | |
224 default: | |
225 LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle: " | |
226 << context->GetCommand().GetType(); | |
227 } | |
228 } | |
229 } | |
230 catch (Orthanc::OrthancException& e) | |
231 { | |
232 LOG(ERROR) << "Error while processing a fetch answer in the oracle: " << e.What(); | |
233 } | |
234 } | |
235 | |
236 static void FailureCallback(emscripten_fetch_t *fetch) | |
237 { | |
238 std::auto_ptr<FetchContext> context(reinterpret_cast<FetchContext*>(fetch->userData)); | |
239 | |
240 LOG(ERROR) << "Fetching " << fetch->url << " failed, HTTP failure status code: " << fetch->status; | |
241 | |
242 /** | |
243 * TODO - The following code leads to an infinite recursion, at | |
244 * least with Firefox running on incognito mode => WHY? | |
245 **/ | |
246 //emscripten_fetch_close(fetch); // Also free data on failure. | |
247 } | |
248 }; | |
249 | |
250 | |
251 | |
252 class WebAssemblyOracle::FetchCommand : public boost::noncopyable | |
253 { | |
254 private: | |
255 WebAssemblyOracle& oracle_; | |
256 const IObserver& receiver_; | |
257 std::auto_ptr<IOracleCommand> command_; | |
258 Orthanc::HttpMethod method_; | |
259 std::string uri_; | |
260 std::string body_; | |
261 HttpHeaders headers_; | |
262 unsigned int timeout_; | |
263 std::string expectedContentType_; | |
264 | |
265 public: | |
266 FetchCommand(WebAssemblyOracle& oracle, | |
267 const IObserver& receiver, | |
268 IOracleCommand* command) : | |
269 oracle_(oracle), | |
270 receiver_(receiver), | |
271 command_(command), | |
272 method_(Orthanc::HttpMethod_Get), | |
273 timeout_(0) | |
274 { | |
275 if (command == NULL) | |
276 { | |
277 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
278 } | |
279 } | |
280 | |
281 void SetMethod(Orthanc::HttpMethod method) | |
282 { | |
283 method_ = method; | |
284 } | |
285 | |
286 void SetUri(const std::string& uri) | |
287 { | |
831
d71cf8504159
handling of GET arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
825
diff
changeset
|
288 uri_ = oracle_.orthancRoot_ + uri; |
825 | 289 } |
290 | |
291 void SetBody(std::string& body /* will be swapped */) | |
292 { | |
293 body_.swap(body); | |
294 } | |
295 | |
296 void SetHttpHeaders(const HttpHeaders& headers) | |
297 { | |
298 headers_ = headers; | |
299 } | |
300 | |
301 void SetTimeout(unsigned int timeout) | |
302 { | |
303 timeout_ = timeout; | |
304 } | |
305 | |
306 void Execute() | |
307 { | |
308 if (command_.get() == NULL) | |
309 { | |
310 // Cannot call Execute() twice | |
311 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
312 } | |
313 | |
314 emscripten_fetch_attr_t attr; | |
315 emscripten_fetch_attr_init(&attr); | |
316 | |
317 const char* method; | |
318 | |
319 switch (method_) | |
320 { | |
321 case Orthanc::HttpMethod_Get: | |
322 method = "GET"; | |
323 break; | |
324 | |
325 case Orthanc::HttpMethod_Post: | |
326 method = "POST"; | |
327 break; | |
328 | |
329 case Orthanc::HttpMethod_Delete: | |
330 method = "DELETE"; | |
331 break; | |
332 | |
333 case Orthanc::HttpMethod_Put: | |
334 method = "PUT"; | |
335 break; | |
336 | |
337 default: | |
338 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
339 } | |
340 | |
341 strcpy(attr.requestMethod, method); | |
342 | |
343 attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY; | |
344 attr.onsuccess = FetchContext::SuccessCallback; | |
345 attr.onerror = FetchContext::FailureCallback; | |
346 attr.timeoutMSecs = timeout_ * 1000; | |
347 | |
348 std::vector<const char*> headers; | |
349 headers.reserve(2 * headers_.size() + 1); | |
350 | |
351 std::string expectedContentType; | |
352 | |
353 for (HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); ++it) | |
354 { | |
355 std::string key; | |
356 Orthanc::Toolbox::ToLowerCase(key, it->first); | |
357 | |
358 if (key == "accept") | |
359 { | |
360 expectedContentType = it->second; | |
361 } | |
362 | |
363 if (key != "accept-encoding") // Web browsers forbid the modification of this HTTP header | |
364 { | |
365 headers.push_back(it->first.c_str()); | |
366 headers.push_back(it->second.c_str()); | |
367 } | |
368 } | |
369 | |
370 headers.push_back(NULL); // Termination of the array of HTTP headers | |
371 | |
372 attr.requestHeaders = &headers[0]; | |
373 | |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
374 char* requestData = NULL; |
825 | 375 if (!body_.empty()) |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
376 requestData = reinterpret_cast<char*>(malloc(body_.size())); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
377 |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
378 try |
825 | 379 { |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
380 if (!body_.empty()) |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
381 { |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
382 memcpy(requestData, &(body_[0]), body_.size()); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
383 attr.requestDataSize = body_.size(); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
384 attr.requestData = requestData; |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
385 } |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
386 attr.userData = new FetchContext(oracle_, receiver_, command_.release(), expectedContentType); |
825 | 387 |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
388 // Must be the last call to prevent memory leak on error |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
389 emscripten_fetch(&attr, uri_.c_str()); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
390 } |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
391 catch(...) |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
392 { |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
393 if(requestData != NULL) |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
394 free(requestData); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
395 throw; |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
396 } |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
397 } |
825 | 398 }; |
399 | |
400 void WebAssemblyOracle::Execute(const IObserver& receiver, | |
401 OrthancRestApiCommand* command) | |
402 { | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
403 try |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
404 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
405 //LOG(TRACE) << "*********** WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
406 //LOG(TRACE) << "WebAssemblyOracle::Execute | command = " << command; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
407 FetchCommand fetch(*this, receiver, command); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
408 |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
409 fetch.SetMethod(command->GetMethod()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
410 fetch.SetUri(command->GetUri()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
411 fetch.SetHttpHeaders(command->GetHttpHeaders()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
412 fetch.SetTimeout(command->GetTimeout()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
413 |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
414 if (command->GetMethod() == Orthanc::HttpMethod_Post || |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
415 command->GetMethod() == Orthanc::HttpMethod_Put) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
416 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
417 std::string body; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
418 command->SwapBody(body); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
419 fetch.SetBody(body); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
420 } |
825 | 421 |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
422 fetch.Execute(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
423 //LOG(TRACE) << "*********** successful end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
424 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
425 catch (const Orthanc::OrthancException& e) |
825 | 426 { |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
427 if (e.HasDetails()) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
428 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
429 LOG(ERROR) << "OrthancException in WebAssemblyOracle::Execute: " << e.What() << " Details: " << e.GetDetails(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
430 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
431 else |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
432 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
433 LOG(ERROR) << "OrthancException in WebAssemblyOracle::Execute: " << e.What(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
434 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
435 //LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
436 throw; |
825 | 437 } |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
438 catch (const std::exception& e) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
439 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
440 LOG(ERROR) << "std::exception in WebAssemblyOracle::Execute: " << e.what(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
441 // LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
442 throw; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
443 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
444 catch (...) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
445 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
446 LOG(ERROR) << "Unknown exception in WebAssemblyOracle::Execute"; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
447 // LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
448 throw; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
449 } |
825 | 450 } |
451 | |
452 | |
453 void WebAssemblyOracle::Execute(const IObserver& receiver, | |
454 GetOrthancImageCommand* command) | |
455 { | |
456 FetchCommand fetch(*this, receiver, command); | |
457 | |
458 fetch.SetUri(command->GetUri()); | |
459 fetch.SetHttpHeaders(command->GetHttpHeaders()); | |
460 fetch.SetTimeout(command->GetTimeout()); | |
461 | |
462 fetch.Execute(); | |
463 } | |
464 | |
465 | |
466 void WebAssemblyOracle::Execute(const IObserver& receiver, | |
467 GetOrthancWebViewerJpegCommand* command) | |
468 { | |
469 FetchCommand fetch(*this, receiver, command); | |
470 | |
471 fetch.SetUri(command->GetUri()); | |
472 fetch.SetHttpHeaders(command->GetHttpHeaders()); | |
473 fetch.SetTimeout(command->GetTimeout()); | |
474 | |
475 fetch.Execute(); | |
476 } | |
477 | |
478 | |
479 | |
480 void WebAssemblyOracle::Schedule(const IObserver& receiver, | |
481 IOracleCommand* command) | |
482 { | |
483 std::auto_ptr<IOracleCommand> protection(command); | |
484 | |
485 if (command == NULL) | |
486 { | |
487 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
488 } | |
489 | |
490 switch (command->GetType()) | |
491 { | |
492 case IOracleCommand::Type_OrthancRestApi: | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
493 //// DIAGNOSTIC. PLEASE REMOVE IF IT HAS BEEN COMMITTED BY MISTAKE |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
494 //{ |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
495 // const IObserver* pReceiver = &receiver; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
496 // LOG(TRACE) << "WebAssemblyOracle::Schedule | pReceiver is " << pReceiver; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
497 // LOG(TRACE) << "WebAssemblyOracle::Schedule | command = " << command; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
498 // OrthancRestApiCommand* rac = dynamic_cast<OrthancRestApiCommand*>(protection.get()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
499 // LOG(TRACE) << "WebAssemblyOracle::Schedule | typed command = " << rac; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
500 // LOG(TRACE) << "WebAssemblyOracle::Schedule" << rac->GetUri(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
501 //} |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
502 //// END OF BLOCK TO REMOVE |
825 | 503 Execute(receiver, dynamic_cast<OrthancRestApiCommand*>(protection.release())); |
504 break; | |
505 | |
506 case IOracleCommand::Type_GetOrthancImage: | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
507 //// DIAGNOSTIC. PLEASE REMOVE IF IT HAS BEEN COMMITTED BY MISTAKE |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
508 //{ |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
509 // GetOrthancImageCommand* rac = dynamic_cast<GetOrthancImageCommand*>(protection.get()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
510 // LOG(TRACE) << "WebAssemblyOracle::Schedule" << rac->GetUri(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
511 //} |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
512 //// END OF BLOCK TO REMOVE |
825 | 513 Execute(receiver, dynamic_cast<GetOrthancImageCommand*>(protection.release())); |
514 break; | |
515 | |
516 case IOracleCommand::Type_GetOrthancWebViewerJpeg: | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
517 //// DIAGNOSTIC. PLEASE REMOVE IF IT HAS BEEN COMMITTED BY MISTAKE |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
518 //{ |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
519 // GetOrthancWebViewerJpegCommand* rac = dynamic_cast<GetOrthancWebViewerJpegCommand*>(protection.get()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
520 // LOG(TRACE) << "WebAssemblyOracle::Schedule" << rac->GetUri(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
521 //} |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
522 //// END OF BLOCK TO REMOVE |
825 | 523 Execute(receiver, dynamic_cast<GetOrthancWebViewerJpegCommand*>(protection.release())); |
524 break; | |
525 | |
526 case IOracleCommand::Type_Sleep: | |
527 { | |
528 unsigned int timeoutMS = dynamic_cast<SleepOracleCommand*>(command)->GetDelay(); | |
529 emscripten_set_timeout(TimeoutContext::Callback, timeoutMS, | |
530 new TimeoutContext(*this, receiver, protection.release())); | |
531 break; | |
532 } | |
533 | |
534 default: | |
535 LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle: " << command->GetType(); | |
536 } | |
537 } | |
538 } |