# HG changeset patch # User bgo-osimis # Date 1549897204 -3600 # Node ID 5055031f4a069c127c8a3c8190ccc456fc528409 # Parent cc47e6eaefb09ff7c03b66ceb005ed67dadb31a5 - Added browserify to build. This allows using require calls for modules that work with tsc compiler. - removed older stuff related to Protocol Buffers and Flatbuffers - changed triple-slash references to import statements - module prefixes are now added at call sites - added cmake module for filename handling - switched to Ninja for sample build - Added virtual dtor in ICommand diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Commands/ICommand.h --- a/Applications/Commands/ICommand.h Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Commands/ICommand.h Mon Feb 11 16:00:04 2019 +0100 @@ -35,6 +35,8 @@ : name_(name) {} public: + virtual ~ICommand() + {} virtual void Execute() = 0; // virtual void Configure(const Json::Value& arguments) = 0; const std::string& GetName() const diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/CMakeLists.txt --- a/Applications/Samples/CMakeLists.txt Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/CMakeLists.txt Mon Feb 11 16:00:04 2019 +0100 @@ -31,11 +31,14 @@ ## Configuration of the Emscripten compiler for WebAssembly target ##################################################################### - set(WASM_FLAGS "-s WASM=1") + set(WASM_FLAGS "-s WASM=1 -O0 -g0") + message("*****************************************************************************") + message("WARNING: optimizations are disabled in emcc!!! Enable them for production use") + message("*****************************************************************************") set(WASM_MODULE_NAME "StoneFrameworkModule" CACHE STRING "Name of the WebAssembly module") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Applications/Samples/samples-library.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmWebService.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmDelayedCallExecutor.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/default-library.js -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmWebService.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmDelayedCallExecutor.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/default-library.js -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") # Handling of memory #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1") # Resize @@ -84,7 +87,6 @@ LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) include(../../Resources/CMake/OrthancStoneConfiguration.cmake) -include(../../Resources/CMake/FlatBuffersConfiguration.cmake) add_library(OrthancStone STATIC ${ORTHANC_STONE_SOURCES} @@ -169,7 +171,7 @@ if (ENABLE_QT OR ENABLE_WASM) - GenerateCodeFromFlatBufferSchema("${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/ApplicationCommands.fbs") + # GenerateCodeFromFlatBufferSchema("${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/ApplicationCommands.fbs") list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES ${FLATC_AUTOGENERATED_SOURCES}) message(STATUS "SIMPLE_VIEWER_APPLICATION_SOURCES = ${SIMPLE_VIEWER_APPLICATION_SOURCES}") diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/SimpleViewer/ApplicationCommands.fbs --- a/Applications/Samples/SimpleViewer/ApplicationCommands.fbs Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -// Example IDL file for our monster's schema. -namespace Orthanc.Stone.Applications; - -union VsolCommands {SelectPanel, ConfigurePanel, StartAcquisition} -union VsolReplies { SelectPanelReply, StartAcquisitionReply } - -table SelectPanel { - panelNumber:int32; -} - -table SelectPanelReply { - ok:bool; - errorMessage:string; -} - -table ConfigurePanel { -} - -table StartAcquisition { -} - -table StartAcquisitionReply { - ok:bool; -} - -table VsolCommand { - command: VsolCommands; -} - -table VsolReply { - command: VsolReplies; -} - -// root_type Monster; - diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/SimpleViewer/Wasm/simple-viewer.ts --- a/Applications/Samples/SimpleViewer/Wasm/simple-viewer.ts Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/SimpleViewer/Wasm/simple-viewer.ts Mon Feb 11 16:00:04 2019 +0100 @@ -1,6 +1,6 @@ -/// +import wasmApplicationRunner = require('../../../../Platforms/Wasm/wasm-application-runner'); -InitializeWasmApplication("OrthancStoneSimpleViewer", "/orthanc"); +wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSimpleViewer", "/orthanc"); function SelectTool(toolName: string) { var command = { @@ -9,8 +9,7 @@ args: { } }; - SendMessageToStoneApplication(JSON.stringify(command)); - + wasmApplicationRunner.SendMessageToStoneApplication(JSON.stringify(command)); } function PerformAction(actionName: string) { @@ -20,7 +19,7 @@ args: { } }; - SendMessageToStoneApplication(JSON.stringify(command)); + wasmApplicationRunner.SendMessageToStoneApplication(JSON.stringify(command)); } class SimpleViewerUI { @@ -31,9 +30,7 @@ public constructor() { // install "SelectTool" handlers document.querySelectorAll("[tool-selector]").forEach((e) => { - console.log(e); (e as HTMLButtonElement).addEventListener("click", () => { - console.log(e); SelectTool(e.attributes["tool-selector"].value); }); }); diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/SimpleViewer/Wasm/tsconfig-simple-viewer.json --- a/Applications/Samples/SimpleViewer/Wasm/tsconfig-simple-viewer.json Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/SimpleViewer/Wasm/tsconfig-simple-viewer.json Mon Feb 11 16:00:04 2019 +0100 @@ -1,9 +1,9 @@ { "extends" : "../../Web/tsconfig-samples", "compilerOptions": { - "outFile": "../../build-web/simple-viewer/app-simple-viewer.js" }, "include" : [ - "simple-viewer.ts" + "simple-viewer.ts", + "../../build-wasm/ApplicationCommands_generated.ts" ] -} \ No newline at end of file +} diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/Web/simple-viewer-single-file.ts --- a/Applications/Samples/Web/simple-viewer-single-file.ts Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/Web/simple-viewer-single-file.ts Mon Feb 11 16:00:04 2019 +0100 @@ -1,6 +1,6 @@ -/// +import wasmApplicationRunner = require('../../../Platforms/Wasm/wasm-application-runner'); -InitializeWasmApplication("OrthancStoneSimpleViewerSingleFile", "/orthanc"); +wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSimpleViewerSingleFile", "/orthanc"); function SelectTool(toolName: string) { var command = { @@ -9,7 +9,7 @@ toolName: toolName } }; - SendMessageToStoneApplication(JSON.stringify(command)); + wasmApplicationRunner.SendMessageToStoneApplication(JSON.stringify(command)); } @@ -19,7 +19,7 @@ commandType: "simple", args: {} }; - SendMessageToStoneApplication(JSON.stringify(command)); + wasmApplicationRunner.SendMessageToStoneApplication(JSON.stringify(command)); } //initializes the buttons diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/Web/simple-viewer-single-file.tsconfig.json --- a/Applications/Samples/Web/simple-viewer-single-file.tsconfig.json Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/Web/simple-viewer-single-file.tsconfig.json Mon Feb 11 16:00:04 2019 +0100 @@ -1,7 +1,7 @@ { "extends" : "./tsconfig-samples", "compilerOptions": { - "outFile": "../build-web/app-simple-viewer-single-file.js" + // "outFile": "../build-web/app-simple-viewer-single-file.js" }, "include" : [ "simple-viewer-single-file.ts" diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/Web/single-frame-editor.ts --- a/Applications/Samples/Web/single-frame-editor.ts Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/Web/single-frame-editor.ts Mon Feb 11 16:00:04 2019 +0100 @@ -1,3 +1,3 @@ -/// +import wasmApplicationRunner = require('../../../Platforms/Wasm/wasm-application-runner'); -InitializeWasmApplication("OrthancStoneSingleFrameEditor", "/orthanc"); +wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSingleFrameEditor", "/orthanc"); diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/Web/single-frame-editor.tsconfig.json --- a/Applications/Samples/Web/single-frame-editor.tsconfig.json Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/Web/single-frame-editor.tsconfig.json Mon Feb 11 16:00:04 2019 +0100 @@ -1,9 +1,8 @@ { "extends" : "./tsconfig-samples", "compilerOptions": { - "outFile": "../build-web/app-single-frame-editor.js" }, "include" : [ "single-frame-editor.ts" ] -} \ No newline at end of file +} diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/Web/single-frame.ts --- a/Applications/Samples/Web/single-frame.ts Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/Web/single-frame.ts Mon Feb 11 16:00:04 2019 +0100 @@ -1,3 +1,4 @@ -/// +import wasmApplicationRunner = require('../../../Platforms/Wasm/wasm-application-runner'); -InitializeWasmApplication("OrthancStoneSingleFrame", "/orthanc"); +wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSingleFrame", "/orthanc"); + diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/Web/single-frame.tsconfig.json --- a/Applications/Samples/Web/single-frame.tsconfig.json Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/Web/single-frame.tsconfig.json Mon Feb 11 16:00:04 2019 +0100 @@ -1,9 +1,8 @@ { "extends" : "./tsconfig-samples", "compilerOptions": { - "outFile": "../build-web/app-single-frame.js" }, "include" : [ "single-frame.ts" ] -} \ No newline at end of file +} diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/build-wasm-ext.sh --- a/Applications/Samples/build-wasm-ext.sh Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -#!/bin/bash -# -# usage: -# to build all targets: -# ./build-wasm.sh -# -# to build a single target: -# ./build-wasm.sh OrthancStoneSingleFrameEditor - -set -e - -target=${1:-all} - -# we will create the output files in a "build-wasm" folder in current location - -# let's save current dir -currentDir=$(pwd) - -scriptDirRel=$(dirname $0) -#echo $scriptDirRel -scriptDirAbs=$(realpath $scriptDirRel) -echo $scriptDirAbs - -pushd -# echo "$0" -# echo $BASH_SOURCE -# echo "$BASH_SOURCE" -# scriptDir=dirname $0 -# echo "***********" -# echo "***********" - -#echo "Script folder is" -#echo "$(cd "$(dirname "$BASH_SOURCE")"; pwd)/$(basename ""$BASH_SOURCE")" - -#samplesRootDir=$(pwd) -samplesRootDir=${scriptDirAbs} -echo "samplesRootDir = " ${samplesRootDir} - -mkdir -p build-wasm -cd build-wasm - -source ~/apps/emsdk/emsdk_env.sh -cmake -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DSTONE_SOURCES_DIR=$samplesRootDir/../.. -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT=$samplesRootDir/../../../orthanc -DALLOW_DOWNLOADS=ON $samplesRootDir -DENABLE_WASM=ON -make -j 5 $target - -echo "-- building the web application -- " -cd ${samplesRootDir} -./build-web-ext.sh - -popd diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/build-wasm.sh --- a/Applications/Samples/build-wasm.sh Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/build-wasm.sh Mon Feb 11 16:00:04 2019 +0100 @@ -18,8 +18,15 @@ cd $samplesRootDir/build-wasm source ~/apps/emsdk/emsdk_env.sh -cmake -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DSTONE_SOURCES_DIR=$currentDir/../../../orthanc-stone -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT=$currentDir/../../../orthanc -DALLOW_DOWNLOADS=ON .. -DENABLE_WASM=ON -make -j 5 $target +cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DSTONE_SOURCES_DIR=$currentDir/../../../orthanc-stone \ + -DORTHANC_FRAMEWORK_SOURCE=path \ + -DORTHANC_FRAMEWORK_ROOT=$currentDir/../../../orthanc \ + -DALLOW_DOWNLOADS=ON .. \ + -DENABLE_WASM=ON + +ninja $target echo "-- building the web application -- " cd $currentDir diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/build-web.sh --- a/Applications/Samples/build-web.sh Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/Samples/build-web.sh Mon Feb 11 16:00:04 2019 +0100 @@ -8,35 +8,51 @@ currentDir=$(pwd) samplesRootDir=$(pwd) +echo "*************************************************************************" +echo "samplesRootDir = $samplesRootDir" +echo "*************************************************************************" + outputDir=$samplesRootDir/build-web/ -mkdir -p $outputDir +mkdir -p "$outputDir" # files used by all single files samples -cp $samplesRootDir/Web/index.html $outputDir -cp $samplesRootDir/Web/samples-styles.css $outputDir +cp "$samplesRootDir/Web/index.html" "$outputDir" +cp "$samplesRootDir/Web/samples-styles.css" "$outputDir" # build simple-viewer-single-file (obsolete project) if [[ $target == "all" || $target == "OrthancStoneSimpleViewerSingleFile" ]]; then cp $samplesRootDir/Web/simple-viewer-single-file.html $outputDir - tsc --allowJs --project $samplesRootDir/Web/simple-viewer-single-file.tsconfig.json - cp $currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.js $outputDir - cp $currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.wasm $outputDir + tsc --project $samplesRootDir/Web/simple-viewer-single-file.tsconfig.json --outDir "$outputDir" + browserify \ + "$outputDir/Platforms/Wasm/wasm-application-runner.js" \ + "$outputDir/Applications/Samples/Web/simple-viewer-single-file.js" \ + -o "$outputDir/app-simple-viewer-single-file.js" + cp "$currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.js" $outputDir + cp "$currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.wasm" $outputDir fi # build single-frame if [[ $target == "all" || $target == "OrthancStoneSingleFrame" ]]; then cp $samplesRootDir/Web/single-frame.html $outputDir - tsc --allowJs --project $samplesRootDir/Web/single-frame.tsconfig.json - cp $currentDir/build-wasm/OrthancStoneSingleFrame.js $outputDir - cp $currentDir/build-wasm/OrthancStoneSingleFrame.wasm $outputDir + tsc --project $samplesRootDir/Web/single-frame.tsconfig.json --outDir "$outputDir" + browserify \ + "$outputDir/Platforms/Wasm/wasm-application-runner.js" \ + "$outputDir/Applications/Samples/Web/single-frame.js" \ + -o "$outputDir/app-single-frame.js" + cp "$currentDir/build-wasm/OrthancStoneSingleFrame.js" $outputDir + cp "$currentDir/build-wasm/OrthancStoneSingleFrame.wasm" $outputDir fi # build single-frame-editor if [[ $target == "all" || $target == "OrthancStoneSingleFrameEditor" ]]; then cp $samplesRootDir/Web/single-frame-editor.html $outputDir - tsc --allowJs --project $samplesRootDir/Web/single-frame-editor.tsconfig.json - cp $currentDir/build-wasm/OrthancStoneSingleFrameEditor.js $outputDir - cp $currentDir/build-wasm/OrthancStoneSingleFrameEditor.wasm $outputDir + tsc --project $samplesRootDir/Web/single-frame-editor.tsconfig.json --outDir "$outputDir" + browserify \ + "$outputDir/Platforms/Wasm/wasm-application-runner.js" \ + "$outputDir/Applications/Samples/Web/single-frame-editor.js" \ + -o "$outputDir/app-single-frame-editor.js" + cp "$currentDir/build-wasm/OrthancStoneSingleFrameEditor.js" $outputDir + cp "$currentDir/build-wasm/OrthancStoneSingleFrameEditor.wasm" $outputDir fi # build simple-viewer project @@ -44,9 +60,15 @@ mkdir -p $outputDir/simple-viewer/ cp $samplesRootDir/SimpleViewer/Wasm/simple-viewer.html $outputDir/simple-viewer/ cp $samplesRootDir/SimpleViewer/Wasm/styles.css $outputDir/simple-viewer/ - tsc --allowJs --project $samplesRootDir/SimpleViewer/Wasm/tsconfig-simple-viewer.json - cp $currentDir/build-wasm/OrthancStoneSimpleViewer.js $outputDir/simple-viewer/ - cp $currentDir/build-wasm/OrthancStoneSimpleViewer.wasm $outputDir/simple-viewer/ + + # the root dir must contain all the source files for the whole project + tsc --module commonjs --allowJs --project "$samplesRootDir/SimpleViewer/Wasm/tsconfig-simple-viewer.json" --rootDir "$samplesRootDir/../.." --outDir "$outputDir/simple-viewer/" + browserify \ + "$outputDir/simple-viewer/Platforms/Wasm/wasm-application-runner.js" \ + "$outputDir/simple-viewer/Applications/Samples/SimpleViewer/Wasm/simple-viewer.js" \ + -o "$outputDir/simple-viewer/app-simple-viewer.js" + cp "$currentDir/build-wasm/OrthancStoneSimpleViewer.js" "$outputDir/simple-viewer/" + cp "$currentDir/build-wasm/OrthancStoneSimpleViewer.wasm" "$outputDir/simple-viewer/" fi cd $currentDir diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/Samples/samples-library.js --- a/Applications/Samples/samples-library.js Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -// this file contains the JS method you want to expose to C++ code - -// mergeInto(LibraryManager.library, { -// ScheduleRedraw: function() { -// ScheduleRedraw(); -// } -// }); - \ No newline at end of file diff -r cc47e6eaefb0 -r 5055031f4a06 Applications/StoneApplicationContext.h --- a/Applications/StoneApplicationContext.h Wed Jan 16 21:08:38 2019 +0100 +++ b/Applications/StoneApplicationContext.h Mon Feb 11 16:00:04 2019 +0100 @@ -26,6 +26,25 @@ #include "../Framework/Toolbox/OrthancApiClient.h" #include "../Framework/Viewport/WidgetViewport.h" + +#ifdef _MSC_VER + #if _MSC_VER > 1910 + #define orthanc_override override + #else + #define orthanc_override + #endif +#elif defined __GNUC__ + #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +/* Test for GCC > 3.2.0 */ + #if GCC_VERSION > 40900 + #define orthanc_override override + else + #define orthanc_override + #endif +#else + #define orthanc_override +#endif + #include namespace OrthancStone diff -r cc47e6eaefb0 -r 5055031f4a06 Platforms/Wasm/WasmDelayedCallExecutor.js --- a/Platforms/Wasm/WasmDelayedCallExecutor.js Wed Jan 16 21:08:38 2019 +0100 +++ b/Platforms/Wasm/WasmDelayedCallExecutor.js Mon Feb 11 16:00:04 2019 +0100 @@ -1,7 +1,7 @@ mergeInto(LibraryManager.library, { WasmDelayedCallExecutor_Schedule: function(callable, timeoutInMs/*, payload*/) { setTimeout(function() { - WasmDelayedCallExecutor_ExecuteCallback(callable/*, payload*/); + window.WasmDelayedCallExecutor_ExecuteCallback(callable/*, payload*/); }, timeoutInMs); } }); diff -r cc47e6eaefb0 -r 5055031f4a06 Platforms/Wasm/WasmPlatformApplicationAdapter.cpp --- a/Platforms/Wasm/WasmPlatformApplicationAdapter.cpp Wed Jan 16 21:08:38 2019 +0100 +++ b/Platforms/Wasm/WasmPlatformApplicationAdapter.cpp Mon Feb 11 16:00:04 2019 +0100 @@ -27,7 +27,7 @@ printf("Could not parse command: '%s'\n", input.c_str()); else application_.ExecuteCommand(*command); - } + } } catch (StoneException& exc) { diff -r cc47e6eaefb0 -r 5055031f4a06 Platforms/Wasm/WasmWebService.js --- a/Platforms/Wasm/WasmWebService.js Wed Jan 16 21:08:38 2019 +0100 +++ b/Platforms/Wasm/WasmWebService.js Mon Feb 11 16:00:04 2019 +0100 @@ -24,10 +24,10 @@ // TODO - Is "new Uint8Array()" necessary? This copies the // answer to the WebAssembly stack, hence necessitating // increasing the TOTAL_STACK parameter of Emscripten - WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response), + window.WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response), this.response.byteLength, headers, payload); } else { - WasmWebService_NotifyError(callableFailure, url_, payload); + window.WasmWebService_NotifyError(callableFailure, url_, payload); } } } diff -r cc47e6eaefb0 -r 5055031f4a06 Platforms/Wasm/default-library.js --- a/Platforms/Wasm/default-library.js Wed Jan 16 21:08:38 2019 +0100 +++ b/Platforms/Wasm/default-library.js Mon Feb 11 16:00:04 2019 +0100 @@ -2,10 +2,10 @@ mergeInto(LibraryManager.library, { ScheduleWebViewportRedrawFromCpp: function(cppViewportHandle) { - ScheduleWebViewportRedraw(cppViewportHandle); + window.ScheduleWebViewportRedraw(cppViewportHandle); }, CreateWasmViewportFromCpp: function(htmlCanvasId) { - return CreateWasmViewport(htmlCanvasId); + return window.CreateWasmViewport(htmlCanvasId); }, // each time the StoneApplication updates its status, it may signal it through this method. i.e, to change the status of a button in the web interface UpdateStoneApplicationStatusFromCpp: function(statusUpdateMessage) { @@ -13,4 +13,3 @@ UpdateWebApplication(statusUpdateMessage_); } }); - \ No newline at end of file diff -r cc47e6eaefb0 -r 5055031f4a06 Platforms/Wasm/stone-framework-loader.ts --- a/Platforms/Wasm/stone-framework-loader.ts Wed Jan 16 21:08:38 2019 +0100 +++ b/Platforms/Wasm/stone-framework-loader.ts Mon Feb 11 16:00:04 2019 +0100 @@ -1,96 +1,95 @@ -module Stone { - /** - * This file contains primitives to interface with WebAssembly and - * with the Stone framework. - **/ - - export declare type InitializationCallback = () => void; - - export declare var StoneFrameworkModule : any; - - //const ASSETS_FOLDER : string = "assets/lib"; - //const WASM_FILENAME : string = "orthanc-framework"; - - - export class Framework - { - private static singleton_ : Framework = null; - private static wasmModuleName_ : string = null; +/** + * This file contains primitives to interface with WebAssembly and + * with the Stone framework. + **/ + +export declare type InitializationCallback = () => void; + +//export declare var StoneFrameworkModule : any; +export var StoneFrameworkModule : any; + +//const ASSETS_FOLDER : string = "assets/lib"; +//const WASM_FILENAME : string = "orthanc-framework"; + +export class Framework +{ + private static singleton_ : Framework = null; + private static wasmModuleName_ : string = null; + + public static Configure(wasmModuleName: string) { + this.wasmModuleName_ = wasmModuleName; + } - public static Configure(wasmModuleName: string) { - this.wasmModuleName_ = wasmModuleName; - } + private constructor(verbose : boolean) + { + //this.ccall('Initialize', null, [ 'number' ], [ verbose ]); + } + + + public ccall( name: string, + returnType: string, + argTypes: Array, + argValues: Array) : any + { + return ( window).StoneFrameworkModule.ccall(name, returnType, argTypes, argValues); + } + + + public cwrap( name: string, + returnType: string, + argTypes: Array) : any + { + return ( window).StoneFrameworkModule.cwrap(name, returnType, argTypes); + } - private constructor(verbose : boolean) - { - //this.ccall('Initialize', null, [ 'number' ], [ verbose ]); - } - - - public ccall(name: string, - returnType: string, - argTypes: Array, - argValues: Array) : any - { - return StoneFrameworkModule.ccall(name, returnType, argTypes, argValues); - } - - - public cwrap(name: string, - returnType: string, - argTypes: Array) : any - { - return StoneFrameworkModule.cwrap(name, returnType, argTypes); - } - - - public static GetInstance() : Framework - { - if (Framework.singleton_ == null) { - throw new Error('The WebAssembly module is not loaded yet'); - } else { - return Framework.singleton_; + + public static GetInstance() : Framework + { + if (Framework.singleton_ == null) { + throw new Error('The WebAssembly module is not loaded yet'); + } else { + return Framework.singleton_; + } + } + + + public static Initialize( verbose: boolean, + callback: InitializationCallback) + { + console.log('Initializing WebAssembly Module'); + + // ( window). + ( window).StoneFrameworkModule = { + preRun: [ + function() { + console.log('Loading the Stone Framework using WebAssembly'); } - } - - - public static Initialize(verbose: boolean, - callback: InitializationCallback) - { - console.log('Initializing WebAssembly Module'); - - ( window).StoneFrameworkModule = { - preRun: [ - function() { - console.log('Loading the Stone Framework using WebAssembly'); - } - ], - postRun: [ - function() { - // This function is called by ".js" wrapper once the ".wasm" - // WebAssembly module has been loaded and compiled by the - // browser - console.log('WebAssembly is ready'); - Framework.singleton_ = new Framework(verbose); - callback(); - } - ], - print: function(text : string) { - console.log(text); - }, - printErr: function(text : string) { - console.error(text); - }, - totalDependencies: 0 - }; - - // Dynamic loading of the JavaScript wrapper around WebAssembly - var script = document.createElement('script'); - script.type = 'application/javascript'; - //script.src = "orthanc-stone.js"; // ASSETS_FOLDER + '/' + WASM_FILENAME + '.js'; - script.src = this.wasmModuleName_ + ".js";// "OrthancStoneSimpleViewer.js"; // ASSETS_FOLDER + '/' + WASM_FILENAME + '.js'; - script.async = true; - document.head.appendChild(script); - } - } -} \ No newline at end of file + ], + postRun: [ + function() { + // This function is called by ".js" wrapper once the ".wasm" + // WebAssembly module has been loaded and compiled by the + // browser + console.log('WebAssembly is ready'); + Framework.singleton_ = new Framework(verbose); + callback(); + } + ], + print: function(text : string) { + console.log(text); + }, + printErr: function(text : string) { + console.error(text); + }, + totalDependencies: 0 + }; + + // Dynamic loading of the JavaScript wrapper around WebAssembly + var script = document.createElement('script'); + script.type = 'application/javascript'; + //script.src = "orthanc-stone.js"; // ASSETS_FOLDER + '/' + WASM_FILENAME + '.js'; + script.src = this.wasmModuleName_ + ".js";// "OrthancStoneSimpleViewer.js"; // ASSETS_FOLDER + '/' + WASM_FILENAME + '.js'; + script.async = true; + document.head.appendChild(script); + } +} diff -r cc47e6eaefb0 -r 5055031f4a06 Platforms/Wasm/wasm-application-runner.ts --- a/Platforms/Wasm/wasm-application-runner.ts Wed Jan 16 21:08:38 2019 +0100 +++ b/Platforms/Wasm/wasm-application-runner.ts Mon Feb 11 16:00:04 2019 +0100 @@ -1,11 +1,12 @@ -/// -/// +import Stone = require('./stone-framework-loader'); +import StoneViewport = require('./wasm-viewport'); if (!('WebAssembly' in window)) { alert('Sorry, your browser does not support WebAssembly :('); } -declare var StoneFrameworkModule : Stone.Framework; +//var StoneFrameworkModule : Stone.Framework = (window).StoneFrameworkModule; +//export declare var StoneFrameworkModule : Stone.Framework; // global functions var WasmWebService_NotifyError: Function = null; @@ -15,11 +16,10 @@ var WasmDoAnimation: Function = null; var SetStartupParameter: Function = null; var CreateWasmApplication: Function = null; -var CreateCppViewport: Function = null; +export var CreateCppViewport: Function = null; var ReleaseCppViewport: Function = null; var StartWasmApplication: Function = null; -var SendMessageToStoneApplication: Function = null; - +export var SendMessageToStoneApplication: Function = null; function DoAnimationThread() { if (WasmDoAnimation != null) { @@ -29,7 +29,6 @@ setTimeout(DoAnimationThread, 100); // Update the viewport content every 100ms if need be } - function GetUriParameters(): Map { var parameters = window.location.search.substr(1); @@ -72,12 +71,12 @@ StartWasmApplication(orthancBaseUrl); // trigger a first resize of the canvas that has just been initialized - Stone.WasmViewport.ResizeAll(); + StoneViewport.WasmViewport.ResizeAll(); DoAnimationThread(); } -function InitializeWasmApplication(wasmModuleName: string, orthancBaseUrl: string) { +export function InitializeWasmApplication(wasmModuleName: string, orthancBaseUrl: string) { Stone.Framework.Configure(wasmModuleName); @@ -87,19 +86,20 @@ console.log("Connecting C++ methods to JS methods"); - SetStartupParameter = StoneFrameworkModule.cwrap('SetStartupParameter', null, ['string', 'string']); - CreateWasmApplication = StoneFrameworkModule.cwrap('CreateWasmApplication', null, ['number']); - CreateCppViewport = StoneFrameworkModule.cwrap('CreateCppViewport', 'number', []); - ReleaseCppViewport = StoneFrameworkModule.cwrap('ReleaseCppViewport', null, ['number']); - StartWasmApplication = StoneFrameworkModule.cwrap('StartWasmApplication', null, ['string']); + SetStartupParameter = ( window).StoneFrameworkModule.cwrap('SetStartupParameter', null, ['string', 'string']); + CreateWasmApplication = ( window).StoneFrameworkModule.cwrap('CreateWasmApplication', null, ['number']); + CreateCppViewport = ( window).StoneFrameworkModule.cwrap('CreateCppViewport', 'number', []); + ReleaseCppViewport = ( window).StoneFrameworkModule.cwrap('ReleaseCppViewport', null, ['number']); + StartWasmApplication = ( window).StoneFrameworkModule.cwrap('StartWasmApplication', null, ['string']); - WasmWebService_NotifyCachedSuccess = StoneFrameworkModule.cwrap('WasmWebService_NotifyCachedSuccess', null, ['number']); - WasmWebService_NotifySuccess = StoneFrameworkModule.cwrap('WasmWebService_NotifySuccess', null, ['number', 'string', 'array', 'number', 'number']); - WasmWebService_NotifyError = StoneFrameworkModule.cwrap('WasmWebService_NotifyError', null, ['number', 'string', 'number']); - WasmDelayedCallExecutor_ExecuteCallback = StoneFrameworkModule.cwrap('WasmDelayedCallExecutor_ExecuteCallback', null, ['number']); - WasmDoAnimation = StoneFrameworkModule.cwrap('WasmDoAnimation', null, []); + ( window).WasmWebService_NotifyCachedSuccess = ( window).StoneFrameworkModule.cwrap('WasmWebService_NotifyCachedSuccess', null, ['number']); + ( window).WasmWebService_NotifySuccess = ( window).StoneFrameworkModule.cwrap('WasmWebService_NotifySuccess', null, ['number', 'string', 'array', 'number', 'number']); + ( window).WasmWebService_NotifyError = ( window).StoneFrameworkModule.cwrap('WasmWebService_NotifyError', null, ['number', 'string', 'number']); + ( window).WasmDelayedCallExecutor_ExecuteCallback = ( window).StoneFrameworkModule.cwrap('WasmDelayedCallExecutor_ExecuteCallback', null, ['number']); + // no need to put this into the globals for it's only used in this very module + WasmDoAnimation = ( window).StoneFrameworkModule.cwrap('WasmDoAnimation', null, []); - SendMessageToStoneApplication = StoneFrameworkModule.cwrap('SendMessageToStoneApplication', 'string', ['string']); + SendMessageToStoneApplication = ( window).StoneFrameworkModule.cwrap('SendMessageToStoneApplication', 'string', ['string']); console.log("Connecting C++ methods to JS methods - done"); @@ -110,4 +110,10 @@ _InitializeWasmApplication(orthancBaseUrl); }); -} \ No newline at end of file +} + + +// exports.InitializeWasmApplication = InitializeWasmApplication; + + + diff -r cc47e6eaefb0 -r 5055031f4a06 Platforms/Wasm/wasm-viewport.ts --- a/Platforms/Wasm/wasm-viewport.ts Wed Jan 16 21:08:38 2019 +0100 +++ b/Platforms/Wasm/wasm-viewport.ts Mon Feb 11 16:00:04 2019 +0100 @@ -1,3 +1,6 @@ +import wasmApplicationRunner = require('./wasm-application-runner'); +//import stoneFrameworkLoader = require('./stone-framework-loader'); + var isPendingRedraw = false; function ScheduleWebViewportRedraw(cppViewportHandle: any) : void @@ -7,24 +10,26 @@ console.log('Scheduling a refresh of the viewport, as its content changed'); window.requestAnimationFrame(function() { isPendingRedraw = false; - Stone.WasmViewport.GetFromCppViewport(cppViewportHandle).Redraw(); + WasmViewport.GetFromCppViewport(cppViewportHandle).Redraw(); }); } } +(window).ScheduleWebViewportRedraw = ScheduleWebViewportRedraw; + declare function UTF8ToString(any): string; function CreateWasmViewport(htmlCanvasId: string) : any { - var cppViewportHandle = CreateCppViewport(); + var cppViewportHandle = wasmApplicationRunner.CreateCppViewport(); var canvasId = UTF8ToString(htmlCanvasId); - var webViewport = new Stone.WasmViewport(StoneFrameworkModule, canvasId, cppViewportHandle); // viewports are stored in a static map in WasmViewport -> won't be deleted + var webViewport = new WasmViewport(( window).StoneFrameworkModule, canvasId, cppViewportHandle); // viewports are stored in a static map in WasmViewport -> won't be deleted webViewport.Initialize(); return cppViewportHandle; } + +(window).CreateWasmViewport = CreateWasmViewport; -module Stone { - // export declare type InitializationCallback = () => void; // export declare var StoneFrameworkModule : any; @@ -32,7 +37,7 @@ //const ASSETS_FOLDER : string = "assets/lib"; //const WASM_FILENAME : string = "orthanc-framework"; - export class WasmViewport { +export class WasmViewport { private static viewportsMapByCppHandle_ : Map = new Map(); // key = the C++ handle private static viewportsMapByCanvasId_ : Map = new Map(); // key = the canvasId @@ -291,5 +296,5 @@ } } -} + \ No newline at end of file diff -r cc47e6eaefb0 -r 5055031f4a06 README.md --- a/README.md Wed Jan 16 21:08:38 2019 +0100 +++ b/README.md Mon Feb 11 16:00:04 2019 +0100 @@ -80,6 +80,8 @@ in `~/apps/emsdk`. If you wish to use it in another way, please edit the `build-wasm.sh` file. +ninja (`sudo apt-get install -y ninja-build`) is used instead of make, for performance reasons. + Installation and usage ---------------------- Build instructions are similar to that of Orthanc: diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CMake/FlatBuffersConfiguration.cmake --- a/Resources/CMake/FlatBuffersConfiguration.cmake Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,171 +0,0 @@ -# Stone of Orthanc -# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics -# Department, University Hospital of Liege, Belgium -# Copyright (C) 2017-2019 Osimis S.A., Belgium -# -# This program is free software: you can redistribute it and/or -# modify it under the terms of the GNU Affero General Public License -# as published by the Free Software Foundation, either version 3 of -# the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) -set(FLATC_AUTOGENERATED_SOURCES) - -if (STATIC_BUILD OR NOT USE_SYSTEM_FLATBUFFERS) - SET(FLATBUFFERS_SOURCES_DIR ${CMAKE_BINARY_DIR}/flatbuffers-1.10) - SET(FLATBUFFERS_URL "http://127.0.0.1:8000/flatbuffers-1.10.tar.gz") - SET(FLATBUFFERS_MD5 "d5f131809c14def9682d49385b452e43") - - DownloadPackage(${FLATBUFFERS_MD5} ${FLATBUFFERS_URL} "${FLATBUFFERS_SOURCES_DIR}") - - include_directories(${FLATBUFFERS_SOURCES_DIR}/include) - - # we only need the flatc compiler! - set(FLATBUFFERS_BUILD_TESTS OFF) - set(FLATBUFFERS_INSTALL OFF) - set(FLATBUFFERS_BUILD_FLATLIB OFF) - set(FLATBUFFERS_BUILD_FLATC ON) - set(FLATBUFFERS_BUILD_FLATHASH OFF) - set(FLATBUFFERS_BUILD_GRPCTEST OFF) - set(FLATBUFFERS_BUILD_SHAREDLIB OFF) - set(FLATBUFFERS_LIBCXX_WITH_CLANG OFF) - - # add_subdirectory(${FLATBUFFERS_SOURCES_DIR} - # ${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-build - # EXCLUDE_FROM_ALL) - - # Now simply link against flatbuffers as needed to your already declared target. - # The flatbuffers target carry header search path automatically if CMake > 2.8.11. - #target_link_libraries(own_project_target PRIVATE flatbuffers) - -else() - find_package(FlatBuffers) - include_directories(${SDL2_INCLUDE_DIRS}) - link_libraries(${SDL2_LIBRARIES}) -endif() - -macro(GetFilenameFromPath TargetVariable Path) - #message(STATUS "GetFilenameFromPath (1): Path = ${Path} TargetVariable = ${${TargetVariable}}") - string(REPLACE "\\" "/" PathWithFwdSlashes "${Path}") - string(REGEX REPLACE "^.*/" "" ${TargetVariable} "${PathWithFwdSlashes}") - #message(STATUS "GetFilenameFromPath (2): Path = ${Path} Path = ${PathWithFwdSlashes} TargetVariable = ${TargetVariable}") -endmacro() - -macro(GetFilePathWithoutLastExtension TargetVariable FilePath) - string(REGEX REPLACE "(^.*)\\.([^\\.]+)" "\\1" ${TargetVariable} "${FilePath}") - #message(STATUS "GetFileNameWithoutLastExtension: FilePath = ${FilePath} TargetVariable = ${${TargetVariable}}") -endmacro() - -macro(Test_GetFilePathWithoutLastExtension) - set(tmp "/prout/zi/goui.goui.cpp") - GetFilePathWithoutLastExtension(TargetVariable "${tmp}") - if(NOT ("${TargetVariable}" STREQUAL "/prout/zi/goui.goui")) - message(FATAL_ERROR "Test_GetFilePathWithoutLastExtension failed (1)") - else() - #message(STATUS "Test_GetFilePathWithoutLastExtension: <>") - endif() -endmacro() - -Test_GetFilePathWithoutLastExtension() - -macro(Test_GetFilenameFromPath) - set(tmp "/prout/../../dada/zi/goui.goui.cpp") - GetFilenameFromPath(TargetVariable "${tmp}") - if(NOT ("${TargetVariable}" STREQUAL "goui.goui.cpp")) - message(FATAL_ERROR "Test_GetFilenameFromPath failed") - else() - #message(STATUS "Test_GetFilenameFromPath: <>") - endif() -endmacro() - -Test_GetFilenameFromPath() - -macro(GenerateCodeFromFlatBufferSchema schemaFilePath) - # extract file name - GetFilePathWithoutLastExtension(schemaFilePathWithoutExt ${schemaFilePath}) - - # remove extension - GetFilenameFromPath(schemaFileNameWithoutExt ${schemaFilePathWithoutExt}) - - set(generatedFilePathWithoutExtension "${CMAKE_BINARY_DIR}/${schemaFileNameWithoutExt}_generated") - set(generatedCppFileName "${generatedFilePathWithoutExtension}.h") - set(generatedTsFileName "${generatedFilePathWithoutExtension}.ts") - set(generatedJsFileName "${generatedFilePathWithoutExtension}.js") - - set(AUTOGENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/AUTOGENERATED") - set(AUTOGENERATED_SOURCES) - - set(FLATC_EXECUTABLE "flatc") - find_program(FLATC_EXECUTABLE_SEARCH ${FLATC_EXECUTABLE}) - if(NOT FLATC_EXECUTABLE_SEARCH) - message(FATAL_ERROR "FlatBuffers compiler not found") - endif() - - set(SCRIPT_CPP_OPTIONS) - list(APPEND SCRIPT_CPP_OPTIONS "--gen-object-api") - list(APPEND SCRIPT_CPP_OPTIONS "--cpp") - list(APPEND SCRIPT_CPP_OPTIONS "--gen-onefile") - list(APPEND SCRIPT_CPP_OPTIONS "--gen-all") - list(APPEND SCRIPT_CPP_OPTIONS "--force-empty") - list(APPEND SCRIPT_CPP_OPTIONS "--reflect-types") - list(APPEND SCRIPT_CPP_OPTIONS "--reflect-names") - - set(SCRIPT_TS_OPTIONS) - list(APPEND SCRIPT_TS_OPTIONS "--gen-object-api") - list(APPEND SCRIPT_TS_OPTIONS "--ts") - list(APPEND SCRIPT_TS_OPTIONS "--gen-onefile") - list(APPEND SCRIPT_TS_OPTIONS "--gen-all") - list(APPEND SCRIPT_TS_OPTIONS "--no-js-exports") - list(APPEND SCRIPT_TS_OPTIONS "--force-empty") - list(APPEND SCRIPT_TS_OPTIONS "--reflect-types") - list(APPEND SCRIPT_TS_OPTIONS "--reflect-names") - - set(SCRIPT_JS_OPTIONS) - list(APPEND SCRIPT_JS_OPTIONS "--gen-object-api") - list(APPEND SCRIPT_JS_OPTIONS "--js") - list(APPEND SCRIPT_JS_OPTIONS "--gen-onefile") - list(APPEND SCRIPT_JS_OPTIONS "--gen-all") - list(APPEND SCRIPT_JS_OPTIONS "--no-js-exports") - list(APPEND SCRIPT_JS_OPTIONS "--force-empty") - list(APPEND SCRIPT_JS_OPTIONS "--reflect-types") - list(APPEND SCRIPT_JS_OPTIONS "--reflect-names") - - add_custom_command( - OUTPUT - ${generatedCppFileName} - COMMAND - ${FLATC_EXECUTABLE} ${SCRIPT_CPP_OPTIONS} ${schemaFilePath} - DEPENDS - ${schemaFilePath} - ) - - add_custom_command( - OUTPUT - ${generatedTsFileName} - COMMAND - ${FLATC_EXECUTABLE} ${SCRIPT_TS_OPTIONS} ${schemaFilePath} - DEPENDS - ${schemaFilePath} - ) - - add_custom_command( - OUTPUT - ${generatedJsFileName} - COMMAND - ${FLATC_EXECUTABLE} ${SCRIPT_JS_OPTIONS} ${schemaFilePath} - DEPENDS - ${schemaFilePath} - ) - - list(APPEND FLATC_AUTOGENERATED_SOURCES "${generatedCppFileName}") - list(APPEND FLATC_AUTOGENERATED_SOURCES "${generatedJsFileName}") - list(APPEND FLATC_AUTOGENERATED_SOURCES "${generatedTsFileName}") - -endmacro() diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CMake/ProtobufCodeGeneration.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Resources/CMake/ProtobufCodeGeneration.cmake Mon Feb 11 16:00:04 2019 +0100 @@ -0,0 +1,77 @@ +# HOW TO USE: +# the GenerateCodeFromProtobufSchema will generate files in ${CMAKE_BINARY_DIR} and will +# populate PROTOBUF_AUTOGENERATED_SOURCES with the list of generated files +# AS OF 2019-01-30, it requires protoc (version 3.6.1.x) to be available in the path +set(PROTOBUF_AUTOGENERATED_SOURCES) + +# TODO: use find_program ( name1 [path1 path2 ...]) to located the protobuf compiler +# TODO: automated the TS plugin installation + +macro(GenerateCodeFromProtobufSchema schemaFilePath outputBaseDirectory) + # extract file name + GetFilePathWithoutLastExtension(schemaFilePathWithoutExt ${schemaFilePath}) + + # remove extension + GetFilenameFromPath(schemaFileNameWithoutExt ${schemaFilePathWithoutExt}) + + set(generatedFilePathWithoutExtension "${CMAKE_BINARY_DIR}/AUTOGENERATED/${schemaFileNameWithoutExt}") + set(generatedCppSourceFilePath "${generatedFilePathWithoutExtension}.pb.cc") + set(generatedCppHeaderFilePath "${generatedFilePathWithoutExtension}.pb.h") + set(generatedJsFilePath "${generatedFilePathWithoutExtension}_pb.js") + set(generatedTsFilePath "${generatedFilePathWithoutExtension}_pb.d.ts") + # set(generatedJsFileName "${generatedFilePathWithoutExtension}.js") + + # set(AUTOGENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/AUTOGENERATED") + # set(AUTOGENERATED_SOURCES) + + set(PROTOC_EXECUTABLE "PROTOC") + find_program(PROTOC_EXECUTABLE_SEARCH ${FLATC_EXECUTABLE}) + if(NOT PROTOC_EXECUTABLE_SEARCH) + message(FATAL_ERROR "The Protocol Buffers compiler (protoc[.exe]) cannot be found!") + endif() + + # TODO CUSTOMIZE FOR TYPESCRIPT + set(SCRIPT_CPP_OPTIONS) + list(APPEND SCRIPT_CPP_OPTIONS "----cpp_out=${CMAKE_BINARY_DIR}/AUTOGENERATED") + # list(APPEND SCRIPT_CPP_OPTIONS "gnagna") + + set(SCRIPT_TS_OPTIONS) + + list(APPEND SCRIPT_TS_OPTIONS "--ts") + list(APPEND SCRIPT_TS_OPTIONS "gnagna") + + add_custom_command( + OUTPUT + ${generatedCppSourceFilePath} + ${generatedCppHeaderFilePath} + COMMAND + ${PROTOC_EXECUTABLE} ${SCRIPT_CPP_OPTIONS} ${schemaFilePath} + DEPENDS + ${schemaFilePath} + ) + + add_custom_command( + OUTPUT + ${generatedTsFileName} + ${generatedJsFilePath} + COMMAND + ${PROTOC_EXECUTABLE} ${SCRIPT_TS_OPTIONS} ${schemaFilePath} + DEPENDS + ${schemaFilePath} + ) + + # add_custom_command( + # OUTPUT + # ${generatedJsFileName} + # COMMAND + # ${FLATC_EXECUTABLE} ${SCRIPT_JS_OPTIONS} ${schemaFilePath} + # DEPENDS + # ${schemaFilePath} + # ) + + list(APPEND FLATC_AUTOGENERATED_SOURCES "${generatedCppFileName}") + # list(APPEND FLATC_AUTOGENERATED_SOURCES "${generatedJsFileName}") + list(APPEND FLATC_AUTOGENERATED_SOURCES "${generatedTsFileName}") + +endmacro() + diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CMake/Utilities.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Resources/CMake/Utilities.cmake Mon Feb 11 16:00:04 2019 +0100 @@ -0,0 +1,37 @@ + + +macro(GetFilenameFromPath TargetVariable Path) +#message(STATUS "GetFilenameFromPath (1): Path = ${Path} TargetVariable = ${${TargetVariable}}") +string(REPLACE "\\" "/" PathWithFwdSlashes "${Path}") +string(REGEX REPLACE "^.*/" "" ${TargetVariable} "${PathWithFwdSlashes}") +#message(STATUS "GetFilenameFromPath (2): Path = ${Path} Path = ${PathWithFwdSlashes} TargetVariable = ${TargetVariable}") +endmacro() + +macro(GetFilePathWithoutLastExtension TargetVariable FilePath) +string(REGEX REPLACE "(^.*)\\.([^\\.]+)" "\\1" ${TargetVariable} "${FilePath}") +#message(STATUS "GetFileNameWithoutLastExtension: FilePath = ${FilePath} TargetVariable = ${${TargetVariable}}") +endmacro() + +macro(Test_GetFilePathWithoutLastExtension) +set(tmp "/prout/zi/goui.goui.cpp") +GetFilePathWithoutLastExtension(TargetVariable "${tmp}") +if(NOT ("${TargetVariable}" STREQUAL "/prout/zi/goui.goui")) + message(FATAL_ERROR "Test_GetFilePathWithoutLastExtension failed (1)") +else() + #message(STATUS "Test_GetFilePathWithoutLastExtension: <>") +endif() +endmacro() + +Test_GetFilePathWithoutLastExtension() + +macro(Test_GetFilenameFromPath) +set(tmp "/prout/../../dada/zi/goui.goui.cpp") +GetFilenameFromPath(TargetVariable "${tmp}") +if(NOT ("${TargetVariable}" STREQUAL "goui.goui.cpp")) + message(FATAL_ERROR "Test_GetFilenameFromPath failed") +else() + #message(STATUS "Test_GetFilenameFromPath: <>") +endif() +endmacro() + +Test_GetFilenameFromPath() diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CommandTool/flatc-tests/basic/BasicCommands.fbs --- a/Resources/CommandTool/flatc-tests/basic/BasicCommands.fbs Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -// Example IDL file for our monster's schema. -namespace Orthanc.Stone.Applications; - -union BasicCommands = {SelectTool, PanImage} -union BasicReplies = {SelectToolReply, PanImageReply, LoadFileReply } - -table SelectTool { - tool:Tool; -} - -table SelectToolReply { -} - -table PanImage { - x:int32; - y:int32; -} - -table PanImageReply { - x:int32; - y:int32; -} - -table LoadFile { - filePath:string; -} - -table LoadFileReply { - success:bool; -} - -union BasicCommand { - command: BasicCommands -} - -union BasicReply { - command: BasicReplies -} - -// root_type Monster; - diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CommandTool/flatc-tests/basic/CMakeLists.txt --- a/Resources/CommandTool/flatc-tests/basic/CMakeLists.txt Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -project(BasicFlatBuffersTest) - -set(AUTOGENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/AUTOGENERATED") -set(AUTOGENERATED_SOURCES) - -set(FLATC_EXECUTABLE "flatc") - -set(DEPOT_ROOT "/osimis") - -set(SCRIPT_CPP_OPTIONS) -list(APPEND SCRIPT_CPP_OPTIONS "--gen-object-api") -list(APPEND SCRIPT_CPP_OPTIONS "--cpp") -list(APPEND SCRIPT_CPP_OPTIONS "--gen-onefile") -list(APPEND SCRIPT_CPP_OPTIONS "--gen-all") -list(APPEND SCRIPT_CPP_OPTIONS "--force-empty") -list(APPEND SCRIPT_CPP_OPTIONS "--reflect-types") -list(APPEND SCRIPT_CPP_OPTIONS "--reflect-names") - -set(SCRIPT_TS_OPTIONS) -list(APPEND SCRIPT_TS_OPTIONS "--gen-object-api") -list(APPEND SCRIPT_TS_OPTIONS "--ts") -list(APPEND SCRIPT_TS_OPTIONS "--gen-onefile") -list(APPEND SCRIPT_TS_OPTIONS "--gen-all") -list(APPEND SCRIPT_TS_OPTIONS "--no-js-exports") -list(APPEND SCRIPT_TS_OPTIONS "--force-empty") -list(APPEND SCRIPT_TS_OPTIONS "--reflect-types") -list(APPEND SCRIPT_TS_OPTIONS "--reflect-names") - -set(SCRIPT_JS_OPTIONS) -list(APPEND SCRIPT_JS_OPTIONS "--gen-object-api") -list(APPEND SCRIPT_JS_OPTIONS "--js") -list(APPEND SCRIPT_JS_OPTIONS "--gen-onefile") -list(APPEND SCRIPT_JS_OPTIONS "--gen-all") -list(APPEND SCRIPT_JS_OPTIONS "--no-js-exports") -list(APPEND SCRIPT_JS_OPTIONS "--force-empty") -list(APPEND SCRIPT_JS_OPTIONS "--reflect-types") -list(APPEND SCRIPT_JS_OPTIONS "--reflect-names") - -set(SCHEMA_FILE "${CMAKE_CURRENT_LIST_DIR}/basic.fbs") -set(AUTOGENERATED_CPP_FILE "${CMAKE_BINARY_DIR}/basic_generated.h") -set(AUTOGENERATED_TS_FILE "${CMAKE_BINARY_DIR}/basic_generated.ts") -set(AUTOGENERATED_JS_FILE "${CMAKE_BINARY_DIR}/basic_generated.js") - -add_custom_command( - OUTPUT - ${AUTOGENERATED_CPP_FILE} - COMMAND - ${FLATC_EXECUTABLE} ${SCRIPT_CPP_OPTIONS} ${SCHEMA_FILE} - DEPENDS - ${SCHEMA_FILE} - ) - -add_custom_command( - OUTPUT - ${AUTOGENERATED_TS_FILE} - COMMAND - ${FLATC_EXECUTABLE} ${SCRIPT_TS_OPTIONS} ${SCHEMA_FILE} - DEPENDS - ${SCHEMA_FILE} - ) - -add_custom_command( - OUTPUT - ${AUTOGENERATED_JS_FILE} - COMMAND - ${FLATC_EXECUTABLE} ${SCRIPT_JS_OPTIONS} ${SCHEMA_FILE} - DEPENDS - ${SCHEMA_FILE} - ) - -list(APPEND AUTOGENERATED_SOURCES ${AUTOGENERATED_CPP_FILE} ${AUTOGENERATED_TS_FILE} ${AUTOGENERATED_JS_FILE}) - -message("AUTOGENERATED_SOURCES = ${AUTOGENERATED_SOURCES}") -add_executable(BasicFlatBuffersTest main.cpp ${SCHEMA_FILE} ${AUTOGENERATED_SOURCES}) - -target_include_directories(BasicFlatBuffersTest PRIVATE ${DEPOT_ROOT}/ThirdParty/flatbuffers-1.10/include) -target_include_directories(BasicFlatBuffersTest PRIVATE ${CMAKE_BINARY_DIR}) diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CommandTool/flatc-tests/basic/basic_test_gen.ps1 --- a/Resources/CommandTool/flatc-tests/basic/basic_test_gen.ps1 Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -flatc --gen-object-api --cpp .\basic.fbs -flatc --ts .\basic.fbs \ No newline at end of file diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CommandTool/flatc-tests/basic/main.cpp --- a/Resources/CommandTool/flatc-tests/basic/main.cpp Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -#include -#include "basic_generated.h" - -using namespace Orthanc::Stone::Samples::SimpleViewer; - -namespace OrthancStone -{ - class IPocMessage - { - public: - virtual std::string GetType() = 0; - }; - - -} - - - -int main() -{ - Request; - - Request::messageType = SelectTool; - - SelectToolT tool2; - tool2.tool = Tool_CircleMeasure; - - SendToApplication(tool2); - - - tool2.tool = Tool_CircleMeasure; - - CircleToolT circleTool; - circleTool.centerX = 3; - circleTool.centerY = 4; - - std::cout << "Hello from flatc generator sample!" << std::endl; -} diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CommandTool/protoc-tests/basic.proto --- a/Resources/CommandTool/protoc-tests/basic.proto Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -syntax = "proto3"; - -// Taken from https://developers.google.com/protocol-buffers/docs/proto -message SearchRequest { - string query = 1; - int32 page_number = 2; - int32 result_per_page = 3; -} - diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CommandTool/protoc-tests/basic_js_test.ps1 --- a/Resources/CommandTool/protoc-tests/basic_js_test.ps1 Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Path to this plugin - -# Under Linux -# $PROTOC_GEN_TS_PATH="$PSScriptRoot/node_modules/.bin/protoc-gen-ts" - -# Under Windows - -# Directory to write generated code to (.js and .d.ts files) -$OUT_DIR="./generated_js" - -protoc ` - --js_out="$OUT_DIR" ` - basic.proto - - diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CommandTool/protoc-tests/basic_test.html --- a/Resources/CommandTool/protoc-tests/basic_test.html Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ - - -Notepad - - - - - -
-
- - - - \ No newline at end of file diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CommandTool/protoc-tests/basic_ts_test.ps1 --- a/Resources/CommandTool/protoc-tests/basic_ts_test.ps1 Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -# Path to this plugin - -# Under Linux -# $PROTOC_GEN_TS_PATH="$PSScriptRoot/node_modules/.bin/protoc-gen-ts" - -# Under Windows -$PROTOC_GEN_TS_PATH="$PSScriptRoot/node_modules/.bin/protoc-gen-ts.cmd" - -# Directory to write generated code to (.js and .d.ts files) -$OUT_DIR="./generated_ts" - -protoc ` - --plugin="protoc-gen-ts=$PROTOC_GEN_TS_PATH" ` - --js_out="import_style=commonjs,binary:$OUT_DIR" ` - --ts_out="$OUT_DIR" ` - basic.proto - - diff -r cc47e6eaefb0 -r 5055031f4a06 Resources/CommandTool/protoc-tests/package-lock.json --- a/Resources/CommandTool/protoc-tests/package-lock.json Wed Jan 16 21:08:38 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "google-protobuf": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.6.1.tgz", - "integrity": "sha512-SJYemeX5GjDLPnadcmCNQePQHCS4Hl5fOcI/JawqDIYFhCmrtYAjcx/oTQx/Wi8UuCuZQhfvftbmPePPAYHFtA==" - }, - "ts-protoc-gen": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.9.0.tgz", - "integrity": "sha512-cFEUTY9U9o6C4DPPfMHk2ZUdIAKL91hZN1fyx5Stz3g56BDVOC7hk+r5fEMCAGaaIgi2akkT1a2hrxu1wo2Phg==" - } - } -}