Mercurial > hg > orthanc-stone
comparison Samples/WebAssembly/BasicMPR.cpp @ 824:15d493101c1e
support of SleepOracleCommand in WebAssemblyOracle
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 29 May 2019 15:26:47 +0200 |
parents | 467d58a59718 |
children | 9a6c7a5dcb76 |
comparison
equal
deleted
inserted
replaced
823:467d58a59718 | 824:15d493101c1e |
---|---|
24 #include <emscripten/fetch.h> | 24 #include <emscripten/fetch.h> |
25 #include <emscripten/html5.h> | 25 #include <emscripten/html5.h> |
26 | 26 |
27 #include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" | 27 #include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" |
28 #include "../../Framework/OpenGL/WebAssemblyOpenGLContext.h" | 28 #include "../../Framework/OpenGL/WebAssemblyOpenGLContext.h" |
29 #include "../../Framework/Oracle/SleepOracleCommand.h" | |
29 #include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h" | 30 #include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h" |
30 #include "../../Framework/Scene2D/OpenGLCompositor.h" | 31 #include "../../Framework/Scene2D/OpenGLCompositor.h" |
31 #include "../../Framework/Scene2D/PanSceneTracker.h" | 32 #include "../../Framework/Scene2D/PanSceneTracker.h" |
32 #include "../../Framework/Scene2D/RotateSceneTracker.h" | 33 #include "../../Framework/Scene2D/RotateSceneTracker.h" |
33 #include "../../Framework/Scene2D/ZoomSceneTracker.h" | 34 #include "../../Framework/Scene2D/ZoomSceneTracker.h" |
400 public IObservable | 401 public IObservable |
401 { | 402 { |
402 private: | 403 private: |
403 typedef std::map<std::string, std::string> HttpHeaders; | 404 typedef std::map<std::string, std::string> HttpHeaders; |
404 | 405 |
406 class Emitter : public IMessageEmitter | |
407 { | |
408 private: | |
409 WebAssemblyOracle& oracle_; | |
410 | |
411 public: | |
412 Emitter(WebAssemblyOracle& oracle) : | |
413 oracle_(oracle) | |
414 { | |
415 } | |
416 | |
417 virtual void EmitMessage(const IObserver& receiver, | |
418 const IMessage& message) | |
419 { | |
420 oracle_.EmitMessage(receiver, message); | |
421 } | |
422 }; | |
423 | |
424 | |
405 class FetchContext : public boost::noncopyable | 425 class FetchContext : public boost::noncopyable |
406 { | 426 { |
407 private: | 427 private: |
408 class Emitter : public IMessageEmitter | |
409 { | |
410 private: | |
411 WebAssemblyOracle& oracle_; | |
412 | |
413 public: | |
414 Emitter(WebAssemblyOracle& oracle) : | |
415 oracle_(oracle) | |
416 { | |
417 } | |
418 | |
419 virtual void EmitMessage(const IObserver& receiver, | |
420 const IMessage& message) | |
421 { | |
422 oracle_.EmitMessage(receiver, message); | |
423 } | |
424 }; | |
425 | |
426 Emitter emitter_; | 428 Emitter emitter_; |
427 const IObserver& receiver_; | 429 const IObserver& receiver_; |
428 std::auto_ptr<IOracleCommand> command_; | 430 std::auto_ptr<IOracleCommand> command_; |
429 std::string expectedContentType_; | 431 std::string expectedContentType_; |
430 | 432 |
752 fetch.SetTimeout(command->GetTimeout()); | 754 fetch.SetTimeout(command->GetTimeout()); |
753 | 755 |
754 fetch.Execute(); | 756 fetch.Execute(); |
755 } | 757 } |
756 | 758 |
759 | |
760 | |
761 class TimeoutContext | |
762 { | |
763 private: | |
764 WebAssemblyOracle& oracle_; | |
765 const IObserver& receiver_; | |
766 std::auto_ptr<SleepOracleCommand> command_; | |
767 | |
768 public: | |
769 TimeoutContext(WebAssemblyOracle& oracle, | |
770 const IObserver& receiver, | |
771 IOracleCommand* command) : | |
772 oracle_(oracle), | |
773 receiver_(receiver) | |
774 { | |
775 if (command == NULL) | |
776 { | |
777 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
778 } | |
779 else | |
780 { | |
781 command_.reset(dynamic_cast<SleepOracleCommand*>(command)); | |
782 } | |
783 } | |
784 | |
785 void EmitMessage() | |
786 { | |
787 SleepOracleCommand::TimeoutMessage message(*command_); | |
788 oracle_.EmitMessage(receiver_, message); | |
789 } | |
790 }; | |
791 | |
792 | |
793 static void TimeoutCallback(void *userData) | |
794 { | |
795 std::auto_ptr<TimeoutContext> context(reinterpret_cast<TimeoutContext*>(userData)); | |
796 context->EmitMessage(); | |
797 } | |
798 | |
799 | |
757 | 800 |
758 public: | 801 public: |
759 WebAssemblyOracle(MessageBroker& broker) : | 802 WebAssemblyOracle(MessageBroker& broker) : |
760 IObservable(broker) | 803 IObservable(broker) |
761 { | 804 { |
783 | 826 |
784 case IOracleCommand::Type_GetOrthancWebViewerJpeg: | 827 case IOracleCommand::Type_GetOrthancWebViewerJpeg: |
785 Execute(receiver, dynamic_cast<GetOrthancWebViewerJpegCommand*>(protection.release())); | 828 Execute(receiver, dynamic_cast<GetOrthancWebViewerJpegCommand*>(protection.release())); |
786 break; | 829 break; |
787 | 830 |
831 case IOracleCommand::Type_Sleep: | |
832 { | |
833 unsigned int timeoutMS = dynamic_cast<SleepOracleCommand*>(command)->GetDelay(); | |
834 emscripten_set_timeout(TimeoutCallback, timeoutMS, new TimeoutContext(*this, receiver, protection.release())); | |
835 break; | |
836 } | |
837 | |
788 default: | 838 default: |
789 LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle: " << command->GetType(); | 839 LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle: " << command->GetType(); |
790 } | 840 } |
791 } | 841 } |
792 | 842 |
923 } | 973 } |
924 | 974 |
925 | 975 |
926 | 976 |
927 | 977 |
978 namespace OrthancStone | |
979 { | |
980 class TestSleep : public IObserver | |
981 { | |
982 private: | |
983 WebAssemblyOracle& oracle_; | |
984 | |
985 void Schedule() | |
986 { | |
987 oracle_.Schedule(*this, new OrthancStone::SleepOracleCommand(2000)); | |
988 } | |
989 | |
990 void Handle(const SleepOracleCommand::TimeoutMessage& message) | |
991 { | |
992 LOG(INFO) << "TIMEOUT"; | |
993 Schedule(); | |
994 } | |
995 | |
996 public: | |
997 TestSleep(MessageBroker& broker, | |
998 WebAssemblyOracle& oracle) : | |
999 IObserver(broker), | |
1000 oracle_(oracle) | |
1001 { | |
1002 oracle.RegisterObserverCallback( | |
1003 new Callable<TestSleep, SleepOracleCommand::TimeoutMessage> | |
1004 (*this, &TestSleep::Handle)); | |
1005 | |
1006 LOG(INFO) << "STARTING"; | |
1007 Schedule(); | |
1008 } | |
1009 }; | |
1010 | |
1011 //static TestSleep testSleep(broker_, oracle_); | |
1012 } | |
1013 | |
1014 | |
928 extern "C" | 1015 extern "C" |
929 { | 1016 { |
930 int main(int argc, char const *argv[]) | 1017 int main(int argc, char const *argv[]) |
931 { | 1018 { |
932 OrthancStone::StoneInitialize(); | 1019 OrthancStone::StoneInitialize(); |