# HG changeset patch # User Benjamin Golinvaux # Date 1552983237 -3600 # Node ID 79bb0a02d1ccb38839794c9e63430b0845304aca # Parent 7016c35d163c93027455ad970674b61b285ffe8b - Added ORTHANC_OVERRIDE to several methods (translates to "override" in C++ 11 compilers) - Last fixes to new style command handling (removed useless commands and switch command handling in simple samples to use XxxxSerializedMessageXxxx instead of XxxxCommandXxxx - Fixed hardcoded input instance in SingleFrameEditorApplication diff -r 7016c35d163c -r 79bb0a02d1cc Applications/IStoneApplication.h --- a/Applications/IStoneApplication.h Mon Mar 18 11:27:01 2019 +0100 +++ b/Applications/IStoneApplication.h Tue Mar 19 09:13:57 2019 +0100 @@ -49,6 +49,12 @@ virtual void Initialize(StoneApplicationContext* context, IStatusBar& statusBar, const boost::program_options::variables_map& parameters) = 0; + + /** + This method is meant to process messages received from the outside world (i.e. GUI) + */ + virtual void HandleSerializedMessage(const char* data) = 0; + #if ORTHANC_ENABLE_WASM==1 virtual void InitializeWasm() {} // specific initialization when the app is running in WebAssembly. This is called after the other Initialize() #endif diff -r 7016c35d163c -r 79bb0a02d1cc Applications/Samples/SampleApplicationBase.h --- a/Applications/Samples/SampleApplicationBase.h Mon Mar 18 11:27:01 2019 +0100 +++ b/Applications/Samples/SampleApplicationBase.h Tue Mar 19 09:13:57 2019 +0100 @@ -41,27 +41,35 @@ class SampleApplicationBase : public IStoneApplication { protected: - WorldSceneWidget* mainWidget_; // ownership is transfered to the application context + // ownership is transferred to the application context + WorldSceneWidget* mainWidget_; public: virtual void Initialize(StoneApplicationContext* context, IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) + const boost::program_options::variables_map& parameters) ORTHANC_OVERRIDE { } - virtual std::string GetTitle() const + virtual std::string GetTitle() const ORTHANC_OVERRIDE { return "Stone of Orthanc - Sample"; } - virtual void Finalize() {} - virtual IWidget* GetCentralWidget() {return mainWidget_;} + /** + * In the basic samples, the commands are handled by the platform adapter and NOT + * by the application handler + */ + virtual void HandleSerializedMessage(const char* data) ORTHANC_OVERRIDE {}; + + + virtual void Finalize() ORTHANC_OVERRIDE {} + virtual IWidget* GetCentralWidget() ORTHANC_OVERRIDE {return mainWidget_;} #if ORTHANC_ENABLE_WASM==1 // default implementations for a single canvas named "canvas" in the HTML and an emtpy WasmApplicationAdapter - virtual void InitializeWasm() + virtual void InitializeWasm() ORTHANC_OVERRIDE { AttachWidgetToWasmViewport("canvas", mainWidget_); } diff -r 7016c35d163c -r 79bb0a02d1cc Applications/Samples/SimpleViewer/SimpleViewerApplication.cpp --- a/Applications/Samples/SimpleViewer/SimpleViewerApplication.cpp Mon Mar 18 11:27:01 2019 +0100 +++ b/Applications/Samples/SimpleViewer/SimpleViewerApplication.cpp Tue Mar 19 09:13:57 2019 +0100 @@ -183,13 +183,13 @@ smartLoader_->SetFrameInWidget(*mainWidget_, 0, instancesIdsPerSeriesId_[seriesId][0], 0); } - bool SimpleViewerApplication::Handle(const StoneSampleCommands::SelectTool& value) ORTHANC_OVERRIDE + bool SimpleViewerApplication::Handle(const StoneSampleCommands::SelectTool& value) { currentTool_ = value.tool; return true; } - bool SimpleViewerApplication::Handle(const StoneSampleCommands::Action& value) ORTHANC_OVERRIDE + bool SimpleViewerApplication::Handle(const StoneSampleCommands::Action& value) { switch (value.type) { diff -r 7016c35d163c -r 79bb0a02d1cc Applications/Samples/SimpleViewer/SimpleViewerApplication.h --- a/Applications/Samples/SimpleViewer/SimpleViewerApplication.h Mon Mar 18 11:27:01 2019 +0100 +++ b/Applications/Samples/SimpleViewer/SimpleViewerApplication.h Tue Mar 19 09:13:57 2019 +0100 @@ -111,13 +111,13 @@ font_.LoadFromResource(Orthanc::EmbeddedResources::FONT_UBUNTU_MONO_BOLD_16); } - virtual void Finalize() {} - virtual IWidget* GetCentralWidget() {return mainLayout_;} + virtual void Finalize() ORTHANC_OVERRIDE {} + virtual IWidget* GetCentralWidget() ORTHANC_OVERRIDE {return mainLayout_;} - virtual void DeclareStartupOptions(boost::program_options::options_description& options); + virtual void DeclareStartupOptions(boost::program_options::options_description& options) ORTHANC_OVERRIDE; virtual void Initialize(StoneApplicationContext* context, IStatusBar& statusBar, - const boost::program_options::variables_map& parameters); + const boost::program_options::variables_map& parameters) ORTHANC_OVERRIDE; void OnStudyListReceived(const OrthancApiClient::JsonResponseReadyMessage& message); @@ -155,10 +155,15 @@ return StoneSampleCommands::StoneDispatchToHandler(cmdStr, this); } - virtual std::string GetTitle() const {return "SimpleViewer";} + virtual void HandleSerializedMessage(const char* data) ORTHANC_OVERRIDE + { + StoneSampleCommands::StoneDispatchToHandler(data, this); + } + + virtual std::string GetTitle() const ORTHANC_OVERRIDE {return "SimpleViewer";} #if ORTHANC_ENABLE_WASM==1 - virtual void InitializeWasm(); + virtual void InitializeWasm() ORTHANC_OVERRIDE; #endif #if ORTHANC_ENABLE_QT==1 diff -r 7016c35d163c -r 79bb0a02d1cc Applications/Samples/SimpleViewer/Wasm/simple-viewer.ts --- a/Applications/Samples/SimpleViewer/Wasm/simple-viewer.ts Mon Mar 18 11:27:01 2019 +0100 +++ b/Applications/Samples/SimpleViewer/Wasm/simple-viewer.ts Tue Mar 19 09:13:57 2019 +0100 @@ -9,7 +9,7 @@ args: { } }; - wasmApplicationRunner.SendCommandToStoneApplication(JSON.stringify(command)); + wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); } function PerformAction(actionName: string) { @@ -19,7 +19,7 @@ args: { } }; - wasmApplicationRunner.SendCommandToStoneApplication(JSON.stringify(command)); + wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); } class SimpleViewerUI { diff -r 7016c35d163c -r 79bb0a02d1cc Applications/Samples/SimpleViewerApplicationSingleFile.h --- a/Applications/Samples/SimpleViewerApplicationSingleFile.h Mon Mar 18 11:27:01 2019 +0100 +++ b/Applications/Samples/SimpleViewerApplicationSingleFile.h Tue Mar 19 09:13:57 2019 +0100 @@ -207,11 +207,6 @@ virtual void HandleSerializedMessageFromWeb(std::string& output, const std::string& input) { - // the simple viewer does not use the serialized messages facilities - } - - virtual void HandleCommandFromWeb(std::string& output, const std::string& input) - { if (input == "select-tool:line-measure") { viewerApplication_.currentTool_ = Tool_LineMeasure; diff -r 7016c35d163c -r 79bb0a02d1cc Applications/Samples/SingleFrameEditorApplication.h --- a/Applications/Samples/SingleFrameEditorApplication.h Mon Mar 18 11:27:01 2019 +0100 +++ b/Applications/Samples/SingleFrameEditorApplication.h Tue Mar 19 09:13:57 2019 +0100 @@ -490,8 +490,10 @@ fontRegistry_.AddFromResource(Orthanc::EmbeddedResources::FONT_UBUNTU_MONO_BOLD_16); scene_.reset(new RadiographyScene(GetBroker())); + + RadiographyLayer& dicomLayer = scene_->LoadDicomFrame(context->GetOrthancApiClient(), instance, 0, false, NULL); //scene_->LoadDicomFrame(instance, frame, false); //.SetPan(200, 0); - RadiographyLayer& dicomLayer = scene_->LoadDicomFrame(context->GetOrthancApiClient(), "61f3143e-96f34791-ad6bbb8d-62559e75-45943e1b", 0, false, NULL); + // = scene_->LoadDicomFrame(context->GetOrthancApiClient(), "61f3143e-96f34791-ad6bbb8d-62559e75-45943e1b", 0, false, NULL); #if !defined(ORTHANC_ENABLE_WASM) || ORTHANC_ENABLE_WASM != 1 Orthanc::HttpClient::ConfigureSsl(true, "/etc/ssl/certs/ca-certificates.crt"); diff -r 7016c35d163c -r 79bb0a02d1cc Applications/Samples/StoneSampleCommands_generated.hpp --- a/Applications/Samples/StoneSampleCommands_generated.hpp Mon Mar 18 11:27:01 2019 +0100 +++ b/Applications/Samples/StoneSampleCommands_generated.hpp Tue Mar 19 09:13:57 2019 +0100 @@ -2,7 +2,7 @@ 1 2 3 4 5 6 7 12345678901234567890123456789012345678901234567890123456789012345678901234567890 -Generated on 2019-03-15 10:00:48.763392 by stonegentool +Generated on 2019-03-18 12:07:42.696093 by stonegentool */ #pragma once @@ -86,7 +86,7 @@ return result; } - inline std::string MakeIndent(int indent) + inline std::string MakeIndent(size_t indent) { char* txt = reinterpret_cast(malloc(indent+1)); // NO EXCEPTION BELOW!!!!!!!!!!!! for(size_t i = 0; i < indent; ++i) @@ -99,14 +99,14 @@ // generic dumper template - std::ostream& StoneDumpValue(std::ostream& out, const T& value, int indent) + std::ostream& StoneDumpValue(std::ostream& out, const T& value, size_t indent) { out << MakeIndent(indent) << value; return out; } // string dumper - inline std::ostream& StoneDumpValue(std::ostream& out, const std::string& value, int indent) + inline std::ostream& StoneDumpValue(std::ostream& out, const std::string& value, size_t indent) { out << MakeIndent(indent) << "\"" << value << "\""; return out; @@ -148,7 +148,7 @@ } template - std::ostream& StoneDumpValue(std::ostream& out, const std::map& value, int indent) + std::ostream& StoneDumpValue(std::ostream& out, const std::map& value, size_t indent) { out << MakeIndent(indent) << "{\n"; for (typename std::map::const_iterator it = value.cbegin(); @@ -188,7 +188,7 @@ } template - std::ostream& StoneDumpValue(std::ostream& out, const std::vector& value, int indent) + std::ostream& StoneDumpValue(std::ostream& out, const std::vector& value, size_t indent) { out << MakeIndent(indent) << "[\n"; for (size_t i = 0; i < value.size(); ++i) @@ -372,7 +372,7 @@ return Json::Value(strValue); } - inline std::ostream& StoneDumpValue(std::ostream& out, const Tool& value, int indent = 0) + inline std::ostream& StoneDumpValue(std::ostream& out, const Tool& value, size_t indent = 0) { if( value == Tool_LineMeasure) { @@ -485,7 +485,7 @@ return Json::Value(strValue); } - inline std::ostream& StoneDumpValue(std::ostream& out, const ActionType& value, int indent = 0) + inline std::ostream& StoneDumpValue(std::ostream& out, const ActionType& value, size_t indent = 0) { if( value == ActionType_UndoCrop) { @@ -531,7 +531,7 @@ return result; } - inline std::ostream& StoneDumpValue(std::ostream& out, const SelectTool& value, int indent = 0) + inline std::ostream& StoneDumpValue(std::ostream& out, const SelectTool& value, size_t indent = 0) { out << MakeIndent(indent) << "{\n"; out << MakeIndent(indent) << "tool:\n"; @@ -594,7 +594,7 @@ return result; } - inline std::ostream& StoneDumpValue(std::ostream& out, const Action& value, int indent = 0) + inline std::ostream& StoneDumpValue(std::ostream& out, const Action& value, size_t indent = 0) { out << MakeIndent(indent) << "{\n"; out << MakeIndent(indent) << "type:\n"; @@ -638,6 +638,7 @@ { public: virtual bool Handle(const SelectTool& value) = 0; + virtual bool Handle(const Action& value) = 0; }; /** Service function for StoneDispatchToHandler */ @@ -657,6 +658,12 @@ _StoneDeserializeValue(value, jsonValue["value"]); return handler->Handle(value); } + else if (type == "StoneSampleCommands.Action") + { + Action value; + _StoneDeserializeValue(value, jsonValue["value"]); + return handler->Handle(value); + } else { return false; diff -r 7016c35d163c -r 79bb0a02d1cc Applications/Samples/StoneSampleCommands_generated.ts --- a/Applications/Samples/StoneSampleCommands_generated.ts Mon Mar 18 11:27:01 2019 +0100 +++ b/Applications/Samples/StoneSampleCommands_generated.ts Tue Mar 19 09:13:57 2019 +0100 @@ -2,7 +2,7 @@ 1 2 3 4 5 6 7 12345678901234567890123456789012345678901234567890123456789012345678901234567890 -Generated on 2019-03-15 10:00:48.763392 by stonegentool +Generated on 2019-03-18 12:07:42.696093 by stonegentool */ diff -r 7016c35d163c -r 79bb0a02d1cc Applications/Samples/Web/simple-viewer-single-file.ts --- a/Applications/Samples/Web/simple-viewer-single-file.ts Mon Mar 18 11:27:01 2019 +0100 +++ b/Applications/Samples/Web/simple-viewer-single-file.ts Tue Mar 19 09:13:57 2019 +0100 @@ -9,7 +9,7 @@ toolName: toolName } }; - wasmApplicationRunner.SendCommandToStoneApplication(JSON.stringify(command)); + wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); } @@ -19,7 +19,7 @@ commandType: "simple", args: {} }; - wasmApplicationRunner.SendCommandToStoneApplication(JSON.stringify(command)); + wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); } //initializes the buttons diff -r 7016c35d163c -r 79bb0a02d1cc Platforms/Wasm/Defaults.cpp --- a/Platforms/Wasm/Defaults.cpp Mon Mar 18 11:27:01 2019 +0100 +++ b/Platforms/Wasm/Defaults.cpp Tue Mar 19 09:13:57 2019 +0100 @@ -357,21 +357,6 @@ return NULL; } - const char* EMSCRIPTEN_KEEPALIVE SendCommandToStoneApplication(const char* message) - { - static std::string output; // we don't want the string to be deallocated when we return to JS code so we always use the same string (this is fine since JS is single-thread) - - printf("SendCommandToStoneApplication\n"); - printf("%s", message); - - if (applicationWasmAdapter.get() != NULL) { - applicationWasmAdapter->HandleCommandFromWeb(output, std::string(message)); - return output.c_str(); - } - printf("This Stone application does not have a Web Adapter"); - return NULL; - } - #ifdef __cplusplus } #endif diff -r 7016c35d163c -r 79bb0a02d1cc Platforms/Wasm/WasmPlatformApplicationAdapter.cpp --- a/Platforms/Wasm/WasmPlatformApplicationAdapter.cpp Mon Mar 18 11:27:01 2019 +0100 +++ b/Platforms/Wasm/WasmPlatformApplicationAdapter.cpp Tue Mar 19 09:13:57 2019 +0100 @@ -2,7 +2,6 @@ #include "Framework/Toolbox/MessagingToolbox.h" #include "Framework/StoneException.h" -#include #include #include "Platforms/Wasm/Defaults.h" @@ -14,35 +13,6 @@ { } - void WasmPlatformApplicationAdapter::HandleCommandFromWeb(std::string& output, const std::string& input) - { - try - { - Json::Value inputJson; - // if the message is a command, build it and execute it - if (MessagingToolbox::ParseJson(inputJson, input.c_str(), input.size())) - { - std::unique_ptr command(application_.GetCommandBuilder().CreateFromJson(inputJson)); - if (command.get() == NULL) - printf("Could not parse command: '%s'\n", input.c_str()); - else - application_.ExecuteCommand(*command); - } - } - catch (StoneException& exc) - { - printf("Error while handling command from web (error code = %d):\n", exc.GetErrorCode()); - printf("While interpreting input: '%s'\n", input.c_str()); - output = std::string("ERROR : "); - } - catch (std::exception& exc) - { - printf("Error while handling message from web (error text = %s):\n", exc.what()); - printf("While interpreting input: '%s'\n", input.c_str()); - output = std::string("ERROR : "); - } - } - void WasmPlatformApplicationAdapter::HandleSerializedMessageFromWeb(std::string& output, const std::string& input) { try diff -r 7016c35d163c -r 79bb0a02d1cc Platforms/Wasm/WasmPlatformApplicationAdapter.h --- a/Platforms/Wasm/WasmPlatformApplicationAdapter.h Mon Mar 18 11:27:01 2019 +0100 +++ b/Platforms/Wasm/WasmPlatformApplicationAdapter.h Tue Mar 19 09:13:57 2019 +0100 @@ -13,7 +13,6 @@ WasmPlatformApplicationAdapter(MessageBroker& broker, IStoneApplication& application); virtual void HandleSerializedMessageFromWeb(std::string& output, const std::string& input); - virtual void HandleCommandFromWeb(std::string& output, const std::string& input); virtual void NotifyStatusUpdateFromCppToWebWithString(const std::string& statusUpdateMessage); virtual void NotifyStatusUpdateFromCppToWebWithSerializedMessage(const std::string& statusUpdateMessage); }; diff -r 7016c35d163c -r 79bb0a02d1cc Platforms/Wasm/wasm-application-runner.ts --- a/Platforms/Wasm/wasm-application-runner.ts Mon Mar 18 11:27:01 2019 +0100 +++ b/Platforms/Wasm/wasm-application-runner.ts Tue Mar 19 09:13:57 2019 +0100 @@ -21,7 +21,6 @@ var ReleaseCppViewport: Function = null; var StartWasmApplication: Function = null; export var SendSerializedMessageToStoneApplication: Function = null; -export var SendCommandToStoneApplication: Function = null; function DoAnimationThread() { if (WasmDoAnimation != null) { @@ -102,7 +101,6 @@ WasmDoAnimation = ( window).StoneFrameworkModule.cwrap('WasmDoAnimation', null, []); SendSerializedMessageToStoneApplication = ( window).StoneFrameworkModule.cwrap('SendSerializedMessageToStoneApplication', 'string', ['string']); - SendCommandToStoneApplication = ( window).StoneFrameworkModule.cwrap('SendCommandToStoneApplication', 'string', ['string']); Logger.defaultLogger.debug("Connecting C++ methods to JS methods - done");