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();