From 18d68ab586a2f521fd94d9114511a4a750dc8620 Mon Sep 17 00:00:00 2001 From: Hassan DRAGA Date: Mon, 17 Apr 2023 15:43:46 -0400 Subject: [PATCH] First WebUI v2.2.0 Commit # WebUI v2.2.0 * Now, creating a wrapper is easier as core functions have been removed from `webui.h` * Removing many functions (webui_open, webui_new_server...) * C - Complete * Go - Complete * Deno - Complete * All other things still need to be completed... --- .gitignore | 5 - build/Linux/Clang/Makefile | 8 +- build/Linux/GCC/Makefile | 8 +- build/Windows/GCC/Makefile | 8 +- build/Windows/GCC/webui-2-x64.dll | Bin 0 -> 184638 bytes build/Windows/MSVC/Makefile | 32 +- build/Windows/MSVC/webui-2-x64.dll | Bin 0 -> 391680 bytes build/Windows/TCC/Makefile | 8 +- build/macOS/Clang/Makefile | 8 +- examples/C++/hello_world/Linux/Clang/Makefile | 2 +- examples/C++/hello_world/Linux/GCC/Makefile | 2 +- examples/C++/hello_world/Windows/GCC/Makefile | 2 +- .../C++/hello_world/Windows/MSVC/Makefile | 2 +- .../VS2019/hello_world/hello_world.cpp | 95 +- .../VS2022/hello_world/hello_world.cpp | 95 +- examples/C++/hello_world/main.cpp | 2 +- .../C/call_c_from_js/Linux/Clang/Makefile | 2 +- examples/C/call_c_from_js/Linux/GCC/Makefile | 2 +- .../C/call_c_from_js/Windows/GCC/Makefile | 2 +- .../C/call_c_from_js/Windows/MSVC/Makefile | 2 +- .../C/call_c_from_js/Windows/TCC/Makefile | 2 +- .../C/call_c_from_js/macOS/Clang/Makefile | 2 +- examples/C/call_c_from_js/main.c | 2 +- .../C/call_js_from_c/Linux/Clang/Makefile | 2 +- examples/C/call_js_from_c/Linux/GCC/Makefile | 2 +- .../C/call_js_from_c/Windows/GCC/Makefile | 2 +- .../C/call_js_from_c/Windows/MSVC/Makefile | 2 +- .../C/call_js_from_c/Windows/TCC/Makefile | 2 +- .../C/call_js_from_c/macOS/Clang/Makefile | 2 +- examples/C/call_js_from_c/main.c | 30 +- examples/C/minimal/Linux/Clang/Makefile | 2 +- examples/C/minimal/Linux/GCC/Makefile | 2 +- examples/C/minimal/Windows/GCC/Makefile | 2 +- examples/C/minimal/Windows/MSVC/Makefile | 2 +- examples/C/minimal/Windows/TCC/Makefile | 2 +- examples/C/minimal/macOS/Clang/Makefile | 2 +- examples/C/minimal/main.c | 2 +- .../C/serve_a_folder/Linux/Clang/Makefile | 2 +- examples/C/serve_a_folder/Linux/GCC/Makefile | 2 +- .../C/serve_a_folder/Windows/GCC/Makefile | 2 +- .../C/serve_a_folder/Windows/MSVC/Makefile | 2 +- .../C/serve_a_folder/Windows/TCC/Makefile | 2 +- .../C/serve_a_folder/macOS/Clang/Makefile | 2 +- examples/C/serve_a_folder/main.c | 4 +- examples/Go/hello_world/README.md | 1 + examples/Go/hello_world/go.mod | 2 +- examples/Go/hello_world/main.go | 55 +- examples/Go/hello_world/webui/webui.go | 243 +- examples/Go/hello_world/webui/webui.h | 189 + .../Python/PyPI/Package}/LICENSE | 0 .../Python/PyPI/Package}/README.md | 0 .../Python/PyPI/Package}/pyproject.toml | 2 +- .../PyPI/Package}/src/webui/__init__.py | 0 .../PyPI/Package/src/webui/webui-2-x64.dll | Bin 0 -> 391680 bytes .../Python/PyPI/Package}/src/webui/webui.py | 5 +- {packages => examples/Python/PyPI}/README.md | 0 .../{dev/main.py => PyPI/test_package.py} | 4 +- .../{hello_world/main.py => hello_world.py} | 0 .../Python/{minimal/main.py => minimal.py} | 0 .../Python/{serve_folder => }/second.html | 0 .../index.html => serve_folder.html} | 0 .../{serve_folder/main.py => serve_folder.py} | 0 examples/Rust/README.md | 13 + examples/Rust/hello_world/Cargo.toml | 2 + examples/Rust/hello_world/src/Webui.rs | 679 +- examples/Rust/hello_world/src/main.rs | 2 - examples/TypeScript/Deno/README.md | 19 +- .../TypeScript/Deno/deno_server/README.md | 16 - .../Deno/deno_server/deno_server.ts | 40 - examples/TypeScript/Deno/hello_world.html | 40 + .../Deno/{hello_world => }/hello_world.ts | 64 +- .../TypeScript/Deno/hello_world/README.md | 13 - examples/TypeScript/Deno/module/webui.ts | 309 - examples/TypeScript/Deno/webui-2-x64.dll | Bin 0 -> 391680 bytes examples/TypeScript/Deno/webui.ts | 287 + examples/TypeScript/Nodejs/README.md | 7 +- .../TypeScript/Nodejs/nodejs_server/README.md | 18 - .../TypeScript/Nodejs/nodejs_server/server.js | 30 - .../TypeScript/Nodejs/nodejs_server/window.c | 27 - .../TypeScript/Nodejs/webui_server/README.md | 18 - .../TypeScript/Nodejs/webui_server/example.c | 34 - .../TypeScript/Nodejs/webui_server/index.js | 6 - .../Nodejs/webui_server/my_module.js | 5 - examples/Zig/hello_world/src/main.zig | 6 +- examples/Zig/serve_folder/src/main.zig | 2 +- include/webui.h | 359 +- scripts/build.bat | 70 + scripts/clean_all.bat | 22 - src/mongoose.c | 37 +- {include => src}/mongoose.h | 8 +- src/webui.c | 7071 ++++++++--------- src/webui_core.h | 181 + website/docs/c_api.md | 8 +- website/index.html | 8 +- 94 files changed, 4948 insertions(+), 5317 deletions(-) create mode 100644 build/Windows/GCC/webui-2-x64.dll create mode 100644 build/Windows/MSVC/webui-2-x64.dll create mode 100644 examples/Go/hello_world/webui/webui.h rename {packages/PyPI => examples/Python/PyPI/Package}/LICENSE (100%) rename {packages/PyPI => examples/Python/PyPI/Package}/README.md (100%) rename {packages/PyPI => examples/Python/PyPI/Package}/pyproject.toml (97%) rename {packages/PyPI => examples/Python/PyPI/Package}/src/webui/__init__.py (100%) create mode 100644 examples/Python/PyPI/Package/src/webui/webui-2-x64.dll rename {packages/PyPI => examples/Python/PyPI/Package}/src/webui/webui.py (99%) rename {packages => examples/Python/PyPI}/README.md (100%) rename examples/Python/{dev/main.py => PyPI/test_package.py} (95%) rename examples/Python/{hello_world/main.py => hello_world.py} (100%) rename examples/Python/{minimal/main.py => minimal.py} (100%) rename examples/Python/{serve_folder => }/second.html (100%) rename examples/Python/{serve_folder/index.html => serve_folder.html} (100%) rename examples/Python/{serve_folder/main.py => serve_folder.py} (100%) create mode 100644 examples/Rust/README.md delete mode 100644 examples/TypeScript/Deno/deno_server/README.md delete mode 100644 examples/TypeScript/Deno/deno_server/deno_server.ts create mode 100644 examples/TypeScript/Deno/hello_world.html rename examples/TypeScript/Deno/{hello_world => }/hello_world.ts (59%) delete mode 100644 examples/TypeScript/Deno/hello_world/README.md delete mode 100644 examples/TypeScript/Deno/module/webui.ts create mode 100644 examples/TypeScript/Deno/webui-2-x64.dll create mode 100644 examples/TypeScript/Deno/webui.ts delete mode 100644 examples/TypeScript/Nodejs/nodejs_server/README.md delete mode 100644 examples/TypeScript/Nodejs/nodejs_server/server.js delete mode 100644 examples/TypeScript/Nodejs/nodejs_server/window.c delete mode 100644 examples/TypeScript/Nodejs/webui_server/README.md delete mode 100644 examples/TypeScript/Nodejs/webui_server/example.c delete mode 100644 examples/TypeScript/Nodejs/webui_server/index.js delete mode 100644 examples/TypeScript/Nodejs/webui_server/my_module.js create mode 100644 scripts/build.bat delete mode 100644 scripts/clean_all.bat rename {include => src}/mongoose.h (99%) create mode 100644 src/webui_core.h diff --git a/.gitignore b/.gitignore index a7f5b7d8..2ebe771a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,5 @@ # Build *.exe -*.dll -*.so -*.dylib -*.a *.ilk *.pdb *.lib @@ -13,7 +9,6 @@ *.o *.def *.obj -*.dyn # IDE .idea/ diff --git a/build/Linux/Clang/Makefile b/build/Linux/Clang/Makefile index c133fd4c..96d8f494 100644 --- a/build/Linux/Clang/Makefile +++ b/build/Linux/Clang/Makefile @@ -8,13 +8,13 @@ all: release debug: # Static with Debug info - @echo "Build WebUI Library (Debug Static)..." + @echo "Build WebUI Library (Clang Debug Static)..." @clang -g -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @clang -g -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @llvm-ar rc libwebui-2-static-x64.a webui.o mongoose.o @llvm-ranlib libwebui-2-static-x64.a # Dynamic with Debug info - @echo "Build WebUI Library (Debug Dynamic)..." + @echo "Build WebUI Library (Clang Debug Dynamic)..." @clang -g -fPIC -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @clang -g -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @clang -g -shared -o webui-2-x64.so webui.o mongoose.o @@ -24,13 +24,13 @@ debug: release: # Static Release - @echo "Build WebUI Library (Release Static)..." + @echo "Build WebUI Library (Clang Release Static)..." @clang -Os -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @clang -Os -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @llvm-ar rc libwebui-2-static-x64.a webui.o mongoose.o @llvm-ranlib libwebui-2-static-x64.a # Dynamic Release - @echo "Build WebUI Library (Release Dynamic)..." + @echo "Build WebUI Library (Clang Release Dynamic)..." @clang -O3 -fPIC -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @clang -O3 -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @clang -shared -o webui-2-x64.so webui.o mongoose.o diff --git a/build/Linux/GCC/Makefile b/build/Linux/GCC/Makefile index cea91dc3..fa793d3d 100644 --- a/build/Linux/GCC/Makefile +++ b/build/Linux/GCC/Makefile @@ -8,13 +8,13 @@ all: release debug: # Static with Debug info - @echo "Build WebUI Library (Debug Static)..." + @echo "Build WebUI Library (GCC Debug Static)..." @gcc -g -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" -Wno-stringop-overread @gcc -g -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @ar rc libwebui-2-static-x64.a webui.o mongoose.o @ranlib libwebui-2-static-x64.a # Dynamic with Debug info - @echo "Build WebUI Library (Debug Dynamic)..." + @echo "Build WebUI Library (GCC Debug Dynamic)..." @gcc -g -fPIC -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" -Wno-stringop-overread @gcc -g -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @gcc -g -shared -o webui-2-x64.so webui.o mongoose.o @@ -24,13 +24,13 @@ debug: release: # Static Release - @echo "Build WebUI Library (Release Static)..." + @echo "Build WebUI Library (GCC Release Static)..." @gcc -Os -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" -Wno-stringop-overread @gcc -Os -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @ar rc libwebui-2-static-x64.a webui.o mongoose.o @ranlib libwebui-2-static-x64.a # Dynamic Release - @echo "Build WebUI Library (Release Dynamic)..." + @echo "Build WebUI Library (GCC Release Dynamic)..." @gcc -O3 -fPIC -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" -Wno-stringop-overread @gcc -O3 -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @gcc -shared -o webui-2-x64.so webui.o mongoose.o diff --git a/build/Windows/GCC/Makefile b/build/Windows/GCC/Makefile index ee662b99..1845ebdd 100644 --- a/build/Windows/GCC/Makefile +++ b/build/Windows/GCC/Makefile @@ -9,13 +9,13 @@ all: release debug: # Static with Debug info - @echo Build WebUI Library (Debug Static)... + @echo Build WebUI Library (GCC Debug Static)... @gcc -g -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" -Wno-stringop-overread @gcc -g -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG @ar rc libwebui-2-static-x64.a webui.o mongoose.o @ranlib libwebui-2-static-x64.a # Dynamic with Debug info - @echo Build WebUI Library (Debug Dynamic)... + @echo Build WebUI Library (GCC Debug Dynamic)... @gcc -g -fPIC -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" -Wno-stringop-overread @gcc -g -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG @gcc -g -shared -o webui-2-x64.dll webui.o mongoose.o -lws2_32 @@ -25,13 +25,13 @@ debug: release: # Static Release - @echo Build WebUI Library (Release Static)... + @echo Build WebUI Library (GCC Release Static)... @gcc -Os -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" -Wno-stringop-overread @gcc -Os -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @ar rc libwebui-2-static-x64.a webui.o mongoose.o @ranlib libwebui-2-static-x64.a # Dynamic Release - @echo Build WebUI Library (Release Dynamic)... + @echo Build WebUI Library (GCC Release Dynamic)... @gcc -O3 -fPIC -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" -Wno-stringop-overread @gcc -O3 -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @gcc -shared -o webui-2-x64.dll webui.o mongoose.o -lws2_32 diff --git a/build/Windows/GCC/webui-2-x64.dll b/build/Windows/GCC/webui-2-x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..37b13d18d0960d98f2dfeb158363b562b0a8bad0 GIT binary patch literal 184638 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� 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

kuFpHM^0;z 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 M*5_ReZO)MVUmDLdZ~y=R literal 0 HcmV?d00001 diff --git a/build/Windows/MSVC/Makefile b/build/Windows/MSVC/Makefile index a743b196..99fc54a7 100644 --- a/build/Windows/MSVC/Makefile +++ b/build/Windows/MSVC/Makefile @@ -5,30 +5,30 @@ all: release debug: # Static with Debug info - @echo Build WebUI Library (Debug Static)... - @cl /Zi /Fomongoose.obj /c /EHsc "../../../src/mongoose.c" /I "../../../include" >nul 2>&1 - @cl /Zi /Fowebui.obj /c /EHsc /DWEBUI_LOG "../../../src/webui.c" /I "../../../include" >nul 2>&1 - @lib /OUT:webui-2-static-x64.lib webui.obj mongoose.obj >nul 2>&1 + @echo Build WebUI Library (MSVC Debug Static)... + @cl /Zi /Fomongoose.obj /c /EHsc "../../../src/mongoose.c" /I "../../../include" 1>NUL 2>&1 + @cl /Zi /Fowebui.obj /c /EHsc /DWEBUI_LOG "../../../src/webui.c" /I "../../../include" 1>NUL 2>&1 + @lib /OUT:webui-2-static-x64.lib webui.obj mongoose.obj 1>NUL 2>&1 # Dynamic with Debug info - @echo Build WebUI Library (Debug Dynamic)... - @cl /Zi /Fomongoose.obj /c /EHsc "../../../src/mongoose.c" /I "../../../include" >nul 2>&1 - @cl /Zi /Fowebui.obj /c /EHsc /DWEBUI_LOG "../../../src/webui.c" /I "../../../include" >nul 2>&1 - @link /DLL /OUT:webui-2-x64.dll webui.obj mongoose.obj user32.lib Advapi32.lib >nul 2>&1 + @echo Build WebUI Library (MSVC Debug Dynamic)... + @cl /Zi /Fomongoose.obj /c /EHsc "../../../src/mongoose.c" /I "../../../include" 1>NUL 2>&1 + @cl /Zi /Fowebui.obj /c /EHsc /DWEBUI_LOG "../../../src/webui.c" /I "../../../include" 1>NUL 2>&1 + @link /DLL /OUT:webui-2-x64.dll webui.obj mongoose.obj user32.lib Advapi32.lib 1>NUL 2>&1 # Clean @- del *.obj >nul 2>&1 @echo Done. release: # Static Release - @echo Build WebUI Library (Release Static)... - @cl /Fomongoose.obj /c /EHsc "../../../src/mongoose.c" /I "../../../include" >nul 2>&1 - @cl /Fowebui.obj /c /EHsc "../../../src/webui.c" /I "../../../include" >nul 2>&1 - @lib /OUT:webui-2-static-x64.lib webui.obj mongoose.obj >nul 2>&1 + @echo Build WebUI Library (MSVC Release Static)... + @cl /Fomongoose.obj /c /EHsc "../../../src/mongoose.c" /I "../../../include" 1>NUL 2>&1 + @cl /Fowebui.obj /c /EHsc "../../../src/webui.c" /I "../../../include" 1>NUL 2>&1 + @lib /OUT:webui-2-static-x64.lib webui.obj mongoose.obj 1>NUL 2>&1 # Dynamic Release - @echo Build WebUI Library (Release Dynamic)... - @cl /Fomongoose.obj /c /EHsc "../../../src/mongoose.c" /I "../../../include" >nul 2>&1 - @cl /Fowebui.obj /c /EHsc "../../../src/webui.c" /I "../../../include" >nul 2>&1 - @link /DLL /OUT:webui-2-x64.dll webui.obj mongoose.obj user32.lib Advapi32.lib >nul 2>&1 + @echo Build WebUI Library (MSVC Release Dynamic)... + @cl /Fomongoose.obj /c /EHsc "../../../src/mongoose.c" /I "../../../include" 1>NUL 2>&1 + @cl /Fowebui.obj /c /EHsc "../../../src/webui.c" /I "../../../include" 1>NUL 2>&1 + @link /DLL /OUT:webui-2-x64.dll webui.obj mongoose.obj user32.lib Advapi32.lib 1>NUL 2>&1 # Clean @- del *.obj >nul 2>&1 @- del *.ilk >nul 2>&1 diff --git a/build/Windows/MSVC/webui-2-x64.dll b/build/Windows/MSVC/webui-2-x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..4dcaca021069888615b4d1e511ba11ac35c0ec7c GIT binary patch literal 391680 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≫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 G{QW=Om1!dY literal 0 HcmV?d00001 diff --git a/build/Windows/TCC/Makefile b/build/Windows/TCC/Makefile index 713b8865..389abb64 100644 --- a/build/Windows/TCC/Makefile +++ b/build/Windows/TCC/Makefile @@ -9,12 +9,12 @@ all: release debug: # Static with Debug info - @echo Build WebUI Library (Debug Static)... + @echo Build WebUI Library (TCC Debug Static)... @tcc -g -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @tcc -g -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG @tcc -m64 -ar rcs libwebui-2-static-x64.a webui.o mongoose.o # Dynamic with Debug info - @echo Build WebUI Library (Debug Dynamic)... + @echo Build WebUI Library (TCC Debug Dynamic)... @tcc -g -fPIC -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @tcc -g -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG @tcc -g -shared -o webui-2-x64.dll webui.o mongoose.o -lws2_32 -lAdvapi32 @@ -24,12 +24,12 @@ debug: release: # Static Release - @echo Build WebUI Library (Release Static)... + @echo Build WebUI Library (TCC Release Static)... @tcc -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @tcc -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @tcc -m64 -ar rcs libwebui-2-static-x64.a webui.o mongoose.o # Dynamic Release - @echo Build WebUI Library (Release Dynamic)... + @echo Build WebUI Library (TCC Release Dynamic)... @tcc -fPIC -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @tcc -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @tcc -shared -o webui-2-x64.dll webui.o mongoose.o -lws2_32 -lAdvapi32 diff --git a/build/macOS/Clang/Makefile b/build/macOS/Clang/Makefile index e6076417..421be80e 100644 --- a/build/macOS/Clang/Makefile +++ b/build/macOS/Clang/Makefile @@ -8,13 +8,13 @@ all: release debug: # Static with Debug info - @echo "Build WebUI Library (Debug Static)..." + @echo "Build WebUI Library (Clang Debug Static)..." @clang -g -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @clang -DWEBUI_LOG -g -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @ar rc libwebui-2-static-x64.a webui.o mongoose.o @ranlib libwebui-2-static-x64.a # Dynamic with Debug info - @echo "Build WebUI Library (Debug Dynamic)..." + @echo "Build WebUI Library (Clang Debug Dynamic)..." @clang -g -fPIC -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @clang -DWEBUI_LOG -g -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @clang -g -shared -o webui-2-x64.dyn webui.o mongoose.o @@ -24,13 +24,13 @@ debug: release: # Static Release - @echo "Build WebUI Library (Release Static)..." + @echo "Build WebUI Library (Clang Release Static)..." @clang -Os -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @clang -Os -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @ar rc libwebui-2-static-x64.a webui.o mongoose.o @ranlib libwebui-2-static-x64.a # Dynamic Release - @echo "Build WebUI Library (Release Dynamic)..." + @echo "Build WebUI Library (Clang Release Dynamic)..." @clang -O3 -fPIC -m64 -o mongoose.o -I "$(INCLUDE)" -c "$(SOURCE)/mongoose.c" @clang -O3 -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" @clang -shared -o webui-2-x64.dyn webui.o mongoose.o diff --git a/examples/C++/hello_world/Linux/Clang/Makefile b/examples/C++/hello_world/Linux/Clang/Makefile index ffeceede..14865a3a 100644 --- a/examples/C++/hello_world/Linux/Clang/Makefile +++ b/examples/C++/hello_world/Linux/Clang/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C++ Example # Linux - Clang diff --git a/examples/C++/hello_world/Linux/GCC/Makefile b/examples/C++/hello_world/Linux/GCC/Makefile index 00097c0c..6fa1e5f5 100644 --- a/examples/C++/hello_world/Linux/GCC/Makefile +++ b/examples/C++/hello_world/Linux/GCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C++ Example # Linux - GCC diff --git a/examples/C++/hello_world/Windows/GCC/Makefile b/examples/C++/hello_world/Windows/GCC/Makefile index 3257c92a..1e2da473 100644 --- a/examples/C++/hello_world/Windows/GCC/Makefile +++ b/examples/C++/hello_world/Windows/GCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C++ Example # Windows - GCC diff --git a/examples/C++/hello_world/Windows/MSVC/Makefile b/examples/C++/hello_world/Windows/MSVC/Makefile index f9b12a77..989c4ea5 100644 --- a/examples/C++/hello_world/Windows/MSVC/Makefile +++ b/examples/C++/hello_world/Windows/MSVC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C++ Example # Windows - Microsoft Visual C diff --git a/examples/C++/hello_world/Windows/VS2019/hello_world/hello_world.cpp b/examples/C++/hello_world/Windows/VS2019/hello_world/hello_world.cpp index 52929400..7da9eda2 100644 --- a/examples/C++/hello_world/Windows/VS2019/hello_world/hello_world.cpp +++ b/examples/C++/hello_world/Windows/VS2019/hello_world/hello_world.cpp @@ -1,91 +1,20 @@ +// The C++ wrapper is coming soon. +// Please see the C example for now. - -extern "C" { - #include +extern "C"{ + #include "webui.h" } -// Window struct -webui_window_t* my_window; - -// UI HTML -const char* my_html = "" -"WebUI 2 - C++ Visual Studio Example" -"" -"

WebUI 2 - C++ Visual Studio Example


" -"

" -" - " -""; - -// Check the password function -void check_the_password(webui_event_t* e) { - - // This function get called every time the user click on "MyButton1" - - webui_script_t js; - js.script = " return document.getElementById(\"MyInput\").value; "; - js.timeout = 3; - - // Run the JavaScript on the UI (Web Browser) - webui_script(my_window, &js); - - // Check if there is any JavaScript error - if (js.result.error) { - - printf("JavaScript Error: %s\n", js.result.data); - return; - } - - // Get the password - const char* password = js.result.data; - printf("Password: %s\n", password); - - // Check the password - if (strcmp(password, "123456") == 0) { - - // Correct password - js.script = "alert('Good. Password is correct.')"; - webui_script(my_window, &js); - } - else { - - // Wrong password - js.script = "alert('Sorry. Wrong password.')"; - webui_script(my_window, &js); - } - - // Free data resources - webui_script_cleanup(&js); -} - -void close_the_application(webui_event_t* e) { - - // Close all opened windows - webui_exit(); -} +#include int main() { - // Create a window - my_window = webui_new_window(); - - // Bind HTML elements with functions - webui_bind(my_window, "MyButton1", check_the_password); - webui_bind(my_window, "MyButton2", close_the_application); - - // Show the window - if (!webui_show(my_window, my_html, webui.browser.chrome)) // Run the window on Chrome - webui_show(my_window, my_html, webui.browser.any); // If not, run on any other installed web browser - - // Wait until all windows get closed - webui_wait(); - - return 0; + std::cout << "The C++ wrapper is coming soon. Please see the C examples for now."; + return 0; } -int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { - - main(); -} +#if defined(_MSC_VER) + int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { + main(); + } +#endif diff --git a/examples/C++/hello_world/Windows/VS2022/hello_world/hello_world.cpp b/examples/C++/hello_world/Windows/VS2022/hello_world/hello_world.cpp index 52929400..7da9eda2 100644 --- a/examples/C++/hello_world/Windows/VS2022/hello_world/hello_world.cpp +++ b/examples/C++/hello_world/Windows/VS2022/hello_world/hello_world.cpp @@ -1,91 +1,20 @@ +// The C++ wrapper is coming soon. +// Please see the C example for now. - -extern "C" { - #include +extern "C"{ + #include "webui.h" } -// Window struct -webui_window_t* my_window; - -// UI HTML -const char* my_html = "" -"WebUI 2 - C++ Visual Studio Example" -"" -"

WebUI 2 - C++ Visual Studio Example


" -"

" -" - " -""; - -// Check the password function -void check_the_password(webui_event_t* e) { - - // This function get called every time the user click on "MyButton1" - - webui_script_t js; - js.script = " return document.getElementById(\"MyInput\").value; "; - js.timeout = 3; - - // Run the JavaScript on the UI (Web Browser) - webui_script(my_window, &js); - - // Check if there is any JavaScript error - if (js.result.error) { - - printf("JavaScript Error: %s\n", js.result.data); - return; - } - - // Get the password - const char* password = js.result.data; - printf("Password: %s\n", password); - - // Check the password - if (strcmp(password, "123456") == 0) { - - // Correct password - js.script = "alert('Good. Password is correct.')"; - webui_script(my_window, &js); - } - else { - - // Wrong password - js.script = "alert('Sorry. Wrong password.')"; - webui_script(my_window, &js); - } - - // Free data resources - webui_script_cleanup(&js); -} - -void close_the_application(webui_event_t* e) { - - // Close all opened windows - webui_exit(); -} +#include int main() { - // Create a window - my_window = webui_new_window(); - - // Bind HTML elements with functions - webui_bind(my_window, "MyButton1", check_the_password); - webui_bind(my_window, "MyButton2", close_the_application); - - // Show the window - if (!webui_show(my_window, my_html, webui.browser.chrome)) // Run the window on Chrome - webui_show(my_window, my_html, webui.browser.any); // If not, run on any other installed web browser - - // Wait until all windows get closed - webui_wait(); - - return 0; + std::cout << "The C++ wrapper is coming soon. Please see the C examples for now."; + return 0; } -int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { - - main(); -} +#if defined(_MSC_VER) + int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { + main(); + } +#endif diff --git a/examples/C++/hello_world/main.cpp b/examples/C++/hello_world/main.cpp index 43d4bf78..7da9eda2 100644 --- a/examples/C++/hello_world/main.cpp +++ b/examples/C++/hello_world/main.cpp @@ -9,7 +9,7 @@ extern "C"{ int main() { - std::cout << "The C++ wrapper is coming soon. Please see the C example for now."; + std::cout << "The C++ wrapper is coming soon. Please see the C examples for now."; return 0; } diff --git a/examples/C/call_c_from_js/Linux/Clang/Makefile b/examples/C/call_c_from_js/Linux/Clang/Makefile index 0b924d49..62e313f9 100644 --- a/examples/C/call_c_from_js/Linux/Clang/Makefile +++ b/examples/C/call_c_from_js/Linux/Clang/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Linux - Clang diff --git a/examples/C/call_c_from_js/Linux/GCC/Makefile b/examples/C/call_c_from_js/Linux/GCC/Makefile index fc3a0382..098bc492 100644 --- a/examples/C/call_c_from_js/Linux/GCC/Makefile +++ b/examples/C/call_c_from_js/Linux/GCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Linux - GCC diff --git a/examples/C/call_c_from_js/Windows/GCC/Makefile b/examples/C/call_c_from_js/Windows/GCC/Makefile index 2b2e5124..27f68aa3 100644 --- a/examples/C/call_c_from_js/Windows/GCC/Makefile +++ b/examples/C/call_c_from_js/Windows/GCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - GCC diff --git a/examples/C/call_c_from_js/Windows/MSVC/Makefile b/examples/C/call_c_from_js/Windows/MSVC/Makefile index 54d29053..671d7a2d 100644 --- a/examples/C/call_c_from_js/Windows/MSVC/Makefile +++ b/examples/C/call_c_from_js/Windows/MSVC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - Microsoft Visual C diff --git a/examples/C/call_c_from_js/Windows/TCC/Makefile b/examples/C/call_c_from_js/Windows/TCC/Makefile index 88fb5a21..5cdb9418 100644 --- a/examples/C/call_c_from_js/Windows/TCC/Makefile +++ b/examples/C/call_c_from_js/Windows/TCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - Tiny C Compiler diff --git a/examples/C/call_c_from_js/macOS/Clang/Makefile b/examples/C/call_c_from_js/macOS/Clang/Makefile index 36fff9b5..74116ba3 100644 --- a/examples/C/call_c_from_js/macOS/Clang/Makefile +++ b/examples/C/call_c_from_js/macOS/Clang/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # macOS - Clang diff --git a/examples/C/call_c_from_js/main.c b/examples/C/call_c_from_js/main.c index eec41bf8..88f0440c 100644 --- a/examples/C/call_c_from_js/main.c +++ b/examples/C/call_c_from_js/main.c @@ -103,7 +103,7 @@ int main() { ""; // Create a window - webui_window_t* my_window = webui_new_window(); + void* my_window = webui_new_window(); // Bind HTML elements with C functions webui_bind(my_window, "MyID_One", my_function_string); diff --git a/examples/C/call_js_from_c/Linux/Clang/Makefile b/examples/C/call_js_from_c/Linux/Clang/Makefile index 0b924d49..62e313f9 100644 --- a/examples/C/call_js_from_c/Linux/Clang/Makefile +++ b/examples/C/call_js_from_c/Linux/Clang/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Linux - Clang diff --git a/examples/C/call_js_from_c/Linux/GCC/Makefile b/examples/C/call_js_from_c/Linux/GCC/Makefile index fc3a0382..098bc492 100644 --- a/examples/C/call_js_from_c/Linux/GCC/Makefile +++ b/examples/C/call_js_from_c/Linux/GCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Linux - GCC diff --git a/examples/C/call_js_from_c/Windows/GCC/Makefile b/examples/C/call_js_from_c/Windows/GCC/Makefile index 2b2e5124..27f68aa3 100644 --- a/examples/C/call_js_from_c/Windows/GCC/Makefile +++ b/examples/C/call_js_from_c/Windows/GCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - GCC diff --git a/examples/C/call_js_from_c/Windows/MSVC/Makefile b/examples/C/call_js_from_c/Windows/MSVC/Makefile index 54d29053..671d7a2d 100644 --- a/examples/C/call_js_from_c/Windows/MSVC/Makefile +++ b/examples/C/call_js_from_c/Windows/MSVC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - Microsoft Visual C diff --git a/examples/C/call_js_from_c/Windows/TCC/Makefile b/examples/C/call_js_from_c/Windows/TCC/Makefile index 88fb5a21..5cdb9418 100644 --- a/examples/C/call_js_from_c/Windows/TCC/Makefile +++ b/examples/C/call_js_from_c/Windows/TCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - Tiny C Compiler diff --git a/examples/C/call_js_from_c/macOS/Clang/Makefile b/examples/C/call_js_from_c/macOS/Clang/Makefile index 36fff9b5..74116ba3 100644 --- a/examples/C/call_js_from_c/macOS/Clang/Makefile +++ b/examples/C/call_js_from_c/macOS/Clang/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # macOS - Clang diff --git a/examples/C/call_js_from_c/main.c b/examples/C/call_js_from_c/main.c index d96f849e..27b1884f 100644 --- a/examples/C/call_js_from_c/main.c +++ b/examples/C/call_js_from_c/main.c @@ -12,38 +12,28 @@ void my_function_count(webui_event_t* e) { // This function gets called every time the user clicks on "MyButton1" - // Create a WebUI JavaScript struct - webui_script_t MyJavaScript = { - .script = "return GetCount();", - .timeout = 3 - }; + // Create a buffer to hold the response + char response[64]; // Run JavaScript - webui_script(e->window, &MyJavaScript); + if(!webui_script(e->window, "return GetCount();", 0, response, 64)) { - // Check if there is any JavaScript error - if(MyJavaScript.result.error) { - - printf("JavaScript Error: %s\n", MyJavaScript.result.data); + printf("JavaScript Error: %s\n", response); return; } // Get the count - int count = atoi(MyJavaScript.result.data); + int count = atoi(response); // Increment count++; // Generate a JavaScript - char buf[64]; - sprintf(buf, "SetCount(%d);", count); + char js[64]; + sprintf(js, "SetCount(%d);", count); - // Run JavaScript - MyJavaScript.script = buf; - webui_script(e->window, &MyJavaScript); - - // Free data resources - webui_script_cleanup(&MyJavaScript); + // Run JavaScript (Quick Way) + webui_run(e->window, js); } int main() { @@ -88,7 +78,7 @@ int main() { ""; // Create a window - webui_window_t* my_window = webui_new_window(); + void* my_window = webui_new_window(); // Bind HTML elements with C functions webui_bind(my_window, "MyButton1", my_function_count); diff --git a/examples/C/minimal/Linux/Clang/Makefile b/examples/C/minimal/Linux/Clang/Makefile index 0b924d49..62e313f9 100644 --- a/examples/C/minimal/Linux/Clang/Makefile +++ b/examples/C/minimal/Linux/Clang/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Linux - Clang diff --git a/examples/C/minimal/Linux/GCC/Makefile b/examples/C/minimal/Linux/GCC/Makefile index fc3a0382..098bc492 100644 --- a/examples/C/minimal/Linux/GCC/Makefile +++ b/examples/C/minimal/Linux/GCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Linux - GCC diff --git a/examples/C/minimal/Windows/GCC/Makefile b/examples/C/minimal/Windows/GCC/Makefile index 2b2e5124..27f68aa3 100644 --- a/examples/C/minimal/Windows/GCC/Makefile +++ b/examples/C/minimal/Windows/GCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - GCC diff --git a/examples/C/minimal/Windows/MSVC/Makefile b/examples/C/minimal/Windows/MSVC/Makefile index 54d29053..671d7a2d 100644 --- a/examples/C/minimal/Windows/MSVC/Makefile +++ b/examples/C/minimal/Windows/MSVC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - Microsoft Visual C diff --git a/examples/C/minimal/Windows/TCC/Makefile b/examples/C/minimal/Windows/TCC/Makefile index 88fb5a21..5cdb9418 100644 --- a/examples/C/minimal/Windows/TCC/Makefile +++ b/examples/C/minimal/Windows/TCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - Tiny C Compiler diff --git a/examples/C/minimal/macOS/Clang/Makefile b/examples/C/minimal/macOS/Clang/Makefile index ddeba65e..0d77fc79 100644 --- a/examples/C/minimal/macOS/Clang/Makefile +++ b/examples/C/minimal/macOS/Clang/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # macOS - Clang diff --git a/examples/C/minimal/main.c b/examples/C/minimal/main.c index 622ce9f2..a122d7e0 100644 --- a/examples/C/minimal/main.c +++ b/examples/C/minimal/main.c @@ -4,7 +4,7 @@ int main() { - webui_window_t* my_window = webui_new_window(); + void* my_window = webui_new_window(); webui_show(my_window, "Hello"); webui_wait(); return 0; diff --git a/examples/C/serve_a_folder/Linux/Clang/Makefile b/examples/C/serve_a_folder/Linux/Clang/Makefile index 0b924d49..62e313f9 100644 --- a/examples/C/serve_a_folder/Linux/Clang/Makefile +++ b/examples/C/serve_a_folder/Linux/Clang/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Linux - Clang diff --git a/examples/C/serve_a_folder/Linux/GCC/Makefile b/examples/C/serve_a_folder/Linux/GCC/Makefile index fc3a0382..098bc492 100644 --- a/examples/C/serve_a_folder/Linux/GCC/Makefile +++ b/examples/C/serve_a_folder/Linux/GCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Linux - GCC diff --git a/examples/C/serve_a_folder/Windows/GCC/Makefile b/examples/C/serve_a_folder/Windows/GCC/Makefile index 2b2e5124..27f68aa3 100644 --- a/examples/C/serve_a_folder/Windows/GCC/Makefile +++ b/examples/C/serve_a_folder/Windows/GCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - GCC diff --git a/examples/C/serve_a_folder/Windows/MSVC/Makefile b/examples/C/serve_a_folder/Windows/MSVC/Makefile index 54d29053..671d7a2d 100644 --- a/examples/C/serve_a_folder/Windows/MSVC/Makefile +++ b/examples/C/serve_a_folder/Windows/MSVC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - Microsoft Visual C diff --git a/examples/C/serve_a_folder/Windows/TCC/Makefile b/examples/C/serve_a_folder/Windows/TCC/Makefile index 88fb5a21..5cdb9418 100644 --- a/examples/C/serve_a_folder/Windows/TCC/Makefile +++ b/examples/C/serve_a_folder/Windows/TCC/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # Windows - Tiny C Compiler diff --git a/examples/C/serve_a_folder/macOS/Clang/Makefile b/examples/C/serve_a_folder/macOS/Clang/Makefile index ddeba65e..0d77fc79 100644 --- a/examples/C/serve_a_folder/macOS/Clang/Makefile +++ b/examples/C/serve_a_folder/macOS/Clang/Makefile @@ -1,4 +1,4 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # C99 Example # macOS - Clang diff --git a/examples/C/serve_a_folder/main.c b/examples/C/serve_a_folder/main.c index 0564f5dd..3d04d1dc 100644 --- a/examples/C/serve_a_folder/main.c +++ b/examples/C/serve_a_folder/main.c @@ -2,8 +2,8 @@ #include "webui.h" -webui_window_t* my_window; -webui_window_t* my_second_window; +void* my_window; +void* my_second_window; void exit_app(webui_event_t* e) { diff --git a/examples/Go/hello_world/README.md b/examples/Go/hello_world/README.md index d2be3bd5..70576145 100644 --- a/examples/Go/hello_world/README.md +++ b/examples/Go/hello_world/README.md @@ -3,5 +3,6 @@ ```sh git clone https://github.com/alifcommunity/webui.git cd webui\examples\Go\hello_world +go clean go build ``` diff --git a/examples/Go/hello_world/go.mod b/examples/Go/hello_world/go.mod index 0e8f4f46..5101f27c 100644 --- a/examples/Go/hello_world/go.mod +++ b/examples/Go/hello_world/go.mod @@ -1,3 +1,3 @@ module github.com/alifcommunity/webui -go 1.19 +go 1.20 diff --git a/examples/Go/hello_world/main.go b/examples/Go/hello_world/main.go index 5be07fef..a931e727 100644 --- a/examples/Go/hello_world/main.go +++ b/examples/Go/hello_world/main.go @@ -52,46 +52,50 @@ const dashboard_html string = `

Welcome !


+ Call Secret() function and get the response +
+
+ +

` -func Exit(e webui.Event) { +func Exit(e webui.Event) string { webui.Exit() + return "" } -func Check(e webui.Event) { +func Secret(e webui.Event) string { - // Script to get the text value - MyScript := webui.JavaScript{ - Timeout: 10, - Script: " return document.getElementById('MyInput').value; ", - } + return "I Love Go!" +} + +func Check(e webui.Event) string { + + // Create new JavaScript object + js := webui.NewJavaScript() // Run the script - webui.RunJavaScript(e.Window, &MyScript) - - // Check if any error - if !MyScript.Error { - - fmt.Printf("Password: %s\n", MyScript.Data) - - // Check the password - if MyScript.Data == "123456" { - - webui.Show(e.Window, dashboard_html) - } else { - - MyScript.Script = " document.getElementById('err').innerHTML = 'Sorry. Wrong password'; " - webui.RunJavaScript(e.Window, &MyScript) - } - } else { + if !webui.Script(e.Window, &js, "return document.getElementById('MyInput').value;") { // There is an error in our script - fmt.Printf("JavaScript Error: %s\n", MyScript.Data) + fmt.Printf("JavaScript Error: %s\n", js.Response) + return "" } + + fmt.Printf("Password: [%s]\n", js.Response) + + // Check the password + if js.Response == "123456" { + webui.Show(e.Window, dashboard_html) + } else { + webui.Script(e.Window, &js, "document.getElementById('err').innerHTML = 'Sorry. Wrong password';") + } + + return "" } func main() { @@ -101,6 +105,7 @@ func main() { // Bind webui.Bind(my_window, "CheckPassword", Check) + webui.Bind(my_window, "Sec", Secret) webui.Bind(my_window, "Exit", Exit) // Show window diff --git a/examples/Go/hello_world/webui/webui.go b/examples/Go/hello_world/webui/webui.go index eec5e0f1..5c60e39f 100644 --- a/examples/Go/hello_world/webui/webui.go +++ b/examples/Go/hello_world/webui/webui.go @@ -1,131 +1,200 @@ /* - WebUI Library 2.1.1 - - http://webui.me - https://github.com/alifcommunity/webui - - Copyright (c) 2020-2023 Hassan Draga. - Licensed under GNU General Public License v2.0. - All rights reserved. - Canada. + WebUI Library 2.2.0 + http://_webui_core.me + https://github.com/alifcommunity/webui + Copyright (c) 2020-2023 Hassan Draga. + Licensed under GNU General Public License v2.0. + All rights reserved. + Canada. */ package webui /* -// [?] Change the library path as you need -#cgo CFLAGS: -I ./ -I ../../../../include -#cgo windows LDFLAGS: -L ./ -L ../../../../build/Windows/GCC/ -L ../../../../build/Windows/MSVC/ -lwebui-2-static-x64 -lws2_32 -#cgo darwin LDFLAGS: -L ./ -L ../../../../build/macOS/GCC/ -L ../../../../build/macOS/Clang/ -lwebui-2-static-x64 -lpthread -lm -#cgo linux LDFLAGS: -L ./ -L ../../../../build/Linux/GCC/ -L ../../../../build/Linux/Clang/ -lwebui-2-static-x64 -lpthread -lm +#cgo CFLAGS: -I ./ +#cgo windows LDFLAGS: -L ./ -lwebui-2-static-x64 -lws2_32 +#cgo darwin LDFLAGS: -L ./ -lwebui-2-static-x64 -lpthread -lm +#cgo linux LDFLAGS: -L ./ -lwebui-2-static-x64 -lpthread -lm #include -extern void webui_go_handler(webui_window_t* _window, unsigned int _element_id, unsigned int _window_id, char* _element_name); -static void webui_bind_go_handler(webui_event_t* e) { - webui_go_handler(e->window, e->element_id, e->window_id, e->element_name); +extern void go_webui_event(void* _window, unsigned int _event_type, char* _element, char* _data, char* _response); +static void go_webui_events_handler(webui_event_t* e) { + go_webui_event(e->window, e->type, e->element, e->data, (char*)&e->response); } -static unsigned int webui_bind_go(webui_window_t* win, const char* element) { - return webui_bind(win, element, webui_bind_go_handler); +static void go_webui_bind(void* win, const char* element) { + webui_bind(win, element, go_webui_events_handler); } */ +import "C" + import ( - "C" + "bytes" + "strconv" + "unsafe" ) -const AnyBrowser uint = 0 -const Chrome uint = 1 -const Firefox uint = 2 -const Edge uint = 3 -const Safari uint = 4 -const Chromium uint = 5 -const Custom uint = 99 - -// Event Struct -type Event struct { - Window *C.webui_window_t - ElementID uint - WindowID uint - ElementName string -} - -// JavaScript Struct -type JavaScript struct { - Timeout uint - Script string - Error bool - Length uint - Data string -} +// Heap +var isIni bool = false // User Go Callback Functions list -var fun_list [64][256]func(Event) +var fun_list map[string]func(Event) string -//export webui_go_handler -func webui_go_handler(_window *C.webui_window_t, _element_id C.uint, _window_id C.uint, _element_name *C.char) { +// Web browsers enum +const AnyBrowser uint = 0 // 0. Default recommended web browser +const Chrome uint = 1 // 1. Google Chrome +const Firefox uint = 2 // 2. Mozilla Firefox +const Edge uint = 3 // 3. Microsoft Edge +const Safari uint = 4 // 4. Apple Safari +const Chromium uint = 5 // 5. The Chromium Project +const Opera uint = 6 // 6. Opera Browser +const Brave uint = 7 // 7. The Brave Browser +const Vivaldi uint = 8 // 8. The Vivaldi Browser +const Epic uint = 9 // 9. The Epic Browser +const Yandex uint = 10 // 10. The Yandex Browser - var window *C.webui_window_t = (*C.webui_window_t)(_window) - var element_id uint = uint(_element_id) - var window_id uint = uint(_window_id) - var element_name string = C.GoString(_element_name) +// Events enum +const WEBUI_EVENT_DISCONNECTED uint = 0 // 0. Window disconnection event +const WEBUI_EVENT_CONNECTED uint = 1 // 1. Window connection event +const WEBUI_EVENT_MULTI_CONNECTION uint = 2 // 2. New window connection event +const WEBUI_EVENT_UNWANTED_CONNECTION uint = 3 // 3. New unwanted window connection event +const WEBUI_EVENT_MOUSE_CLICK uint = 4 // 4. Mouse click event +const WEBUI_EVENT_NAVIGATION uint = 5 // 5. Window navigation event +const WEBUI_EVENT_CALLBACK uint = 6 // 6. Function call event +// Events struct +type Event struct { + Window unsafe.Pointer + EventType uint + Element string + Data string +} + +// JavaScript struct +type JavaScript struct { + Timeout uint + BufferSize uint + Response string +} + +// Initilializing +func Ini() { + if isIni { + return + } + isIni = true + fun_list = make(map[string]func(Event) string) +} + +// JavaScript object constructor +func NewJavaScript() JavaScript { + Ini() + js := JavaScript{ + Timeout: 0, + BufferSize: (1024 * 8), + Response: "", + } + return js +} + +// This function receives all events +// +//export go_webui_event +func go_webui_event(window unsafe.Pointer, _event_type C.uint, _element *C.char, _data *C.char, _response *C.char) { + + Ini() + + // Create a new event struct + var event_type uint = uint(_event_type) + var element string = C.GoString(_element) + var data string = C.GoString(_data) e := Event{ - Window: window, - ElementID: element_id, - WindowID: window_id, - ElementName: element_name, + Window: window, + EventType: event_type, + Element: element, + Data: data, } - fun_list[window_id][element_id](e) -} + // Call user callback function + var window_id uint = uint(C.webui_interface_get_window_id(unsafe.Pointer(window))) + var func_id string = strconv.Itoa(int(window_id)) + element + response := string(fun_list[func_id](e)) -func RunJavaScript(window *C.webui_window_t, js *JavaScript) { - - // Interface - c_js := C.webui_script_interface_t{ - script: C.CString(js.Script), - timeout: 30, // uint(js.Timeout), - error: C.bool(false), - // length: uint(0), - // data: C.CString(nil), + // Set the response back + if len(response) > 0 { + c_response := C.CString(response) + C.webui_interface_set_response(_response, c_response) } - - C.webui_script_interface_struct(window, &c_js) - - js.Error = bool(c_js.error) - js.Data = C.GoString(c_js.data) } -func NewWindow() *C.webui_window_t { +// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response). +func Script(window unsafe.Pointer, js *JavaScript, script string) bool { - return C.webui_new_window() + Ini() + + // Convert the JavaScript from Go-String to C-String + c_script := C.CString(script) + + // Create a local buffer to hold the response + ResponseBuffer := make([]byte, uint64(js.BufferSize)) + + // Create a pointer to the local buffer + ptr := (*C.char)(unsafe.Pointer(&ResponseBuffer[0])) + + // Run the JavaScript and wait for response + status := C.webui_script(window, c_script, C.uint(js.Timeout), ptr, C.size_t(uint64(js.BufferSize))) + + // Copy the response to the users struct + ResponseLen := bytes.IndexByte(ResponseBuffer[:], 0) + js.Response = string(ResponseBuffer[:ResponseLen]) + + // return the status of the JavaScript execution + // True: No JavaScript error. + // False: JavaScript error. + return bool(status) } +// Create a new window object +func NewWindow() unsafe.Pointer { + Ini() + // Create a new window object + // this return a (void pointer) and we should + // never change it. It's only managed by WebUI + return unsafe.Pointer(C.webui_new_window()) +} + +// Close all opened windows func Exit() { - + Ini() C.webui_exit() } -func Show(window *C.webui_window_t, content string) { - +// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed. +func Show(window unsafe.Pointer, content string) { + Ini() c_content := C.CString(content) C.webui_show(window, c_content) } -func Open(window *C.webui_window_t, url string, browser uint) { - - c_url := C.CString(url) - C.webui_open(window, c_url, C.uint(browser)) -} - +// Wait until all opened windows get closed. func Wait() { - + Ini() C.webui_wait() } -func Bind(window *C.webui_window_t, element string, callback func(Event)) { +// Bind a specific html element click event with a function. Empty element means all events. +func Bind(window unsafe.Pointer, element string, callback func(Event) string) { + Ini() + + // Convert element from Go-String to C-String c_element := C.CString(element) - var window_id uint = uint(C._webui_window_get_number(window)) - var cb_index uint = uint(C.webui_bind_go(window, c_element)) + C.go_webui_bind(window, c_element) - fun_list[window_id][cb_index] = callback + // Get the window ID + var window_id uint = uint(C.webui_interface_get_window_id(window)) + + // Generate a unique ID for this element + var func_id string = strconv.Itoa(int(window_id)) + element + + // Add the user callback function to the list + fun_list[func_id] = callback } diff --git a/examples/Go/hello_world/webui/webui.h b/examples/Go/hello_world/webui/webui.h new file mode 100644 index 00000000..07b08828 --- /dev/null +++ b/examples/Go/hello_world/webui/webui.h @@ -0,0 +1,189 @@ +/* + WebUI Library 2.2.0 + http://webui.me + https://github.com/alifcommunity/webui + Copyright (c) 2020-2023 Hassan Draga. + Licensed under GNU General Public License v2.0. + All rights reserved. + Canada. +*/ + +#ifndef _WEBUI_H +#define _WEBUI_H + +#define WEBUI_VERSION "2.2.0" + +// Dynamic Library Exports +#if defined(_MSC_VER) || defined(__TINYC__) + #ifndef WEBUI_EXPORT + #define WEBUI_EXPORT __declspec(dllexport) + #endif +#else + #ifndef WEBUI_EXPORT + #define WEBUI_EXPORT extern + #endif +#endif + +// -- C STD --------------------------- +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(__GNUC__) || defined(__TINYC__) + #include +#endif + +// -- Windows ------------------------- +#ifdef _WIN32 + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #include + #include + #include + #include + #include + #include + #define WEBUI_GET_CURRENT_DIR _getcwd + #define WEBUI_FILE_EXIST _access + #define WEBUI_POPEN _popen + #define WEBUI_PCLOSE _pclose + #define WEBUI_MAX_PATH MAX_PATH +#endif + +// -- Linux --------------------------- +#ifdef __linux__ + #include + #include + #include + #include + #include + #include + #include + #include + #define WEBUI_GET_CURRENT_DIR getcwd + #define WEBUI_FILE_EXIST access + #define WEBUI_POPEN popen + #define WEBUI_PCLOSE pclose + #define WEBUI_MAX_PATH PATH_MAX +#endif + +// -- Apple --------------------------- +#ifdef __APPLE__ + #include + #include + #include + #include + #include + #include + #include + #include // PATH_MAX + #include + #define WEBUI_GET_CURRENT_DIR getcwd + #define WEBUI_FILE_EXIST access + #define WEBUI_POPEN popen + #define WEBUI_PCLOSE pclose + #define WEBUI_MAX_PATH PATH_MAX +#endif + +// -- Enums --------------------------- +enum webui_browsers { + AnyBrowser = 0, // 0. Default recommended web browser + Chrome, // 1. Google Chrome + Firefox, // 2. Mozilla Firefox + Edge, // 3. Microsoft Edge + Safari, // 4. Apple Safari + Chromium, // 5. The Chromium Project + Opera, // 6. Opera Browser + Brave, // 7. The Brave Browser + Vivaldi, // 8. The Vivaldi Browser + Epic, // 9. The Epic Browser + Yandex, // 10. The Yandex Browser +}; + +enum webui_runtimes { + None = 0, // 0. Prevent WebUI from using any runtime for .js and .ts files + Deno, // 1. Use Deno runtime for .js and .ts files + NodeJS, // 2. Use Nodejs runtime for .js files +}; + +enum webui_events { + WEBUI_EVENT_DISCONNECTED = 0, // 0. Window disconnection event + WEBUI_EVENT_CONNECTED, // 1. Window connection event + WEBUI_EVENT_MULTI_CONNECTION, // 2. New window connection event + WEBUI_EVENT_UNWANTED_CONNECTION, // 3. New unwanted window connection event + WEBUI_EVENT_MOUSE_CLICK, // 4. Mouse click event + WEBUI_EVENT_NAVIGATION, // 5. Window navigation event + WEBUI_EVENT_CALLBACK, // 6. Function call event +}; + +// -- Structs ------------------------- +typedef struct webui_event_t { + void* window; // Pointer to the window object + unsigned int type; // Event type + char* element; // HTML element ID + char* data; // JavaScript data + char* response; // Callback response +} webui_event_t; + +// -- Definitions --------------------- +// Create a new webui window object. +WEBUI_EXPORT void* webui_new_window(void); +// Bind a specific html element click event with a function. Empty element means all events. +WEBUI_EXPORT unsigned int webui_bind(void* window, const char* element, void (*func)(webui_event_t* e)); +// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed. +WEBUI_EXPORT bool webui_show(void* window, const char* content); +// Same as webui_show(). But with a specific web browser. +WEBUI_EXPORT bool webui_show_browser(void* window, const char* content, unsigned int browser); +// Wait until all opened windows get closed. +WEBUI_EXPORT void webui_wait(void); +// Close a specific window. +WEBUI_EXPORT void webui_close(void* window); +// Close all opened windows. webui_wait() will break. +WEBUI_EXPORT void webui_exit(void); + +// -- Other --------------------------- +WEBUI_EXPORT bool webui_is_shown(void* window); +WEBUI_EXPORT void webui_set_timeout(unsigned int second); +WEBUI_EXPORT void webui_set_icon(void* window, const char* icon, const char* type); +WEBUI_EXPORT void webui_set_multi_access(void* window, bool status); + +// -- JavaScript ---------------------- +// Quickly run a JavaScript. +WEBUI_EXPORT bool webui_run(void* window, const char* script); +// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response). +WEBUI_EXPORT bool webui_script(void* window, const char* script, unsigned int timeout, char* buffer, size_t buffer_length); +// Chose between Deno and Nodejs runtime for .js and .ts files. +WEBUI_EXPORT void webui_set_runtime(void* window, unsigned int runtime); +// Parse argument as integer. +WEBUI_EXPORT long long int webui_get_int(webui_event_t* e); +// Parse argument as string. +WEBUI_EXPORT const char* webui_get_string(webui_event_t* e); +// Parse argument as boolean. +WEBUI_EXPORT bool webui_get_bool(webui_event_t* e); +// Return the response to JavaScript as integer. +WEBUI_EXPORT void webui_return_int(webui_event_t* e, long long int n); +// Return the response to JavaScript as string. +WEBUI_EXPORT void webui_return_string(webui_event_t* e, char* s); +// Return the response to JavaScript as boolean. +WEBUI_EXPORT void webui_return_bool(webui_event_t* e, bool b); + +// -- Interface ----------------------- +// Bind a specific html element click event with a function. Empty element means all events. This replace webui_bind(). +WEBUI_EXPORT unsigned int webui_interface_bind(void* window, const char* element, void (*func)(void*, unsigned int, char*, char*, char*)); +// When using `webui_interface_bind()` you need this function to easily set your response. +WEBUI_EXPORT void webui_interface_set_response(char* ptr, const char* response); +// Check if the app still running or not. This replace webui_wait(). +WEBUI_EXPORT bool webui_interface_is_app_running(void); +// Get window unique ID +WEBUI_EXPORT unsigned int webui_interface_get_window_id(void* window); + +#endif /* _WEBUI_H */ diff --git a/packages/PyPI/LICENSE b/examples/Python/PyPI/Package/LICENSE similarity index 100% rename from packages/PyPI/LICENSE rename to examples/Python/PyPI/Package/LICENSE diff --git a/packages/PyPI/README.md b/examples/Python/PyPI/Package/README.md similarity index 100% rename from packages/PyPI/README.md rename to examples/Python/PyPI/Package/README.md diff --git a/packages/PyPI/pyproject.toml b/examples/Python/PyPI/Package/pyproject.toml similarity index 97% rename from packages/PyPI/pyproject.toml rename to examples/Python/PyPI/Package/pyproject.toml index 8f5e1e43..805d597e 100644 --- a/packages/PyPI/pyproject.toml +++ b/examples/Python/PyPI/Package/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "webui2" -version = "2.1.1" +version = "2.2.0" authors = [ { name="Hassan Draga" }, ] diff --git a/packages/PyPI/src/webui/__init__.py b/examples/Python/PyPI/Package/src/webui/__init__.py similarity index 100% rename from packages/PyPI/src/webui/__init__.py rename to examples/Python/PyPI/Package/src/webui/__init__.py diff --git a/examples/Python/PyPI/Package/src/webui/webui-2-x64.dll b/examples/Python/PyPI/Package/src/webui/webui-2-x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..4dcaca021069888615b4d1e511ba11ac35c0ec7c GIT binary patch literal 391680 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≫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 G{QW=Om1!dY literal 0 HcmV?d00001 diff --git a/packages/PyPI/src/webui/webui.py b/examples/Python/PyPI/Package/src/webui/webui.py similarity index 99% rename from packages/PyPI/src/webui/webui.py rename to examples/Python/PyPI/Package/src/webui/webui.py index 9f92bf09..fc3db472 100644 --- a/packages/PyPI/src/webui/webui.py +++ b/examples/Python/PyPI/Package/src/webui/webui.py @@ -1,5 +1,5 @@ -# WebUI Library 2.1.1 +# WebUI Library 2.2.0 # # http://webui.me # https://github.com/alifcommunity/webui @@ -26,7 +26,6 @@ PTR_PTR_CHAR = ctypes.POINTER(PTR_CHAR) # Event class event: - element_id = 0 window_id = 0 element_name = "" data = "" @@ -137,7 +136,7 @@ class window: err_library_not_found('bind') return cb_index = int( - WebUI.webui_bind_interface( + WebUI.webui_interface_bind( self.window, element.encode('utf-8'), self.c_events)) diff --git a/packages/README.md b/examples/Python/PyPI/README.md similarity index 100% rename from packages/README.md rename to examples/Python/PyPI/README.md diff --git a/examples/Python/dev/main.py b/examples/Python/PyPI/test_package.py similarity index 95% rename from examples/Python/dev/main.py rename to examples/Python/PyPI/test_package.py index 323e9b4b..03a1f24a 100644 --- a/examples/Python/dev/main.py +++ b/examples/Python/PyPI/test_package.py @@ -1,12 +1,12 @@ # This script is for debugging & development of the WebUI Python wrapper -# The source code is located at 'webui/packages/PyPI/src/webui/webui.py' +# The source code is located at 'webui/examples/Python/PyPI/Package/src/webui/webui.py' # [!] Make sure to remove the WebUI package # pip uninstall webui2 # Import the WebUI local module import sys -sys.path.append('../../../packages/PyPI/src/webui') +sys.path.append('Package/src/webui') import webui # Use the local WebUI Dynamic lib diff --git a/examples/Python/hello_world/main.py b/examples/Python/hello_world.py similarity index 100% rename from examples/Python/hello_world/main.py rename to examples/Python/hello_world.py diff --git a/examples/Python/minimal/main.py b/examples/Python/minimal.py similarity index 100% rename from examples/Python/minimal/main.py rename to examples/Python/minimal.py diff --git a/examples/Python/serve_folder/second.html b/examples/Python/second.html similarity index 100% rename from examples/Python/serve_folder/second.html rename to examples/Python/second.html diff --git a/examples/Python/serve_folder/index.html b/examples/Python/serve_folder.html similarity index 100% rename from examples/Python/serve_folder/index.html rename to examples/Python/serve_folder.html diff --git a/examples/Python/serve_folder/main.py b/examples/Python/serve_folder.py similarity index 100% rename from examples/Python/serve_folder/main.py rename to examples/Python/serve_folder.py diff --git a/examples/Rust/README.md b/examples/Rust/README.md new file mode 100644 index 00000000..0d607412 --- /dev/null +++ b/examples/Rust/README.md @@ -0,0 +1,13 @@ +# WebUI Examples - Rust + +# NOTICE: + +## The Rust wrapper still needs to be completed. You can finish it and submit the patch as PR. Or, if you prefer to maintain it in your repo, you can create a new issue and submit the link to your Rust wrapper repo. Thank you. + +```sh +git clone https://github.com/alifcommunity/webui.git +cd webui\examples\Rust\hello_world +cargo clean +cargo build +cargo run +``` diff --git a/examples/Rust/hello_world/Cargo.toml b/examples/Rust/hello_world/Cargo.toml index 3789e707..63d82297 100644 --- a/examples/Rust/hello_world/Cargo.toml +++ b/examples/Rust/hello_world/Cargo.toml @@ -2,5 +2,7 @@ name = "my-webui-application" version = "0.1.0" build = "build.rs" +edition = "2021" [dependencies] +lazy_static = "1.4.0" diff --git a/examples/Rust/hello_world/src/Webui.rs b/examples/Rust/hello_world/src/Webui.rs index 8f20d8b9..551239d9 100644 --- a/examples/Rust/hello_world/src/Webui.rs +++ b/examples/Rust/hello_world/src/Webui.rs @@ -1,13 +1,11 @@ /* - WebUI Library 2.1.1 - - http://webui.me - https://github.com/alifcommunity/webui - - Copyright (c) 2020-2023 Hassan Draga. - Licensed under GNU General Public License v2.0. - All rights reserved. - Canada. + WebUI Library 2.2.0 + http://_webui_core.me + https://github.com/alifcommunity/webui + Copyright (c) 2020-2023 Hassan Draga. + Licensed under GNU General Public License v2.0. + All rights reserved. + Canada. */ // Flags @@ -22,484 +20,238 @@ use std::os::raw::c_char; use std::ffi::CString; use std::ffi::CStr; +use std::collections::HashMap; +use lazy_static::lazy_static; +use std::sync::Mutex; -// --[WebUI Library References]-------- -pub type size_t = ::std::os::raw::c_ulonglong; -pub const WEBUI_MAX_ARRAY: u32 = 32; -pub const __bool_true_false_are_defined: u32 = 1; +// Consts pub const true_: u32 = 1; pub const false_: u32 = 0; +pub const __bool_true_false_are_defined: u32 = 1; +pub type size_t = ::std::os::raw::c_ulong; +pub type wchar_t = ::std::os::raw::c_int; + +// Event struct #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct webui_event_t { - pub window_id: ::std::os::raw::c_uint, - pub element_id: ::std::os::raw::c_uint, - pub element_name: *mut ::std::os::raw::c_char, - pub window: *mut webui_window_t, + pub window: *mut ::std::os::raw::c_void, + pub type_: ::std::os::raw::c_uint, + pub element: *mut ::std::os::raw::c_char, pub data: *mut ::std::os::raw::c_char, - pub data_len: ::std::os::raw::c_uint, + pub response: *mut ::std::os::raw::c_char, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_window_core_t { - pub window_number: ::std::os::raw::c_uint, - pub server_running: bool, - pub connected: bool, - pub server_handled: bool, - pub multi_access: bool, - pub server_root: bool, - pub server_port: ::std::os::raw::c_uint, - pub url: *mut ::std::os::raw::c_char, - pub html: *const ::std::os::raw::c_char, - pub html_cpy: *const ::std::os::raw::c_char, - pub icon: *const ::std::os::raw::c_char, - pub icon_type: *const ::std::os::raw::c_char, - pub CurrentBrowser: ::std::os::raw::c_uint, - pub browser_path: *mut ::std::os::raw::c_char, - pub profile_path: *mut ::std::os::raw::c_char, - pub connections: ::std::os::raw::c_uint, - pub runtime: ::std::os::raw::c_uint, - pub detect_process_close: bool, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_window_t { - pub core: webui_window_core_t, - pub path: *mut ::std::os::raw::c_char, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_javascript_result_t { - pub error: bool, - pub length: ::std::os::raw::c_uint, - pub data: *const ::std::os::raw::c_char, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_script_t { - pub script: *const ::std::os::raw::c_char, - pub timeout: ::std::os::raw::c_uint, - pub result: webui_javascript_result_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_cb_t { - pub win: *mut webui_window_t, - pub webui_internal_id: *mut ::std::os::raw::c_char, - pub element_name: *mut ::std::os::raw::c_char, - pub data: *mut ::std::os::raw::c_char, - pub data_len: ::std::os::raw::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_cmd_async_t { - pub win: *mut webui_window_t, - pub cmd: *mut ::std::os::raw::c_char, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_custom_browser_t { - pub app: *mut ::std::os::raw::c_char, - pub arg: *mut ::std::os::raw::c_char, - pub auto_link: bool, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_browser_t { - pub any: ::std::os::raw::c_uint, - pub chrome: ::std::os::raw::c_uint, - pub firefox: ::std::os::raw::c_uint, - pub edge: ::std::os::raw::c_uint, - pub safari: ::std::os::raw::c_uint, - pub chromium: ::std::os::raw::c_uint, - pub opera: ::std::os::raw::c_uint, - pub brave: ::std::os::raw::c_uint, - pub vivaldi: ::std::os::raw::c_uint, - pub epic: ::std::os::raw::c_uint, - pub yandex: ::std::os::raw::c_uint, - pub current: ::std::os::raw::c_uint, - pub custom: ::std::os::raw::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_runtime_t { - pub none: ::std::os::raw::c_uint, - pub deno: ::std::os::raw::c_uint, - pub nodejs: ::std::os::raw::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_t { - pub servers: ::std::os::raw::c_uint, - pub connections: ::std::os::raw::c_uint, - pub custom_browser: *mut webui_custom_browser_t, - pub wait_for_socket_window: bool, - pub html_elements: [*mut ::std::os::raw::c_char; 32usize], - pub used_ports: [::std::os::raw::c_uint; 32usize], - pub last_window: ::std::os::raw::c_uint, - pub startup_timeout: ::std::os::raw::c_uint, - pub use_timeout: bool, - pub timeout_extra: bool, - pub exit_now: bool, - pub run_responses: [*const ::std::os::raw::c_char; 32usize], - pub run_done: [bool; 32usize], - pub run_error: [bool; 32usize], - pub run_last_id: ::std::os::raw::c_uint, - pub browser: webui_browser_t, - pub runtime: webui_runtime_t, - pub initialized: bool, - pub cb: [::std::option::Option; - 32usize], - pub cb_interface: [::std::option::Option< - unsafe extern "C" fn( - element_id: ::std::os::raw::c_uint, - window_id: ::std::os::raw::c_uint, - element_name: *mut ::std::os::raw::c_char, - window: *mut webui_window_t, - ), - >; 32usize], - pub executable_path: *mut ::std::os::raw::c_char, - pub ptr_list: [*mut ::std::os::raw::c_void; 32usize], - pub ptr_position: ::std::os::raw::c_uint, - pub ptr_size: [usize; 32usize], + +// References + +extern "C" { + pub fn webui_new_window() -> *mut ::std::os::raw::c_void; } extern "C" { - pub static mut webui: webui_t; + pub fn webui_bind( + window: *mut ::std::os::raw::c_void, + element: *const ::std::os::raw::c_char, + func: ::std::option::Option + ) -> ::std::os::raw::c_uint; +} +extern "C" { + pub fn webui_show( + window: *mut ::std::os::raw::c_void, + content: *const ::std::os::raw::c_char + ) -> bool; +} +extern "C" { + pub fn webui_show_browser( + window: *mut ::std::os::raw::c_void, + content: *const ::std::os::raw::c_char, + browser: ::std::os::raw::c_uint + ) -> bool; } extern "C" { pub fn webui_wait(); } +extern "C" { + pub fn webui_close(window: *mut ::std::os::raw::c_void); +} extern "C" { pub fn webui_exit(); } extern "C" { - pub fn webui_is_any_window_running() -> bool; + pub fn webui_is_shown(window: *mut ::std::os::raw::c_void) -> bool; } extern "C" { pub fn webui_set_timeout(second: ::std::os::raw::c_uint); } -extern "C" { - pub fn webui_new_window() -> *mut webui_window_t; -} -extern "C" { - pub fn webui_show( - win: *mut webui_window_t, - content: *const ::std::os::raw::c_char - ) -> bool; -} extern "C" { pub fn webui_set_icon( - win: *mut webui_window_t, - icon_s: *const ::std::os::raw::c_char, - type_s: *const ::std::os::raw::c_char, + window: *mut ::std::os::raw::c_void, + icon: *const ::std::os::raw::c_char, + type_: *const ::std::os::raw::c_char ); } extern "C" { - pub fn webui_multi_access(win: *mut webui_window_t, status: bool); + pub fn webui_set_multi_access(window: *mut ::std::os::raw::c_void, status: bool); } extern "C" { - pub fn _webui_set_root_folder( - win: *mut webui_window_t, - path: *const ::std::os::raw::c_char, + pub fn webui_run( + window: *mut ::std::os::raw::c_void, + script: *const ::std::os::raw::c_char ) -> bool; } -extern "C" { - pub fn webui_new_server( - win: *mut webui_window_t, - path: *const ::std::os::raw::c_char, - ) -> *const ::std::os::raw::c_char; -} -extern "C" { - pub fn webui_close(win: *mut webui_window_t); -} -extern "C" { - pub fn webui_is_shown(win: *mut webui_window_t) -> bool; -} extern "C" { pub fn webui_script( - win: *mut webui_window_t, - script: *mut webui_script_t, - ); -} -extern "C" { - pub fn webui_bind( - win: *mut webui_window_t, - element: *const ::std::os::raw::c_char, - func: ::std::option::Option< - // unsafe extern "C" fn(e: *mut webui_event_t), - unsafe fn(e: *mut webui_event_t), - >, - ) -> ::std::os::raw::c_uint; -} -extern "C" { - pub fn webui_open( - win: *mut webui_window_t, - url: *const ::std::os::raw::c_char, - browser: ::std::os::raw::c_uint, - ) -> bool; -} -extern "C" { - pub fn webui_script_cleanup(script: *mut webui_script_t); -} -extern "C" { - pub fn webui_script_runtime( - win: *mut webui_window_t, - runtime: ::std::os::raw::c_uint, - ); -} -extern "C" { - pub fn _webui_wait_process(win: *mut webui_window_t, status: bool); -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct webui_script_interface_t { - pub script: *mut ::std::os::raw::c_char, - pub timeout: ::std::os::raw::c_uint, - pub error: bool, - pub length: ::std::os::raw::c_uint, - pub data: *const ::std::os::raw::c_char, -} -extern "C" { - pub fn webui_bind_interface( - win: *mut webui_window_t, - element: *const ::std::os::raw::c_char, - func: ::std::option::Option< - // unsafe extern "C" fn( - // element_id: ::std::os::raw::c_uint, - // window_id: ::std::os::raw::c_uint, - // element_name: *mut ::std::os::raw::c_char, - // window: *mut webui_window_t, - // ), - unsafe fn( - element_id: ::std::os::raw::c_uint, - window_id: ::std::os::raw::c_uint, - element_name: *mut ::std::os::raw::c_char, - window: *mut webui_window_t, - // TODO: Add char*, char** - ), - >, - ) -> ::std::os::raw::c_uint; -} -extern "C" { - pub fn webui_script_interface( - win: *mut webui_window_t, + window: *mut ::std::os::raw::c_void, script: *const ::std::os::raw::c_char, timeout: ::std::os::raw::c_uint, - error: *mut bool, - length: *mut ::std::os::raw::c_uint, - data: *mut ::std::os::raw::c_char, // TODO: Change this from char* to char** - ); + buffer: *mut ::std::os::raw::c_char, + buffer_length: size_t + ) -> bool; } extern "C" { - pub fn webui_script_interface_struct( - win: *mut webui_window_t, - //js_int: *mut webui_script_interface_t, - js_int: &webui_script_interface_t, - ); + pub fn webui_set_runtime(window: *mut ::std::os::raw::c_void, runtime: ::std::os::raw::c_uint); } extern "C" { - pub fn _webui_init(); + pub fn webui_get_int(e: *mut webui_event_t) -> ::std::os::raw::c_longlong; } extern "C" { - pub fn _webui_get_cb_index( - webui_internal_id: *mut ::std::os::raw::c_char, + pub fn webui_get_string(e: *mut webui_event_t) -> *const ::std::os::raw::c_char; +} +extern "C" { + pub fn webui_get_bool(e: *mut webui_event_t) -> bool; +} +extern "C" { + pub fn webui_return_int(e: *mut webui_event_t, n: ::std::os::raw::c_longlong); +} +extern "C" { + pub fn webui_return_string(e: *mut webui_event_t, s: *mut ::std::os::raw::c_char); +} +extern "C" { + pub fn webui_return_bool(e: *mut webui_event_t, b: bool); +} +extern "C" { + pub fn webui_interface_bind( + window: *mut ::std::os::raw::c_void, + element: *const ::std::os::raw::c_char, + func: ::std::option::Option< + unsafe fn( + arg1: *mut ::std::os::raw::c_void, + arg2: ::std::os::raw::c_uint, + arg3: *mut ::std::os::raw::c_char, + arg4: *mut ::std::os::raw::c_char, + arg5: *mut ::std::os::raw::c_char + ) + > ) -> ::std::os::raw::c_uint; } extern "C" { - pub fn _webui_set_cb_index( - webui_internal_id: *mut ::std::os::raw::c_char, + pub fn webui_interface_set_response( + ptr: *mut ::std::os::raw::c_char, + response: *const ::std::os::raw::c_char + ); +} +extern "C" { + pub fn webui_interface_is_app_running() -> bool; +} +extern "C" { + pub fn webui_interface_get_window_id( + window: *mut ::std::os::raw::c_void ) -> ::std::os::raw::c_uint; } -extern "C" { - pub fn _webui_get_free_port() -> ::std::os::raw::c_uint; -} -extern "C" { - pub fn _webui_get_new_window_number() -> ::std::os::raw::c_uint; -} -extern "C" { - pub fn _webui_wait_for_startup(); -} -extern "C" { - pub fn _webui_free_port(port: ::std::os::raw::c_uint); -} -extern "C" { - pub fn _webui_set_custom_browser(p: *mut webui_custom_browser_t); -} -extern "C" { - pub fn _webui_get_current_path() -> *mut ::std::os::raw::c_char; -} -extern "C" { - pub fn _webui_window_receive( - win: *mut webui_window_t, - packet: *const ::std::os::raw::c_char, - len: usize, - ); -} -extern "C" { - pub fn _webui_window_send( - win: *mut webui_window_t, - packet: *mut ::std::os::raw::c_char, - packets_size: usize, - ); -} -extern "C" { - pub fn _webui_window_event( - win: *mut webui_window_t, - element_id: *mut ::std::os::raw::c_char, - element: *mut ::std::os::raw::c_char, - data: *mut ::std::os::raw::c_char, - data_len: ::std::os::raw::c_uint, - ); -} -extern "C" { - pub fn _webui_window_get_number( - win: *mut webui_window_t, - ) -> ::std::os::raw::c_uint; -} -extern "C" { - pub fn _webui_window_open( - win: *mut webui_window_t, - link: *mut ::std::os::raw::c_char, - browser: ::std::os::raw::c_uint, - ); -} -extern "C" { - pub fn _webui_cmd_sync( - cmd: *mut ::std::os::raw::c_char, - show: bool, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn _webui_cmd_async( - cmd: *mut ::std::os::raw::c_char, - show: bool, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn _webui_run_browser( - win: *mut webui_window_t, - cmd: *mut ::std::os::raw::c_char, - ) -> ::std::os::raw::c_int; -} -extern "C" { - pub fn _webui_clean(); -} -extern "C" { - pub fn _webui_browser_exist( - win: *mut webui_window_t, - browser: ::std::os::raw::c_uint, - ) -> bool; -} -extern "C" { - pub fn _webui_browser_get_temp_path( - browser: ::std::os::raw::c_uint, - ) -> *const ::std::os::raw::c_char; -} -extern "C" { - pub fn _webui_folder_exist(folder: *mut ::std::os::raw::c_char) -> bool; -} -extern "C" { - pub fn _webui_browser_create_profile_folder( - win: *mut webui_window_t, - browser: ::std::os::raw::c_uint, - ) -> bool; -} -extern "C" { - pub fn _webui_browser_start_edge( - win: *mut webui_window_t, - address: *const ::std::os::raw::c_char, - ) -> bool; -} -extern "C" { - pub fn _webui_browser_start_firefox( - win: *mut webui_window_t, - address: *const ::std::os::raw::c_char, - ) -> bool; -} -extern "C" { - pub fn _webui_browser_start_custom( - win: *mut webui_window_t, - address: *const ::std::os::raw::c_char, - ) -> bool; -} -extern "C" { - pub fn _webui_browser_start_chrome( - win: *mut webui_window_t, - address: *const ::std::os::raw::c_char, - ) -> bool; -} -extern "C" { - pub fn _webui_browser_start( - win: *mut webui_window_t, - address: *const ::std::os::raw::c_char, - browser: ::std::os::raw::c_uint, - ) -> bool; -} -extern "C" { - pub fn _webui_system_win32( - cmd: *mut ::std::os::raw::c_char, - show: bool, - ) -> ::std::os::raw::c_int; -} - -// --[Tools]--------------------------- - -// fn char_to_string(c : *mut ::std::os::raw::c_char) -> String { -// let cstr = unsafe {CStr::from_ptr(c)}; -// let s : String = String::from_utf8_lossy(cstr.to_bytes()).to_string(); -// return s; -// } - -fn char_to_string(c : *const i8) -> String { - - let cstr = unsafe {CStr::from_ptr(c)}; - let s : String = String::from_utf8_lossy(cstr.to_bytes()).to_string(); - return s; -} - -fn cstr_to_string(c : CString) -> String { - - let s : String = String::from_utf8_lossy(c.to_bytes()).to_string(); - return s; -} // --[Wrapper]------------------------- +// Browsers pub const AnyBrowser: u32 = 0; pub const Chrome: u32 = 1; pub const Firefox: u32 = 2; pub const Edge: u32 = 3; pub const Safari: u32 = 4; pub const Chromium: u32 = 5; -pub const opera: u32 = 6; -pub const brave: u32 = 7; -pub const vivaldi: u32 = 8; -pub const epic: u32 = 9; -pub const yandex: u32 = 10; -pub const current: u32 = 0; -pub const Custom: u32 = 99; +pub const Opera: u32 = 6; +pub const Brave: u32 = 7; +pub const Vivaldi: u32 = 8; +pub const Epic: u32 = 9; +pub const Yandex: u32 = 10; + +// Runtimes +pub const None: u32 = 0; +pub const Deno: u32 = 1; +pub const NodeJS: u32 = 2; + +// Events +pub const WEBUI_EVENT_DISCONNECTED: u32 = 0; +pub const WEBUI_EVENT_CONNECTED: u32 = 1; +pub const WEBUI_EVENT_MULTI_CONNECTION: u32 = 2; +pub const WEBUI_EVENT_UNWANTED_CONNECTION: u32 = 3; +pub const WEBUI_EVENT_MOUSE_CLICK: u32 = 4; +pub const WEBUI_EVENT_NAVIGATION: u32 = 5; +pub const WEBUI_EVENT_CALLBACK: u32 = 6; pub struct JavaScript { pub timeout: u32, - pub script: String, - pub error: bool, - pub data: String, + pub script: String, + pub error: bool, + pub data: String, } pub struct Event { - pub ElementId: u32, - pub WindowId: u32, - pub ElementName: String, - pub Window: *mut webui_window_t, + pub Window: *mut ::std::os::raw::c_void, + pub EventType: u32, + pub Element: String, + pub Data: String, } // List of Rust user functions (2-dimensional array) -static mut func_list: [[Option:: ()>; 64]; 64] = [[None; 64]; 64]; +// static mut func_list: [[Option:: ()>; 64]; 64] = [[64; 64]; 64]; +// static mut func_array: Vec> = vec![vec![]; 1024]; +// static mut elements_map = HashMap::::new(); +// static mut elements_map: HashMap::new(); -pub fn RunJavaScript(win: *mut webui_window_t, js: &mut JavaScript) { +type FunctionType = fn(Event); +const ROWS: usize = 64; +const COLS: usize = 64; +static mut GLOBAL_ARRAY: Option<[[Option; COLS]; ROWS]> = None; +lazy_static! { + static ref elements_map: HashMap = HashMap::new(); + // static mut func_array: Vec> = vec![vec![]; 1024]; +} + +// Save a string in the map and return its index +fn save_string(map: &mut HashMap, s: &str) -> usize { + // Check if the string already exists in the map + if let Some(&index) = map.get(s) { + return index; + } + + // If the string does not exist, add it to the map and return the new index + let index = map.len(); + map.insert(s.to_owned(), index); + index +} + +// Search for a string in the map and return its index if found, or -1 if not found +fn find_string(map: &HashMap, s: &str) -> isize { + if let Some(&index) = map.get(s) { + index as isize + } else { + -1 + } +} + +fn char_to_string(c: *const i8) -> String { + let cstr = unsafe { CStr::from_ptr(c) }; + let s: String = String::from_utf8_lossy(cstr.to_bytes()).to_string(); + return s; +} + +fn cstr_to_string(c: CString) -> String { + let s: String = String::from_utf8_lossy(c.to_bytes()).to_string(); + return s; +} + +pub fn RunJavaScript(win: *mut ::std::os::raw::c_void, js: &mut JavaScript) { unsafe { - // Script String to i8/u8 let script_cpy = String::from(js.script.clone()); let script_c_str = CString::new(script_cpy).unwrap(); @@ -508,46 +260,41 @@ pub fn RunJavaScript(win: *mut webui_window_t, js: &mut JavaScript) { let script: webui_script_interface_t = webui_script_interface_t { timeout: js.timeout, script: script_c_char as *mut i8, - data: script_c_char, // 'data' TODO: Should be null + data: script_c_char, error: false, length: 0, }; + // deprecated webui_script_interface_struct(win, &script); + // TODO: `webui_script_interface_struct` is deprecated. use `webui_script` instead. js.error = script.error; js.data = char_to_string(script.data); } } -pub fn NewWindow() -> *mut webui_window_t { - +pub fn NewWindow() -> *mut ::std::os::raw::c_void { unsafe { - + GLOBAL_ARRAY = Some([[None; COLS]; ROWS]); return webui_new_window(); } } pub fn Wait() { - unsafe { - webui_wait(); } } pub fn Exit() { - unsafe { - webui_exit(); } } -pub fn Show(win: *mut webui_window_t, content: &str) -> bool { - +pub fn Show(win: *mut ::std::os::raw::c_void, content: &str) -> bool { unsafe { - // Content String to i8/u8 let content_c_str = CString::new(content).unwrap(); let content_c_char: *const c_char = content_c_str.as_ptr() as *const c_char; @@ -556,47 +303,75 @@ pub fn Show(win: *mut webui_window_t, content: &str) -> bool { } } -fn events_handler (element_id: ::std::os::raw::c_uint, window_id: ::std::os::raw::c_uint, element_name: *mut ::std::os::raw::c_char, window: *mut webui_window_t) { +fn events_handler( + _window: *mut ::std::os::raw::c_void, + _event_type: ::std::os::raw::c_uint, + _element: *mut ::std::os::raw::c_char, + _data: *mut ::std::os::raw::c_char, + _response: *mut ::std::os::raw::c_char +) { + let Window: *mut ::std::os::raw::c_void = _window; + let EventType: u32 = _event_type; + let Element: String = char_to_string(_element); + let Data: String = char_to_string(_data); - let ElementId: u32 = element_id; - let WindowId: u32 = window_id; - let ElementName: String = char_to_string(element_name); - let Window: *mut webui_window_t = window; + let element_index = find_string(&elements_map, &Element); + if element_index < 0 { + return; + } let E = Event { - ElementId: ElementId, - WindowId: WindowId, - ElementName: ElementName, Window: Window, + EventType: EventType, + Element: Element, + Data: Data, }; // Call the Rust user function - let WindowId_64 = WindowId as usize; - let ElementId_64 = ElementId as usize; + let window_id = webui_interface_get_window_id(_window); + let window_id_64 = window_id as usize; + let element_index_64 = element_index as usize; unsafe { - (func_list[WindowId_64][ElementId_64]).expect("non-null function pointer")(E); + // func_list[window_id_64][element_index_64].expect("non-null function pointer")(E); + // func_array[window_id_64][element_index_64](E); + // if let Some(func) = GLOBAL_ARRAY[window_id_64][element_index_64] { + // func(E.clone()); + // } + if let Some(func) = GLOBAL_ARRAY.as_ref().unwrap()[window_id_64][element_index_64] { + func(E); + } } } -pub fn Bind(win: *mut webui_window_t, element: &str, func: fn(e: Event)) { - +pub fn Bind(win: *mut ::std::os::raw::c_void, element: &str, func: fn(Event)) { // Element String to i8/u8 let element_c_str = CString::new(element).unwrap(); let element_c_char: *const c_char = element_c_str.as_ptr() as *const c_char; // Bind unsafe { - - let f: Option = Some(events_handler); - - let window_id: ::std::os::raw::c_uint = _webui_window_get_number(win); - let cb_index: ::std::os::raw::c_uint = webui_bind_interface(win, element_c_char, f); + let f: Option< + unsafe fn( + _window: *mut ::std::os::raw::c_void, + _event_type: ::std::os::raw::c_uint, + _element: *mut ::std::os::raw::c_char, + _data: *mut ::std::os::raw::c_char, + _response: *mut ::std::os::raw::c_char + ) + > = Some(events_handler); + let element_index = save_string(&mut elements_map, element); + let window_id = webui_interface_get_window_id(win); let window_id_64 = window_id as usize; - let cb_index_64 = cb_index as usize; + let element_index_64 = element_index as usize; + + webui_interface_bind(win, element_c_char, f); // Add the Rust user function to the list - let user_cb: Option = Some(func); - func_list[window_id_64][cb_index_64] = user_cb; + // let user_cb: Option = Some(func); + // func_list[window_id_64][element_index_64] = user_cb; + // func_array[window_id_64][element_index_64] = func; + // GLOBAL_ARRAY[window_id_64][element_index_64] = Some(func as FunctionType); + GLOBAL_ARRAY.as_mut().unwrap()[window_id_64][element_index_64] = Some(func as FunctionType); } } diff --git a/examples/Rust/hello_world/src/main.rs b/examples/Rust/hello_world/src/main.rs index 56ce0839..2610e714 100644 --- a/examples/Rust/hello_world/src/main.rs +++ b/examples/Rust/hello_world/src/main.rs @@ -1,5 +1,3 @@ - - mod Webui; fn close_the_application (_e: Webui::Event) { diff --git a/examples/TypeScript/Deno/README.md b/examples/TypeScript/Deno/README.md index 50fb57ca..31d85b13 100644 --- a/examples/TypeScript/Deno/README.md +++ b/examples/TypeScript/Deno/README.md @@ -1,7 +1,24 @@ # WebUI Examples - Deno -WebUI can create a web server and use [Deno](https://deno.land/) runtimes to parse `TypeScript` and `JavaScript` files. Another way is simply create a web server using Deno and run a simple system command to run a basic WebUI application to open a window. +This is an example of how to use the WebUI dynamic library in Deno to create an HTML5 based user interface. Tested using Deno v1.32.3 (v8 11.2.214.9, typescript 5.0.3). + +### Deno Hello World + +This example shows how to use the WebUI Dynamic Library in Deno. + + 1. Download and [Install Deno](https://github.com/denoland/deno/releases) (*Or just copy deno binary file into this folder*) + 2. Download WebUI pre-built Library (*[webui.me](https://webui.me/)*) + 3. Run `deno run --allow-all --unstable hello_world.ts` + +Folder structure example (*Windows*) + + [My Folder] + * deno + * hello_world.ts + * module/webui.ts + * module/`webui-2-x64` library + diff --git a/examples/TypeScript/Deno/deno_server/README.md b/examples/TypeScript/Deno/deno_server/README.md deleted file mode 100644 index 25e888dd..00000000 --- a/examples/TypeScript/Deno/deno_server/README.md +++ /dev/null @@ -1,16 +0,0 @@ -### Deno Server - -This example shows how to show a simple WebUI window using a Deno-Web-Server. - - 1. Download and [Install Deno](https://github.com/denoland/deno/releases) (*Or just copy deno binary file into this folder*) - 2. Download WebUI pre-built Library (*[webui.me](https://webui.me/)*) - 3. Run `deno run --allow-all --unstable deno_server.ts` - -Folder structure example (*Windows*) - - [My Folder] - * deno.exe (if not installed) - * deno_server.ts --> Import webui.ts -> Load `webui-2-x64` library - * file1.js - * file2.ts - * ... diff --git a/examples/TypeScript/Deno/deno_server/deno_server.ts b/examples/TypeScript/Deno/deno_server/deno_server.ts deleted file mode 100644 index dd5d0fff..00000000 --- a/examples/TypeScript/Deno/deno_server/deno_server.ts +++ /dev/null @@ -1,40 +0,0 @@ - - -// Run this script by: -// deno run --allow-all --unstable deno_server.ts - -// Import WebUI module -import * as webui from "../module/webui.ts"; - -// Import Deno Server Module -import { serve } from "https://deno.land/std@0.158.0/http/server.ts"; - -// Optional - Set a custom library path: -// const lib_full_path = '../../../../build/Windows/MSVC/webui-2-x64.dll'; -// console.log("Looking for the WebUI dynamic library at: " + lib_full_path); -// webui.set_lib_path(lib_full_path); - -// Deno Server Listener -const port = 8080; -const url = "http://localhost:" + 8080; -const handler = (request: Request): Response => { - const body = `This is a Deno-Web-Server example. Your user-agent is:\n\n${ - request.headers.get("user-agent") ?? "Unknown" - }`; - return new Response(body, { status: 200 }); -}; -serve(handler, { port }); - -// Create new window -const my_window = webui.new_window(); - -// Show the window -if(!webui.open(my_window, url, webui.browser.chrome)) - webui.open(my_window, url, webui.browser.any); - -// Wait until all windows get closed -await webui.wait(); - -// The window is closed. -console.log('Thank you.'); -Deno.exit(0); diff --git a/examples/TypeScript/Deno/hello_world.html b/examples/TypeScript/Deno/hello_world.html new file mode 100644 index 00000000..eca8e29b --- /dev/null +++ b/examples/TypeScript/Deno/hello_world.html @@ -0,0 +1,40 @@ + + + + WebUI 2 - Deno Hello World Example + + + +

WebUI 2 - Deno Hello World (File)


+ A:

+ B:

+
A + B = ?


+ - + + + + + + + diff --git a/examples/TypeScript/Deno/hello_world/hello_world.ts b/examples/TypeScript/Deno/hello_world.ts similarity index 59% rename from examples/TypeScript/Deno/hello_world/hello_world.ts rename to examples/TypeScript/Deno/hello_world.ts index debb5d0b..35b381f3 100644 --- a/examples/TypeScript/Deno/hello_world/hello_world.ts +++ b/examples/TypeScript/Deno/hello_world.ts @@ -2,7 +2,7 @@ // Run this script by: // deno run --allow-all --unstable hello_world.ts -// Import WebUI module +// Import WebUI module (Local file) import * as webui from "../module/webui.ts"; // Optional - Set a custom library path: @@ -34,15 +34,15 @@ const my_html = ` - @@ -51,32 +51,38 @@ const my_html = ` function calculate(e : webui.event) { - // Create a JS struct - const MyJS: webui.js = { - Script: "", - Timeout: 0, - }; - - // Call JS function `get_A()` - MyJS.Script = "return get_A();"; - webui.run(e.win, MyJS); - const A = MyJS.Data; + // Create a JavaScript object + const my_js = webui.js; - // Check for error - if(MyJS.Error) { - console.log("Error in the JavaScript: " + MyJS.Data); - } + // Settings if needed + // my_js.timeout = 30; // Set javascript execution timeout + // my_js.response_size = 64; // Set the response size in bytes - // Call JS function `get_B()` - MyJS.Script = "return get_B();"; - webui.run(e.win, MyJS); - const B = MyJS.Data; + // Call a js function + if(!webui.script(e.win, my_js, "return get_A()")) { + // Error + console.log("Error in the JavaScript: " + my_js.response); + return; + } - const C : Number = parseInt(A) + parseInt(B); + // Get A + const A = my_js.response; - // Set the result - MyJS.Script = "set_result(" + C + ");"; - webui.run(e.win, MyJS); + // Call a js function + if(!webui.script(e.win, my_js, "return get_B();")) { + // Error + console.log("Error in the JavaScript: " + my_js.response); + return; + } + + // Get B + const B = my_js.response; + + // Calculate + const C : number = parseInt(A) + parseInt(B); + + // Run js (Quick Way) + webui.run(e.win, "set_result(" + C + ");"); } // Create new window @@ -85,12 +91,12 @@ const my_window = webui.new_window(); // Bind webui.bind(my_window, "Calculate", calculate); webui.bind(my_window, "Exit", function(e : webui.event) { - // Close all windows and exit - webui.exit(); + // Close all windows and exit + webui.exit(); }); // Show the window -webui.show(my_window, my_html); +webui.show(my_window, my_html); // Or webui.show(my_window, 'hello_world.html'); // Wait until all windows get closed await webui.wait(); diff --git a/examples/TypeScript/Deno/hello_world/README.md b/examples/TypeScript/Deno/hello_world/README.md deleted file mode 100644 index 71be411a..00000000 --- a/examples/TypeScript/Deno/hello_world/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Deno Server - -This example shows how to use the WebUI Dynamic Library in Deno. - - 1. Download and [Install Deno](https://github.com/denoland/deno/releases) (*Or just copy deno binary file into this folder*) - 2. Download WebUI pre-built Library (*[webui.me](https://webui.me/)*) - 3. Run `deno run --allow-all --unstable hello_world.ts` - -Folder structure example (*Windows*) - - [My Folder] - * deno.exe (if not installed) - * hello_world.ts --> Import webui.ts -> Load `webui-2-x64` library diff --git a/examples/TypeScript/Deno/module/webui.ts b/examples/TypeScript/Deno/module/webui.ts deleted file mode 100644 index f11207aa..00000000 --- a/examples/TypeScript/Deno/module/webui.ts +++ /dev/null @@ -1,309 +0,0 @@ -/* - WebUI Library 2.1.1 - - http://webui.me - https://github.com/alifcommunity/webui - - Copyright (c) 2020-2023 Hassan Draga. - Licensed under GNU General Public License v2.0. - All rights reserved. - Canada. -*/ - -import { existsSync } from "https://deno.land/std/fs/mod.ts"; -// import { readCString } from "https://deno.land/std/c/strings/mod.ts"; - -export const version = '2.1.1'; -const encoder = new TextEncoder(); -const decoder = new TextDecoder(); -let lib_loaded = false; -let webui_lib; - -export const browser = {}; -browser.any = 0; -browser.chrome = 1; -browser.firefox = 2; -browser.edge = 3; -browser.safari = 4; -browser.chromium = 5; - -export interface event { - element_id: number; - window_id: number; - element_name_ptr: string; - win: Deno.Pointer; - data: string; -} - -export interface js { - Timeout: number; - Script: string; - Error: boolean; - Length: number; - Data: string; -} - -// Determine the library name based -// on the current operating system -let lib_name : string; -let os_sep : string; -if (Deno.build.os === 'windows') { - lib_name = 'webui-2-x64.dll'; - os_sep = '\\'; -} -else if (Deno.build.os === 'linux') { - lib_name = 'webui-2-x64.so'; - os_sep = '/'; -} -else { - lib_name = 'webui-2-x64.dyn'; - os_sep = '/'; -} - -// Full path to the library name -let lib_path = './' + lib_name; - -// Check if a file exist -function is_file_exist(path : string): boolean { - // TODO: existsSync() is deprecated - return existsSync(path); -} - -// Convert String to C-String -function string_to_uint8array(value: string) : Uint8Array { - return encoder.encode(value + '\0'); -} - -// Get current folder path -function get_current_module_path() : string { - const __dirname = new URL('.', import.meta.url).pathname; - let directory = String(__dirname); - if (Deno.build.os === 'windows') { - // Remove '/' - let buf = directory.substring(1); - directory = buf; - // Replace '/' by '\' - buf = directory.replaceAll('/', os_sep); - directory = buf; - } - return directory; -} - -// Convert C-String to String -function uint8array_to_string(value: ArrayBuffer) : string { - return decoder.decode(value); -} - -// Load the library -function load_lib() { - if(lib_loaded) - return; - - // Check if the library file exist - if(!is_file_exist(lib_path)) { - let lib_path_cwd = get_current_module_path() + lib_name; - if(!is_file_exist(lib_path_cwd)) { - console.log('WebUI Error: File not found (' + lib_path + ') or (' + lib_path_cwd + ')'); - Deno.exit(1); - } - lib_path = lib_path_cwd; - } - - // Load the library - // FFI - webui_lib = Deno.dlopen( - lib_path, - { - webui_wait: { - parameters: [], - result: 'void', - nonblocking: true, - }, - webui_new_window: { - parameters: [], - result: 'pointer', - nonblocking: false, - }, - webui_new_server: { - parameters: ['pointer', 'buffer'], - result: 'pointer', - nonblocking: false, - }, - webui_show: { - parameters: ['pointer', 'buffer'], - result: 'i32', - nonblocking: false, - }, - webui_open: { - parameters: ['pointer', 'buffer', 'u32'], - result: 'i32', - nonblocking: false, - }, - webui_bind_interface: { - parameters: ['pointer', 'buffer', 'function'], - result: 'u32', - nonblocking: false, - }, - webui_is_app_running: { - parameters: [], - result: 'i32', - nonblocking: false, - }, - webui_exit: { - parameters: [], - result: 'void', - nonblocking: false, - }, - webui_script_interface: { - parameters: ['pointer', 'buffer', 'u32', 'buffer', 'buffer', 'buffer'], - result: 'void', - nonblocking: false, - }, - webui_clean_mem: { - parameters: ['pointer'], - result: 'void', - nonblocking: false, - }, - } as const, - ); - - // Make sure we don't load twice - lib_loaded = true; -} - -export function set_lib_path(path : string) { - lib_path = path; -} - -export function new_window() : Deno.Pointer { - load_lib(); - return webui_lib.symbols.webui_new_window(); -} - -export function new_server(win : Deno.Pointer = null, path : string) : string { - load_lib(); - const ptr = webui_lib.symbols.webui_new_server(win, string_to_uint8array(path)); - const dataView = new Deno.UnsafePointerView(ptr); - return String(dataView.getCString()); -} - -export function show(win : Deno.Pointer, content : string) : number { - load_lib(); - return webui_lib.symbols.webui_show(win, string_to_uint8array(content)); -} - -export function open(win, url : string, browser : number) : number { - load_lib(); - return webui_lib.symbols.webui_open(win, string_to_uint8array(url), browser); -} - -export function exit() { - load_lib(); - webui_lib.symbols.webui_exit(); -} - -// - - - - - - - - - - - - - - - - -// TODO: We should use the Non-blocking FFI to call -// `webui_lib.symbols.webui_wait()`. but it breaks -// the main thread. Lets do it in another way for now. - const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); - export async function wait() { - load_lib(); - while(true) { - await sleep(50); - if(!webui_lib.symbols.webui_is_app_running()) - break; - } - } -// - - - - - - - - - - - - - - - - - -export function run(win : number, javascript : js) { - load_lib(); - - // Buffers - const bool_buffer = new Uint8Array(1); // 1 byte bool - const integer_buffer = new Uint8Array(4); // 4 bytes integer - const pointer_buffer = new Uint8Array(8); // 8 bytes pointer (x64) - - // Execute the script - webui_lib.symbols.webui_script_interface(win, string_to_uint8array(javascript.Script), javascript.Timeout, bool_buffer, integer_buffer, pointer_buffer); - - let error : Boolean = false; - let length : Number = 0; - let data : String = ""; - - // Resolve boolean - if(bool_buffer[0] === 0) - error = false; - else - error = true; - - // Resolve number - length = Number(new Uint32Array(integer_buffer.buffer)[0]); - - // Resolve string - const charPointer = Deno.UnsafePointer.create(BigInt(new BigUint64Array(pointer_buffer.buffer)[0])); - data = String(Deno.UnsafePointerView.getCString(charPointer, 0)); - - // Update - javascript.Error = Boolean(error); - javascript.Length = Number(length); - javascript.Data = String(data); - - // Clean memory - webui_lib.symbols.webui_clean_mem(charPointer); -} - -export function bind(win : number, element : string, func : Function) : number { - load_lib(); - const callbackResource = new Deno.UnsafeCallback( - { - parameters: ['u32', 'u32', 'pointer', 'pointer', 'pointer', 'pointer'], - result: 'void', - } as const, - ( - param_element_id: Deno.u32, - param_window_id: Deno.u32, - param_element_name_ptr: Deno.Pointer, - param_win: Deno.Pointer, - param_data: Deno.Pointer, - param_response: Deno.PointerValue, - ) => { - - // Create elements - const element_id = parseInt(param_element_id); - const window_id = parseInt(param_window_id); - const element_name = new Deno.UnsafePointerView(param_element_name_ptr).getCString(); - const win = param_win; - const data = new Deno.UnsafePointerView(param_data).getCString(); - - // Create struct - const e: event = { - element_id: element_id, - window_id: window_id, - element_name: element_name, - win: win, - data: data, - }; - - // Call the user callback - const result = String(func(e)); - - // -- This code is by ChatGPT (AI) -------- - const resultBytes = encoder.encode(result); // Convert the string to bytes - const buf = new Uint8Array(resultBytes.length + 1); // Allocate a buffer to hold the string - buf.set(resultBytes); // Copy the bytes of the string into the buffer - buf[resultBytes.length] = 0; // Set the null terminator - // ---------------------------------------- - - // 8 bytes ie. pointer size on a 64 bit machine, use BigUin64Array to get a writable and suitable view into it. - const response_writable = new BigUint64Array(Deno.UnsafePointerView.getArrayBuffer(param_response, 8)); - - // Write our string response buffer address into the `param_response` memory slot. - response_writable[0] = BigInt(Deno.UnsafePointer.value(Deno.UnsafePointer.of(buf))); - }, - ); - - webui_lib.symbols.webui_bind_interface(win, string_to_uint8array(element), callbackResource.pointer); - return 0; -} diff --git a/examples/TypeScript/Deno/webui-2-x64.dll b/examples/TypeScript/Deno/webui-2-x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..4dcaca021069888615b4d1e511ba11ac35c0ec7c GIT binary patch literal 391680 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≫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 G{QW=Om1!dY literal 0 HcmV?d00001 diff --git a/examples/TypeScript/Deno/webui.ts b/examples/TypeScript/Deno/webui.ts new file mode 100644 index 00000000..581e0490 --- /dev/null +++ b/examples/TypeScript/Deno/webui.ts @@ -0,0 +1,287 @@ +/* + WebUI Library 2.2.0 + + http://webui.me + https://github.com/alifcommunity/webui + + Copyright (c) 2020-2023 Hassan Draga. + Licensed under GNU General Public License v2.0. + All rights reserved. + Canada. +*/ + +import { existsSync } from "https://deno.land/std/fs/mod.ts"; + +export const version = '2.2.0'; + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +let lib_loaded = false; +let webui_lib; + +export const browser = { + AnyBrowser: 0, // 0. Default recommended web browser + Chrome: 1, // 1. Google Chrome + Firefox: 2, // 2. Mozilla Firefox + Edge: 3, // 3. Microsoft Edge + Safari: 4, // 4. Apple Safari + Chromium: 5, // 5. The Chromium Project + Opera: 6, // 6. Opera Browser + Brave: 7, // 7. The Brave Browser + Vivaldi: 8, // 8. The Vivaldi Browser + Epic: 9, // 9. The Epic Browser + Yandex: 10, // 10. The Yandex Browser +}; + +export interface event { + win: Deno.Pointer, + type: number, + element: string, + data: string, +} + +export const js = { + timeout: 0, + BufferSize: (1024 * 8), + response: "", +} + +// Determine the library name based +// on the current operating system +let lib_name: string; +let os_sep: string; +if (Deno.build.os === 'windows') { + lib_name = 'webui-2-x64.dll'; + os_sep = '\\'; +} +else if (Deno.build.os === 'linux') { + lib_name = 'webui-2-x64.so'; + os_sep = '/'; +} +else { + lib_name = 'webui-2-x64.dyn'; + os_sep = '/'; +} + +// Full path to the library name +let lib_path = './' + lib_name; + +// Check if a file exist +function is_file_exist(path: string): boolean { + // TODO: existsSync() is deprecated + return existsSync(path); +} + +// Convert String to C-String +function string_to_uint8array(value: string): Uint8Array { + return encoder.encode(value + '\0'); +} + +// Get current folder path +function get_current_module_path(): string { + const __dirname = new URL('.', import.meta.url).pathname; + let directory = String(__dirname); + if (Deno.build.os === 'windows') { + // Remove '/' + let buf = directory.substring(1); + directory = buf; + // Replace '/' by '\' + buf = directory.replaceAll('/', os_sep); + directory = buf; + } + return directory; +} + +// Convert C-String to String +function uint8array_to_string(value: ArrayBuffer): string { + return decoder.decode(value); +} + +// Load the library +function load_lib() { + if(lib_loaded) + return; + + // Check if the library file exist + if(!is_file_exist(lib_path)) { + let lib_path_cwd = get_current_module_path() + lib_name; + if(!is_file_exist(lib_path_cwd)) { + console.log('WebUI Error: File not found (' + lib_path + ') or (' + lib_path_cwd + ')'); + Deno.exit(1); + } + lib_path = lib_path_cwd; + } + + // Load the library + // FFI + webui_lib = Deno.dlopen( + lib_path, + { + webui_wait: { + // void webui_wait(void) + parameters: [], + result: 'void', + nonblocking: true, + }, + webui_interface_is_app_running: { + // bool webui_interface_is_app_running(void) + parameters: [], + result: 'i32', + nonblocking: false, + }, + webui_new_window: { + // void* webui_new_window(void) + parameters: [], + result: 'pointer', + nonblocking: false, + }, + webui_show: { + // bool webui_show(void* window, const char* content) + parameters: ['pointer', 'buffer'], + result: 'i32', + nonblocking: false, + }, + webui_show_browser: { + // bool webui_show_browser(void* window, const char* content, unsigned int browser) + parameters: ['pointer', 'buffer', 'u32'], + result: 'i32', + nonblocking: false, + }, + webui_interface_bind: { + // unsigned int webui_interface_bind(void* window, const char* element, void (*func)(void*, int, char*, char*, char*)) + parameters: ['pointer', 'buffer', 'function'], + result: 'u32', + nonblocking: false, + }, + webui_script: { + // bool webui_script(void* window, const char* script, unsigned int timeout, char* buffer, size_t buffer_length) + parameters: ['pointer', 'buffer', 'u32', 'buffer', 'i32'], + result: 'i32', + nonblocking: false, + }, + webui_run: { + // bool webui_run(void* window, const char* script) + parameters: ['pointer', 'buffer'], + result: 'i32', + nonblocking: false, + }, + webui_interface_set_response: { + // void webui_interface_set_response(char* ptr, const char* response) + parameters: ['pointer', 'buffer'], + result: 'void', + nonblocking: false, + }, + webui_exit: { + // void webui_exit(void) + parameters: [], + result: 'void', + nonblocking: false, + } + } as const, + ); + + // Make sure we don't load twice + lib_loaded = true; +} + +export function set_lib_path(path: string) { + lib_path = path; +} + +export function new_window(): Deno.Pointer { + load_lib(); + return webui_lib.symbols.webui_new_window(); +} + +export function show(win: Deno.Pointer, content: string): number { + load_lib(); + return webui_lib.symbols.webui_show(win, string_to_uint8array(content)); +} + +export function show_browser(win: Deno.Pointer, content: string, browser: number): number { + load_lib(); + return webui_lib.symbols.webui_show_browser(win, string_to_uint8array(content), browser); +} + +export function exit() { + load_lib(); + webui_lib.symbols.webui_exit(); +} + +export function script(win: Deno.Pointer, js, script: string): boolean { + load_lib(); + + // Response Buffer + const size: number = (js.BufferSize > 0 ? js.BufferSize: (1024 * 8)); + const buffer = new Uint8Array(size); + + // Execute the script + const status = webui_lib.symbols.webui_script(win, string_to_uint8array(script), js.timeout, buffer, size); + + // Update + js.response = String(uint8array_to_string(buffer)); + + return Boolean(status); +} + +export function run(win: Deno.Pointer, script: string): boolean { + load_lib(); + + // Execute the script + const status = webui_lib.symbols.webui_run(win, string_to_uint8array(script)); + + return Boolean(status); +} + +export function bind(win: Deno.Pointer, element: string, func: Function) { + load_lib(); + const callbackResource = new Deno.UnsafeCallback( + { + parameters: ['pointer', 'u32', 'pointer', 'pointer', 'pointer'], + result: 'void', + } as const, + ( + param_window: Deno.Pointer, + param_type: Deno.u32, + param_element: Deno.Pointer, + param_data: Deno.Pointer, + param_response: Deno.Pointer + ) => { + + // Create elements + const win = param_window; + const type = parseInt(param_type); + const element = new Deno.UnsafePointerView(param_element).getCString(); + const data = new Deno.UnsafePointerView(param_data).getCString(); + + // Create struct + const e: event = { + win: win, + type: type, + element: element, + data: data, + }; + + // Call the user callback + const result = String(func(e)); + + // Send back the response + webui_lib.symbols.webui_interface_set_response(param_response, string_to_uint8array(result)); + }, + ); + + webui_lib.symbols.webui_interface_bind(win, string_to_uint8array(element), callbackResource.pointer); +} + +// TODO: We should use the Non-blocking FFI to call +// `webui_lib.symbols.webui_wait()`. but it breaks +// the main thread. Lets do it in another way for now. +const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); +export async function wait() { + load_lib(); + while(true) { + await sleep(10); + if(!webui_lib.symbols.webui_interface_is_app_running()) + break; + } +} diff --git a/examples/TypeScript/Nodejs/README.md b/examples/TypeScript/Nodejs/README.md index 30acec57..33a3bb98 100644 --- a/examples/TypeScript/Nodejs/README.md +++ b/examples/TypeScript/Nodejs/README.md @@ -1,4 +1,7 @@ -# WebUI Examples - Node.js +# WebUI Examples - Nodejs -WebUI can create a web server and use [Node.js](https://nodejs.org/) runtimes to parse `JavaScript` files. Another way is simply create a web server using Node.js and run a simple system command to run a basic WebUI application to open a window. +Unfortunately, Nodejs does not support FFI natively (only trough unofficial addon). We recommend using Deno instead. + + +The only way to use Nodejs with WebUI is to create a simple app in another language like C, C++, Nim, Go, Python, V, Zig, Rust... and use `webui_set_runtime()` to interpret the Nodejs files. diff --git a/examples/TypeScript/Nodejs/nodejs_server/README.md b/examples/TypeScript/Nodejs/nodejs_server/README.md deleted file mode 100644 index e9610a48..00000000 --- a/examples/TypeScript/Nodejs/nodejs_server/README.md +++ /dev/null @@ -1,18 +0,0 @@ -### Node.js Server - -This example shows how to create a web server using Node.js and run a simple system command to run a basic WebUI application to open a window. - - 1. Download and [Install Node.js](https://nodejs.org/en/download/) - 2. Build WebUI Library (*[instructions](https://github.com/alifcommunity/webui/tree/main/build)*) - 3. Build `window.c` using any C compiler (*[instructions](https://github.com/alifcommunity/webui/tree/main/examples/C)*) - 3. Run `node server.js` - -Folder structure example (*Windows*) - - [My Folder] - * node.exe (if not installed) - * window.exe - * server.js - * file1.js - * file2.js - * ... diff --git a/examples/TypeScript/Nodejs/nodejs_server/server.js b/examples/TypeScript/Nodejs/nodejs_server/server.js deleted file mode 100644 index ed274859..00000000 --- a/examples/TypeScript/Nodejs/nodejs_server/server.js +++ /dev/null @@ -1,30 +0,0 @@ - -// Modules -const http = require('http'); - -// Config -const port = 8080; -const url = "http://localhost:" + 8080; - -// Server Listener -const requestListener = function (req, res) { - - res.writeHead(200); - res.end('Hello, World!\nNode.js will automatically stop when you close this window.\nNo need for Ctrl + D!'); -} - -// Create a web server using Nodejs -const server = http.createServer(requestListener); -server.listen(port); - -// Run the WebUI example application to open a new window -const { spawn } = require("child_process"); -const ls = spawn("window", [url]); -ls.on('error', (error) => { - console.log('Failed to start the window'); - process.exit(); -}); -ls.on("close", code => { - console.log('Thank you.'); - process.exit(); -}); diff --git a/examples/TypeScript/Nodejs/nodejs_server/window.c b/examples/TypeScript/Nodejs/nodejs_server/window.c deleted file mode 100644 index 0a955b87..00000000 --- a/examples/TypeScript/Nodejs/nodejs_server/window.c +++ /dev/null @@ -1,27 +0,0 @@ - - - -#include "webui.h" - -int main(int argc, char* argv[]) { - - // argc should be exactly 2 - if(argc != 2) - return 1; - - // Get the Nodejs server url - const char *url = argv[1]; - - // Create a new window - webui_window_t* my_window; - my_window = webui_new_window(); - - // Show the window - if(!webui_open(my_window, url, webui.browser.chrome)) // Run the window on Chrome - webui_open(my_window, url, webui.browser.any); // If not, run on any other installed web browser - - // Wait until all windows get closed - webui_wait(); - - return 0; -} diff --git a/examples/TypeScript/Nodejs/webui_server/README.md b/examples/TypeScript/Nodejs/webui_server/README.md deleted file mode 100644 index 142e8eb5..00000000 --- a/examples/TypeScript/Nodejs/webui_server/README.md +++ /dev/null @@ -1,18 +0,0 @@ -### WebUI Server - -This example shows how to create a WebUI web server and use Node.js runtimes to parse JavaScript files. - - 1. Download and [Install Node.js](https://nodejs.org/en/download/) - 2. Build WebUI Library (*[instructions](https://github.com/alifcommunity/webui/tree/main/build)*) - 3. Build `example.c` using any C compiler (*[instructions](https://github.com/alifcommunity/webui/tree/main/examples/C)*) - -Folder structure example (*Windows*) - - [My Folder] - * node.exe (if not installed) - * example.exe - * index.js or index.html - * style.css - * file1.js - * file2.js - * ... diff --git a/examples/TypeScript/Nodejs/webui_server/example.c b/examples/TypeScript/Nodejs/webui_server/example.c deleted file mode 100644 index 1fe85ea8..00000000 --- a/examples/TypeScript/Nodejs/webui_server/example.c +++ /dev/null @@ -1,34 +0,0 @@ - - - -#include "webui.h" - -int main() { - - // Create a new window - webui_window_t* my_window; - my_window = webui_new_window(); - - // Chose your preferable runtime for .js files - // Deno: webui.runtime.deno - // Node.js: webui.runtime.nodejs - webui_script_runtime(my_window, webui.runtime.nodejs); - - // Create a new web server using WebUI - const char* url = webui_new_server(my_window, ""); - - // Show the window - if(!webui_open(my_window, url, webui.browser.chrome)) // Run the window on Chrome - webui_open(my_window, url, webui.browser.any); // If not, run on any other installed web browser - - // Wait until all windows get closed - webui_wait(); - - return 0; -} - -#if defined(_MSC_VER) - int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { - main(); - } -#endif diff --git a/examples/TypeScript/Nodejs/webui_server/index.js b/examples/TypeScript/Nodejs/webui_server/index.js deleted file mode 100644 index fa3e1df2..00000000 --- a/examples/TypeScript/Nodejs/webui_server/index.js +++ /dev/null @@ -1,6 +0,0 @@ - -var MyModule = require('./my_module'); - -console.log( - "Welcome!, You are using a WebUI server.\nToday is " + MyModule.date_time() -); diff --git a/examples/TypeScript/Nodejs/webui_server/my_module.js b/examples/TypeScript/Nodejs/webui_server/my_module.js deleted file mode 100644 index 2bf3972f..00000000 --- a/examples/TypeScript/Nodejs/webui_server/my_module.js +++ /dev/null @@ -1,5 +0,0 @@ - -exports.date_time = function () { - - return Date(); -}; diff --git a/examples/Zig/hello_world/src/main.zig b/examples/Zig/hello_world/src/main.zig index cdfb9116..098762ac 100644 --- a/examples/Zig/hello_world/src/main.zig +++ b/examples/Zig/hello_world/src/main.zig @@ -65,13 +65,13 @@ export fn check_the_password(e_opt: ?*c.webui_event_t) callconv(.C) void { c.webui_script(e.window, &js); // Check if there is a JavaScript error - if (js.result.@"error") { - std.log.err("JavaScript Error: {s}\n", .{js.result.data}); + if (js.@"error") { + std.log.err("JavaScript Error: {s}\n", .{js.data}); return; } // Get the password - const password = std.mem.span(js.result.data); + const password = std.mem.span(js.data); std.log.info("Password: {s}", .{password}); // Check the password diff --git a/examples/Zig/serve_folder/src/main.zig b/examples/Zig/serve_folder/src/main.zig index 1816530b..e50d2638 100644 --- a/examples/Zig/serve_folder/src/main.zig +++ b/examples/Zig/serve_folder/src/main.zig @@ -1,4 +1,4 @@ -// WebUI Library 2.1.1 +// WebUI Library 2.2.0 // Serve a Folder Example pub fn main() void { diff --git a/include/webui.h b/include/webui.h index 4cb043e1..07b08828 100644 --- a/include/webui.h +++ b/include/webui.h @@ -1,46 +1,29 @@ /* - WebUI Library 2.1.1 - - http://webui.me - https://github.com/alifcommunity/webui - - Copyright (c) 2020-2023 Hassan Draga. - Licensed under GNU General Public License v2.0. - All rights reserved. - Canada. + WebUI Library 2.2.0 + http://webui.me + https://github.com/alifcommunity/webui + Copyright (c) 2020-2023 Hassan Draga. + Licensed under GNU General Public License v2.0. + All rights reserved. + Canada. */ #ifndef _WEBUI_H #define _WEBUI_H +#define WEBUI_VERSION "2.2.0" + +// Dynamic Library Exports #if defined(_MSC_VER) || defined(__TINYC__) - #define EXPORT __declspec(dllexport) + #ifndef WEBUI_EXPORT + #define WEBUI_EXPORT __declspec(dllexport) + #endif #else - #define EXPORT extern + #ifndef WEBUI_EXPORT + #define WEBUI_EXPORT extern + #endif #endif -#define WEBUI_VERSION "2.1.1" // Version -#define WEBUI_HEADER_SIGNATURE 0xFF // All packets should start with this 8bit -#define WEBUI_HEADER_JS 0xFE // Javascript result in frontend -#define WEBUI_HEADER_CLICK 0xFD // Click event -#define WEBUI_HEADER_SWITCH 0xFC // Frontend refresh -#define WEBUI_HEADER_CLOSE 0xFB // Close window -#define WEBUI_HEADER_CALL_FUNC 0xFA // Call a backend function -#define WEBUI_MAX_ARRAY (1024) // Max threads, servers, windows, pointers.. -#define WEBUI_MIN_PORT (10000) // Minimum socket port -#define WEBUI_MAX_PORT (65500) // Should be less than 65535 -#define WEBUI_MAX_BUF (1024000) // 1024 Kb max dynamic memory allocation -#define WEBUI_DEFAULT_PATH "." // Default root path -#define WEBUI_DEF_TIMEOUT (8) // Default startup timeout in seconds - -#define WEBUI_EVENT_CONNECTED (1) // Window connected -#define WEBUI_EVENT_MULTI_CONNECTION (2) // Multi clients connected -#define WEBUI_EVENT_UNWANTED_CONNECTION (3) // Unwanted client connected -#define WEBUI_EVENT_DISCONNECTED (4) // Window disconnected -#define WEBUI_EVENT_MOUSE_CLICK (5) // Mouse Click -#define WEBUI_EVENT_NAVIGATION (6) // The window URL changed -#define WEBUI_EVENT_CALLBACK (7) // Function call - // -- C STD --------------------------- #include #include @@ -63,11 +46,9 @@ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif - // #include // Fix _WIN32_WINNT warning #include #include #include - // #include #include #include #include @@ -77,24 +58,27 @@ #define WEBUI_PCLOSE _pclose #define WEBUI_MAX_PATH MAX_PATH #endif + // -- Linux --------------------------- #ifdef __linux__ - #include // POSIX threading + #include #include #include #include #include #include #include + #include #define WEBUI_GET_CURRENT_DIR getcwd #define WEBUI_FILE_EXIST access #define WEBUI_POPEN popen #define WEBUI_PCLOSE pclose #define WEBUI_MAX_PATH PATH_MAX #endif + // -- Apple --------------------------- #ifdef __APPLE__ - #include // POSIX threading + #include #include #include #include @@ -102,6 +86,7 @@ #include #include #include // PATH_MAX + #include #define WEBUI_GET_CURRENT_DIR getcwd #define WEBUI_FILE_EXIST access #define WEBUI_POPEN popen @@ -109,232 +94,96 @@ #define WEBUI_MAX_PATH PATH_MAX #endif +// -- Enums --------------------------- +enum webui_browsers { + AnyBrowser = 0, // 0. Default recommended web browser + Chrome, // 1. Google Chrome + Firefox, // 2. Mozilla Firefox + Edge, // 3. Microsoft Edge + Safari, // 4. Apple Safari + Chromium, // 5. The Chromium Project + Opera, // 6. Opera Browser + Brave, // 7. The Brave Browser + Vivaldi, // 8. The Vivaldi Browser + Epic, // 9. The Epic Browser + Yandex, // 10. The Yandex Browser +}; + +enum webui_runtimes { + None = 0, // 0. Prevent WebUI from using any runtime for .js and .ts files + Deno, // 1. Use Deno runtime for .js and .ts files + NodeJS, // 2. Use Nodejs runtime for .js files +}; + +enum webui_events { + WEBUI_EVENT_DISCONNECTED = 0, // 0. Window disconnection event + WEBUI_EVENT_CONNECTED, // 1. Window connection event + WEBUI_EVENT_MULTI_CONNECTION, // 2. New window connection event + WEBUI_EVENT_UNWANTED_CONNECTION, // 3. New unwanted window connection event + WEBUI_EVENT_MOUSE_CLICK, // 4. Mouse click event + WEBUI_EVENT_NAVIGATION, // 5. Window navigation event + WEBUI_EVENT_CALLBACK, // 6. Function call event +}; + // -- Structs ------------------------- -struct webui_event_t; -typedef struct webui_timer_t { - struct timespec start; - struct timespec now; -} webui_timer_t; -typedef struct webui_window_core_t { - unsigned int window_number; - bool server_running; - bool connected; - bool server_handled; - bool multi_access; - bool server_root; - unsigned int server_port; - char* url; - const char* html; - const char* html_cpy; - const char* icon; - const char* icon_type; - unsigned int CurrentBrowser; - char* browser_path; - char* profile_path; - unsigned int connections; - unsigned int runtime; - bool detect_process_close; - bool has_events; - #ifdef _WIN32 - HANDLE server_thread; - #else - pthread_t server_thread; - #endif -} webui_window_core_t; -typedef struct webui_window_t { - webui_window_core_t core; - char* path; -} webui_window_t; typedef struct webui_event_t { - unsigned int window_id; - unsigned int element_id; - char* element_name; - webui_window_t* window; - void* data; - void* response; - int type; + void* window; // Pointer to the window object + unsigned int type; // Event type + char* element; // HTML element ID + char* data; // JavaScript data + char* response; // Callback response } webui_event_t; -typedef struct webui_javascript_result_t { - bool error; - unsigned int length; - const char* data; -} webui_javascript_result_t; -typedef struct webui_script_t { - const char* script; - unsigned int timeout; - webui_javascript_result_t result; -} webui_script_t; -typedef struct webui_cb_t { - webui_window_t* win; - char* webui_internal_id; - char* element_name; - void* data; - unsigned int data_len; - int event_type; -} webui_cb_t; -typedef struct webui_cmd_async_t { - webui_window_t* win; - char* cmd; -} webui_cmd_async_t; -typedef struct webui_custom_browser_t { - char* app; - char* arg; - bool auto_link; -} webui_custom_browser_t; -typedef struct webui_browser_t { - unsigned int any; // 0 - unsigned int chrome; // 1 - unsigned int firefox; // 2 - unsigned int edge; // 3 - unsigned int safari; // 4 - unsigned int chromium; // 5 - unsigned int opera; // 6 - unsigned int brave; // 7 - unsigned int vivaldi; // 8 - unsigned int epic; // 9 - unsigned int yandex; // 10 - unsigned int current; // x - unsigned int custom; // 99 -} webui_browser_t; -typedef struct webui_runtime_t { - unsigned int none; // 0 - unsigned int deno; // 1 - unsigned int nodejs; // 2 -} webui_runtime_t; -typedef struct webui_t { - unsigned int servers; - unsigned int connections; - unsigned int process; - webui_custom_browser_t *custom_browser; - bool wait_for_socket_window; - char* html_elements[WEBUI_MAX_ARRAY]; - unsigned int used_ports[WEBUI_MAX_ARRAY]; - unsigned int last_window; - unsigned int startup_timeout; - bool use_timeout; - bool timeout_extra; - bool exit_now; - const char* run_responses[WEBUI_MAX_ARRAY]; - bool run_done[WEBUI_MAX_ARRAY]; - bool run_error[WEBUI_MAX_ARRAY]; - unsigned int run_last_id; - struct mg_mgr* mg_mgrs[WEBUI_MAX_ARRAY]; - struct mg_connection* mg_connections[WEBUI_MAX_ARRAY]; - webui_browser_t browser; - webui_runtime_t runtime; - bool initialized; - void (*cb[WEBUI_MAX_ARRAY])(webui_event_t* e); - void (*cb_interface[WEBUI_MAX_ARRAY])(unsigned int, unsigned int, char*, webui_window_t*, char*, char**); - char* executable_path; - void *ptr_list[WEBUI_MAX_ARRAY]; - unsigned int ptr_position; - size_t ptr_size[WEBUI_MAX_ARRAY]; -} webui_t; // -- Definitions --------------------- -EXPORT webui_t webui; -// Create a new window object -EXPORT webui_window_t* webui_new_window(void); -// Bind a specific html element click event with a function -EXPORT unsigned int webui_bind(webui_window_t* win, const char* element, void (*func)(webui_event_t* e)); -// Show a window using a static HTML script, or a file name in the same working directory. If the window is already opened then it will be refreshed with the new content -EXPORT bool webui_show(webui_window_t* win, const char* content); -// Wait until all opened windows get closed -EXPORT void webui_wait(void); -// Close a specific window -EXPORT void webui_close(webui_window_t* win); -// Close all opened windows -EXPORT void webui_exit(void); +// Create a new webui window object. +WEBUI_EXPORT void* webui_new_window(void); +// Bind a specific html element click event with a function. Empty element means all events. +WEBUI_EXPORT unsigned int webui_bind(void* window, const char* element, void (*func)(webui_event_t* e)); +// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed. +WEBUI_EXPORT bool webui_show(void* window, const char* content); +// Same as webui_show(). But with a specific web browser. +WEBUI_EXPORT bool webui_show_browser(void* window, const char* content, unsigned int browser); +// Wait until all opened windows get closed. +WEBUI_EXPORT void webui_wait(void); +// Close a specific window. +WEBUI_EXPORT void webui_close(void* window); +// Close all opened windows. webui_wait() will break. +WEBUI_EXPORT void webui_exit(void); -// JavaScript -EXPORT void webui_script(webui_window_t* win, webui_script_t* script); -EXPORT void webui_script_cleanup(webui_script_t* script); -EXPORT void webui_script_runtime(webui_window_t* win, unsigned int runtime); -EXPORT long long int webui_get_int(webui_event_t* e); -EXPORT const char* webui_get_string(webui_event_t* e); -EXPORT bool webui_get_bool(webui_event_t* e); -EXPORT void webui_return_int(webui_event_t* e, long long int n); -EXPORT void webui_return_string(webui_event_t* e, char* s); -EXPORT void webui_return_bool(webui_event_t* e, bool b); +// -- Other --------------------------- +WEBUI_EXPORT bool webui_is_shown(void* window); +WEBUI_EXPORT void webui_set_timeout(unsigned int second); +WEBUI_EXPORT void webui_set_icon(void* window, const char* icon, const char* type); +WEBUI_EXPORT void webui_set_multi_access(void* window, bool status); -// Other -EXPORT const char* webui_new_server(webui_window_t* win, const char* path); -EXPORT bool webui_open(webui_window_t* win, const char* url, unsigned int browser); -EXPORT bool webui_is_any_window_running(void); -EXPORT bool webui_is_app_running(void); -EXPORT bool webui_is_shown(webui_window_t* win); -EXPORT void webui_set_timeout(unsigned int second); -EXPORT void webui_set_icon(webui_window_t* win, const char* icon_s, const char* type_s); -EXPORT void webui_multi_access(webui_window_t* win, bool status); -EXPORT void webui_clean_mem(void* p); +// -- JavaScript ---------------------- +// Quickly run a JavaScript. +WEBUI_EXPORT bool webui_run(void* window, const char* script); +// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response). +WEBUI_EXPORT bool webui_script(void* window, const char* script, unsigned int timeout, char* buffer, size_t buffer_length); +// Chose between Deno and Nodejs runtime for .js and .ts files. +WEBUI_EXPORT void webui_set_runtime(void* window, unsigned int runtime); +// Parse argument as integer. +WEBUI_EXPORT long long int webui_get_int(webui_event_t* e); +// Parse argument as string. +WEBUI_EXPORT const char* webui_get_string(webui_event_t* e); +// Parse argument as boolean. +WEBUI_EXPORT bool webui_get_bool(webui_event_t* e); +// Return the response to JavaScript as integer. +WEBUI_EXPORT void webui_return_int(webui_event_t* e, long long int n); +// Return the response to JavaScript as string. +WEBUI_EXPORT void webui_return_string(webui_event_t* e, char* s); +// Return the response to JavaScript as boolean. +WEBUI_EXPORT void webui_return_bool(webui_event_t* e, bool b); // -- Interface ----------------------- -// Used by other languages to create WebUI wrappers -typedef struct webui_script_interface_t { - char* script; - unsigned int timeout; - bool error; - unsigned int length; - const char* data; -} webui_script_interface_t; -EXPORT unsigned int webui_bind_interface(webui_window_t* win, const char* element, void (*func)(unsigned int, unsigned int, char*, webui_window_t*, char*, char**)); -EXPORT void webui_script_interface(webui_window_t* win, const char* script, unsigned int timeout, bool* error, unsigned int* length, char** data); -EXPORT void webui_script_interface_struct(webui_window_t* win, webui_script_interface_t* js_int); - -// Core -EXPORT void _webui_init(void); -EXPORT unsigned int _webui_get_cb_index(char* webui_internal_id); -EXPORT unsigned int _webui_set_cb_index(char* webui_internal_id); -EXPORT unsigned int _webui_get_free_port(void); -EXPORT unsigned int _webui_get_new_window_number(void); -EXPORT void _webui_wait_for_startup(void); -EXPORT void _webui_free_port(unsigned int port); -EXPORT void _webui_set_custom_browser(webui_custom_browser_t* p); -EXPORT char* _webui_get_current_path(void); -EXPORT void _webui_window_receive(webui_window_t* win, const char* packet, size_t len); -EXPORT void _webui_window_send(webui_window_t* win, char* packet, size_t packets_size); -EXPORT void _webui_window_event(webui_window_t* win, char* element_id, char* element, void* data, unsigned int data_len, int event_type); -EXPORT unsigned int _webui_window_get_number(webui_window_t* win); -EXPORT void _webui_window_open(webui_window_t* win, char* link, unsigned int browser); -EXPORT int _webui_cmd_sync(char* cmd, bool show); -EXPORT int _webui_cmd_async(char* cmd, bool show); -EXPORT int _webui_run_browser(webui_window_t* win, char* cmd); -EXPORT void _webui_clean(void); -EXPORT bool _webui_browser_exist(webui_window_t* win, unsigned int browser); -EXPORT const char* _webui_browser_get_temp_path(unsigned int browser); -EXPORT bool _webui_folder_exist(char* folder); -EXPORT bool _webui_browser_create_profile_folder(webui_window_t* win, unsigned int browser); -EXPORT bool _webui_browser_start_chrome(webui_window_t* win, const char* address); -EXPORT bool _webui_browser_start_edge(webui_window_t* win, const char* address); -EXPORT bool _webui_browser_start_epic(webui_window_t* win, const char* address); -EXPORT bool _webui_browser_start_vivaldi(webui_window_t* win, const char* address); -EXPORT bool _webui_browser_start_brave(webui_window_t* win, const char* address); -EXPORT bool _webui_browser_start_firefox(webui_window_t* win, const char* address); -EXPORT bool _webui_browser_start_yandex(webui_window_t* win, const char* address); -EXPORT bool _webui_browser_start_chromium(webui_window_t* win, const char* address); -EXPORT bool _webui_browser_start_custom(webui_window_t* win, const char* address); -EXPORT bool _webui_browser_start(webui_window_t* win, const char* address, unsigned int browser); -EXPORT long _webui_timer_diff(struct timespec *start, struct timespec *end); -EXPORT void _webui_timer_start(webui_timer_t* t); -EXPORT bool _webui_timer_is_end(webui_timer_t* t, unsigned int ms); -EXPORT void _webui_timer_clock_gettime(struct timespec *spec); -EXPORT bool _webui_set_root_folder(webui_window_t* win, const char* path); -EXPORT void _webui_wait_process(webui_window_t* win, bool status); -EXPORT const char* _webui_generate_js_bridge(webui_window_t* win); -EXPORT void _webui_print_hex(const char* data, size_t len); -EXPORT void _webui_free_mem(void **p); -EXPORT bool _webui_file_exist_mg(void *ev_data); -EXPORT bool _webui_file_exist(char* file); -EXPORT void _webui_free_all_mem(void); -EXPORT bool _webui_show_window(webui_window_t* win, const char* html, unsigned int browser); -EXPORT char* _webui_generate_internal_id(webui_window_t* win, const char* element); -#ifdef _WIN32 - EXPORT DWORD WINAPI _webui_cb(LPVOID _arg); - EXPORT DWORD WINAPI _webui_run_browser_task(LPVOID _arg); - EXPORT int _webui_system_win32(char* cmd, bool show); -#else - EXPORT void* _webui_cb(void* _arg); - EXPORT void* _webui_run_browser_task(void* _arg); -#endif +// Bind a specific html element click event with a function. Empty element means all events. This replace webui_bind(). +WEBUI_EXPORT unsigned int webui_interface_bind(void* window, const char* element, void (*func)(void*, unsigned int, char*, char*, char*)); +// When using `webui_interface_bind()` you need this function to easily set your response. +WEBUI_EXPORT void webui_interface_set_response(char* ptr, const char* response); +// Check if the app still running or not. This replace webui_wait(). +WEBUI_EXPORT bool webui_interface_is_app_running(void); +// Get window unique ID +WEBUI_EXPORT unsigned int webui_interface_get_window_id(void* window); #endif /* _WEBUI_H */ diff --git a/scripts/build.bat b/scripts/build.bat new file mode 100644 index 00000000..56e3c987 --- /dev/null +++ b/scripts/build.bat @@ -0,0 +1,70 @@ +@echo off + +set ARG1=%1 +IF "%ARG1%"=="debug" ( + set MSVC_CMD=nmake debug + set GCC_CMD=mingw32-make debug +) else ( + set MSVC_CMD=nmake + set GCC_CMD=mingw32-make +) + +echo. +echo - - - - - - - - - - - - - - - - - - - - - - - +echo WebUI v2.2.0 Build Script +echo - - - - - - - - - - - - - - - - - - - - - - - +echo. +echo OS: Micsoroft Windows x64 +echo Compiler: Microsoft Visual C + +Set RootPath=%CD%\..\ +cd "%RootPath%" + +echo. +echo - - [Build] - - - - - - - - - - - - - - - - - + +REM Build WebUI Library using MSVC +cd "%RootPath%" +cd "build\Windows\MSVC" +%MSVC_CMD% + +REM Build WebUI Library using GCC +cd "%RootPath%" +cd "build\Windows\GCC" +%GCC_CMD% + +echo. +echo - - [Copy] - - - - - - - - - - - - - - - - - +echo. + +cd "%RootPath%" + +REM Golang +copy /Y "build\Windows\GCC\libwebui-2-static-x64.a" "examples\Go\hello_world\webui\libwebui-2-static-x64.a" +copy /Y "include\webui.h" "examples\Go\hello_world\webui\webui.h" + +REM Deno +copy /Y "build\Windows\MSVC\webui-2-x64.dll" "examples\TypeScript\Deno\webui-2-x64.dll" + +REM Python +copy /Y "build\Windows\MSVC\webui-2-x64.dll" "examples\Python\PyPI\Package\src\webui\webui-2-x64.dll" + +echo. +IF "%ARG1%"=="" ( + + echo - - [Clean] - - - - - - - - - - - - - - - - - + + DEL /Q /F /S "*.exe" >nul 2>&1 + DEL /Q /F /S "*.o" >nul 2>&1 + DEL /Q /F /S "*.a" >nul 2>&1 + DEL /Q /F /S "*.def" >nul 2>&1 + DEL /Q /F /S "*.exp" >nul 2>&1 + DEL /Q /F /S "*.pdb" >nul 2>&1 + DEL /Q /F /S "*.ilk" >nul 2>&1 + DEL /Q /F /S "*.obj" >nul 2>&1 + DEL /Q /F /S "*.res" >nul 2>&1 + DEL /Q /F /S "*.bak" >nul 2>&1 + DEL /Q /F /S "*.DS_Store" >nul 2>&1 +) + +cd "scripts" diff --git a/scripts/clean_all.bat b/scripts/clean_all.bat deleted file mode 100644 index 5c130268..00000000 --- a/scripts/clean_all.bat +++ /dev/null @@ -1,22 +0,0 @@ -@echo off - -Set RootPath=%CD%\..\ -cd "%RootPath%" - -echo. -echo Clean all... - -DEL /Q /F /S "*.exe" >nul 2>&1 -DEL /Q /F /S "*.dll" >nul 2>&1 -DEL /Q /F /S "*.lib" >nul 2>&1 -DEL /Q /F /S "*.o" >nul 2>&1 -DEL /Q /F /S "*.a" >nul 2>&1 -DEL /Q /F /S "*.def" >nul 2>&1 -DEL /Q /F /S "*.exp" >nul 2>&1 -DEL /Q /F /S "*.pdb" >nul 2>&1 -DEL /Q /F /S "*.ilk" >nul 2>&1 -DEL /Q /F /S "*.obj" >nul 2>&1 -DEL /Q /F /S "*.res" >nul 2>&1 -DEL /Q /F /S "*.bak" >nul 2>&1 - -DEL /Q /F /S "*.DS_Store" >nul 2>&1 diff --git a/src/mongoose.c b/src/mongoose.c index f18d1c4f..ee65b18d 100644 --- a/src/mongoose.c +++ b/src/mongoose.c @@ -117,6 +117,7 @@ int mg_base64_decode(const char *src, int n, char *dst) { + struct dns_data { struct dns_data *next; struct mg_connection *c; @@ -411,9 +412,7 @@ void mg_error(struct mg_connection *c, const char *fmt, ...) { -static bool is_digit(int c) { - return c >= '0' && c <= '9'; -} +static bool is_digit(int c) { return c >= '0' && c <= '9'; } static int addexp(char *buf, int e, int sign) { int n = 0; @@ -446,7 +445,7 @@ static int xisnan(double x) { 0x7ff00000; } -static size_t mg_dtoa(char *dst, size_t dstlen, double d, int width) { +static size_t mg_dtoa(char *dst, size_t dstlen, double d, int width, bool tz) { char buf[40]; int i, s = 0, n = 0, e = 0; double t, mul, saved; @@ -468,13 +467,13 @@ static size_t mg_dtoa(char *dst, size_t dstlen, double d, int width) { while (d < 1.0 && d / mul < 1.0) mul /= 10.0, e--; // printf(" --> %g %d %g %g\n", saved, e, t, mul); - if (e >= width) { - n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width); + if (e >= width && width > 1) { + n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz); // printf(" --> %.*g %d [%.*s]\n", 10, d / t, e, n, buf); n += addexp(buf + s + n, e, '+'); return mg_snprintf(dst, dstlen, "%.*s", n, buf); - } else if (e <= -width) { - n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width); + } else if (e <= -width && width > 1) { + n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz); // printf(" --> %.*g %d [%.*s]\n", 10, d / mul, e, n, buf); n += addexp(buf + s + n, -e, '-'); return mg_snprintf(dst, dstlen, "%.*s", n, buf); @@ -497,8 +496,8 @@ static size_t mg_dtoa(char *dst, size_t dstlen, double d, int width) { t /= 10.0; } } - while (n > 0 && buf[s + n - 1] == '0') n--; // Trim trailing zeros - if (n > 0 && buf[s + n - 1] == '.') n--; // Trim trailing dot + while (tz && n > 0 && buf[s + n - 1] == '0') n--; // Trim trailing zeroes + if (n > 0 && buf[s + n - 1] == '.') n--; // Trim trailing dot n += s; if (n >= (int) sizeof(buf)) n = (int) sizeof(buf) - 1; buf[n] = '\0'; @@ -542,9 +541,7 @@ static char mg_esc(int c, bool esc) { return 0; } -static char mg_escape(int c) { - return mg_esc(c, true); -} +static char mg_escape(int c) { return mg_esc(c, true); } static size_t qcpy(void (*out)(char, void *), void *ptr, char *buf, size_t len) { @@ -631,7 +628,7 @@ size_t mg_vxprintf(void (*out)(char, void *), void *param, const char *fmt, if (c == 'g' || c == 'f') { double v = va_arg(*ap, double); if (pr == ~0U) pr = 6; - k = mg_dtoa(tmp, sizeof(tmp), v, (int) pr); + k = mg_dtoa(tmp, sizeof(tmp), v, (int) pr, c == 'g'); } else if (is_long == 2) { int64_t v = va_arg(*ap, int64_t); k = mg_lld(tmp, v, s, h); @@ -1309,6 +1306,7 @@ struct mg_fs mg_fs_posix = {p_stat, p_list, p_open, p_close, p_read, + // Chunk deletion marker is the MSB in the "processed" counter #define MG_DMARK ((size_t) 1 << (sizeof(size_t) * 8 - 1)) @@ -3247,6 +3245,7 @@ struct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url, + size_t mg_vprintf(struct mg_connection *c, const char *fmt, va_list *ap) { size_t old = c->send.len; mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap); @@ -3495,7 +3494,6 @@ void mg_mgr_init(struct mg_mgr *mgr) { - size_t mg_queue_vprintf(struct mg_queue *q, const char *fmt, va_list *ap) { size_t len = mg_snprintf(NULL, 0, fmt, ap); char *buf; @@ -4107,6 +4105,7 @@ struct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url, + #if MG_ENABLE_SOCKET #ifndef closesocket @@ -4669,7 +4668,7 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { } } #else - struct timeval tv = {ms / 1000, (ms % 1000) * 1000}, tv_zero = {0, 0}; + struct timeval tv = {ms / 1000, (ms % 1000) * 1000}, tv_zero = {0, 0}, *tvp; struct mg_connection *c; fd_set rset, wset, eset; MG_SOCKET_TYPE maxfd = 0; @@ -4678,17 +4677,18 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&eset); + tvp = ms < 0 ? NULL : &tv; for (c = mgr->conns; c != NULL; c = c->next) { c->is_readable = c->is_writable = 0; if (skip_iotest(c)) continue; FD_SET(FD(c), &eset); if (can_read(c)) FD_SET(FD(c), &rset); if (can_write(c)) FD_SET(FD(c), &wset); - if (mg_tls_pending(c) > 0) tv = tv_zero; + if (mg_tls_pending(c) > 0) tvp = &tv_zero; if (FD(c) > maxfd) maxfd = FD(c); } - if ((rc = select((int) maxfd + 1, &rset, &wset, &eset, &tv)) < 0) { + if ((rc = select((int) maxfd + 1, &rset, &wset, &eset, tvp)) < 0) { #if MG_ARCH == MG_ARCH_WIN32 if (maxfd == 0) Sleep(ms); // On Windows, select fails if no sockets #else @@ -5779,6 +5779,7 @@ uint64_t mg_millis(void) { + struct ws_msg { uint8_t flags; size_t header_len; diff --git a/include/mongoose.h b/src/mongoose.h similarity index 99% rename from include/mongoose.h rename to src/mongoose.h index 00f9910b..ee7e8287 100644 --- a/include/mongoose.h +++ b/src/mongoose.h @@ -862,14 +862,17 @@ void mg_queue_del(struct mg_queue *, size_t); // Delete oldest message - - typedef void (*mg_pfn_t)(char, void *); // Output function typedef size_t (*mg_pm_t)(mg_pfn_t, void *, va_list *); // %M printer size_t mg_vxprintf(void (*)(char, void *), void *, const char *fmt, va_list *); size_t mg_xprintf(void (*fn)(char, void *), void *, const char *fmt, ...); + + + + + // Convenience wrappers around mg_xprintf size_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap); size_t mg_snprintf(char *, size_t, const char *fmt, ...); @@ -989,7 +992,6 @@ bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...); - #if MG_ENABLE_ASSERT #include #elif !defined(assert) diff --git a/src/webui.c b/src/webui.c index 80422763..8a87b004 100644 --- a/src/webui.c +++ b/src/webui.c @@ -1,36 +1,30 @@ /* - WebUI Library 2.1.1 - - http://webui.me - https://github.com/alifcommunity/webui - - Copyright (c) 2020-2023 Hassan Draga. - Licensed under GNU General Public License v2.0. - All rights reserved. - Canada. + WebUI Library 2.2.0 + http://_webui_core.me + https://github.com/alifcommunity/webui + Copyright (c) 2020-2023 Hassan Draga. + Licensed under GNU General Public License v2.0. + All rights reserved. + Canada. */ // -- Third-party --------------------- #include "mongoose.h" // -- WebUI --------------------------- -#include "webui.h" - -// -- Log ----------------------------- -// #define WEBUI_LOG +#include "webui_core.h" // -- Heap ---------------------------- -webui_t webui; +static _webui_core_t _webui_core; +// -- WebUI JS-Bridge --------- +// This is a uncompressed version to make the debugging +// more easy in the browser using the builtin dev-tools #ifdef WEBUI_LOG #define WEBUI_JS_LOG "true" #else #define WEBUI_JS_LOG "false" #endif - -// -- WebUI JS-Bridge --------- -// This is a uncompressed version to make the debugging -// more easy in the browser using the builtin dev-tools static const char* webui_javascript_bridge = "var _webui_log = " WEBUI_JS_LOG "; \n" "var _webui_ws; \n" @@ -39,12 +33,13 @@ static const char* webui_javascript_bridge = "var _webui_close_reason = 0; \n" "var _webui_close_value; \n" "var _webui_has_events = false; \n" -"const _WEBUI_SIGNATURE = 255; \n" +"const _WEBUI_SIGNATURE = 221; \n" "const _WEBUI_JS = 254; \n" -"const _WEBUI_CLICK = 253; \n" -"const _WEBUI_SWITCH = 252; \n" -"const _WEBUI_CLOSE = 251; \n" -"const _WEBUI_FUNCTION = 250; \n" +"const _WEBUI_JS_QUICK = 253; \n" +"const _WEBUI_CLICK = 252; \n" +"const _WEBUI_SWITCH = 251; \n" +"const _WEBUI_CLOSE = 250; \n" +"const _WEBUI_FUNCTION = 249; \n" "function _webui_close(reason = 0, value = 0) { \n" " _webui_send_event_navigation(value); \n" " _webui_ws_status = false; \n" @@ -58,7 +53,7 @@ static const char* webui_javascript_bridge = "function _webui_start() { \n" " if('WebSocket' in window) { \n" " if(_webui_bind_list.includes(_webui_win_num + '/')) _webui_has_events = true; \n" -" _webui_ws = new WebSocket('ws://localhost:' + _webui_port + '/_ws'); \n" +" _webui_ws = new WebSocket('ws://localhost:' + _webui_port + '/_webui_ws_connect'); \n" " _webui_ws.binaryType = 'arraybuffer'; \n" " _webui_ws.onopen = function () { \n" " _webui_ws.binaryType = 'arraybuffer'; \n" @@ -102,13 +97,14 @@ static const char* webui_javascript_bridge = " _webui_close(_WEBUI_SWITCH, data8utf8); \n" " } else if(buffer8[1] === _WEBUI_CLOSE) { \n" " _webui_close(_WEBUI_CLOSE); \n" -" } else if(buffer8[1] === _WEBUI_JS) { \n" +" } else if(buffer8[1] === _WEBUI_JS_QUICK || buffer8[1] === _WEBUI_JS) { \n" " data8utf8 = data8utf8.replace(/(?:\\r\\n|\\r|\\n)/g, \"\\\\n\"); \n" " if(_webui_log) \n" " console.log('WebUI -> JS [' + data8utf8 + ']'); \n" " var FunReturn = 'undefined'; \n" " var FunError = false; \n" " try { FunReturn = eval('(() => {' + data8utf8 + '})()'); } catch (e) { FunError = true; FunReturn = e.message } \n" +" if(buffer8[1] === _WEBUI_JS_QUICK) return; \n" " if(typeof FunReturn === 'undefined' || FunReturn === undefined) FunReturn = 'undefined'; \n" " if(_webui_log && !FunError) console.log('WebUI -> JS -> Return [' + FunReturn + ']'); \n" " if(_webui_log && FunError) console.log('WebUI -> JS -> Error [' + FunReturn + ']'); \n" @@ -117,8 +113,8 @@ static const char* webui_javascript_bridge = " Return8[0] = _WEBUI_SIGNATURE; \n" " Return8[1] = _WEBUI_JS; \n" " Return8[2] = buffer8[2]; \n" -" if(FunError) Return8[3] = 1; \n" -" else Return8[3] = 0; \n" +" if(FunError) Return8[3] = 0; \n" +" else Return8[3] = 1; \n" " var p = -1; \n" " for (i = 4; i < FunReturn8.length + 4; i++) Return8[i] = FunReturn8[++p]; \n" " if(_webui_ws_status) _webui_ws.send(Return8.buffer); \n" @@ -175,6 +171,8 @@ static const char* webui_javascript_bridge = "function webui_fn(fn, value) { \n" " if(!_webui_has_events && !_webui_bind_list.includes(_webui_win_num + '/' + fn)) \n" " return; \n" +" if(typeof value == 'undefined') \n" +" var value = ''; \n" " var data = ''; \n" " if(_webui_ws_status && fn !== '') { \n" " if(_webui_log) \n" @@ -207,7 +205,7 @@ static const char* webui_javascript_bridge = " } \n" "}); \n" "window.onbeforeunload = function () { \n" -" //_webui_ws.close(); \n" +" _webui_ws.close(); \n" "}; \n" "setTimeout(function () { \n" " if(!_webui_ws_status_once) { \n" @@ -230,10 +228,15 @@ static const char* webui_javascript_bridge = " _webui_close(_WEBUI_SWITCH, link); \n" " } \n" "}); \n" -"navigation.addEventListener('navigate', (event) => { \n" -" const url = new URL(event.destination.url); \n" -" _webui_send_event_navigation(url); \n" -"}); \n" +"if(typeof navigation !== 'undefined') { \n" +" navigation.addEventListener('navigate', (event) => { \n" +" const url = new URL(event.destination.url); \n" +" _webui_send_event_navigation(url); \n" +" }); \n" +"} \n" +"document.body.addEventListener('contextmenu', function(event){ event.preventDefault(); }); \n" +"var inputs = document.getElementsByTagName('input'); \n" +"for(var i = 0; i < inputs.length; i++){ inputs[i].addEventListener('contextmenu', function(event){ event.stopPropagation(); });} \n" "// Load \n" "window.addEventListener('load', _webui_start()); \n"; @@ -242,126 +245,707 @@ static const char* webui_html_served = "Access Denied static const char* webui_html_res_not_available = "Resource Not Available

⚠ Resource Not Available

The requested resource is not available.


WebUI v" WEBUI_VERSION ""; static const char* webui_deno_not_found = "Deno Not Found

⚠ Deno Not Found

Deno is not found on this system.
Please download it from https://github.com/denoland/deno/releases


WebUI v" WEBUI_VERSION ""; static const char* webui_nodejs_not_found = "Node.js Not Found

⚠ Node.js Not Found

Node.js is not found on this system.
Please download it from https://nodejs.org/en/download/


WebUI v" WEBUI_VERSION ""; -static const char* webui_def_icon = ""; -static const char* webui_def_icon_type = "image/svg+xml"; -static const char* webui_js_empty = "WEBUI_JS_EMPTY"; -static const char* webui_js_timeout = "WEBUI_JS_TIMEOUT"; +static const char* webui_def_icon = ""; +static const char* webui_def_icon_type = "Content-Type: image/svg+xml\r\n"; +static const char* webui_js_empty = "ERR_WEBUI_NO_SCRIPT_FOUND"; +static const char* webui_js_timeout = "ERR_WEBUI_TIMEOUT"; static const char* const webui_empty_string = ""; // In case the compiler optimization is disabled -#ifdef _WIN32 - static const char* webui_sep = "\\"; -#else - static const char* webui_sep = "/"; -#endif - -#define WEBUI_NON_EXIST_BROWSER (100) - // -- Functions ----------------------- -bool _webui_ptr_exist(void *p) { - +bool webui_run(void* window, const char* script) { + #ifdef WEBUI_LOG - // printf("[0] _webui_ptr_exist()... \n"); + printf("[User] webui_run([%s])... \n", script); #endif - if(p == NULL) + size_t js_len = strlen(script); + + if(js_len < 1) return false; - for(unsigned int i = 0; i < webui.ptr_position; i++) { + // Dereference + _webui_window_t* win = (_webui_window_t*)window; - if(webui.ptr_list[i] == p) + // Initializing pipe + unsigned char run_id = _webui_get_run_id(); + _webui_core.run_done[run_id] = false; + _webui_core.run_error[run_id] = false; + if((void *)_webui_core.run_responses[run_id] != NULL) + _webui_free_mem((void *)_webui_core.run_responses[run_id]); + + // Prepare the packet + size_t packet_len = 3 + js_len; // [header][js] + char* packet = (char*) _webui_malloc(packet_len); + packet[0] = WEBUI_HEADER_SIGNATURE; // Signature + packet[1] = WEBUI_HEADER_JS_QUICK; // Type + packet[2] = run_id; // ID + for(unsigned int i = 0; i < js_len; i++) // Data + packet[i + 3] = script[i]; + + // Send packets + _webui_window_send(win, packet, packet_len); + _webui_free_mem((void *)packet); + + return true; +} + +bool webui_script(void* window, const char* script, unsigned int timeout_second, char* buffer, size_t buffer_length) { + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + #ifdef WEBUI_LOG + printf("[User] webui_script()... \n", script); + printf("[User] webui_script() -> Script [%s] \n", script); + printf("[User] webui_script() -> Response Buffer @ 0x%p \n", buffer); + printf("[User] webui_script() -> Response Buffer Size %lld bytes \n", buffer_length); + #endif + + _webui_init(); + + // Initializing response buffer + if(buffer_length > 0) + memset(buffer, 0x00, buffer_length); + + size_t js_len = strlen(script); + + if(js_len < 1) { + + if(buffer != NULL && buffer_length > 1) + snprintf(buffer, buffer_length, "%s", webui_js_empty); + return false; + } + + // Initializing pipe + unsigned char run_id = _webui_get_run_id(); + _webui_core.run_done[run_id] = false; + _webui_core.run_error[run_id] = false; + if((void *)_webui_core.run_responses[run_id] != NULL) + _webui_free_mem((void *)_webui_core.run_responses[run_id]); + + // Prepare the packet + size_t packet_len = 3 + js_len; // [header][js] + char* packet = (char*) _webui_malloc(packet_len); + packet[0] = WEBUI_HEADER_SIGNATURE; // Signature + packet[1] = WEBUI_HEADER_JS; // Type + packet[2] = run_id; // ID + for(unsigned int i = 0; i < js_len; i++) // Data + packet[i + 3] = script[i]; + + // Send packets + _webui_window_send(win, packet, packet_len); + _webui_free_mem((void *)packet); + + // Wait for UI response + if(timeout_second < 1 || timeout_second > 86400) { + + // Wait forever + for(;;) { + + if(_webui_core.run_done[run_id]) + break; + + _webui_sleep(1); + } + } + else { + + // Using timeout + for(unsigned int n = 0; n <= (timeout_second * 1000); n++) { + + if(_webui_core.run_done[run_id]) + break; + + _webui_sleep(1); + } + } + + if(_webui_core.run_responses[run_id] != NULL) { + + #ifdef WEBUI_LOG + printf("[User] webui_script -> Response found [%s] \n", _webui_core.run_responses[run_id]); + #endif + + // Response found + if(buffer != NULL && buffer_length > 1) { + + // Copy response to the user's response buffer + size_t response_len = strlen(_webui_core.run_responses[run_id]); + size_t bytes_to_cpy = (response_len <= buffer_length ? response_len : buffer_length); + snprintf(buffer, bytes_to_cpy, "%s", _webui_core.run_responses[run_id]); + } + + _webui_free_mem((void *)_webui_core.run_responses[run_id]); + + return _webui_core.run_error[run_id]; + } + + return false; +} + +void* webui_new_window(void) { + + #ifdef WEBUI_LOG + printf("[User] webui_new_window()... \n"); + #endif + + _webui_init(); + + _webui_window_t* win = (_webui_window_t*) _webui_malloc(sizeof(_webui_window_t)); + + // Initialisation + win->window_number = _webui_get_new_window_number(); + win->browser_path = (char*) _webui_malloc(WEBUI_MAX_PATH); + win->profile_path = (char*) _webui_malloc(WEBUI_MAX_PATH); + win->server_root_path = (char*) _webui_malloc(WEBUI_MAX_PATH); + sprintf(win->server_root_path, "%s", WEBUI_DEFAULT_PATH); + + #ifdef WEBUI_LOG + printf("[User] webui_new_window() -> New window @ 0x%p\n", win); + #endif + + return (void*)win; +} + +void webui_close(void* window) { + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + #ifdef WEBUI_LOG + printf("[User] webui_close()... \n"); + #endif + + _webui_init(); + + if(win->connected) { + + // Prepare packets + char* packet = (char*) _webui_malloc(4); + packet[0] = WEBUI_HEADER_SIGNATURE; // Signature + packet[1] = WEBUI_HEADER_CLOSE; // Type + packet[2] = 0; // ID + packet[3] = 0; // Data + + // Send packets + _webui_window_send(win, packet, 4); + _webui_free_mem((void *)packet); + } +} + +bool webui_is_shown(void* window) { + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + #ifdef WEBUI_LOG + printf("[User] webui_is_shown()... \n"); + #endif + + return win->connected; +} + +void webui_set_multi_access(void* window, bool status) { + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + #ifdef WEBUI_LOG + printf("[User] webui_set_multi_access([%d])... \n", status); + #endif + + win->multi_access = status; +} + +void webui_set_icon(void* window, const char* icon, const char* type) { + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + #ifdef WEBUI_LOG + printf("[User] webui_set_icon([%s], [%s])... \n", icon, type); + #endif + + win->icon = icon; + win->icon_type = type; +} + +bool webui_show(void* window, const char* content) { + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + #ifdef WEBUI_LOG + printf("[User] webui_show()... \n"); + #endif + + return _webui_show(win, content, AnyBrowser); +} + +bool webui_show_browser(void* window, const char* content, unsigned int browser) { + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + #ifdef WEBUI_LOG + printf("[User] webui_show_browser([%d])... \n", browser); + #endif + + return _webui_show(win, content, browser); +} + +unsigned int webui_bind(void* window, const char* element, void (*func)(webui_event_t* e)) { + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + #ifdef WEBUI_LOG + printf("[User] webui_bind([%s], [0x%p])... \n", element, func); + #endif + + _webui_init(); + + int len = 0; + if(_webui_is_empty(element)) + win->has_events = true; + else + len = strlen(element); + + // [win num][/][element] + char* webui_internal_id = _webui_malloc(3 + 1 + len); + sprintf(webui_internal_id, "%d/%s", win->window_number, element); + + unsigned int cb_index = _webui_get_cb_index(webui_internal_id); + + if(cb_index > 0) { + + // Replace a reference + _webui_core.cb[cb_index] = func; + + _webui_free_mem((void *)webui_internal_id); + } + else { + + // New reference + cb_index = _webui_set_cb_index(webui_internal_id); + + if(cb_index > 0) + _webui_core.cb[cb_index] = func; + else + _webui_free_mem((void *)webui_internal_id); + } + + return cb_index; +} + +const char* webui_get_string(webui_event_t* e) { + + #ifdef WEBUI_LOG + printf("[User] webui_get_string()... \n"); + #endif + + if(e->data != NULL) { + size_t len = strlen(e->data); + if(len > 0 && len <= WEBUI_MAX_BUF) + return (const char *) e->data; + } + + return webui_empty_string; +} + +long long int webui_get_int(webui_event_t* e) { + + #ifdef WEBUI_LOG + printf("[User] webui_get_int()... \n"); + #endif + + char *endptr; + + if(e->data != NULL) { + size_t len = strlen(e->data); + if(len > 0 && len <= 20) // 64-bit max is -9,223,372,036,854,775,808 (20 character) + return strtoll((const char *) e->data, &endptr, 10); + } + + return 0; +} + +bool webui_get_bool(webui_event_t* e) { + + #ifdef WEBUI_LOG + printf("[User] webui_get_bool()... \n"); + #endif + + const char* str = webui_get_string(e); + if(str[0] == 't' || str[0] == 'T') // true || True + return true; + + return false; +} + +void webui_return_int(webui_event_t* e, long long int n) { + + #ifdef WEBUI_LOG + printf("[User] webui_return_int([%lld])... \n", n); + #endif + + // Free + if(e->response != NULL) + _webui_free_mem(e->response); + + // Int to Str + // 64-bit max is -9,223,372,036,854,775,808 (20 character) + char* buf = (char*) _webui_malloc(20); + sprintf(buf, "%lld", n); + + // Set response + e->response = buf; +} + +void webui_return_string(webui_event_t* e, char* s) { + + #ifdef WEBUI_LOG + printf("[User] webui_return_string([%s])... \n", s); + #endif + + if(_webui_is_empty(s)) + return; + + // Free + if(e->response != NULL) + _webui_free_mem(e->response); + + // Copy Str + int len = strlen(s); + char* buf = (char*) _webui_malloc(len); + memcpy(buf, s, len); + + // Set response + e->response = buf; +} + +void webui_return_bool(webui_event_t* e, bool b) { + + #ifdef WEBUI_LOG + printf("[User] webui_return_bool([%d])... \n", b); + #endif + + // Free + if(e->response != NULL) + _webui_free_mem(e->response); + + // Bool to Str + int len = 1; + char* buf = (char*) _webui_malloc(len); + sprintf(buf, "%d", b); + + // Set response + e->response = buf; +} + +void webui_exit(void) { + + #ifdef WEBUI_LOG + printf("[User] webui_exit()... \n"); + #endif + + _webui_core.exit_now = true; + + // Let's give other threads more time to + // safely exit and finish their cleaning up. + _webui_sleep(100); +} + +void webui_wait(void) { + + #ifdef WEBUI_LOG + printf("[Loop] webui_wait()... \n"); + #endif + + _webui_init(); + + if(_webui_core.startup_timeout > 0) { + + #ifdef WEBUI_LOG + printf("[Loop] webui_wait() -> Using timeout %d second\n", _webui_core.startup_timeout); + #endif + + // Wait for browser to start + _webui_wait_for_startup(); + + #ifdef WEBUI_LOG + printf("[Loop] webui_wait() -> Wait for connected UI...\n"); + #endif + + while(_webui_core.servers > 0) { + + #ifdef WEBUI_LOG + // printf("[%d/%d]", _webui_core.servers, _webui_core.connections); + #endif + _webui_sleep(50); + } + } + else { + + #ifdef WEBUI_LOG + printf("[Loop] webui_wait() -> Infinite wait...\n"); + #endif + + // Infinite wait + while(!_webui_core.exit_now) + _webui_sleep(50); + } + + #ifdef WEBUI_LOG + printf("[Loop] webui_wait() -> Wait finished.\n"); + #endif + + // Final cleaning + _webui_clean(); +} + +void webui_set_timeout(unsigned int second) { + + #ifdef WEBUI_LOG + printf("[User] webui_set_timeout([%d])... \n", second); + #endif + + _webui_init(); + + if(second > WEBUI_MAX_TIMEOUT) + second = WEBUI_MAX_TIMEOUT; + + _webui_core.startup_timeout = second; +} + +void webui_set_runtime(void* window, unsigned int runtime) { + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + #ifdef WEBUI_LOG + printf("[User] webui_script_runtime(%d)... \n", runtime); + #endif + + _webui_init(); + + if(runtime != Deno && runtime != NodeJS) + win->runtime = None; + else + win->runtime = runtime; +} + +// -- Interface's Functions ---------------- +void _webui_interface_bind_handler(webui_event_t* e) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_interface_bind_handler()... \n"); + #endif + + // Generate WebUI internal id + char* webui_internal_id = _webui_generate_internal_id(e->window, e->element); + unsigned int cb_index = _webui_get_cb_index(webui_internal_id); + + if(cb_index > 0 && _webui_core.cb_interface[cb_index] != NULL) + _webui_core.cb_interface[cb_index](e->window, e->type, e->element, e->data, (char*)&e->response); + + if(_webui_is_empty((const char *)e->response)) + e->response = (char*)webui_empty_string; + + // Free + _webui_free_mem((void *)webui_internal_id); + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_interface_bind_handler()... user-callback response [%s]\n", (const char *)e->response); + #endif +} + +unsigned int webui_interface_bind(void* window, const char* element, void (*func)(void*, unsigned int, char*, char*, char*)) { + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + #ifdef WEBUI_LOG + printf("[User] webui_interface_bind()... \n"); + #endif + + // Bind + unsigned int cb_index = webui_bind(win, element, _webui_interface_bind_handler); + _webui_core.cb_interface[cb_index] = func; + return cb_index; +} + +void webui_interface_set_response(char* ptr, const char* response) { + + #ifdef WEBUI_LOG + printf("[User] webui_interface_set_response()... \n"); + printf("[User] webui_interface_set_response() -> Response [%s] \n", response); + #endif + + printf("[User] webui_interface_set_response() -> ptr 1 0x%p \n", ptr); + printf("[User] webui_interface_set_response() -> ptr 2 0x%p \n", *((char**)ptr)); + + size_t len = strlen(response); + + if(len < 1) + return; + + char* buf = (char*) _webui_malloc(len); + char** _ptr = (char**)ptr; + *_ptr = buf; + strcpy(*_ptr, response); + + #ifdef WEBUI_LOG + printf("[User] webui_interface_set_response() -> Internal buffer @ 0x%p \n", (*_ptr)); + printf("[User] webui_interface_set_response() -> Internal buffer [%s] \n", (*_ptr)); + #endif + + printf("[User] webui_interface_set_response() -> ptr 1 0x%p \n", ptr); + printf("[User] webui_interface_set_response() -> ptr 2 0x%p \n", *((char**)ptr)); +} + +bool webui_interface_is_app_running(void) { + + #ifdef WEBUI_LOG + // printf("[User] webui_is_app_running()... \n"); + #endif + + static bool app_is_running = true; + + // Stop if already flagged + if(!app_is_running) return false; + + // Initialization + if(!_webui_core.initialized) + _webui_init(); + + // Get app status + if(_webui_core.exit_now) { + app_is_running = false; + } + else if(_webui_core.startup_timeout > 0) { + if(_webui_core.servers < 1) + app_is_running = false; + } + + // Final cleaning + if(!app_is_running) { + #ifdef WEBUI_LOG + printf("[User] webui_is_app_running() -> App Stopped.\n"); + #endif + _webui_clean(); + } + + return app_is_running; +} + +unsigned int webui_interface_get_window_id(void* window) { + + #ifdef WEBUI_LOG + printf("[User] webui_interface_get_window_id()... \n"); + #endif + + // Dereference + _webui_window_t* win = (_webui_window_t*)window; + + return win->window_number; +} + +// -- Core's Functions ---------------- +bool _webui_ptr_exist(void* ptr) { + + #ifdef WEBUI_LOG + // printf("[Core]\t\t_webui_ptr_exist()... \n"); + #endif + + if(ptr == NULL) + return false; + + for(unsigned int i = 0; i < _webui_core.ptr_position; i++) { + + if(_webui_core.ptr_list[i] == ptr) return true; } return false; } -void _webui_ptr_add(void *p, size_t size) { +static void _webui_ptr_add(void* ptr, size_t size) { #ifdef WEBUI_LOG - // printf("[0] _webui_ptr_add(0x%p)... \n", p); + // printf("[Core]\t\t_webui_ptr_add(0x%p)... \n", ptr); #endif - if(p == NULL) + if(ptr == NULL) return; - if(!_webui_ptr_exist(p)) { + if(!_webui_ptr_exist(ptr)) { - for(unsigned int i = 0; i < webui.ptr_position; i++) { + for(unsigned int i = 0; i < _webui_core.ptr_position; i++) { - if(webui.ptr_list[i] == NULL) { + if(_webui_core.ptr_list[i] == NULL) { #ifdef WEBUI_LOG - printf("[0] _webui_ptr_add(0x%p)... Allocate %d bytes\n", p, (int)size); + printf("[Core]\t\t_webui_ptr_add(0x%p)... Allocate %d bytes\n", ptr, (int)size); #endif - webui.ptr_list[i] = p; - webui.ptr_size[i] = size; + _webui_core.ptr_list[i] = ptr; + _webui_core.ptr_size[i] = size; return; } } #ifdef WEBUI_LOG - printf("[0] _webui_ptr_add(0x%p)... Allocate %d bytes\n", p, (int)size); + printf("[Core]\t\t_webui_ptr_add(0x%p)... Allocate %d bytes\n", ptr, (int)size); #endif - webui.ptr_list[webui.ptr_position] = p; - webui.ptr_size[webui.ptr_position] = size; - webui.ptr_position++; - if(webui.ptr_position >= WEBUI_MAX_ARRAY) - webui.ptr_position = (WEBUI_MAX_ARRAY - 1); + _webui_core.ptr_list[_webui_core.ptr_position] = ptr; + _webui_core.ptr_size[_webui_core.ptr_position] = size; + _webui_core.ptr_position++; + if(_webui_core.ptr_position >= WEBUI_MAX_ARRAY) + _webui_core.ptr_position = (WEBUI_MAX_ARRAY - 1); } } -void webui_clean_mem(void* p) { - - #ifdef WEBUI_LOG - printf("[0] webui_clean_mem(0x%p)... \n", p); - #endif - - _webui_free_mem((void *) &p); -} - -void _webui_free_mem(void **p) { +static void _webui_free_mem(void* ptr) { #ifdef WEBUI_LOG - // printf("[0] _webui_free_mem(0x%p)... \n", *p); + printf("[Core]\t\t_webui_free_mem(0x%p)... \n", ptr); #endif - if(p == NULL || *p == NULL) + if(ptr == NULL) return; - for(unsigned int i = 0; i < webui.ptr_position; i++) { + for(unsigned int i = 0; i < _webui_core.ptr_position; i++) { - if(webui.ptr_list[i] == *p) { + if(_webui_core.ptr_list[i] == ptr) { #ifdef WEBUI_LOG - printf("[0] _webui_free_mem(0x%p)... Free %d bytes\n", *p, (int)webui.ptr_size[i]); + printf("[Core]\t\t_webui_free_mem(0x%p)... Free %d bytes\n", ptr, (int)_webui_core.ptr_size[i]); #endif - memset(*p, 0x00, webui.ptr_size[i]); - free(*p); + memset(ptr, 0x00, _webui_core.ptr_size[i]); + free(ptr); - webui.ptr_size[i] = 0; - webui.ptr_list[i] = NULL; + _webui_core.ptr_size[i] = 0; + _webui_core.ptr_list[i] = NULL; } } - for(int i = webui.ptr_position; i >= 0; i--) { + for(int i = _webui_core.ptr_position; i >= 0; i--) { - if(webui.ptr_list[i] == NULL) { + if(_webui_core.ptr_list[i] == NULL) { - webui.ptr_position = i; + _webui_core.ptr_position = i; break; } } - - *p = NULL; } -void _webui_free_all_mem(void) { +static void _webui_free_all_mem(void) { #ifdef WEBUI_LOG - printf("[0] _webui_free_all_mem()... \n"); + printf("[Core]\t\t_webui_free_all_mem()... \n"); #endif // Makes sure we run this once @@ -370,26 +954,26 @@ void _webui_free_all_mem(void) { freed = true; void* ptr = NULL; - for(unsigned int i = 0; i < webui.ptr_position; i++) { + for(unsigned int i = 0; i < _webui_core.ptr_position; i++) { - ptr = webui.ptr_list[i]; + ptr = _webui_core.ptr_list[i]; if(ptr != NULL) { #ifdef WEBUI_LOG - printf("[0] _webui_free_all_mem()... Free %d bytes @ 0x%p\n", (int)webui.ptr_size[i], ptr); + printf("[Core]\t\t_webui_free_all_mem()... Free %d bytes @ 0x%p\n", (int)_webui_core.ptr_size[i], ptr); #endif - memset(ptr, 0x00, webui.ptr_size[i]); + memset(ptr, 0x00, _webui_core.ptr_size[i]); free(ptr); } } } -void _webui_panic(void) { +static void _webui_panic(void) { #ifdef WEBUI_LOG - printf("[0] _webui_panic()... \n"); + printf("[Core]\t\t_webui_panic()... \n"); #endif webui_exit(); @@ -416,7 +1000,7 @@ size_t _webui_round_to_memory_block(int size) { void* _webui_malloc(int size) { #ifdef WEBUI_LOG - // printf("[0] _webui_malloc([%d])... \n", size); + printf("[Core]\t\t_webui_malloc([%d])... \n", size); #endif // Make sure we have the null @@ -452,10 +1036,10 @@ void* _webui_malloc(int size) { return block; } -void _webui_sleep(long unsigned int ms) { +static void _webui_sleep(long unsigned int ms) { #ifdef WEBUI_LOG - // printf("[0] _webui_sleep([%d])... \n", ms); + // printf("[Core]\t\t_webui_sleep([%d])... \n", ms); #endif #ifdef _WIN32 @@ -468,7 +1052,7 @@ void _webui_sleep(long unsigned int ms) { long _webui_timer_diff(struct timespec *start, struct timespec *end) { #ifdef WEBUI_LOG - // printf("[0] _webui_timer_diff()... \n"); + // printf("[Core]\t\t_webui_timer_diff()... \n"); #endif return ( @@ -479,10 +1063,10 @@ long _webui_timer_diff(struct timespec *start, struct timespec *end) { ); } -void _webui_timer_clock_gettime(struct timespec *spec) { +static void _webui_timer_clock_gettime(struct timespec *spec) { #ifdef WEBUI_LOG - // printf("[0] _webui_timer_clock_gettime()... \n"); + // printf("[Core]\t\t_webui_timer_clock_gettime()... \n"); #endif #ifdef _WIN32 @@ -496,19 +1080,19 @@ void _webui_timer_clock_gettime(struct timespec *spec) { #endif } -void _webui_timer_start(webui_timer_t* t) { +static void _webui_timer_start(_webui_timer_t* t) { #ifdef WEBUI_LOG - // printf("[0] _webui_timer_start()... \n"); + // printf("[Core]\t\t_webui_timer_start()... \n"); #endif _webui_timer_clock_gettime(&t->start); } -bool _webui_timer_is_end(webui_timer_t* t, unsigned int ms) { +bool _webui_timer_is_end(_webui_timer_t* t, unsigned int ms) { #ifdef WEBUI_LOG - // printf("[0] _webui_timer_is_end()... \n"); + // printf("[Core]\t\t_webui_timer_is_end()... \n"); #endif _webui_timer_clock_gettime(&t->now); @@ -519,21 +1103,10 @@ bool _webui_timer_is_end(webui_timer_t* t, unsigned int ms) { return false; } -#ifdef WEBUI_LOG - void _webui_print_hex(const char* data, size_t len) { - - for(size_t i = 0; i < len; i++) { - - printf("0x%02X ", (unsigned char) *data); - data++; - } - } -#endif - bool _webui_is_empty(const char* s) { #ifdef WEBUI_LOG - // printf("[0] _webui_is_empty()... \n"); + printf("[Core]\t\t_webui_is_empty()... \n"); #endif if((s != NULL) && (s[0] != '\0')) @@ -544,7 +1117,7 @@ bool _webui_is_empty(const char* s) { bool _webui_file_exist_mg(void *ev_data) { #ifdef WEBUI_LOG - printf("[0] _webui_file_exist_mg()... \n"); + printf("[Core]\t\t_webui_file_exist_mg()... \n"); #endif char* file; @@ -560,13 +1133,13 @@ bool _webui_file_exist_mg(void *ev_data) { // Get full path // [current folder][/][file] - full_path = (char*) _webui_malloc(strlen(webui.executable_path) + 1 + strlen(file)); - sprintf(full_path, "%s%s%s", webui.executable_path, webui_sep, file); + full_path = (char*) _webui_malloc(strlen(_webui_core.executable_path) + 1 + strlen(file)); + sprintf(full_path, "%s%s%s", _webui_core.executable_path, webui_sep, file); bool exist = _webui_file_exist(full_path); - _webui_free_mem((void *) &file); - _webui_free_mem((void *) &full_path); + _webui_free_mem((void *)file); + _webui_free_mem((void *)full_path); return exist; } @@ -574,7 +1147,7 @@ bool _webui_file_exist_mg(void *ev_data) { bool _webui_file_exist(char* file) { #ifdef WEBUI_LOG - printf("[0] _webui_file_exist([%s])... \n", file); + printf("[Core]\t\t_webui_file_exist([%s])... \n", file); #endif if(_webui_is_empty(file)) @@ -588,7 +1161,7 @@ bool _webui_file_exist(char* file) { const char* _webui_get_extension(const char*f) { #ifdef WEBUI_LOG - printf("[0] _webui_get_extension()... \n"); + printf("[Core]\t\t_webui_get_extension()... \n"); #endif if(f == NULL) @@ -601,19 +1174,19 @@ const char* _webui_get_extension(const char*f) { return ext + 1; } -unsigned int _webui_get_run_id(void) { +unsigned char _webui_get_run_id(void) { #ifdef WEBUI_LOG - printf("[0] _webui_get_run_id()... \n"); + printf("[Core]\t\t_webui_get_run_id()... \n"); #endif - return ++webui.run_last_id; + return ++_webui_core.run_last_id; } bool _webui_socket_test_listen_mg(unsigned int port_num) { #ifdef WEBUI_LOG - printf("[0] _webui_socket_test_listen_mg([%d])... \n", port_num); + printf("[Core]\t\t_webui_socket_test_listen_mg([%d])... \n", port_num); #endif struct mg_connection *c; @@ -636,11 +1209,2739 @@ bool _webui_socket_test_listen_mg(unsigned int port_num) { return true; } +bool _webui_port_is_used(unsigned int port_num) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_port_is_used([%d])... \n", port_num); + #endif + + #ifdef _WIN32 + // Listener test + if(!_webui_socket_test_listen_win32(port_num)) + return true; // Port is already used + return false; // Port is not in use + #else + // Listener test MG + if(!_webui_socket_test_listen_mg(port_num)) + return true; // Port is already used + return false; // Port is not in use + #endif +} + +static void _webui_serve_file(_webui_window_t* win, struct mg_connection *c, void *ev_data) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_serve_file()... \n"); + #endif + + // Serve a normal text based file + // send with HTTP 200 status code + + struct mg_http_serve_opts opts = { + + .root_dir = win->server_root_path + }; + + mg_http_serve_dir(c, ev_data, &opts); +} + +bool _webui_deno_exist(void) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_deno_exist()... \n"); + #endif + + static bool found = false; + + if(found) + return true; + + if(_webui_cmd_sync("deno --version", false) == 0) { + + found = true; + return true; + } + else + return false; +} + +bool _webui_nodejs_exist(void) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_nodejs_exist()... \n"); + #endif + + static bool found = false; + + if(found) + return true; + + if(_webui_cmd_sync("node -v", false) == 0) { + + found = true; + return true; + } + else + return false; +} + +const char* _webui_interpret_command(const char* cmd) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_interpret_command()... \n"); + #endif + + // Redirect stderr to stdout + char cmd_redirected[1024]; + sprintf(cmd_redirected, "%s 2>&1", cmd); + + FILE *runtime = WEBUI_POPEN(cmd_redirected, "r"); + + if(runtime == NULL) + return NULL; + + // Get STDOUT length + // int c; + // while ((c = fgetc(runtime)) != EOF) + // len++; + int len = 1024 * 8; + + // Read STDOUT + char* out = (char*) _webui_malloc(len); + char* line = (char*) _webui_malloc(4000); + while(fgets(line, 4000, runtime) != NULL) + strcat(out, line); + + WEBUI_PCLOSE(runtime); + _webui_free_mem((void *)line); + + return (const char*) out; +} + +static void _webui_interpret_file(_webui_window_t* win, struct mg_connection *c, void *ev_data, char* index) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_interpret_file()... \n"); + #endif + + // Run the JavaScript / TypeScript runtime + // and send back the output with HTTP 200 status code + // otherwise, send the file as a normal text based one + + char* file; + char* full_path; + + if(index != NULL && !_webui_is_empty(index)) { + + // Parse index file + file = index; + full_path = index; + } + else { + + // Parse other files + + struct mg_http_message *hm = (struct mg_http_message *) ev_data; + + // Get file name + file = (char*) _webui_malloc(hm->uri.len); + const char* p = hm->uri.ptr; + p++; // Skip "/" + sprintf(file, "%.*s", (int)(hm->uri.len - 1), p); + + // Get full path + // [current folder][/][file] + full_path = (char*) _webui_malloc(strlen(_webui_core.executable_path) + 1 + strlen(file)); + sprintf(full_path, "%s%s%s", _webui_core.executable_path, webui_sep, file); + + if(!_webui_file_exist(full_path)) { + + // File not exist - 404 + _webui_serve_file(win, c, ev_data); + + _webui_free_mem((void *)file); + _webui_free_mem((void *)full_path); + return; + } + } + + // Get file extension + const char* extension = _webui_get_extension(file); + + if(strcmp(extension, "ts") == 0 || strcmp(extension, "js") == 0) { + + // TypeScript / JavaScript + + if(win->runtime == Deno) { + + // Use Deno + + if(_webui_deno_exist()) { + + // Set command + // [disable coloring][file] + char* cmd = (char*) _webui_malloc(64 + strlen(full_path)); + #ifdef _WIN32 + sprintf(cmd, "Set NO_COLOR=1 & deno run --allow-all \"%s\"", full_path); + #else + sprintf(cmd, "NO_COLOR=1 & deno run --allow-all \"%s\"", full_path); + #endif + + // Run command + const char* out = _webui_interpret_command(cmd); + + if(out != NULL) { + + // Send deno output + mg_http_reply( + c, 200, + "", + out + ); + } + else { + + // Deno failed. + // Serve as a normal text-based file + _webui_serve_file(win, c, ev_data); + } + + _webui_free_mem((void *)cmd); + _webui_free_mem((void *)out); + } + else { + + // Deno not installed + + mg_http_reply( + c, 200, + "", + webui_deno_not_found + ); + } + } + else if(win->runtime == NodeJS) { + + // Use Nodejs + + if(_webui_nodejs_exist()) { + + // Set command + // [node][file] + char* cmd = (char*) _webui_malloc(16 + strlen(full_path)); + sprintf(cmd, "node \"%s\"", full_path); + + // Run command + const char* out = _webui_interpret_command(cmd); + + if(out != NULL) { + + // Send Node.js output + mg_http_reply( + c, 200, + "", + out + ); + } + else { + + // Node.js failed. + // Serve as a normal text-based file + _webui_serve_file(win, c, ev_data); + } + + _webui_free_mem((void *)cmd); + _webui_free_mem((void *)out); + } + else { + + // Node.js not installed + + mg_http_reply( + c, 200, + "", + webui_nodejs_not_found + ); + } + } + else { + + // Unknown runtime + // Serve as a normal text-based file + _webui_serve_file(win, c, ev_data); + } + } + else { + + // Unknown file extension + // Serve as a normal text-based file + _webui_serve_file(win, c, ev_data); + } + + _webui_free_mem((void *)file); + _webui_free_mem((void *)full_path); +} + +const char* _webui_generate_js_bridge(_webui_window_t* win) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_generate_js_bridge()... \n"); + #endif + + // Calculate the cb size + size_t cb_mem_size = 64; // To hold 'const _webui_bind_list = ["elem1", "elem2",];' + for(unsigned int i = 1; i < WEBUI_MAX_ARRAY; i++) + if(_webui_core.html_elements[i] != NULL && !_webui_is_empty(_webui_core.html_elements[i])) + cb_mem_size += strlen(_webui_core.html_elements[i]) + 3; + + // Generate the cb array + char* event_cb_js_array = (char*) _webui_malloc(cb_mem_size); + strcat(event_cb_js_array, "const _webui_bind_list = ["); + for(unsigned int i = 1; i < WEBUI_MAX_ARRAY; i++) { + if(_webui_core.html_elements[i] != NULL && !_webui_is_empty(_webui_core.html_elements[i])) { + strcat(event_cb_js_array, "\""); + strcat(event_cb_js_array, _webui_core.html_elements[i]); + strcat(event_cb_js_array, "\","); + } + } + strcat(event_cb_js_array, "]; \n"); + + // Generate the full WebUI JS-Bridge + size_t len = cb_mem_size + strlen(webui_javascript_bridge); + char* js = (char*) _webui_malloc(len); + sprintf(js, + "_webui_port = %d; \n_webui_win_num = %d; \n%s \n%s \n", + win->server_port, win->window_number, event_cb_js_array, webui_javascript_bridge + ); + + return js; +} + +static void _webui_server_event_handler(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { + + #ifdef WEBUI_LOG + // printf("[Core]\t\t_webui_server_event_handler()... \n"); + #endif + + _webui_window_t* win = (_webui_window_t *) fn_data; + + if(ev == MG_EV_HTTP_MSG) { + + struct mg_http_message *hm = (struct mg_http_message *) ev_data; + + if(mg_http_match_uri(hm, "/_webui_ws_connect")) { + + // WebSocket + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... HTML Upgrade to WebSocket\n"); + #endif + + mg_ws_upgrade(c, hm, NULL); + } + else if(mg_http_match_uri(hm, "/webui.js")) { + + // WebUI JS-Bridge + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... HTML WebUI JS\n"); + #endif + + // Generate JavaScript bridge + const char* js = _webui_generate_js_bridge(win); + + // Header + // Content-Type: text/javascript + + // Send + mg_http_reply( + c, 200, + "", + js + ); + + _webui_free_mem((void *)js); + } + else if(strncmp(hm->uri.ptr, "/WEBUI/FUNC/", 12) == 0 && hm->uri.len >= 15) { + + // Function Call (With response) + + // [/WEBUI/FUNC/ELEMENT_ID/DATA] + // 0 12 + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... CB start\n"); + #endif + + // Copy packet + size_t len = hm->uri.len; + char* packet = (char*) _webui_malloc(len); + memcpy(packet, hm->uri.ptr, len); + + // Get html element id + char* element = &packet[12]; + size_t element_len = 0; + for (size_t i = 12; i < len; i++) { + if(packet[i] == '/') { + packet[i] = '\0'; + break; + } + element_len++; + } + + // [/WEBUI/FUNC/ELEMENT_ID DATA] + // 0 12 + + // Get data + void* data = &packet[11 + element_len + 2]; + size_t data_len = strlen(data); + + // Generate WebUI internal id + char* webui_internal_id = _webui_generate_internal_id(win, element); + + // Call user function + webui_event_t e; + e.element = element; + e.window = win; + e.data = data; + e.response = NULL; + e.type = WEBUI_EVENT_CALLBACK; + + unsigned int cb_index = _webui_get_cb_index(webui_internal_id); + + // Check for bind + if(cb_index > 0 && _webui_core.cb[cb_index] != NULL) { + + // Call user cb + _webui_core.cb[cb_index](&e); + } + + if(_webui_is_empty(e.response)) + e.response = (char*)webui_empty_string; + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... user-callback response [%s]\n", (const char*)e.response); + #endif + + // Send response + mg_http_reply( + c, 200, + "", + e.response + ); + + // Free + _webui_free_mem((void *)packet); + _webui_free_mem((void *)webui_internal_id); + _webui_free_mem((void *)e.response); + } + else if(mg_http_match_uri(hm, "/")) { + + // [/] + + if(win->is_embedded_html) { + + // Main HTML + + if(!win->multi_access && win->html_handled) { + + // Main HTML already handled. + // Forbidden 403 + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... HTML Main Already Handled (403)\n"); + #endif + + // Header + // text/html; charset=utf-8 + + mg_http_reply( + c, 403, + "", + webui_html_served + ); + } + else { + + // Send main HTML + + win->html_handled = true; + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... HTML Main\n"); + #endif + + char* html = (char*) webui_empty_string; + + if(win->html != NULL) { + + // Generate the full WebUI JS-Bridge + const char* js = _webui_generate_js_bridge(win); + + // Inject WebUI JS-Bridge into HTML + size_t len = strlen(win->html) + strlen(js) + 128; + html = (char*) _webui_malloc(len); + sprintf(html, + "%s \n ", + win->html, js + ); + + _webui_free_mem((void *)js); + } + + // // HTTP Header + // char header[512]; + // memset(header, 0x00, 512); + // sprintf(header, + // "HTTP/1.1 200 OK\r\n" + // "Content-Type: text/html; charset=utf-8\r\n" + // "Host: localhost:%d\r\n" + // "Cache-Control: no-cache\r\n" + // "Content-Length: %d\r\n" + // "Connection: close\r\n\r\n", + // win->server_port, strlen(html) + // ); + + // Send + mg_http_reply( + c, 200, + "", + html + ); + + _webui_free_mem((void *)html); + } + } + else { + + // Serve local files + + win->html_handled = true; + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... HTML Root Index\n"); + #endif + + // Set full path + // [Path][Sep][File Name] + char* index = (char*) _webui_malloc(strlen(_webui_core.executable_path) + 1 + 8); + + // Index.ts + sprintf(index, "%s%sindex.ts", _webui_core.executable_path, webui_sep); + if(_webui_file_exist(index)) { + + // TypeScript Index + _webui_interpret_file(win, c, ev_data, index); + + _webui_free_mem((void *)index); + return; + } + + // Index.js + sprintf(index, "%s%sindex.js", _webui_core.executable_path, webui_sep); + if(_webui_file_exist(index)) { + + // JavaScript Index + _webui_interpret_file(win, c, ev_data, index); + + _webui_free_mem((void *)index); + return; + } + + _webui_free_mem((void *)index); + + // Index.html + // Serve as a normal HTML text-based file + _webui_serve_file(win, c, ev_data); + } + } + else if(mg_http_match_uri(hm, "/favicon.ico") || mg_http_match_uri(hm, "/favicon.svg")) { + + // Favicon + + if(win->icon != NULL && win->icon_type != NULL) { + + // Custom user icon + + char* icon_header = (char*) _webui_malloc(strlen(win->icon_type) + 32); + sprintf(icon_header, "Content-Type: %s\r\n", win->icon_type); + + // User icon + mg_http_reply( + c, 200, + icon_header, + win->icon + ); + } + else if(_webui_file_exist_mg(ev_data)) { + + // Local icon file + _webui_serve_file(win, c, ev_data); + } + else { + + // Default embedded icon + + if(mg_http_match_uri(hm, "/favicon.ico")) { + + mg_http_reply(c, 302, "Location: /favicon.svg\r\n", ""); + } + else { + + // TODO: Use webui_def_icon_type + + // Header + // Content-Type: image/svg+xml + + // Default icon + mg_http_reply( + c, 200, + webui_def_icon_type, + webui_def_icon + ); + } + } + } + else { + + // [/file] + + if(win->is_embedded_html) { + + if(win->runtime != None) { + + // Interpret file + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... HTML Interpret file\n"); + #endif + + _webui_interpret_file(win, c, ev_data, NULL); + } + else { + + // Serve local files + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... HTML Root file\n"); + #endif + + // Serve as a normal text-based file + _webui_serve_file(win, c, ev_data); + } + } + else { + + // This is a non-server-folder mode + // but the HTML body request a local file + // this request can be css, js, image, etc... + + if(_webui_file_exist_mg(ev_data)) { + + // Serve as a normal text-based file + _webui_serve_file(win, c, ev_data); + } + else { + + // 404 + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... HTML 404\n"); + #endif + + // Header + // text/html; charset=utf-8 + + mg_http_reply( + c, 404, + "", + webui_html_res_not_available + ); + } + } + } + } + else if(ev == MG_EV_WS_MSG) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... WebSocket Data\n"); + #endif + + struct mg_ws_message *wm = (struct mg_ws_message *) ev_data; + + // Parse the packet + _webui_window_receive(win, wm->data.ptr, wm->data.len); + } + else if(ev == MG_EV_WS_OPEN) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... WebSocket Connected\n"); + #endif + + int event_type = WEBUI_EVENT_CONNECTED; + + if(!win->connected) { + + // First connection + + win->connected = true; // server thread + _webui_core.connections++; // main loop + _webui_core.mg_connections[win->window_number] = c; // websocket send func + } + else { + + if(win->multi_access) { + + // Multi connections + win->connections++; + event_type = WEBUI_EVENT_MULTI_CONNECTION; + } + else { + + // UNWANTED Multi connections + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler() -> UNWANTED Multi Connections\n"); + #endif + + mg_close_conn(c); + event_type = WEBUI_EVENT_UNWANTED_CONNECTION; + } + } + + // Events + if(win->has_events) { + + // Generate WebUI internal id + char* webui_internal_id = _webui_generate_internal_id(win, ""); + + _webui_window_event( + win, // Window + webui_internal_id, // WebUI Internal ID + "", // User HTML ID + NULL, // User Custom Data + 0, // User Data Len + event_type // Type of this event + ); + } + } + else if(ev == MG_EV_WS_CTL) { + + win->html_handled = false; + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_server_event_handler()... WebSocket Closed\n"); + #endif + + if(win->connected) { + + if(win->multi_access && win->connections > 0) { + + // Multi connections close + win->connections--; + } + else { + + // Main connection close + _webui_core.connections--; // main loop + win->connected = false; // server thread + } + } + + // Events + if(win->has_events) { + + // Generate WebUI internal id + char* webui_internal_id = _webui_generate_internal_id(win, ""); + + _webui_window_event( + win, // Window + webui_internal_id, // WebUI Internal ID + "", // User HTML ID + NULL, // User Custom Data + 0, // User Data Len + WEBUI_EVENT_DISCONNECTED // Type of this event + ); + } + } +} + +bool _webui_browser_create_profile_folder(_webui_window_t* win, unsigned int browser) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_create_profile_folder(%d)... \n", browser); + #endif + + const char* temp = _webui_browser_get_temp_path(browser); + + if(browser == Chrome) { + + // Google Chrome + sprintf(win->profile_path, "%s%s.WebUI%sWebUIChromeProfile", temp, webui_sep, webui_sep); + return true; + } + else if(browser == Edge) { + + // Edge + sprintf(win->profile_path, "%s%s.WebUI%sWebUIEdgeProfile", temp, webui_sep, webui_sep); + return true; + } + else if(browser == Epic) { + + // Epic + sprintf(win->profile_path, "%s%s.WebUI%sWebUIEpicProfile", temp, webui_sep, webui_sep); + return true; + } + else if(browser == Vivaldi) { + + // Vivaldi + sprintf(win->profile_path, "%s%s.WebUI%sWebUIVivaldiProfile", temp, webui_sep, webui_sep); + return true; + } + else if(browser == Brave) { + + // Brave + sprintf(win->profile_path, "%s%s.WebUI%sWebUIBraveProfile", temp, webui_sep, webui_sep); + return true; + } + else if(browser == Yandex) { + + // Yandex + sprintf(win->profile_path, "%s%s.WebUI%sWebUIYandexProfile", temp, webui_sep, webui_sep); + return true; + } + else if(browser == Chromium) { + + // Chromium + sprintf(win->profile_path, "%s%s.WebUI%sWebUIChromiumProfile", temp, webui_sep, webui_sep); + return true; + } + else if(browser == Firefox) { + + // Firefox (We need to create a folder) + + char* profile_name = "WebUIFirefoxProfile"; + + char firefox_profile_path[1024]; + sprintf(firefox_profile_path, "%s%s.WebUI%s%s", temp, webui_sep, webui_sep, profile_name); + + if(!_webui_folder_exist(firefox_profile_path)) { + + char buf[2048]; + + sprintf(buf, "%s -CreateProfile \"WebUI %s\"", win->browser_path, firefox_profile_path); + _webui_cmd_sync(buf, false); + + // Creating the browser profile + for(unsigned int n = 0; n <= (_webui_core.startup_timeout * 4); n++) { + + if(_webui_folder_exist(firefox_profile_path)) + break; + + _webui_sleep(250); + } + + if(!_webui_folder_exist(firefox_profile_path)) + return false; + + // prefs.js + FILE *file; + sprintf(buf, "%s%sprefs.js", firefox_profile_path, webui_sep); + file = fopen(buf, "a"); + if(file == NULL) + return false; + fputs("user_pref(\"toolkit.legacyUserProfileCustomizations.stylesheets\", true); ", file); + fputs("user_pref(\"browser.shell.checkDefaultBrowser\", false); ", file); + fputs("user_pref(\"browser.tabs.warnOnClose\", false); ", file); + fclose(file); + + // userChrome.css + sprintf(buf, "\"%s%schrome%s\"", firefox_profile_path, webui_sep, webui_sep); + if(!_webui_folder_exist(buf)) { + + sprintf(buf, "mkdir \"%s%schrome%s\"", firefox_profile_path, webui_sep, webui_sep); + _webui_cmd_sync(buf, false); // Create directory + } + sprintf(buf, "%s%schrome%suserChrome.css", firefox_profile_path, webui_sep, webui_sep); + file = fopen(buf, "a"); + if(file == NULL) + return false; + #ifdef _WIN32 + fputs(":root{--uc-toolbar-height:32px}:root:not([uidensity=\"compact\"]) {--uc-toolbar-height:38px}#TabsToolbar{visibility:collapse!important}:root:not([inFullscreen]) #nav-bar{margin-top:calc(0px - var(--uc-toolbar-height))}#toolbar-menubar{min-height:unset!important;height:var(--uc-toolbar-height)!important;position:relative}#main-menubar{-moz-box-flex:1;background-color:var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor);background-clip:padding-box;border-right:30px solid transparent;border-image:linear-gradient(to left,transparent,var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor) 30px) 20 / 30px}#toolbar-menubar:not([inactive]) {z-index:2}#toolbar-menubar[inactive] > #menubar-items{opacity:0;pointer-events:none;margin-left:var(--uc-window-drag-space-width,0px)}#nav-bar{visibility:collapse}@-moz-document url(chrome://browser/content/browser.xhtml) {:root:not([sizemode=\"fullscreen\"]) > head{display: block;position: fixed;width: calc(200vw - 440px);text-align: left;z-index: 9;pointer-events: none;}head > *{ display: none }head > title{display: -moz-inline-box;padding: 4px;max-width: 50vw;overflow-x: hidden;text-overflow: ellipsis;}}", file); + #elif __APPLE__ + fputs(":root{--uc-toolbar-height:32px}:root:not([uidensity=\"compact\"]) {--uc-toolbar-height:38px}#TabsToolbar{visibility:collapse!important}:root:not([inFullscreen]) #nav-bar{margin-top:calc(0px - var(--uc-toolbar-height))}#toolbar-menubar{min-height:unset!important;height:var(--uc-toolbar-height)!important;position:relative}#main-menubar{-moz-box-flex:1;background-color:var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor);background-clip:padding-box;border-right:30px solid transparent;border-image:linear-gradient(to left,transparent,var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor) 30px) 20 / 30px}#toolbar-menubar:not([inactive]) {z-index:2}#toolbar-menubar[inactive] > #menubar-items{opacity:0;pointer-events:none;margin-left:var(--uc-window-drag-space-width,0px)}#nav-bar{visibility:collapse}@-moz-document url(chrome://browser/content/browser.xhtml) {:root:not([sizemode=\"fullscreen\"]) > head{display: block;position: fixed;width: calc(200vw - 440px);text-align: left;z-index: 9;pointer-events: none;}head > *{ display: none }head > title{display: -moz-inline-box;padding: 4px;max-width: 50vw;overflow-x: hidden;text-overflow: ellipsis;}}", file); + #else + fputs(":root{--uc-toolbar-height:32px}:root:not([uidensity=\"compact\"]) {--uc-toolbar-height:38px}#TabsToolbar{visibility:collapse!important}:root:not([inFullscreen]) #nav-bar{margin-top:calc(0px - var(--uc-toolbar-height))}#toolbar-menubar{min-height:unset!important;height:var(--uc-toolbar-height)!important;position:relative}#main-menubar{-moz-box-flex:1;background-color:var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor);background-clip:padding-box;border-right:30px solid transparent;border-image:linear-gradient(to left,transparent,var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor) 30px) 20 / 30px}#toolbar-menubar:not([inactive]) {z-index:2}#toolbar-menubar[inactive] > #menubar-items{opacity:0;pointer-events:none;margin-left:var(--uc-window-drag-space-width,0px)}#nav-bar{visibility:collapse}@-moz-document url(chrome://browser/content/browser.xhtml) {:root:not([sizemode=\"fullscreen\"]) > head{display: block;position: fixed;width: calc(200vw - 440px);text-align: left;z-index: 9;pointer-events: none;}head > *{ display: none }head > title{display: -moz-inline-box;padding: 4px;max-width: 50vw;overflow-x: hidden;text-overflow: ellipsis;}}", file); + #endif + fclose(file); + + sprintf(win->profile_path, "%s%s%s", temp, webui_sep, profile_name); + } + + return true; + } + + return false; +} + +bool _webui_folder_exist(char* folder) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_folder_exist([%s])... \n", folder); + #endif + + #if defined(_MSC_VER) + if(GetFileAttributesA(folder) != INVALID_FILE_ATTRIBUTES) + return true; + #else + DIR* dir = opendir(folder); + if(dir) { + closedir(dir); + return true; + } + #endif + + return false; +} + +char* _webui_generate_internal_id(_webui_window_t* win, const char* element) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_generate_internal_id([%s])... \n", element); + #endif + + // Generate WebUI internal id + size_t element_len = strlen(element); + size_t internal_id_size = 3 + 1 + element_len; // [win num][/][name] + char* webui_internal_id = (char*) _webui_malloc(internal_id_size); + sprintf(webui_internal_id, "%d/%s", win->window_number, element); + + return webui_internal_id; +} + +const char* _webui_browser_get_temp_path(unsigned int browser) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_get_temp_path([%d])... \n", browser); + #endif + + #ifdef _WIN32 + // Resolve %USERPROFILE% + #ifdef _MSC_VER + char* WinUserProfile = NULL; + size_t sz = 0; + if(_dupenv_s(&WinUserProfile, &sz, "USERPROFILE") != 0 || WinUserProfile == NULL) + return webui_empty_string; + #else + char* WinUserProfile = getenv("USERPROFILE"); + if(WinUserProfile == NULL) + return webui_empty_string; + #endif + #elif __APPLE__ + // Resolve $HOME + char* MacUserProfile = getenv("HOME"); + if(MacUserProfile == NULL) + return webui_empty_string; + #else + // Resolve $HOME + char* LinuxUserProfile = getenv("HOME"); + if(LinuxUserProfile == NULL) + return webui_empty_string; + #endif + + #ifdef _WIN32 + return WinUserProfile; + #elif __APPLE__ + return MacUserProfile; + #else + return LinuxUserProfile; + #endif +} + +bool _webui_is_google_chrome_folder(const char* folder) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_is_google_chrome_folder([%s])... \n", folder); + #endif + + char browser_full_path[WEBUI_MAX_PATH]; + + // Make sure this folder is Google Chrome setup and not Chromium + // by checking if `master_preferences` file exist or `initial_preferences` + // Ref: https://support.google.com/chrome/a/answer/187948?hl=en + + sprintf(browser_full_path, "%s\\master_preferences", folder); + if(!_webui_file_exist(browser_full_path)) { + + sprintf(browser_full_path, "%s\\initial_preferences", folder); + if(!_webui_file_exist(browser_full_path)) + return false; // This is Chromium or something else + } + + // Make sure the browser executable file exist + sprintf(browser_full_path, "%s\\chrome.exe", folder); + if(!_webui_file_exist(browser_full_path)) + return false; + + return true; +} + +bool _webui_browser_exist(_webui_window_t* win, unsigned int browser) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_exist([%d])... \n", browser); + #endif + + // Check if a web browser is installed on this machine + + if(browser == Chrome) { + + // Google Chrome + + #ifdef _WIN32 + + // Google Chrome on Windows + + char browser_folder[WEBUI_MAX_PATH]; + + // Search in `HKEY_LOCAL_MACHINE` (If Google Chrome installed for multi-user) + if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", "Path", browser_folder)) { + + // Make sure its Google Chrome and not Chromium + if(_webui_is_google_chrome_folder(browser_folder)) { + + // Google Chrome Found (multi-user) + sprintf(win->browser_path, "\"%s\\chrome.exe\"", browser_folder); + return true; + } + } + + // Search in `HKEY_CURRENT_USER` (If Google Chrome installed for one user) + if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", "Path", browser_folder)) { + + // Make sure its Google Chrome and not Chromium + if(_webui_is_google_chrome_folder(browser_folder)) { + + // Google Chrome Found (one user) + sprintf(win->browser_path, "\"%s\\chrome.exe\"", browser_folder); + return true; + } + } + + return false; + + #elif __APPLE__ + + // Google Chrome on macOS + if(_webui_cmd_sync("open -R -a \"Google Chrome\"", false) == 0) { + + sprintf(win->browser_path, "open -W \"/Applications/Google Chrome.app\" --args"); + return true; + } + else + return false; + #else + + // Google Chrome on Linux + if(_webui_cmd_sync("google-chrome --version", false) == 0) { + + sprintf(win->browser_path, "google-chrome"); + return true; + } + else if(_webui_cmd_sync("google-chrome-stable --version", false) == 0) { + + sprintf(win->core.browser_path, "google-chrome-stable"); + return true; + } + else + return false; + + #endif + } + else if(browser == Edge) { + + // Edge + + #ifdef _WIN32 + + // Edge on Windows + + char browser_fullpath[WEBUI_MAX_PATH]; + + // Search in `HKEY_LOCAL_MACHINE` (If Edge installed for multi-user) + if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\msedge.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Edge Found (multi-user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + // Search in `HKEY_CURRENT_USER` (If Edge installed for one user) + if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\msedge.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Edge Found (one user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + return false; + + #elif __APPLE__ + + // Edge on macOS + return false; + + #else + + // Edge on Linux + return false; + + #endif + } + else if(browser == Epic) { + + // Epic Privacy Browser + + #ifdef _WIN32 + + // Epic on Windows + + char browser_fullpath[WEBUI_MAX_PATH]; + + // Search in `HKEY_CURRENT_USER` (If Epic installed for one user) + if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\epic.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Epic Found (one user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + // Search in `HKEY_LOCAL_MACHINE` (If Epic installed for multi-user) + if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\epic.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Epic Found (multi-user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + return false; + + #elif __APPLE__ + + // Epic on macOS + if(_webui_cmd_sync("open -R -a \"Epic\"", false) == 0) { + + sprintf(win->browser_path, "open -W \"/Applications/Epic.app\" --args"); + return true; + } + else + return false; + #else + + // Epic on Linux + if(_webui_cmd_sync("epic --version", false) == 0) { + + sprintf(win->browser_path, "epic"); + return true; + } + else + return false; + #endif + } + else if(browser == Vivaldi) { + + // Vivaldi Browser + + #ifdef _WIN32 + + // Vivaldi on Windows + + char browser_fullpath[WEBUI_MAX_PATH]; + + // Search in `HKEY_LOCAL_MACHINE` (If Vivaldi installed for multi-user) + if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\vivaldi.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Vivaldi Found (multi-user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + // Search in `HKEY_CURRENT_USER` (If Vivaldi installed for one user) + if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\vivaldi.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Vivaldi Found (one user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + return false; + + #elif __APPLE__ + + // Vivaldi on macOS + if(_webui_cmd_sync("open -R -a \"Vivaldi\"", false) == 0) { + + sprintf(win->browser_path, "open -W \"/Applications/Vivaldi.app\" --args"); + return true; + } + else + return false; + #else + + // Vivaldi on Linux + if(_webui_cmd_sync("vivaldi --version", false) == 0) { + + sprintf(win->browser_path, "vivaldi"); + return true; + } + else + return false; + #endif + } + else if(browser == Brave) { + + // Brave Browser + + #ifdef _WIN32 + + // Brave on Windows + + char browser_fullpath[WEBUI_MAX_PATH]; + + // Search in `HKEY_LOCAL_MACHINE` (If Brave installed for multi-user) + if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\brave.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Brave Found (multi-user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + // Search in `HKEY_CURRENT_USER` (If Brave installed for one user) + if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\brave.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Brave Found (one user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + return false; + + #elif __APPLE__ + + // Brave on macOS + if(_webui_cmd_sync("open -R -a \"Brave\"", false) == 0) { + + sprintf(win->browser_path, "open -W \"/Applications/Brave.app\" --args"); + return true; + } + else + return false; + #else + + // Brave on Linux + if(_webui_cmd_sync("brave-browser --version", false) == 0) { + + sprintf(win->browser_path, "brave-browser"); + return true; + } + else + return false; + #endif + } + else if(browser == Firefox) { + + // Firefox + + #ifdef _WIN32 + + // Firefox on Windows + + char browser_fullpath[WEBUI_MAX_PATH]; + + // Search in `HKEY_LOCAL_MACHINE` (If Firefox installed for multi-user) + if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\firefox.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Firefox Found (multi-user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + // Search in `HKEY_CURRENT_USER` (If Firefox installed for one user) + if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\firefox.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Firefox Found (one user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + return false; + + #elif __APPLE__ + + // Firefox on macOS + if(_webui_cmd_sync("open -R -a \"firefox\"", false) == 0) { + + sprintf(win->browser_path, "open -W \"/Applications/Firefox.app\" --args"); + return true; + } + else + return false; + #else + + // Firefox on Linux + + if(_webui_cmd_sync("firefox -v", false) == 0) { + + sprintf(win->browser_path, "firefox"); + return true; + } + else + return false; + + #endif + + } + else if(browser == Yandex) { + + // Yandex Browser + + #ifdef _WIN32 + + // Yandex on Windows + + char browser_fullpath[WEBUI_MAX_PATH]; + + // Search in `HKEY_CURRENT_USER` (If Yandex installed for one user) + if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\browser.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Yandex Found (one user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + // Search in `HKEY_LOCAL_MACHINE` (If Yandex installed for multi-user) + if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\browser.exe", "", browser_fullpath)) { + + // Make sure the browser executable file exist + if(_webui_file_exist(browser_fullpath)) { + + // Yandex Found (multi-user) + sprintf(win->browser_path, "\"%s\"", browser_fullpath); + return true; + } + } + + return false; + + #elif __APPLE__ + + // Yandex on macOS + if(_webui_cmd_sync("open -R -a \"Yandex\"", false) == 0) { + + sprintf(win->browser_path, "open -W \"/Applications/Yandex.app\" --args"); + return true; + } + else + return false; + #else + + // Yandex on Linux + if(_webui_cmd_sync("yandex-browser --version", false) == 0) { + + sprintf(win->browser_path, "yandex-browser"); + return true; + } + else + return false; + #endif + } + else if(browser == Chromium) { + + // The Chromium Projects + + #ifdef _WIN32 + + // Chromium on Windows + + char browser_folder[WEBUI_MAX_PATH]; + + // Search in `HKEY_CURRENT_USER` (If Chromium installed for one user) + if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", "Path", browser_folder)) { + + // Make sure its Chromium and not Google Chrome + if(!_webui_is_google_chrome_folder(browser_folder)) { + + // Chromium Found (one user) + sprintf(win->browser_path, "\"%s\\chrome.exe\"", browser_folder); + return true; + } + } + + // Search in `HKEY_LOCAL_MACHINE` (If Chromium installed for multi-user) + if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", "Path", browser_folder)) { + + // Make sure its Chromium and not Google Chrome + if(!_webui_is_google_chrome_folder(browser_folder)) { + + // Chromium Found (multi-user) + sprintf(win->browser_path, "\"%s\\chrome.exe\"", browser_folder); + return true; + } + } + + return false; + + #elif __APPLE__ + + // Chromium on macOS + if(_webui_cmd_sync("open -R -a \"Chromium\"", false) == 0) { + + sprintf(win->browser_path, "open -W \"/Applications/Chromium.app\" --args"); + return true; + } + else + return false; + #else + + // Chromium on Linux + if(_webui_cmd_sync("chromium-browser --version", false) == 0) { + + sprintf(win->browser_path, "chromium-browser"); + return true; + } + else + return false; + #endif + } + + return false; +} + +static void _webui_clean(void) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_clean()... \n"); + #endif + + static bool cleaned = false; + if(cleaned) return; + cleaned = true; + + // Let's give other threads more time to safely exit + // and finish their cleaning up. + _webui_sleep(120); + + // TODO: Add option to let the user decide if + // WebUI should delete the web browser profile + // folder or not. + + // Free all non-freed memory allocations + _webui_free_all_mem(); +} + +int _webui_cmd_sync(char* cmd, bool show) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_cmd_sync()... \n"); + #endif + + // Run sync command and + // return the exit code + + char buf[1024]; + + #ifdef _WIN32 + sprintf(buf, "cmd /c \"%s\" > nul 2>&1", cmd); + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_cmd_sync() -> Running [%s] \n", buf); + #endif + return _webui_system_win32(buf, show); + #else + sprintf(buf, "%s >>/dev/null 2>>/dev/null ", cmd); + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_cmd_sync() -> Running [%s] \n", buf); + #endif + int r = system(buf); + r = (r != -1 && r != 127 && WIFEXITED(r)) ? WEXITSTATUS(r) : -1; + return r; + #endif +} + +int _webui_cmd_async(char* cmd, bool show) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_cmd_async()... \n"); + #endif + + // Run a async command + // and return immediately + + char buf[1024]; + int res = 0; + + // Asynchronous command + #ifdef _WIN32 + sprintf(buf, "START \"\" %s", cmd); + res = _webui_cmd_sync(buf, show); + #else + sprintf(buf, "%s >>/dev/null 2>>/dev/null &", cmd); + res = _webui_cmd_sync(buf, show); + #endif + + return res; +} + +int _webui_run_browser(_webui_window_t* win, char* cmd) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_run_browser()... \n"); + #endif + + // Run a async command + return _webui_cmd_async(cmd, false); +} + +bool _webui_browser_start_chrome(_webui_window_t* win, const char* address) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_start_chrome([%s])... \n", address); + #endif + + // -- Google Chrome ---------------------- + + if(win->current_browser != 0 && win->current_browser != Chrome) + return false; + + if(!_webui_browser_exist(win, Chrome)) + return false; + + if(!_webui_browser_create_profile_folder(win, Chrome)) + return false; + + char arg[1024]; + sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --disable-sync-preferences --app=", win->profile_path); + + char full[1024]; + sprintf(full, "%s%s%s", win->browser_path, arg, address); + + if(_webui_run_browser(win, full) == 0) { + + win->current_browser = Chrome; + _webui_core.current_browser = Chrome; + return true; + } + else + return false; +} + +bool _webui_browser_start_edge(_webui_window_t* win, const char* address) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_start_edge([%s])... \n", address); + #endif + + // -- Microsoft Edge ---------------------- + + if(win->current_browser != 0 && win->current_browser != Edge) + return false; + + if(!_webui_browser_exist(win, Edge)) + return false; + + if(!_webui_browser_create_profile_folder(win, Edge)) + return false; + + char arg[1024]; + sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --disable-sync-preferences --app=", win->profile_path); + + char full[1024]; + sprintf(full, "%s%s%s", win->browser_path, arg, address); + + if(_webui_run_browser(win, full) == 0) { + + win->current_browser = Edge; + _webui_core.current_browser = Edge; + return true; + } + else + return false; +} + +bool _webui_browser_start_epic(_webui_window_t* win, const char* address) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_start_epic([%s])... \n", address); + #endif + + // -- Epic Privacy Browser ---------------------- + + if(win->current_browser != 0 && win->current_browser != Epic) + return false; + + if(!_webui_browser_exist(win, Epic)) + return false; + + if(!_webui_browser_create_profile_folder(win, Epic)) + return false; + + char arg[1024]; + sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --disable-sync-preferences --app=", win->profile_path); + + char full[1024]; + sprintf(full, "%s%s%s", win->browser_path, arg, address); + + if(_webui_run_browser(win, full) == 0) { + + win->current_browser = Epic; + _webui_core.current_browser = Epic; + return true; + } + else + return false; +} + +bool _webui_browser_start_vivaldi(_webui_window_t* win, const char* address) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_start_vivaldi([%s])... \n", address); + #endif + + // -- Vivaldi Browser ---------------------- + + if(win->current_browser != 0 && win->current_browser != Vivaldi) + return false; + + if(!_webui_browser_exist(win, Vivaldi)) + return false; + + if(!_webui_browser_create_profile_folder(win, Vivaldi)) + return false; + + char arg[1024]; + sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --disable-sync-preferences --app=", win->profile_path); + + char full[1024]; + sprintf(full, "%s%s%s", win->browser_path, arg, address); + + if(_webui_run_browser(win, full) == 0) { + + win->current_browser = Vivaldi; + _webui_core.current_browser = Vivaldi; + return true; + } + else + return false; +} + +bool _webui_browser_start_brave(_webui_window_t* win, const char* address) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_start_brave([%s])... \n", address); + #endif + + // -- Brave Browser ---------------------- + + if(win->current_browser != 0 && win->current_browser != Brave) + return false; + + if(!_webui_browser_exist(win, Brave)) + return false; + + if(!_webui_browser_create_profile_folder(win, Brave)) + return false; + + char arg[1024]; + sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --disable-sync-preferences --app=", win->profile_path); + + char full[1024]; + sprintf(full, "%s%s%s", win->browser_path, arg, address); + + if(_webui_run_browser(win, full) == 0) { + + win->current_browser = Brave; + _webui_core.current_browser = Brave; + return true; + } + else + return false; +} + +bool _webui_browser_start_firefox(_webui_window_t* win, const char* address) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_start_firefox([%s])... \n", address); + #endif + + // -- Mozilla Firefox ---------------------- + + if(win->current_browser != 0 && win->current_browser != Firefox) + return false; + + if(!_webui_browser_exist(win, Firefox)) + return false; + + if(!_webui_browser_create_profile_folder(win, Firefox)) + return false; + + char full[1024]; + sprintf(full, "%s -P WebUI -purgecaches -new-window %s", win->browser_path, address); + + if(_webui_run_browser(win, full) == 0) { + + win->current_browser = Firefox; + _webui_core.current_browser = Firefox; + return true; + } + else + return false; +} + +bool _webui_browser_start_yandex(_webui_window_t* win, const char* address) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_start_yandex([%s])... \n", address); + #endif + + // -- Yandex Browser ---------------------- + + if(win->current_browser != 0 && win->current_browser != Yandex) + return false; + + if(!_webui_browser_exist(win, Yandex)) + return false; + + if(!_webui_browser_create_profile_folder(win, Yandex)) + return false; + + char arg[1024]; + sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --disable-sync-preferences --app=", win->profile_path); + + char full[1024]; + sprintf(full, "%s%s%s", win->browser_path, arg, address); + + if(_webui_run_browser(win, full) == 0) { + + win->current_browser = Yandex; + _webui_core.current_browser = Yandex; + return true; + } + else + return false; +} + +bool _webui_browser_start_chromium(_webui_window_t* win, const char* address) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_start_chromium([%s])... \n", address); + #endif + + // -- The Chromium Projects ------------------- + + if (win->current_browser != 0 && win->current_browser != Chromium) + return false; + + if (!_webui_browser_exist(win, Chromium)) + return false; + + if (!_webui_browser_create_profile_folder(win, Chromium)) + return false; + + char arg[1024]; + sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --disable-sync-preferences --app=", win->profile_path); + + char full[1024]; + sprintf(full, "%s%s%s", win->browser_path, arg, address); + + if (_webui_run_browser(win, full) == 0) { + + win->current_browser = Chromium; + _webui_core.current_browser = Chromium; + return true; + } + else + return false; +} + +bool _webui_browser_start(_webui_window_t* win, const char* address, unsigned int browser) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_browser_start([%s], [%d])... \n", address, browser); + #endif + + // Non existing browser + if(browser > 10) + return false; + + // Current browser + if(browser == AnyBrowser && _webui_core.current_browser != 0) + browser = _webui_core.current_browser; + + // TODO: Convert address from [/...] to [file://...] + + if(browser != 0) { + + // User specified browser + + if(browser == Chrome) + return _webui_browser_start_chrome(win, address); + else if(browser == Edge) + return _webui_browser_start_edge(win, address); + else if(browser == Epic) + return _webui_browser_start_epic(win, address); + else if(browser == Vivaldi) + return _webui_browser_start_vivaldi(win, address); + else if(browser == Brave) + return _webui_browser_start_brave(win, address); + else if(browser == Firefox) + return _webui_browser_start_firefox(win, address); + else if(browser == Yandex) + return _webui_browser_start_yandex(win, address); + else if(browser == Chromium) + return _webui_browser_start_chromium(win, address); + else + return false; + } + else if(win->current_browser != 0) { + + // Already used browser + + if(win->current_browser == Chrome) + return _webui_browser_start_chrome(win, address); + else if(win->current_browser == Edge) + return _webui_browser_start_edge(win, address); + else if(win->current_browser == Epic) + return _webui_browser_start_epic(win, address); + else if(win->current_browser == Vivaldi) + return _webui_browser_start_vivaldi(win, address); + else if(win->current_browser == Brave) + return _webui_browser_start_brave(win, address); + else if(win->current_browser == Firefox) + return _webui_browser_start_firefox(win, address); + else if(win->current_browser == Yandex) + return _webui_browser_start_yandex(win, address); + else if(browser == Chromium) + return _webui_browser_start_chromium(win, address); + else + return false; + } + else { + + // Default OS browser + + #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) + // Windows + if(!_webui_browser_start_chrome(win, address)) + if(!_webui_browser_start_edge(win, address)) + if(!_webui_browser_start_epic(win, address)) + if(!_webui_browser_start_vivaldi(win, address)) + if(!_webui_browser_start_brave(win, address)) + if(!_webui_browser_start_firefox(win, address)) + if(!_webui_browser_start_yandex(win, address)) + if(!_webui_browser_start_chromium(win, address)) + return false; + #elif __APPLE__ + // macOS + if(!_webui_browser_start_chrome(win, address)) + if(!_webui_browser_start_edge(win, address)) + if(!_webui_browser_start_epic(win, address)) + if(!_webui_browser_start_vivaldi(win, address)) + if(!_webui_browser_start_brave(win, address)) + if(!_webui_browser_start_firefox(win, address)) + if(!_webui_browser_start_yandex(win, address)) + if(!_webui_browser_start_chromium(win, address)) + return false; + #else + // Linux + if(!_webui_browser_start_chrome(win, address)) + if(!_webui_browser_start_edge(win, address)) + if(!_webui_browser_start_epic(win, address)) + if(!_webui_browser_start_vivaldi(win, address)) + if(!_webui_browser_start_brave(win, address)) + if(!_webui_browser_start_firefox(win, address)) + if(!_webui_browser_start_yandex(win, address)) + if(!_webui_browser_start_chromium(win, address)) + return false; + #endif + } + + return true; +} + +bool _webui_set_root_folder(_webui_window_t* win, const char* path) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_set_root_folder([%s])... \n", path); + #endif + + if((path == NULL) || (strlen(path) > WEBUI_MAX_PATH)) + return false; + + win->is_embedded_html = true; + + if(_webui_is_empty(path)) + sprintf(win->server_root_path, "%s", WEBUI_DEFAULT_PATH); + else + sprintf(win->server_root_path, "%s", path); + + webui_set_multi_access(win, true); + + return true; +} + +bool _webui_show(_webui_window_t* win, const char* content, unsigned int browser) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_show([%d])... \n", browser); + #endif + + if(_webui_is_empty(content)) + return false; + + // Some wrappers does not guarantee `content` to + // stay valid, so, let's make our copy right now + size_t content_len = strlen(content); + const char* content_cpy = (const char*)_webui_malloc(content_len); + memcpy((char*)content_cpy, content, content_len); + + if(strstr(content_cpy, " Embedded HTML:\n"); + printf("- - -[HTML]- - - - - - - - - -\n%s\n- - - - - - - - - - - - - - - -\n", content_cpy); + #endif + + return _webui_show_window(win, content_cpy, true, browser); + } + else { + + // File + #ifdef WEBUI_LOG + printf("[User] webui_show() -> File: [%s]\n", content_cpy); + #endif + + if(content_len > WEBUI_MAX_PATH || strstr(content_cpy, "<")) + return false; + + return _webui_show_window(win, content_cpy, false, browser); + } +} + +bool _webui_show_window(_webui_window_t* win, const char* content, bool is_embedded_html, unsigned int browser) { + + #ifdef WEBUI_LOG + if(is_embedded_html) + printf("[Core]\t\t_webui_show_window(HTML, [%d])... \n", browser); + else + printf("[Core]\t\t_webui_show_window(FILE, [%d])... \n", browser); + #endif + + _webui_init(); + + char* url = NULL; + unsigned int port = (win->server_port == 0 ? _webui_get_free_port() : win->server_port); + + // Initialization + if(win->html != NULL) + _webui_free_mem((void *)win->html); + if(win->url != NULL) + _webui_free_mem((void *)win->url); + + if(is_embedded_html) { + + // Show a window using the embedded HTML + win->is_embedded_html = true; + win->html = (content == NULL ? webui_empty_string : content); + + // Generate the URL + size_t url_len = 20; // [domain][port] + url = (char*) _webui_malloc(url_len); + sprintf(url, "http://localhost:%d", port); + } + else { + + // Show a window using a local file + win->is_embedded_html = false; + win->html = webui_empty_string; + + // Generate the URL + size_t url_len = 20 + strlen(content); // [domain][port][file] + url = (char*) _webui_malloc(url_len); + sprintf(url, "http://localhost:%d/%s", port, content); + } + + // Set URL + win->url = url; + win->server_port = port; + + if(!webui_is_shown(win)) { + + // Start a new window + + // Run browser + if(!_webui_browser_start(win, win->url, browser)) { + + // Browser not available + _webui_free_mem((void *)win->html); + _webui_free_mem((void *)win->url); + _webui_free_port(win->server_port); + return false; + } + + // New server thread + #ifdef _WIN32 + HANDLE thread = CreateThread(NULL, 0, _webui_server_start, (void *)win, 0, NULL); + win->server_thread = thread; + if(thread != NULL) + CloseHandle(thread); + #else + pthread_t thread; + pthread_create(&thread, NULL, &_webui_server_start, (void *)win); + pthread_detach(thread); + win->server_thread = thread; + #endif + } + else { + + // Refresh an existing running window + + // Prepare packets + size_t packet_len = 3 + strlen(url); // [header][url] + char* packet = (char*) _webui_malloc(packet_len); + packet[0] = WEBUI_HEADER_SIGNATURE; // Signature + packet[1] = WEBUI_HEADER_SWITCH; // Type + packet[2] = 0; // ID + for(unsigned int i = 0; i < strlen(win->url); i++) // URL + packet[i + 3] = win->url[i]; + + // Send the packet + _webui_window_send(win, packet, packet_len); + _webui_free_mem((void *)packet); + } + + return true; +} + +static void _webui_window_event(_webui_window_t* win, char* webui_internal_id, char* element, void* data, unsigned int data_len, int event_type) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_window_event([%s], [%s])... \n", webui_internal_id, element); + #endif + + // Create a thread, and call the used cb function + _webui_cb_t* arg = (_webui_cb_t*) _webui_malloc(sizeof(_webui_cb_t)); + arg->win = win; + arg->webui_internal_id = webui_internal_id; + arg->element_name = element; + arg->event_type = event_type; + if(data != NULL) { + arg->data = data; + arg->data_len = data_len; + } + else { + arg->data = (void*) webui_empty_string; + arg->data_len = 0; + } + + #ifdef _WIN32 + HANDLE user_fun_thread = CreateThread(NULL, 0, _webui_cb, (void *) arg, 0, NULL); + if(user_fun_thread != NULL) + CloseHandle(user_fun_thread); + #else + pthread_t thread; + pthread_create(&thread, NULL, &_webui_cb, (void *) arg); + pthread_detach(thread); + #endif +} + +static void _webui_window_send(_webui_window_t* win, char* packet, size_t packets_size) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_window_send()... \n"); + printf("[Core]\t\t_webui_window_send() -> %d bytes \n", (int)packets_size); + printf("[Core]\t\t_webui_window_send() -> [ "); + _webui_print_hex(packet, 3); + printf("]\n"); + printf("[Core]\t\t_webui_window_send() -> [%.*s] \n", (int)(packets_size - 3), (const char*)&packet[3]); + #endif + + if(!win->connected || + _webui_core.mg_connections[win->window_number] == NULL || + packet == NULL || + packets_size < 4) + return; + + struct mg_connection* c = _webui_core.mg_connections[win->window_number]; + mg_ws_send( + c, + packet, + packets_size, + WEBSOCKET_OP_BINARY + ); +} + +bool _webui_get_data(const char* packet, size_t packet_len, unsigned int pos, size_t* data_len, char** data) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_get_data()... \n"); + #endif + + if((pos + 1) > packet_len) { + + *data = NULL; + data_len = 0; + return false; + } + + *data = (char*) _webui_malloc((packet_len - pos)); + + // Check mem + if(*data == NULL) { + + data_len = 0; + return false; + } + + // Copy data part + char* p = *data; + for(unsigned int i = pos; i < packet_len; i++) { + + memcpy(p, &packet[i], 1); + p++; + } + + // Check data size + *data_len = strlen(*data); + if(*data_len < 1) { + + _webui_free_mem((void *) data); + *data = NULL; + data_len = 0; + return false; + } + + return true; +} + +static void _webui_window_receive(_webui_window_t* win, const char* packet, size_t len) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_window_receive()... \n"); + #endif + + if((unsigned char) packet[0] != WEBUI_HEADER_SIGNATURE || len < 4) + return; + + if((unsigned char) packet[1] == WEBUI_HEADER_CLICK) { + + // Click Event + + // 0: [Signature] + // 1: [Type] + // 2: + // 3: [Data] + + // Get html element id + char* element; + size_t element_len; + if(!_webui_get_data(packet, len, 3, &element_len, &element)) + return; + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_window_receive() -> %d bytes \n", (int)element_len); + printf("[Core]\t\t_webui_window_receive() -> [%s] \n", element); + #endif + + // Generate WebUI internal id + char* webui_internal_id = _webui_generate_internal_id(win, element); + + _webui_window_event( + win, // Window + webui_internal_id, // WebUI Internal ID + element, // User HTML ID + NULL, // User Custom Data + 0, // User Data Len + WEBUI_EVENT_MOUSE_CLICK // Type of this event + ); + } + else if((unsigned char) packet[1] == WEBUI_HEADER_JS) { + + // JS Result + + // 0: [Signature] + // 1: [Type] + // 2: [ID] + // 3: [Error] + // 4: [Data] + + // Get pipe id + unsigned char run_id = packet[2]; + if(run_id < 0x01) { + + // Fatal. + // The pipe ID is not valid + // we can't send the ready signal to webui_script() + return; + } + + // Get data part + char* data; + size_t data_len; + bool data_status = _webui_get_data(packet, len, 4, &data_len, &data); + + // Get js-error + bool error = true; + if((unsigned char) packet[3] == 0x00) + error = false; + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_window_receive() -> run_id = 0x%02x \n", run_id); + printf("[Core]\t\t_webui_window_receive() -> error = 0x%02x \n", error); + printf("[Core]\t\t_webui_window_receive() -> %d bytes of data\n", (int)data_len); + printf("[Core]\t\t_webui_window_receive() -> data = [%s] @ 0x%p\n", data, data); + #endif + + // Initialize pipe + if((void *)_webui_core.run_responses[run_id] != NULL) + _webui_free_mem((void *)_webui_core.run_responses[run_id]); + + // Set pipe + if(data_status && data_len > 0) { + + _webui_core.run_error[run_id] = error; + _webui_core.run_responses[run_id] = data; + } + else { + + // Empty Result + _webui_core.run_error[run_id] = error; + _webui_core.run_responses[run_id] = webui_empty_string; + } + + // Send ready signal to webui_script() + _webui_core.run_done[run_id] = true; + } + else if((unsigned char) packet[1] == WEBUI_HEADER_CALL_FUNC) { + + // Function Call (No response) + + // 0: [Signature] + // 1: [Type] + // 2: + // 3: [ID, Null, Data] + + // Get html element id + char* element; + size_t element_len; + if(!_webui_get_data(packet, len, 3, &element_len, &element)) + return; + + // Get data + void* data; + size_t data_len; + if(!_webui_get_data(packet, len, (3 + element_len + 1), &data_len, (char **) &data)) + return; + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_window_receive() -> %d bytes \n", (int)element_len); + printf("[Core]\t\t_webui_window_receive() -> [%s] \n", element); + #endif + + // Generate WebUI internal id + char* webui_internal_id = _webui_generate_internal_id(win, element); + + _webui_window_event( + win, // Window + webui_internal_id, // WebUI Internal ID + element, // User HTML ID + data, // User Custom Data + data_len, // User Data Len + WEBUI_EVENT_CALLBACK // Type of this event + ); + } + else if((unsigned char) packet[1] == WEBUI_HEADER_SWITCH) { + + // Navigation Event + + // 0: [Signature] + // 1: [Type] + // 2: + // 3: [URL] + + // Events + if(win->has_events) { + + // Get URL + char* url; + size_t url_len; + if(!_webui_get_data(packet, len, 3, &url_len, &url)) + return; + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_window_receive() -> %d bytes \n", (int)url_len); + printf("[Core]\t\t_webui_window_receive() -> [%s] \n", url); + #endif + + // Generate WebUI internal id + char* webui_internal_id = _webui_generate_internal_id(win, ""); + + _webui_window_event( + win, // Window + webui_internal_id, // WebUI Internal ID + "", // HTML ID + url, // URL + url_len, // URL Len + WEBUI_EVENT_NAVIGATION // Type of this event + ); + } + } +} + +char* _webui_get_current_path(void) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_get_current_path()... \n"); + #endif + + char* path = (char*) _webui_malloc(WEBUI_MAX_PATH); + if(WEBUI_GET_CURRENT_DIR (path, WEBUI_MAX_PATH) == NULL) + path[0] = 0x00; + + return path; +} + +static void _webui_free_port(unsigned int port) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_free_port([%d])... \n", port); + #endif + + for(unsigned int i = 0; i < WEBUI_MAX_ARRAY; i++) { + if(_webui_core.used_ports[i] == port) { + _webui_core.used_ports[i] = 0; + break; + } + } +} + +static void _webui_wait_for_startup(void) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_wait_for_startup()... \n"); + #endif + + if(_webui_core.connections > 0) + return; + + // Wait for the first connection + for(unsigned int n = 0; n <= (_webui_core.startup_timeout * 10); n++) { + + if(_webui_core.connections > 0) + break; + + _webui_sleep(50); + } + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_wait_for_startup() -> Finish.\n"); + #endif +} + +unsigned int _webui_get_new_window_number(void) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_get_new_window_number()... \n"); + #endif + + return ++_webui_core.last_window; +} + +unsigned int _webui_get_free_port(void) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_get_free_port()... \n"); + #endif + + #ifdef _WIN32 + srand((unsigned int)time(NULL)); + #else + srand(time(NULL)); + #endif + + unsigned int port = (rand() % (WEBUI_MAX_PORT + 1 - WEBUI_MIN_PORT)) + WEBUI_MIN_PORT; + + for(unsigned int i = WEBUI_MIN_PORT; i <= WEBUI_MAX_PORT; i++) { + + // Search [port] in [_webui_core.used_ports] + bool found = false; + for(unsigned int j = 0; j < WEBUI_MAX_ARRAY; j++) { + if(_webui_core.used_ports[j] == port) { + found = true; + break; + } + } + + if(found) + // Port used by local window + port = (rand() % (WEBUI_MAX_PORT + 1 - WEBUI_MIN_PORT)) + WEBUI_MIN_PORT; + else { + if(_webui_port_is_used(port)) + // Port used by an external app + port = (rand() % (WEBUI_MAX_PORT + 1 - WEBUI_MIN_PORT)) + WEBUI_MIN_PORT; + else + // Port is free + break; + } + } + + // Add + for(unsigned int i = 0; i < WEBUI_MAX_ARRAY; i++) { + if(_webui_core.used_ports[i] == 0) { + _webui_core.used_ports[i] = port; + break; + } + } + + return port; +} + +static void _webui_init(void) { + + if(_webui_core.initialized) + return; + + #ifdef WEBUI_LOG + printf("[Core]\t\tWebUI v%s \n", WEBUI_VERSION); + printf("[Core]\t\t_webui_init()... \n"); + #endif + + // Initializing + memset(&_webui_core, 0x0, sizeof(_webui_core_t)); + + _webui_core.initialized = true; + _webui_core.startup_timeout = WEBUI_DEF_TIMEOUT; + _webui_core.executable_path = _webui_get_current_path(); +} + +unsigned int _webui_get_cb_index(char* webui_internal_id) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_get_cb_index([%s])... \n", webui_internal_id); + #endif + + if(webui_internal_id != NULL) { + + for(unsigned int i = 1; i < WEBUI_MAX_ARRAY; i++) { + + if(_webui_core.html_elements[i] != NULL && !_webui_is_empty(_webui_core.html_elements[i])) + if(strcmp(_webui_core.html_elements[i], webui_internal_id) == 0) + return i; + } + } + + return 0; +} + +unsigned int _webui_set_cb_index(char* webui_internal_id) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t_webui_set_cb_index([%s])... \n", webui_internal_id); + #endif + + // Add + for(unsigned int i = 1; i < WEBUI_MAX_ARRAY; i++) { + + if(_webui_is_empty(_webui_core.html_elements[i])) { + + _webui_core.html_elements[i] = webui_internal_id; + + return i; + } + } + + return 0; +} + +#ifdef WEBUI_LOG + static void _webui_print_hex(const char* data, size_t len) { + + for(size_t i = 0; i < len; i++) { + + printf("0x%02X ", (unsigned char) *data); + data++; + } + } +#endif + +WEBUI_SERVER_START +{ + _webui_window_t* win = (_webui_window_t*) arg; + + #ifdef WEBUI_LOG + printf("[Core]\t\t[Thread] _webui_server_start(%s)... \n", win->url); + #endif + + // Initialization + _webui_core.servers++; + win->server_running = true; + if(_webui_core.startup_timeout < 1) + _webui_core.startup_timeout = 0; + if(_webui_core.startup_timeout > 30) + _webui_core.startup_timeout = 30; + + // Start Server + struct mg_mgr mgr; + mg_mgr_init(&mgr); + _webui_core.mg_mgrs[win->window_number] = &mgr; + + if(mg_http_listen(&mgr, win->url, _webui_server_event_handler, (void *)win) != NULL) { + + if(_webui_core.startup_timeout > 0) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t[Thread] _webui_server_start()... Listening Success\n"); + printf("[Core]\t\t[Thread] _webui_server_start()... Timeout is %d seconds\n", _webui_core.startup_timeout); + #endif + + bool stop = false; + + while(!stop) { + + if(!win->connected) { + + // Wait for first connection + _webui_timer_t timer_1; + _webui_timer_start(&timer_1); + for(;;) { + + // Stop if window is connected + mg_mgr_poll(&mgr, 1); + if(win->connected) + break; + + // Stop if timer is finished + if(_webui_timer_is_end(&timer_1, (_webui_core.startup_timeout * 1000))) + break; + } + + if(!win->connected && win->html_handled) { + + // At this moment the browser is already started and HTML + // is already handled, so, let's wait more time to give + // the WebSocket an extra one second to connect. + + _webui_timer_t timer_2; + _webui_timer_start(&timer_2); + for(;;) { + + // Stop if window is connected + mg_mgr_poll(&mgr, 1); + if(win->connected) + break; + + // Stop if timer is finished + if(_webui_timer_is_end(&timer_2, 1000)) + break; + } + } + + if(!win->connected) + stop = true; // First run failed + } + else { + + // UI is connected + + while(!stop) { + + // Wait forever for disconnection + + mg_mgr_poll(&mgr, 1); + + // Exit signal + if(_webui_core.exit_now) { + stop = true; + break; + } + + if(!win->connected) { + + // The UI is just get disconnected + // probably the user did a refresh + // let's wait for re-connection... + + _webui_timer_t timer_3; + _webui_timer_start(&timer_3); + for(;;) { + + // Stop if window is re-connected + mg_mgr_poll(&mgr, 1); + if(win->connected) + break; + + // Stop if timer is finished + if(_webui_timer_is_end(&timer_3, 600)) + break; + } + + if(!win->connected) { + + stop = true; + break; + } + } + } + } + } + } + + // Let's check the flag again, there is a change that + // the flag has ben changed during the first loop for + // example when set_timeout() get called later + if(_webui_core.startup_timeout == 0) { + + #ifdef WEBUI_LOG + printf("[Core]\t\t[Thread] _webui_server_start(%s)... Listening Success -> Infinite Loop... \n", win->url); + #endif + + // Wait forever + for(;;) { + + mg_mgr_poll(&mgr, 1); + if(_webui_core.exit_now) + break; + } + } + } + else { + + #ifdef WEBUI_LOG + printf("[Core]\t\t[Thread] _webui_server_start(%s)... Listening failed\n", win->url); + #endif + } + + // Stop server + mg_mgr_free(&mgr); + _webui_core.servers--; + + #ifdef WEBUI_LOG + printf("[Core]\t\t[Thread] _webui_server_start()... Server Stop.\n"); + #endif + + // Clean + win->server_running = false; + win->html_handled = false; + win->connected = false; + _webui_core.mg_mgrs[win->window_number] = NULL; + _webui_core.mg_connections[win->window_number] = NULL; + _webui_free_port(win->server_port); + + THREAD_RETURN +} + +WEBUI_CB +{ + _webui_cb_t* arg = (_webui_cb_t*) _arg; + + #ifdef WEBUI_LOG + printf("[Core]\t\t[Thread] _webui_cb()... \n"); + #endif + + webui_event_t e; + e.element = arg->element_name; + e.window = arg->win; + e.data = arg->data; + e.response = NULL; + e.type = arg->event_type; + + // Check for the events-bind function + if(arg->win->has_events) { + + char* events_id = _webui_generate_internal_id(arg->win, ""); + unsigned int events_cb_index = _webui_get_cb_index(events_id); + _webui_free_mem((void *)events_id); + + if(events_cb_index > 0 && _webui_core.cb[events_cb_index] != NULL) { + + // Call user events cb + _webui_core.cb[events_cb_index](&e); + } + } + + // Check for the bind function + if(arg->element_name != NULL && !_webui_is_empty(arg->element_name)) { + + unsigned int cb_index = _webui_get_cb_index(arg->webui_internal_id); + if(cb_index > 0 && _webui_core.cb[cb_index] != NULL) { + + // Call user cb + _webui_core.cb[cb_index](&e); + } + } + + #ifdef WEBUI_LOG + printf("[Core]\t\t[Thread] _webui_cb()... Stop.\n"); + #endif + + // Free + _webui_free_mem((void *)e.response); + _webui_free_mem((void *)arg->webui_internal_id); + _webui_free_mem((void *)arg->element_name); + _webui_free_mem((void *)arg); + + THREAD_RETURN +} + #ifdef _WIN32 + bool _webui_socket_test_listen_win32(unsigned int port_num) { #ifdef WEBUI_LOG - printf("[0] _webui_socket_test_listen_win32([%d])... \n", port_num); + printf("[Core]\t\t_webui_socket_test_listen_win32([%d])... \n", port_num); #endif WSADATA wsaData; @@ -697,1715 +3998,11 @@ bool _webui_socket_test_listen_mg(unsigned int port_num) { // Listening Success return true; } -#endif -bool _webui_port_is_used(unsigned int port_num) { - - #ifdef WEBUI_LOG - printf("[0] _webui_port_is_used([%d])... \n", port_num); - #endif - - #ifdef _WIN32 - // Listener test - if(!_webui_socket_test_listen_win32(port_num)) - return true; // Port is already used - return false; // Port is not in use - #else - // Listener test MG - if(!_webui_socket_test_listen_mg(port_num)) - return true; // Port is already used - return false; // Port is not in use - #endif -} - -void _webui_serve_file(webui_window_t* win, struct mg_connection *c, void *ev_data) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_serve_file()... \n", win->core.window_number); - #endif - - // Serve a normal text based file - // send with HTTP 200 status code - - struct mg_http_serve_opts opts = { - - .root_dir = win->path - }; - - mg_http_serve_dir(c, ev_data, &opts); -} - -bool _webui_deno_exist(void) { - - #ifdef WEBUI_LOG - printf("[0] _webui_deno_exist()... \n"); - #endif - - static bool found = false; - - if(found) - return true; - - if(_webui_cmd_sync("deno --version", false) == 0) { - - found = true; - return true; - } - else - return false; -} - -bool _webui_nodejs_exist(void) { - - #ifdef WEBUI_LOG - printf("[0] _webui_nodejs_exist()... \n"); - #endif - - static bool found = false; - - if(found) - return true; - - if(_webui_cmd_sync("node -v", false) == 0) { - - found = true; - return true; - } - else - return false; -} - -const char* _webui_interpret_command(const char* cmd) { - - #ifdef WEBUI_LOG - printf("[0] _webui_interpret_command()... \n"); - #endif - - // Redirect stderr to stdout - char cmd_redirected[1024]; - sprintf(cmd_redirected, "%s 2>&1", cmd); - - FILE *runtime = WEBUI_POPEN(cmd_redirected, "r"); - - if(runtime == NULL) - return NULL; - - // Get STDOUT length - // int c; - // while ((c = fgetc(runtime)) != EOF) - // len++; - int len = 1024 * 8; - - // Read STDOUT - char* out = (char*) _webui_malloc(len); - char* line = (char*) _webui_malloc(4000); - while(fgets(line, 4000, runtime) != NULL) - strcat(out, line); - - WEBUI_PCLOSE(runtime); - _webui_free_mem((void *) &line); - - return (const char*) out; -} - -void _webui_interpret_file(webui_window_t* win, struct mg_connection *c, void *ev_data, char* index) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_interpret_file()... \n", win->core.window_number); - #endif - - // Run the JavaScript / TypeScript runtime - // and send back the output with HTTP 200 status code - // otherwise, send the file as a normal text based one - - char* file; - char* full_path; - - if(!_webui_is_empty(index)) { - - // Parse index file - file = index; - full_path = index; - } - else { - - // Parse other files - - struct mg_http_message *hm = (struct mg_http_message *) ev_data; - - // Get file name - file = (char*) _webui_malloc(hm->uri.len); - const char* p = hm->uri.ptr; - p++; // Skip "/" - sprintf(file, "%.*s", (int)(hm->uri.len - 1), p); - - // Get full path - // [current folder][/][file] - full_path = (char*) _webui_malloc(strlen(webui.executable_path) + 1 + strlen(file)); - sprintf(full_path, "%s%s%s", webui.executable_path, webui_sep, file); - - if(!_webui_file_exist(full_path)) { - - // File not exist - 404 - _webui_serve_file(win, c, ev_data); - - _webui_free_mem((void *) &file); - _webui_free_mem((void *) &full_path); - return; - } - } - - // Get file extension - const char* extension = _webui_get_extension(file); - - if(strcmp(extension, "ts") == 0 || strcmp(extension, "js") == 0) { - - // TypeScript / JavaScript - - if(win->core.runtime == webui.runtime.deno) { - - // Use Deno - - if(_webui_deno_exist()) { - - // Set command - // [disable coloring][file] - char* cmd = (char*) _webui_malloc(64 + strlen(full_path)); - #ifdef _WIN32 - sprintf(cmd, "Set NO_COLOR=1 & deno run --allow-all \"%s\"", full_path); - #else - sprintf(cmd, "NO_COLOR=1 & deno run --allow-all \"%s\"", full_path); - #endif - - // Run command - const char* out = _webui_interpret_command(cmd); - - if(out != NULL) { - - // Send deno output - mg_http_reply( - c, 200, - "", - out - ); - } - else { - - // Deno failed. - // Serve as a normal text-based file - _webui_serve_file(win, c, ev_data); - } - - _webui_free_mem((void *) &cmd); - _webui_free_mem((void *) &out); - } - else { - - // Deno not installed - - mg_http_reply( - c, 200, - "", - webui_deno_not_found - ); - } - } - else if(win->core.runtime == webui.runtime.nodejs) { - - // Use Nodejs - - if(_webui_nodejs_exist()) { - - // Set command - // [node][file] - char* cmd = (char*) _webui_malloc(16 + strlen(full_path)); - sprintf(cmd, "node \"%s\"", full_path); - - // Run command - const char* out = _webui_interpret_command(cmd); - - if(out != NULL) { - - // Send Node.js output - mg_http_reply( - c, 200, - "", - out - ); - } - else { - - // Node.js failed. - // Serve as a normal text-based file - _webui_serve_file(win, c, ev_data); - } - - _webui_free_mem((void *) &cmd); - _webui_free_mem((void *) &out); - } - else { - - // Node.js not installed - - mg_http_reply( - c, 200, - "", - webui_nodejs_not_found - ); - } - } - else { - - // Unknown runtime - // Serve as a normal text-based file - _webui_serve_file(win, c, ev_data); - } - } - else { - - // Unknown file extension - // Serve as a normal text-based file - _webui_serve_file(win, c, ev_data); - } - - _webui_free_mem((void *) &file); - _webui_free_mem((void *) &full_path); -} - -const char* _webui_generate_js_bridge(webui_window_t* win) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_generate_js_bridge()... \n", win->core.window_number); - #endif - - // Calculate the cb size - size_t cb_mem_size = 64; // To hold 'const _webui_bind_list = ["elem1", "elem2",];' - for(unsigned int i = 1; i < WEBUI_MAX_ARRAY; i++) - if(!_webui_is_empty(webui.html_elements[i])) - cb_mem_size += strlen(webui.html_elements[i]) + 3; - - // Generate the cb array - char* event_cb_js_array = (char*) _webui_malloc(cb_mem_size); - strcat(event_cb_js_array, "const _webui_bind_list = ["); - for(unsigned int i = 1; i < WEBUI_MAX_ARRAY; i++) { - if(!_webui_is_empty(webui.html_elements[i])) { - strcat(event_cb_js_array, "\""); - strcat(event_cb_js_array, webui.html_elements[i]); - strcat(event_cb_js_array, "\","); - } - } - strcat(event_cb_js_array, "]; \n"); - - // Generate the full WebUI JS-Bridge - size_t len = cb_mem_size + strlen(webui_javascript_bridge) + 1; - char* js = (char*) _webui_malloc(len); - sprintf(js, - "_webui_port = %d; \n _webui_win_num = %d; \n %s \n %s \n", - win->core.server_port, win->core.window_number, event_cb_js_array, webui_javascript_bridge - ); - - return js; -} - -static void _webui_server_event_handler(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { - - webui_window_t* win = (webui_window_t *) fn_data; - - #ifdef WEBUI_LOG - // printf("[%d] _webui_server_event_handler()... \n", win->core.window_number); - #endif - - if(ev == MG_EV_OPEN) { - - // c->is_hexdumping = 1; - } - else if(ev == MG_EV_HTTP_MSG) { - - struct mg_http_message *hm = (struct mg_http_message *) ev_data; - - if(mg_http_match_uri(hm, "/_ws")) { - - // WebSocket - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... HTML Upgrade to WebSocket\n", win->core.window_number); - #endif - - mg_ws_upgrade(c, hm, NULL); - } - else if(mg_http_match_uri(hm, "/webui.js")) { - - // WebUI JS-Bridge - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... HTML WebUI JS\n", win->core.window_number); - #endif - - // Generate JavaScript bridge - const char* js = _webui_generate_js_bridge(win); - - // Header - // Content-Type: text/javascript - - // Send - mg_http_reply( - c, 200, - "", - js - ); - - _webui_free_mem((void *) &js); - } - else if(mg_http_match_uri(hm, "/favicon.ico") || - mg_http_match_uri(hm, "/favicon.svg") || - mg_http_match_uri(hm, "/favicon.png")) { - - // Send favicon - - if(win->core.icon) { - - // Custom icon - - // TODO: Add core.icon_type to the header - - // Header - // ... - - // User icon - mg_http_reply( - c, 200, - "", - win->core.icon - ); - } - else if(win->core.server_root) { - - // Local icon file - _webui_serve_file(win, c, ev_data); - } - else { - - // Default embedded icon - - // TODO: Use webui_def_icon_type - - // Header - // Content-Type: image/svg+xml - - // Default icon - mg_http_reply( - c, 200, - "", - webui_def_icon - ); - } - } - else if(mg_http_match_uri(hm, "/")) { - - // [/] - - if(win->core.server_root) { - - // Serve local files - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... HTML Root Index\n", win->core.window_number); - #endif - - win->core.server_handled = true; - - // Set full path - // [Path][Sep][File Name] - char* index = (char*) _webui_malloc(strlen(webui.executable_path) + 1 + 8); - - // Index.ts - sprintf(index, "%s%sindex.ts", webui.executable_path, webui_sep); - if(_webui_file_exist(index)) { - - // TypeScript Index - _webui_interpret_file(win, c, ev_data, index); - - _webui_free_mem((void *) &index); - return; - } - - // Index.js - sprintf(index, "%s%sindex.js", webui.executable_path, webui_sep); - if(_webui_file_exist(index)) { - - // JavaScript Index - _webui_interpret_file(win, c, ev_data, index); - - _webui_free_mem((void *) &index); - return; - } - - _webui_free_mem((void *) &index); - - // Index.html - // Serve as a normal HTML text-based file - _webui_serve_file(win, c, ev_data); - } - else { - - // Main HTML - - if(!win->core.multi_access && win->core.server_handled) { - - // Main HTML already handled. - // Forbidden 403 - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... HTML Main Already Handled (403)\n", win->core.window_number); - #endif - - // Header - // text/html; charset=utf-8 - - mg_http_reply( - c, 403, - "", - webui_html_served - ); - } - else { - - // Send main HTML - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... HTML Main\n", win->core.window_number); - #endif - - win->core.server_handled = true; - char* html = (char*) webui_empty_string; - - if(win->core.html != NULL) { - - // Generate the full WebUI JS-Bridge - const char* js = _webui_generate_js_bridge(win); - - // Inject WebUI JS-Bridge into HTML - size_t len = strlen(win->core.html) + strlen(js) + 128; - html = (char*) _webui_malloc(len); - sprintf(html, - "%s \n ", - win->core.html, js - ); - - _webui_free_mem((void *) &js); - } - - // // HTTP Header - // char header[512]; - // memset(header, 0x00, 512); - // sprintf(header, - // "HTTP/1.1 200 OK\r\n" - // "Content-Type: text/html; charset=utf-8\r\n" - // "Host: localhost:%d\r\n" - // "Cache-Control: no-cache\r\n" - // "Content-Length: %d\r\n" - // "Connection: close\r\n\r\n", - // win->core.server_port, strlen(html) - // ); - - // Send - mg_http_reply( - c, 200, - "", - html - ); - - _webui_free_mem((void *) &html); - } - } - } - else if(strncmp(hm->uri.ptr, "/WEBUI/FUNC/", 12) == 0 && hm->uri.len >= 15) { - - // Function Call (With response) - - // [/WEBUI/FUNC/ELEMENT_ID/DATA] - // 0 12 - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... CB start\n", win->core.window_number); - #endif - - // Copy packet - size_t len = hm->uri.len; - char* packet = (char*) _webui_malloc(len); - memcpy(packet, hm->uri.ptr, len); - - // Get html element id - char* element = &packet[12]; - size_t element_len = 0; - for (size_t i = 12; i < len; i++) { - if(packet[i] == '/') { - packet[i] = '\0'; - break; - } - element_len++; - } - - // [/WEBUI/FUNC/ELEMENT_ID DATA] - // 0 12 - - // Get data - void* data = &packet[11 + element_len + 2]; - size_t data_len = strlen(data); - - // Generate WebUI internal id - char* webui_internal_id = _webui_generate_internal_id(win, element); - - // Call user function - webui_event_t e; - e.window_id = win->core.window_number; - e.element_name = element; - e.window = win; - e.data = data; - e.response = NULL; - e.type = WEBUI_EVENT_CALLBACK; - - unsigned int cb_index = _webui_get_cb_index(webui_internal_id); - - // Check for bind - if(cb_index > 0 && webui.cb[cb_index] != NULL) { - - // Call user cb - e.element_id = cb_index; - webui.cb[cb_index](&e); - } - - if(_webui_is_empty(e.response)) - e.response = (char*)webui_empty_string; - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... user-callback response [%s]\n", win->core.window_number, (const char*)e.response); - #endif - - // Send response - mg_http_reply( - c, 200, - "", - e.response - ); - - // Free - _webui_free_mem((void *) &packet); - _webui_free_mem((void *) &webui_internal_id); - - // Free data allocated by user callback - if(e.response != NULL) { - if(_webui_ptr_exist(e.response)) { - // This block of memory is allocated by WebUI - // for example the user callback used webui_return_int() - // It's totally safe to free it right now - _webui_free_mem((void *) &e.response); - } - else { - // This block of memory is allocated by - // the user-callback in another language - // for example Python, Rust, Golang... - // We should not free it, it's unsafe. - e.response = NULL; - } - } - } - else { - - // [/file] - - if(win->core.server_root) { - - if(win->core.runtime != webui.runtime.none) { - - // Interpret file - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... HTML Interpret file\n", win->core.window_number); - #endif - - _webui_interpret_file(win, c, ev_data, NULL); - } - else { - - // Serve local files - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... HTML Root file\n", win->core.window_number); - #endif - - // Serve as a normal text-based file - _webui_serve_file(win, c, ev_data); - } - } - else { - - // This is a non-server-folder mode - // but the HTML body request a local file - // this request can be css, js, image, etc... - - if(_webui_file_exist_mg(ev_data)) { - - // Serve as a normal text-based file - _webui_serve_file(win, c, ev_data); - } - else { - - // 404 - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... HTML 404\n", win->core.window_number); - #endif - - // Header - // text/html; charset=utf-8 - - mg_http_reply( - c, 404, - "", - webui_html_res_not_available - ); - } - } - } - } - else if(ev == MG_EV_WS_MSG) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... WebSocket Data\n", win->core.window_number); - #endif - - struct mg_ws_message *wm = (struct mg_ws_message *) ev_data; - - // Parse the packet - _webui_window_receive(win, wm->data.ptr, wm->data.len); - } - else if(ev == MG_EV_WS_OPEN) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... WebSocket Connected\n", win->core.window_number); - #endif - - int event_type = WEBUI_EVENT_CONNECTED; - - if(!win->core.connected) { - - // First connection - - win->core.connected = true; // server thread - webui.connections++; // main loop - webui.mg_connections[win->core.window_number] = c; // websocket send func - } - else { - - if(win->core.multi_access) { - - // Multi connections - win->core.connections++; - event_type = WEBUI_EVENT_MULTI_CONNECTION; - } - else { - - // UNWANTED Multi connections - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler() -> UNWANTED Multi Connections\n", win->core.window_number); - #endif - - mg_close_conn(c); - event_type = WEBUI_EVENT_UNWANTED_CONNECTION; - } - } - - // Generate WebUI internal id - char* webui_internal_id = _webui_generate_internal_id(win, ""); - - _webui_window_event( - win, // Window - webui_internal_id, // WebUI Internal ID - "", // User HTML ID - NULL, // User Custom Data - 0, // User Data Len - event_type // Type of this event - ); - } - else if(ev == MG_EV_WS_CTL) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_server_event_handler()... WebSocket Closed\n", win->core.window_number); - #endif - - if(win->core.connected) { - - if(win->core.multi_access && win->core.connections > 0) { - - // Multi connections close - win->core.connections--; - } - else { - - // Main connection close - webui.connections--; // main loop - win->core.connected = false; // server thread - } - } - - // Generate WebUI internal id - char* webui_internal_id = _webui_generate_internal_id(win, ""); - - _webui_window_event( - win, // Window - webui_internal_id, // WebUI Internal ID - "", // User HTML ID - NULL, // User Custom Data - 0, // User Data Len - WEBUI_EVENT_DISCONNECTED // Type of this event - ); - } -} - -#ifdef _WIN32 - DWORD WINAPI webui_server_start(LPVOID arg) -#else - void* webui_server_start(void* arg) -#endif -{ - webui_window_t* win = (webui_window_t*) arg; - - #ifdef WEBUI_LOG - printf("[%d] [Thread] webui_server_start(%s)... \n", win->core.window_number, win->core.url); - #endif - - // Initialization - webui.servers++; - win->core.server_running = true; - unsigned int timeout = webui.startup_timeout; - if(timeout < 1) - timeout = 1; - - // Start Server - struct mg_mgr mgr; - mg_mgr_init(&mgr); - webui.mg_mgrs[win->core.window_number] = &mgr; - - if(mg_http_listen(&mgr, win->core.url, _webui_server_event_handler, (void *)win) != NULL) { - - if(webui.use_timeout) { - - #ifdef WEBUI_LOG - printf("[%d] [Thread] webui_server_start(%s)... Listening Success -> Loop (%d seconds timeout)... \n", win->core.window_number, win->core.url, timeout); - #endif - - bool stop = false; - - for(;;) { - - if(!win->core.server_handled) { - - // Wait for first connection - webui_timer_t timer; - _webui_timer_start(&timer); - for(;;) { - - // Stop if window is connected - mg_mgr_poll(&mgr, 1); - if(win->core.connected) - break; - - // Stop if timer is finished - if(_webui_timer_is_end(&timer, (timeout * 1000))) - break; - } - - if(!win->core.connected && webui.timeout_extra && win->core.server_handled) { - - // At this moment the browser is already started and HTML - // is already handled, so, let's wait more time to give - // the WebSocket an extra time to connect - - _webui_timer_start(&timer); - for(;;) { - - // Stop if window is connected - mg_mgr_poll(&mgr, 1); - if(win->core.connected) - break; - - // Stop if timer is finished - if(_webui_timer_is_end(&timer, (timeout * 1000))) - break; - } - } - - if(!win->core.connected) - stop = true; - } - else { - - for(;;) { - - // Wait forever for disconnection - - mg_mgr_poll(&mgr, 1); - - // Exit signal - if(webui.exit_now) { - stop = true; - break; - } - - if(!win->core.connected) { - - // The UI is just get disconnected - // let's wait for re-connection... - - webui_timer_t timer; - _webui_timer_start(&timer); - for(;;) { - - // Stop if window is re-connected - mg_mgr_poll(&mgr, 1); - if(win->core.connected) - break; - - // Stop if all process get closed - if(webui.process < 1) { - - stop = true; - break; - } - - // Stop if timer is finished - if(_webui_timer_is_end(&timer, 2500)) - break; - } - - if(!win->core.connected) - break; - } - } - - if(win->core.server_handled) - stop = true; - } - - if(stop) - break; - } - } - - // Let's check the flag again, there is a change - // that the flag is changed during the first loop - // for example when set_timeout() get called later - if(!webui.use_timeout) { - - #ifdef WEBUI_LOG - printf("[%d] [Thread] webui_server_start(%s)... Listening Success -> Infinite Loop... \n", win->core.window_number, win->core.url); - #endif - - // Wait forever - for(;;) { - - mg_mgr_poll(&mgr, 1); - if(webui.exit_now) - break; - } - } - } - else { - - #ifdef WEBUI_LOG - printf("[%d] [Thread] webui_server_start(%s)... Listening failed\n", win->core.window_number, win->core.url); - #endif - } - - // Stop server - mg_mgr_free(&mgr); - webui.servers--; - - #ifdef WEBUI_LOG - printf("[%d] [Thread] webui_server_start()... Server Stop.\n", win->core.window_number); - #endif - - // Clean - win->core.server_running = false; - win->core.server_handled = false; - win->core.connected = false; - webui.mg_mgrs[win->core.window_number] = NULL; - webui.mg_connections[win->core.window_number] = NULL; - _webui_free_port(win->core.server_port); - - #ifdef _WIN32 - return 0; - #else - pthread_exit(NULL); - #endif -} - -bool _webui_browser_create_profile_folder(webui_window_t* win, unsigned int browser) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_create_profile_folder(%d)... \n", browser); - #endif - - // Custom Browser - if(browser == webui.browser.custom) { - // Check the struct pointer - if(webui.custom_browser == NULL) - return false; - return true; - } - - const char* temp = _webui_browser_get_temp_path(browser); - - if(browser == webui.browser.chrome) { - - // Google Chrome - sprintf(win->core.profile_path, "%s%s.WebUI%sWebUIChromeProfile", temp, webui_sep, webui_sep); - return true; - } - else if(browser == webui.browser.edge) { - - // Edge - sprintf(win->core.profile_path, "%s%s.WebUI%sWebUIEdgeProfile", temp, webui_sep, webui_sep); - return true; - } - else if(browser == webui.browser.epic) { - - // Epic - sprintf(win->core.profile_path, "%s%s.WebUI%sWebUIEpicProfile", temp, webui_sep, webui_sep); - return true; - } - else if(browser == webui.browser.vivaldi) { - - // Vivaldi - sprintf(win->core.profile_path, "%s%s.WebUI%sWebUIVivaldiProfile", temp, webui_sep, webui_sep); - return true; - } - else if(browser == webui.browser.brave) { - - // Brave - sprintf(win->core.profile_path, "%s%s.WebUI%sWebUIBraveProfile", temp, webui_sep, webui_sep); - return true; - } - else if(browser == webui.browser.yandex) { - - // Yandex - sprintf(win->core.profile_path, "%s%s.WebUI%sWebUIYandexProfile", temp, webui_sep, webui_sep); - return true; - } - else if(browser == webui.browser.chromium) { - - // Chromium - sprintf(win->core.profile_path, "%s%s.WebUI%sWebUIChromiumProfile", temp, webui_sep, webui_sep); - return true; - } - else if(browser == webui.browser.firefox) { - - // Firefox (We need to create a folder) - - char* profile_name = "WebUIFirefoxProfile"; - - char firefox_profile_path[1024]; - sprintf(firefox_profile_path, "%s%s.WebUI%s%s", temp, webui_sep, webui_sep, profile_name); - - if(!_webui_folder_exist(firefox_profile_path)) { - - char buf[2048]; - - sprintf(buf, "%s -CreateProfile \"WebUI %s\"", win->core.browser_path, firefox_profile_path); - _webui_cmd_sync(buf, false); - - // Creating the browser profile folders timeout... - for(unsigned int n = 0; n <= (webui.startup_timeout * 4); n++) { - - if(_webui_folder_exist(firefox_profile_path)) - break; - - _webui_sleep(250); - } - - if(!_webui_folder_exist(firefox_profile_path)) - return false; - - // prefs.js - FILE *file; - sprintf(buf, "%s%sprefs.js", firefox_profile_path, webui_sep); - file = fopen(buf, "a"); - if(file == NULL) - return false; - fputs("user_pref(\"toolkit.legacyUserProfileCustomizations.stylesheets\", true); ", file); - fputs("user_pref(\"browser.shell.checkDefaultBrowser\", false); ", file); - fputs("user_pref(\"browser.tabs.warnOnClose\", false); ", file); - fclose(file); - - // userChrome.css - sprintf(buf, "\"%s%schrome%s\"", firefox_profile_path, webui_sep, webui_sep); - if(!_webui_folder_exist(buf)) { - - sprintf(buf, "mkdir \"%s%schrome%s\"", firefox_profile_path, webui_sep, webui_sep); - _webui_cmd_sync(buf, false); // Create directory - } - sprintf(buf, "%s%schrome%suserChrome.css", firefox_profile_path, webui_sep, webui_sep); - file = fopen(buf, "a"); - if(file == NULL) - return false; - #ifdef _WIN32 - fputs(":root{--uc-toolbar-height:32px}:root:not([uidensity=\"compact\"]) {--uc-toolbar-height:38px}#TabsToolbar{visibility:collapse!important}:root:not([inFullscreen]) #nav-bar{margin-top:calc(0px - var(--uc-toolbar-height))}#toolbar-menubar{min-height:unset!important;height:var(--uc-toolbar-height)!important;position:relative}#main-menubar{-moz-box-flex:1;background-color:var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor);background-clip:padding-box;border-right:30px solid transparent;border-image:linear-gradient(to left,transparent,var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor) 30px) 20 / 30px}#toolbar-menubar:not([inactive]) {z-index:2}#toolbar-menubar[inactive] > #menubar-items{opacity:0;pointer-events:none;margin-left:var(--uc-window-drag-space-width,0px)}#nav-bar{visibility:collapse}@-moz-document url(chrome://browser/content/browser.xhtml) {:root:not([sizemode=\"fullscreen\"]) > head{display: block;position: fixed;width: calc(200vw - 440px);text-align: left;z-index: 9;pointer-events: none;}head > *{ display: none }head > title{display: -moz-inline-box;padding: 4px;max-width: 50vw;overflow-x: hidden;text-overflow: ellipsis;}}", file); - #elif __APPLE__ - fputs(":root{--uc-toolbar-height:32px}:root:not([uidensity=\"compact\"]) {--uc-toolbar-height:38px}#TabsToolbar{visibility:collapse!important}:root:not([inFullscreen]) #nav-bar{margin-top:calc(0px - var(--uc-toolbar-height))}#toolbar-menubar{min-height:unset!important;height:var(--uc-toolbar-height)!important;position:relative}#main-menubar{-moz-box-flex:1;background-color:var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor);background-clip:padding-box;border-right:30px solid transparent;border-image:linear-gradient(to left,transparent,var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor) 30px) 20 / 30px}#toolbar-menubar:not([inactive]) {z-index:2}#toolbar-menubar[inactive] > #menubar-items{opacity:0;pointer-events:none;margin-left:var(--uc-window-drag-space-width,0px)}#nav-bar{visibility:collapse}@-moz-document url(chrome://browser/content/browser.xhtml) {:root:not([sizemode=\"fullscreen\"]) > head{display: block;position: fixed;width: calc(200vw - 440px);text-align: left;z-index: 9;pointer-events: none;}head > *{ display: none }head > title{display: -moz-inline-box;padding: 4px;max-width: 50vw;overflow-x: hidden;text-overflow: ellipsis;}}", file); - #else - fputs(":root{--uc-toolbar-height:32px}:root:not([uidensity=\"compact\"]) {--uc-toolbar-height:38px}#TabsToolbar{visibility:collapse!important}:root:not([inFullscreen]) #nav-bar{margin-top:calc(0px - var(--uc-toolbar-height))}#toolbar-menubar{min-height:unset!important;height:var(--uc-toolbar-height)!important;position:relative}#main-menubar{-moz-box-flex:1;background-color:var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor);background-clip:padding-box;border-right:30px solid transparent;border-image:linear-gradient(to left,transparent,var(--toolbar-bgcolor,--toolbar-non-lwt-bgcolor) 30px) 20 / 30px}#toolbar-menubar:not([inactive]) {z-index:2}#toolbar-menubar[inactive] > #menubar-items{opacity:0;pointer-events:none;margin-left:var(--uc-window-drag-space-width,0px)}#nav-bar{visibility:collapse}@-moz-document url(chrome://browser/content/browser.xhtml) {:root:not([sizemode=\"fullscreen\"]) > head{display: block;position: fixed;width: calc(200vw - 440px);text-align: left;z-index: 9;pointer-events: none;}head > *{ display: none }head > title{display: -moz-inline-box;padding: 4px;max-width: 50vw;overflow-x: hidden;text-overflow: ellipsis;}}", file); - #endif - fclose(file); - - sprintf(win->core.profile_path, "%s%s%s", temp, webui_sep, profile_name); - } - - return true; - } - - return false; -} - -bool _webui_folder_exist(char* folder) { - - #ifdef WEBUI_LOG - printf("[0] _webui_folder_exist([%s])... \n", folder); - #endif - - #if defined(_MSC_VER) - if(GetFileAttributesA(folder) != INVALID_FILE_ATTRIBUTES) - return true; - #else - DIR* dir = opendir(folder); - if(dir) { - closedir(dir); - return true; - } - #endif - - return false; -} - -char* _webui_generate_internal_id(webui_window_t* win, const char* element) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_generate_internal_id([%s])... \n", win->core.window_number, element); - #endif - - // Generate WebUI internal id - size_t element_len = strlen(element); - size_t internal_id_size = 3 + 1 + element_len; // [win num][/][name] - char* webui_internal_id = (char*) _webui_malloc(internal_id_size); - sprintf(webui_internal_id, "%d/%s", win->core.window_number, element); - - return webui_internal_id; -} - -const char* _webui_browser_get_temp_path(unsigned int browser) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_get_temp_path([%d])... \n", browser); - #endif - - #ifdef _WIN32 - // Resolve %USERPROFILE% - #ifdef _MSC_VER - char* WinUserProfile = NULL; - size_t sz = 0; - if(_dupenv_s(&WinUserProfile, &sz, "USERPROFILE") != 0 || WinUserProfile == NULL) - return webui_empty_string; - #else - char* WinUserProfile = getenv("USERPROFILE"); - if(WinUserProfile == NULL) - return webui_empty_string; - #endif - #elif __APPLE__ - // Resolve $HOME - char* MacUserProfile = getenv("HOME"); - if(MacUserProfile == NULL) - return webui_empty_string; - #else - // Resolve $HOME - char* LinuxUserProfile = getenv("HOME"); - if(LinuxUserProfile == NULL) - return webui_empty_string; - #endif - - #ifdef _WIN32 - // WinUserProfile is already a complete path - return WinUserProfile; - #elif __APPLE__ - return MacUserProfile; - #else - return LinuxUserProfile; - #endif -} - -#ifdef _WIN32 - bool _webui_get_windows_reg_value(HKEY key, const char* reg, const char* value_name, char value[WEBUI_MAX_PATH]) { - - #ifdef WEBUI_LOG - printf("[0] _webui_get_windows_reg_value([%s])... \n", reg); - #endif - - HKEY hKey; - - if(RegOpenKeyEx(key, reg, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { - - DWORD valueSize = WEBUI_MAX_PATH; - // If `value_name` is empty then - // will read the "(default)" reg-key - if(RegQueryValueEx(hKey, value_name, NULL, NULL, (LPBYTE)value, &valueSize) == ERROR_SUCCESS) { - - RegCloseKey(hKey); - return true; - } - } - - return false; - } -#endif - -bool _webui_is_google_chrome_folder(const char* folder) { - - #ifdef WEBUI_LOG - printf("[0] _webui_is_google_chrome_folder([%s])... \n", folder); - #endif - - char browser_full_path[WEBUI_MAX_PATH]; - - // Make sure this folder is Google Chrome setup and not Chromium - // by checking if `master_preferences` file exist or `initial_preferences` - // Ref: https://support.google.com/chrome/a/answer/187948?hl=en - - sprintf(browser_full_path, "%s\\master_preferences", folder); - if(!_webui_file_exist(browser_full_path)) { - - sprintf(browser_full_path, "%s\\initial_preferences", folder); - if(!_webui_file_exist(browser_full_path)) - return false; // This is Chromium or something else - } - - // Make sure the browser executable file exist - sprintf(browser_full_path, "%s\\chrome.exe", folder); - if(!_webui_file_exist(browser_full_path)) - return false; - - return true; -} - -bool _webui_browser_exist(webui_window_t* win, unsigned int browser) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_exist([%d])... \n", browser); - #endif - - // Check if a web browser is installed on this machine - - // Custom Browser - if(browser == webui.browser.custom) { - // Check the struct pointer - if(webui.custom_browser == NULL) - return false; - return true; - } - - if(browser == webui.browser.chrome) { - - // Google Chrome - - #ifdef _WIN32 - - // Google Chrome on Windows - - char browser_folder[WEBUI_MAX_PATH]; - - // Search in `HKEY_LOCAL_MACHINE` (If Google Chrome installed for multi-user) - if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", "Path", browser_folder)) { - - // Make sure its Google Chrome and not Chromium - if(_webui_is_google_chrome_folder(browser_folder)) { - - // Google Chrome Found (multi-user) - sprintf(win->core.browser_path, "\"%s\\chrome.exe\"", browser_folder); - return true; - } - } - - // Search in `HKEY_CURRENT_USER` (If Google Chrome installed for one user) - if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", "Path", browser_folder)) { - - // Make sure its Google Chrome and not Chromium - if(_webui_is_google_chrome_folder(browser_folder)) { - - // Google Chrome Found (one user) - sprintf(win->core.browser_path, "\"%s\\chrome.exe\"", browser_folder); - return true; - } - } - - return false; - - #elif __APPLE__ - - // Google Chrome on macOS - if(_webui_cmd_sync("open -R -a \"Google Chrome\"", false) == 0) { - - sprintf(win->core.browser_path, "open -W \"/Applications/Google Chrome.app\" --args"); - return true; - } - else - return false; - #else - - // Google Chrome on Linux - if(_webui_cmd_sync("google-chrome --version", false) == 0) { - - sprintf(win->core.browser_path, "google-chrome"); - return true; - } - else if(_webui_cmd_sync("google-chrome-stable --version", false) == 0) { - - sprintf(win->core.browser_path, "google-chrome-stable"); - return true; - } - else - return false; - - #endif - } - else if(browser == webui.browser.edge) { - - // Edge - - #ifdef _WIN32 - - // Edge on Windows - - char browser_fullpath[WEBUI_MAX_PATH]; - - // Search in `HKEY_LOCAL_MACHINE` (If Edge installed for multi-user) - if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\msedge.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Edge Found (multi-user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - // Search in `HKEY_CURRENT_USER` (If Edge installed for one user) - if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\msedge.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Edge Found (one user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - return false; - - #elif __APPLE__ - - // Edge on macOS - return false; - - #else - - // Edge on Linux - return false; - - #endif - } - else if(browser == webui.browser.epic) { - - // Epic Privacy Browser - - #ifdef _WIN32 - - // Epic on Windows - - char browser_fullpath[WEBUI_MAX_PATH]; - - // Search in `HKEY_CURRENT_USER` (If Epic installed for one user) - if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\epic.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Epic Found (one user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - // Search in `HKEY_LOCAL_MACHINE` (If Epic installed for multi-user) - if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\epic.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Epic Found (multi-user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - return false; - - #elif __APPLE__ - - // Epic on macOS - if(_webui_cmd_sync("open -R -a \"Epic\"", false) == 0) { - - sprintf(win->core.browser_path, "open -W \"/Applications/Epic.app\" --args"); - return true; - } - else - return false; - #else - - // Epic on Linux - if(_webui_cmd_sync("epic --version", false) == 0) { - - sprintf(win->core.browser_path, "epic"); - return true; - } - else - return false; - #endif - } - else if(browser == webui.browser.vivaldi) { - - // Vivaldi Browser - - #ifdef _WIN32 - - // Vivaldi on Windows - - char browser_fullpath[WEBUI_MAX_PATH]; - - // Search in `HKEY_LOCAL_MACHINE` (If Vivaldi installed for multi-user) - if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\vivaldi.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Vivaldi Found (multi-user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - // Search in `HKEY_CURRENT_USER` (If Vivaldi installed for one user) - if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\vivaldi.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Vivaldi Found (one user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - return false; - - #elif __APPLE__ - - // Vivaldi on macOS - if(_webui_cmd_sync("open -R -a \"Vivaldi\"", false) == 0) { - - sprintf(win->core.browser_path, "open -W \"/Applications/Vivaldi.app\" --args"); - return true; - } - else - return false; - #else - - // Vivaldi on Linux - if(_webui_cmd_sync("vivaldi --version", false) == 0) { - - sprintf(win->core.browser_path, "vivaldi"); - return true; - } - else - return false; - #endif - } - else if(browser == webui.browser.brave) { - - // Brave Browser - - #ifdef _WIN32 - - // Brave on Windows - - char browser_fullpath[WEBUI_MAX_PATH]; - - // Search in `HKEY_LOCAL_MACHINE` (If Brave installed for multi-user) - if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\brave.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Brave Found (multi-user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - // Search in `HKEY_CURRENT_USER` (If Brave installed for one user) - if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\brave.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Brave Found (one user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - return false; - - #elif __APPLE__ - - // Brave on macOS - if(_webui_cmd_sync("open -R -a \"Brave\"", false) == 0) { - - sprintf(win->core.browser_path, "open -W \"/Applications/Brave.app\" --args"); - return true; - } - else - return false; - #else - - // Brave on Linux - if(_webui_cmd_sync("brave-browser --version", false) == 0) { - - sprintf(win->core.browser_path, "brave-browser"); - return true; - } - else - return false; - #endif - } - else if(browser == webui.browser.firefox) { - - // Firefox - - #ifdef _WIN32 - - // Firefox on Windows - - char browser_fullpath[WEBUI_MAX_PATH]; - - // Search in `HKEY_LOCAL_MACHINE` (If Firefox installed for multi-user) - if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\firefox.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Firefox Found (multi-user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - // Search in `HKEY_CURRENT_USER` (If Firefox installed for one user) - if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\firefox.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Firefox Found (one user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - return false; - - #elif __APPLE__ - - // Firefox on macOS - if(_webui_cmd_sync("open -R -a \"firefox\"", false) == 0) { - - sprintf(win->core.browser_path, "open -W \"/Applications/Firefox.app\" --args"); - return true; - } - else - return false; - #else - - // Firefox on Linux - - if(_webui_cmd_sync("firefox -v", false) == 0) { - - sprintf(win->core.browser_path, "firefox"); - return true; - } - else - return false; - - #endif - - } - else if(browser == webui.browser.yandex) { - - // Yandex Browser - - #ifdef _WIN32 - - // Yandex on Windows - - char browser_fullpath[WEBUI_MAX_PATH]; - - // Search in `HKEY_CURRENT_USER` (If Yandex installed for one user) - if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\browser.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Yandex Found (one user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - // Search in `HKEY_LOCAL_MACHINE` (If Yandex installed for multi-user) - if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\browser.exe", "", browser_fullpath)) { - - // Make sure the browser executable file exist - if(_webui_file_exist(browser_fullpath)) { - - // Yandex Found (multi-user) - sprintf(win->core.browser_path, "\"%s\"", browser_fullpath); - return true; - } - } - - return false; - - #elif __APPLE__ - - // Yandex on macOS - if(_webui_cmd_sync("open -R -a \"Yandex\"", false) == 0) { - - sprintf(win->core.browser_path, "open -W \"/Applications/Yandex.app\" --args"); - return true; - } - else - return false; - #else - - // Yandex on Linux - if(_webui_cmd_sync("yandex-browser --version", false) == 0) { - - sprintf(win->core.browser_path, "yandex-browser"); - return true; - } - else - return false; - #endif - } - else if(browser == webui.browser.chromium) { - - // The Chromium Projects - - #ifdef _WIN32 - - // Chromium on Windows - - char browser_folder[WEBUI_MAX_PATH]; - - // Search in `HKEY_CURRENT_USER` (If Chromium installed for one user) - if(_webui_get_windows_reg_value(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", "Path", browser_folder)) { - - // Make sure its Chromium and not Google Chrome - if(!_webui_is_google_chrome_folder(browser_folder)) { - - // Chromium Found (one user) - sprintf(win->core.browser_path, "\"%s\\chrome.exe\"", browser_folder); - return true; - } - } - - // Search in `HKEY_LOCAL_MACHINE` (If Chromium installed for multi-user) - if(_webui_get_windows_reg_value(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", "Path", browser_folder)) { - - // Make sure its Chromium and not Google Chrome - if(!_webui_is_google_chrome_folder(browser_folder)) { - - // Chromium Found (multi-user) - sprintf(win->core.browser_path, "\"%s\\chrome.exe\"", browser_folder); - return true; - } - } - - return false; - - #elif __APPLE__ - - // Chromium on macOS - if(_webui_cmd_sync("open -R -a \"Chromium\"", false) == 0) { - - sprintf(win->core.browser_path, "open -W \"/Applications/Chromium.app\" --args"); - return true; - } - else - return false; - #else - - // Chromium on Linux - if(_webui_cmd_sync("chromium-browser --version", false) == 0) { - - sprintf(win->core.browser_path, "chromium-browser"); - return true; - } - else - return false; - #endif - } - - return false; -} - -void _webui_clean(void) { - - #ifdef WEBUI_LOG - printf("[0] _webui_clean()... \n"); - #endif - - static bool cleaned = false; - if(cleaned) return; - cleaned = true; - - // Let's give other threads more time to safely exit - // and finish their cleaning up. - _webui_sleep(120); - - // TODO: Add option to let the user decide if - // WebUI should delete the web browser profile - // folder or not. - - // Free all non-freed memory allocations - _webui_free_all_mem(); -} - -#ifdef _WIN32 int _webui_system_win32(char* cmd, bool show) { #ifdef WEBUI_LOG - printf("[0] _webui_system_win32()... \n"); + printf("[Core]\t\t_webui_system_win32()... \n"); #endif DWORD Return = 0; @@ -2462,1810 +4059,32 @@ void _webui_clean(void) { else return -1; } -#endif -int _webui_cmd_sync(char* cmd, bool show) { - - #ifdef WEBUI_LOG - printf("[0] _webui_cmd_sync()... \n"); - #endif - - // Run sync command and - // return the exit code - - char buf[1024]; - - #ifdef _WIN32 - sprintf(buf, "cmd /c \"%s\" > nul 2>&1", cmd); - #ifdef WEBUI_LOG - printf("[0] _webui_cmd_sync() -> Running [%s] \n", buf); - #endif - return _webui_system_win32(buf, show); - #else - sprintf(buf, "%s >>/dev/null 2>>/dev/null ", cmd); - #ifdef WEBUI_LOG - printf("[0] _webui_cmd_sync() -> Running [%s] \n", buf); - #endif - int r = system(buf); - r = (r != -1 && r != 127 && WIFEXITED(r)) ? WEXITSTATUS(r) : -1; - return r; - #endif -} - -int _webui_cmd_async(char* cmd, bool show) { - - #ifdef WEBUI_LOG - printf("[0] _webui_cmd_async()... \n"); - #endif - - // Run a async command - // and return immediately - - char buf[1024]; - int res = 0; - - // Asynchronous command - #ifdef _WIN32 - sprintf(buf, "START \"\" %s", cmd); - res = _webui_cmd_sync(buf, show); - #else - sprintf(buf, "%s >>/dev/null 2>>/dev/null &", cmd); - res = _webui_cmd_sync(buf, show); - #endif - - return res; -} - -#ifdef _WIN32 - DWORD WINAPI _webui_run_browser_detect_proc_task(LPVOID _arg) -#else - void* _webui_run_browser_detect_proc_task(void* _arg) -#endif -{ - webui_cmd_async_t* arg = (webui_cmd_async_t*) _arg; - - #ifdef WEBUI_LOG - printf("[%d] _webui_run_browser_detect_proc_task()... \n", arg->win->core.window_number); - #endif - - // Prevent the main loop from closing - webui.process++; - - // Run command - _webui_cmd_sync(arg->cmd, false); - - #ifdef WEBUI_LOG - printf("[%d] _webui_run_browser_detect_proc_task() -> Process closed.\n", arg->win->core.window_number); - #endif - - // Free memory - _webui_free_mem((void *) &arg->cmd); - - // The browser process just get closed - // let the main loop break if there is - // no other running browser process. - webui.process--; - _webui_sleep(250); - if((webui.process < 1) && (!arg->win->core.connected)) - webui.exit_now = true; - - #ifdef _WIN32 - return 0; - #else - pthread_exit(NULL); - #endif -} - -int _webui_run_browser(webui_window_t* win, char* cmd) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_run_browser()... \n", win->core.window_number); - #endif - - int res = 0; - - if(win->core.detect_process_close) { - - // Detect window closing event by the browser - // process, instead of the WS connection status - - webui_cmd_async_t* arg = (webui_cmd_async_t*) _webui_malloc(sizeof(webui_cmd_async_t)); - arg->win = win; - arg->cmd = (char*) _webui_malloc(strlen(cmd)); - strcpy(arg->cmd, cmd); - - #ifdef _WIN32 - HANDLE user_fun_thread = CreateThread(NULL, 0, _webui_run_browser_detect_proc_task, (void *) arg, 0, NULL); - if(user_fun_thread != NULL) - CloseHandle(user_fun_thread); - #else - pthread_t thread; - pthread_create(&thread, NULL, &_webui_run_browser_detect_proc_task, (void *) arg); - pthread_detach(thread); - #endif - - // TODO: We need to set 'res = -1' when _webui_run_browser_detect_proc_task() fails. - } - else { - - // Run a async command - res = _webui_cmd_async(cmd, false); - } - - return res; -} - -bool _webui_browser_start_chrome(webui_window_t* win, const char* address) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_start_chrome([%s])... \n", address); - #endif - - // -- Google Chrome ---------------------- - - if(win->core.CurrentBrowser != 0 && win->core.CurrentBrowser != webui.browser.chrome) - return false; - - if(!_webui_browser_exist(win, webui.browser.chrome)) - return false; - - if(!_webui_browser_create_profile_folder(win, webui.browser.chrome)) - return false; - - char arg[1024]; - sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --incognito --app=", win->core.profile_path); - - char full[1024]; - sprintf(full, "%s%s%s", win->core.browser_path, arg, address); - - if(_webui_run_browser(win, full) == 0) { - - win->core.CurrentBrowser = webui.browser.chrome; - webui.browser.current = webui.browser.chrome; - return true; - } - else - return false; -} - -bool _webui_browser_start_edge(webui_window_t* win, const char* address) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_start_edge([%s])... \n", address); - #endif - - // -- Microsoft Edge ---------------------- - - if(win->core.CurrentBrowser != 0 && win->core.CurrentBrowser != webui.browser.edge) - return false; - - if(!_webui_browser_exist(win, webui.browser.edge)) - return false; - - if(!_webui_browser_create_profile_folder(win, webui.browser.edge)) - return false; - - // TODO: We need to disable the Sync message in the first run, - // we fix it using `--inprivate`, but it add "" in the title bar. - - char arg[1024]; - sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --inprivate --app=", win->core.profile_path); - - char full[1024]; - sprintf(full, "%s%s%s", win->core.browser_path, arg, address); - - if(_webui_run_browser(win, full) == 0) { - - win->core.CurrentBrowser = webui.browser.edge; - webui.browser.current = webui.browser.edge; - return true; - } - else - return false; -} - -bool _webui_browser_start_epic(webui_window_t* win, const char* address) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_start_epic([%s])... \n", address); - #endif - - // -- Epic Privacy Browser ---------------------- - - if(win->core.CurrentBrowser != 0 && win->core.CurrentBrowser != webui.browser.epic) - return false; - - if(!_webui_browser_exist(win, webui.browser.epic)) - return false; - - if(!_webui_browser_create_profile_folder(win, webui.browser.epic)) - return false; - - char arg[1024]; - sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --incognito --app=", win->core.profile_path); - - char full[1024]; - sprintf(full, "%s%s%s", win->core.browser_path, arg, address); - - if(_webui_run_browser(win, full) == 0) { - - win->core.CurrentBrowser = webui.browser.epic; - webui.browser.current = webui.browser.epic; - return true; - } - else - return false; -} - -bool _webui_browser_start_vivaldi(webui_window_t* win, const char* address) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_start_vivaldi([%s])... \n", address); - #endif - - // -- Vivaldi Browser ---------------------- - - if(win->core.CurrentBrowser != 0 && win->core.CurrentBrowser != webui.browser.vivaldi) - return false; - - if(!_webui_browser_exist(win, webui.browser.vivaldi)) - return false; - - if(!_webui_browser_create_profile_folder(win, webui.browser.vivaldi)) - return false; - - char arg[1024]; - sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --incognito --app=", win->core.profile_path); - - char full[1024]; - sprintf(full, "%s%s%s", win->core.browser_path, arg, address); - - if(_webui_run_browser(win, full) == 0) { - - win->core.CurrentBrowser = webui.browser.vivaldi; - webui.browser.current = webui.browser.vivaldi; - return true; - } - else - return false; -} - -bool _webui_browser_start_brave(webui_window_t* win, const char* address) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_start_brave([%s])... \n", address); - #endif - - // -- Brave Browser ---------------------- - - if(win->core.CurrentBrowser != 0 && win->core.CurrentBrowser != webui.browser.brave) - return false; - - if(!_webui_browser_exist(win, webui.browser.brave)) - return false; - - if(!_webui_browser_create_profile_folder(win, webui.browser.brave)) - return false; - - char arg[1024]; - sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --incognito --app=", win->core.profile_path); - - char full[1024]; - sprintf(full, "%s%s%s", win->core.browser_path, arg, address); - - if(_webui_run_browser(win, full) == 0) { - - win->core.CurrentBrowser = webui.browser.brave; - webui.browser.current = webui.browser.brave; - return true; - } - else - return false; -} - -bool _webui_browser_start_firefox(webui_window_t* win, const char* address) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_start_firefox([%s])... \n", address); - #endif - - // -- Mozilla Firefox ---------------------- - - if(win->core.CurrentBrowser != 0 && win->core.CurrentBrowser != webui.browser.firefox) - return false; - - if(!_webui_browser_exist(win, webui.browser.firefox)) - return false; - - if(!_webui_browser_create_profile_folder(win, webui.browser.firefox)) - return false; - - char full[1024]; - sprintf(full, "%s -P WebUI -purgecaches -new-window -private-window %s", win->core.browser_path, address); - - if(_webui_run_browser(win, full) == 0) { - - win->core.CurrentBrowser = webui.browser.firefox; - webui.browser.current = webui.browser.firefox; - return true; - } - else - return false; -} - -bool _webui_browser_start_yandex(webui_window_t* win, const char* address) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_start_yandex([%s])... \n", address); - #endif - - // -- Yandex Browser ---------------------- - - if(win->core.CurrentBrowser != 0 && win->core.CurrentBrowser != webui.browser.yandex) - return false; - - if(!_webui_browser_exist(win, webui.browser.yandex)) - return false; - - if(!_webui_browser_create_profile_folder(win, webui.browser.yandex)) - return false; - - char arg[1024]; - sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --incognito --app=", win->core.profile_path); - - char full[1024]; - sprintf(full, "%s%s%s", win->core.browser_path, arg, address); - - if(_webui_run_browser(win, full) == 0) { - - win->core.CurrentBrowser = webui.browser.yandex; - webui.browser.current = webui.browser.yandex; - return true; - } - else - return false; -} - -bool _webui_browser_start_chromium(webui_window_t* win, const char* address) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_start_chromium([%s])... \n", address); - #endif - - // -- The Chromium Projects ------------------- - - if (win->core.CurrentBrowser != 0 && win->core.CurrentBrowser != webui.browser.chromium) - return false; - - if (!_webui_browser_exist(win, webui.browser.chromium)) - return false; - - if (!_webui_browser_create_profile_folder(win, webui.browser.chromium)) - return false; - - char arg[1024]; - sprintf(arg, " --user-data-dir=\"%s\" --no-first-run --disable-gpu --disable-software-rasterizer --no-proxy-server --safe-mode --disable-extensions --disable-background-mode --disable-plugins --disable-plugins-discovery --disable-translate --bwsi --disable-sync --incognito --app=", win->core.profile_path); - - char full[1024]; - sprintf(full, "%s%s%s", win->core.browser_path, arg, address); - - if (_webui_run_browser(win, full) == 0) { - - win->core.CurrentBrowser = webui.browser.chromium; - webui.browser.current = webui.browser.chromium; - return true; - } - else - return false; -} - -bool _webui_browser_start_custom(webui_window_t* win, const char* address) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_start_custom([%s])... \n", address); - #endif - - // -- Custom Browser ---------------------- - - if(win->core.CurrentBrowser != 0 && win->core.CurrentBrowser != webui.browser.custom) - return false; - - if(!_webui_browser_exist(win, webui.browser.custom)) - return false; - - if(!_webui_browser_create_profile_folder(win, webui.browser.custom)) - return false; - - char full[1024]; - if(webui.custom_browser->auto_link) - sprintf(full, "%s %s%s", webui.custom_browser->app, webui.custom_browser->arg, address); - else - sprintf(full, "%s %s", webui.custom_browser->app, webui.custom_browser->arg); - - if(_webui_run_browser(win, full) == 0) { - - win->core.CurrentBrowser = webui.browser.custom; - webui.browser.current = webui.browser.custom; - return true; - } - else - return false; -} - -bool _webui_browser_start(webui_window_t* win, const char* address, unsigned int browser) { - - #ifdef WEBUI_LOG - printf("[0] _webui_browser_start([%s], [%d])... \n", address, browser); - #endif - - // Non existing browser - if(browser > 10) - return false; - - // Current browser - if(browser == webui.browser.any && webui.browser.current != 0) - browser = webui.browser.current; - - // TODO: Convert address from [/...] to [file://...] - - if(browser != 0) { - - // User specified browser - - if(browser == webui.browser.chrome) - return _webui_browser_start_chrome(win, address); - else if(browser == webui.browser.edge) - return _webui_browser_start_edge(win, address); - else if(browser == webui.browser.epic) - return _webui_browser_start_epic(win, address); - else if(browser == webui.browser.vivaldi) - return _webui_browser_start_vivaldi(win, address); - else if(browser == webui.browser.brave) - return _webui_browser_start_brave(win, address); - else if(browser == webui.browser.firefox) - return _webui_browser_start_firefox(win, address); - else if(browser == webui.browser.yandex) - return _webui_browser_start_yandex(win, address); - else if(browser == webui.browser.chromium) - return _webui_browser_start_chromium(win, address); - else if(browser == webui.browser.custom) - return _webui_browser_start_custom(win, address); - else - return false; - } - else if(win->core.CurrentBrowser != 0) { - - // Already used browser - - if(win->core.CurrentBrowser == webui.browser.chrome) - return _webui_browser_start_chrome(win, address); - else if(win->core.CurrentBrowser == webui.browser.edge) - return _webui_browser_start_edge(win, address); - else if(win->core.CurrentBrowser == webui.browser.epic) - return _webui_browser_start_epic(win, address); - else if(win->core.CurrentBrowser == webui.browser.vivaldi) - return _webui_browser_start_vivaldi(win, address); - else if(win->core.CurrentBrowser == webui.browser.brave) - return _webui_browser_start_brave(win, address); - else if(win->core.CurrentBrowser == webui.browser.firefox) - return _webui_browser_start_firefox(win, address); - else if(win->core.CurrentBrowser == webui.browser.yandex) - return _webui_browser_start_yandex(win, address); - else if(browser == webui.browser.chromium) - return _webui_browser_start_chromium(win, address); - else if(win->core.CurrentBrowser == webui.browser.custom) - return _webui_browser_start_custom(win, address); - else - return false; - } - else { - - // Default OS browser - - #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) - // Windows - if(!_webui_browser_start_chrome(win, address)) - if(!_webui_browser_start_edge(win, address)) - if(!_webui_browser_start_epic(win, address)) - if(!_webui_browser_start_vivaldi(win, address)) - if(!_webui_browser_start_brave(win, address)) - if(!_webui_browser_start_firefox(win, address)) - if(!_webui_browser_start_yandex(win, address)) - if(!_webui_browser_start_chromium(win, address)) - if(!_webui_browser_start_custom(win, address)) - return false; - #elif __APPLE__ - // macOS - if(!_webui_browser_start_chrome(win, address)) - if(!_webui_browser_start_edge(win, address)) - if(!_webui_browser_start_epic(win, address)) - if(!_webui_browser_start_vivaldi(win, address)) - if(!_webui_browser_start_brave(win, address)) - if(!_webui_browser_start_firefox(win, address)) - if(!_webui_browser_start_yandex(win, address)) - if(!_webui_browser_start_chromium(win, address)) - if(!_webui_browser_start_custom(win, address)) - return false; - #else - // Linux - if(!_webui_browser_start_chrome(win, address)) - if(!_webui_browser_start_edge(win, address)) - if(!_webui_browser_start_epic(win, address)) - if(!_webui_browser_start_vivaldi(win, address)) - if(!_webui_browser_start_brave(win, address)) - if(!_webui_browser_start_firefox(win, address)) - if(!_webui_browser_start_yandex(win, address)) - if(!_webui_browser_start_chromium(win, address)) - if(!_webui_browser_start_custom(win, address)) - return false; - #endif - } - - return true; -} - -void _webui_window_open(webui_window_t* win, char* link, unsigned int browser) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_window_open([%s], [%d])... \n", win->core.window_number, link, browser); - #endif - - // Just open an app-mode window using this link - _webui_browser_start(win, link, browser); -} - -void webui_script_cleanup(webui_script_t* script) { - - _webui_free_mem((void *) &script->result.data); - _webui_free_mem((void *) &script->script); -} - -void webui_script(webui_window_t* win, webui_script_t* script) { - - #ifdef WEBUI_LOG - printf("[%d] webui_script([%s])... \n", win->core.window_number, script->script); - #endif - - _webui_init(); - - size_t js_len = strlen(script->script); - - if(js_len < 1) { - - _webui_free_mem((void *) &script->result.data); - script->result.data = webui_js_empty; - script->result.length = (unsigned int) strlen(webui_js_empty); - script->result.error = true; - return; - } - - // Initializing js result - _webui_free_mem((void *) &script->result.data); - script->result.data = webui_js_timeout; - script->result.length = (unsigned int) strlen(webui_js_timeout); - script->result.error = true; - - // Initializing pipe - unsigned int run_id = _webui_get_run_id(); - webui.run_done[run_id] = false; - webui.run_error[run_id] = false; - _webui_free_mem((void *) &webui.run_responses[run_id]); - - // Prepare the packet - size_t packet_len = 3 + js_len + 1; // [header][js] - char* packet = (char*) _webui_malloc(packet_len); - packet[0] = WEBUI_HEADER_SIGNATURE; // Signature - packet[1] = WEBUI_HEADER_JS; // Type - packet[2] = run_id; // ID - for(unsigned int i = 0; i < js_len; i++) // Data - packet[i + 3] = script->script[i]; - - // Send packets - _webui_window_send(win, packet, packet_len); - _webui_free_mem((void *) &packet); - - // Wait for UI response - if(script->timeout < 1 || script->timeout > 86400) { - - for(;;) { - - if(webui.run_done[run_id]) - break; - - _webui_sleep(1); - } - } - else { - - for(unsigned int n = 0; n <= (script->timeout * 1000); n++) { - - if(webui.run_done[run_id]) - break; - - _webui_sleep(1); - } - } - - if(webui.run_responses[run_id] != NULL) { - - script->result.data = webui.run_responses[run_id]; - script->result.length = (unsigned int) strlen(webui.run_responses[run_id]); - script->result.error = webui.run_error[run_id]; - } -} - -webui_window_t* webui_new_window(void) { - - #ifdef WEBUI_LOG - printf("[0] webui_new_window()... \n"); - #endif - - _webui_init(); - - webui_window_t* win = (webui_window_t*) _webui_malloc(sizeof(webui_window_t)); - - // Initialisation - win->core.window_number = _webui_get_new_window_number(); - win->core.browser_path = (char*) _webui_malloc(WEBUI_MAX_PATH); - win->core.profile_path = (char*) _webui_malloc(WEBUI_MAX_PATH); - win->path = (char*) _webui_malloc(WEBUI_MAX_PATH); - sprintf(win->path, "%s", WEBUI_DEFAULT_PATH); - - #ifdef WEBUI_LOG - printf("[0] webui_new_window() -> New window @ 0x%p\n", win); - #endif - - return win; -} - -void webui_close(webui_window_t* win) { - - #ifdef WEBUI_LOG - printf("[%d] webui_close()... \n", win->core.window_number); - #endif - - _webui_init(); - - if(win->core.connected) { - - // Prepare packets - char* packet = (char*) _webui_malloc(4); - packet[0] = WEBUI_HEADER_SIGNATURE; // Signature - packet[1] = WEBUI_HEADER_CLOSE; // Type - packet[2] = 0; // ID - packet[3] = 0; // Data - - // Send packets - _webui_window_send(win, packet, 4); - _webui_free_mem((void *) &packet); - } -} - -bool webui_is_shown(webui_window_t* win) { - - #ifdef WEBUI_LOG - printf("[%d] webui_is_shown()... \n", win->core.window_number); - #endif - - return win->core.connected; -} - -bool webui_is_any_window_running(void) { - - #ifdef WEBUI_LOG - printf("[0] webui_is_any_window_running()... \n"); - #endif - - _webui_init(); - - if(webui.connections > 0) - return true; - - return false; -} - -unsigned int _webui_window_get_number(webui_window_t* win) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_window_get_number()... \n", win->core.window_number); - #endif - - return win->core.window_number; -} - -const char* webui_new_server(webui_window_t* win, const char* path) { - - #ifdef WEBUI_LOG - printf("[%d] webui_new_server()... \n", win->core.window_number); - #endif - - _webui_init(); - - // Root folder to serve - if(!_webui_set_root_folder(win, path)) - return webui_empty_string; - - // Prevent the server from using the - // timeout-mode while waiting for connections - webui_set_timeout(0); - - // WEBUI_NON_EXIST_BROWSER is to prevent - // any browser from running. Because we want - // to only to run a web-server this time. - _webui_show_window(win, NULL, WEBUI_NON_EXIST_BROWSER); - - // Wait for server to start - for(unsigned int n = 0; n < 500; n++) { - - if(win->core.server_running) - break; - - _webui_sleep(1); - } - - return (const char*) win->core.url; -} - -bool _webui_set_root_folder(webui_window_t* win, const char* path) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_set_root_folder([%s])... \n", win->core.window_number, path); - #endif - - if((path == NULL) || (strlen(path) > WEBUI_MAX_PATH)) - return false; - - win->core.server_root = true; - - if(_webui_is_empty(path)) - sprintf(win->path, "%s", WEBUI_DEFAULT_PATH); - else - sprintf(win->path, "%s", path); - - webui_multi_access(win, true); - - return true; -} - -void webui_multi_access(webui_window_t* win, bool status) { - - #ifdef WEBUI_LOG - printf("[%d] webui_multi_access([%d])... \n", win->core.window_number, status); - #endif - - win->core.multi_access = status; -} - -void webui_set_icon(webui_window_t* win, const char* icon_s, const char* type_s) { - - #ifdef WEBUI_LOG - printf("[%d] webui_set_icon([%s], [%s])... \n", win->core.window_number, icon_s, type_s); - #endif - - win->core.icon = icon_s; - win->core.icon_type = type_s; -} - -bool webui_open(webui_window_t* win, const char* url, unsigned int browser) { - - #ifdef WEBUI_LOG - printf("[%d] webui_open()... \n", win->core.window_number); - #endif - - // Just open an app-mode window using the link - // webui_set_timeout(0); - _webui_wait_process(win, true); - - if(webui_is_shown(win)) { - - // Refresh an existing running window + bool _webui_get_windows_reg_value(HKEY key, const char* reg, const char* value_name, char value[WEBUI_MAX_PATH]) { #ifdef WEBUI_LOG - printf("[%d] webui_open()... Refresh the running window to [%s]...\n", win->core.window_number, url); + printf("[Core]\t\t_webui_get_windows_reg_value([%s])... \n", reg); #endif - // Prepare packets - size_t packet_len = 3 + strlen(url) + 1; // [header][url] - char* packet = (char*) _webui_malloc(packet_len); - packet[0] = WEBUI_HEADER_SIGNATURE; // Signature - packet[1] = WEBUI_HEADER_SWITCH; // Type - packet[2] = 0; // ID - for(unsigned int i = 0; i < strlen(url); i++) // Data - packet[i + 3] = url[i]; + HKEY hKey; - // Send the packet - _webui_window_send(win, packet, packet_len); - _webui_free_mem((void *) &packet); + if(RegOpenKeyEx(key, reg, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { - return true; - } - - // New window - return _webui_browser_start(win, url, browser); -} + DWORD valueSize = WEBUI_MAX_PATH; + // If `value_name` is empty then + // will read the "(default)" reg-key + if(RegQueryValueEx(hKey, value_name, NULL, NULL, (LPBYTE)value, &valueSize) == ERROR_SUCCESS) { -bool webui_show(webui_window_t* win, const char* content) { - - #ifdef WEBUI_LOG - printf("[%d] webui_show()... \n", win->core.window_number); - #endif - - size_t content_len = strlen(content); - - // Some wrappers does not guarantee `content` to - // stay valid, so, let's make a copy right now. - char* content_cpy = (char*) webui_empty_string; - if(content_len > 1) { - content_cpy = _webui_malloc(content_len); - memcpy(content_cpy, content, content_len); - } - - // Check if this is an HTML script or a file name - if(strstr(content_cpy, " Static HTML Script:\n", win->core.window_number); - printf("- - -[HTML]- - - - - - - - - -\n%s\n- - - - - - - - - - - - - - - -\n", content_cpy); - #endif - win->core.server_root = false; - return _webui_show_window(win, content_cpy, webui.browser.any); - } - - // Handel the file - #ifdef WEBUI_LOG - printf("[%d] webui_show()... -> File: [%s]\n", win->core.window_number, content_cpy); - #endif - if(content_len > WEBUI_MAX_PATH || strstr(content_cpy, "<")) - return false; - if(win->core.url == NULL) - webui_new_server(win, ""); - // URL: [localhost:port][/][filename] - char* url = (char*) _webui_malloc(strlen(win->core.url) + 1 + content_len); - sprintf(url, "%s/%s", win->core.url, content_cpy); - return webui_open(win, url, win->core.CurrentBrowser); -} - -bool _webui_show_window(webui_window_t* win, const char* html, unsigned int browser) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_show_window(html, [%d])... \n", win->core.window_number, browser); - #endif - - _webui_init(); - - // Initializing - win->core.html = (html == NULL ? webui_empty_string : html); - win->core.server_handled = false; - webui.wait_for_socket_window = true; - - // Detect window closing event by the browser - // process, instead of the WS connection status - _webui_wait_process(win, true); - - if(!webui_is_shown(win)) { - - // Start a new window - - // Get new port - unsigned int port = _webui_get_free_port(); - win->core.server_port = port; - _webui_free_mem((void *) &win->core.url); - win->core.url = (char*) _webui_malloc(2000); - sprintf(win->core.url, "http://localhost:%d", port); - - // Run browser - bool browser_started = _webui_browser_start(win, win->core.url, browser); - if(browser != WEBUI_NON_EXIST_BROWSER && !browser_started) { - - // Browser not available - _webui_free_port(win->core.server_port); - return false; - } - - // New Server Thread - #ifdef _WIN32 - HANDLE thread = CreateThread(NULL, 0, webui_server_start, (void *) win, 0, NULL); - win->core.server_thread = thread; - if(thread != NULL) - CloseHandle(thread); - #else - pthread_t thread; - pthread_create(&thread, NULL, &webui_server_start, (void *) win); - pthread_detach(thread); - win->core.server_thread = thread; - #endif - } - else { - - // Refresh an existing running window - - // Prepare packets - size_t packet_len = 3 + strlen(win->core.url) + 1; // [header][url] - char* packet = (char*) _webui_malloc(packet_len); - packet[0] = WEBUI_HEADER_SIGNATURE; // Signature - packet[1] = WEBUI_HEADER_SWITCH; // Type - packet[2] = 0; // ID - for(unsigned int i = 0; i < strlen(win->core.url); i++) // Data - packet[i + 3] = win->core.url[i]; - - // Send the packet - _webui_window_send(win, packet, packet_len); - _webui_free_mem((void *) &packet); - } - - return true; -} - -unsigned int webui_bind(webui_window_t* win, const char* element, void (*func)(webui_event_t* e)) { - - #ifdef WEBUI_LOG - printf("[%d] webui_bind([%s], [0x%p])... \n", win->core.window_number, element, func); - #endif - - _webui_init(); - - int len = 0; - if(_webui_is_empty(element)) - win->core.has_events = true; - else - len = strlen(element); - - // [win num][/][element] - char* webui_internal_id = _webui_malloc(3 + 1 + len); - sprintf(webui_internal_id, "%d/%s", win->core.window_number, element); - - unsigned int cb_index = _webui_get_cb_index(webui_internal_id); - - if(cb_index > 0) { - - // Replace a reference - webui.cb[cb_index] = func; - - _webui_free_mem((void *) &webui_internal_id); - } - else { - - // New reference - cb_index = _webui_set_cb_index(webui_internal_id); - - if(cb_index > 0) - webui.cb[cb_index] = func; - else - _webui_free_mem((void *) &webui_internal_id); - } - - return cb_index; -} - -#ifdef _WIN32 - DWORD WINAPI _webui_cb(LPVOID _arg) -#else - void* _webui_cb(void* _arg) -#endif -{ - webui_cb_t* arg = (webui_cb_t*) _arg; - - #ifdef WEBUI_LOG - printf("[%d] [Thread] _webui_cb()... \n", arg->win->core.window_number); - #endif - - webui_event_t e; - e.window_id = arg->win->core.window_number; - e.element_name = arg->element_name; - e.window = arg->win; - e.data = arg->data; - e.response = NULL; - e.type = arg->event_type; - - // Check for the events-bind function - if(arg->win->core.has_events) { - - char* events_id = _webui_generate_internal_id(arg->win, ""); - unsigned int events_cb_index = _webui_get_cb_index(events_id); - _webui_free_mem((void *) &events_id); - - if(events_cb_index > 0 && webui.cb[events_cb_index] != NULL) { - - // Call user events cb - e.element_id = 0; - webui.cb[events_cb_index](&e); - } - } - - // Check for the bind function - if(!_webui_is_empty(arg->element_name)) { - - unsigned int cb_index = _webui_get_cb_index(arg->webui_internal_id); - if(cb_index > 0 && webui.cb[cb_index] != NULL) { - - // Call user cb - e.element_id = cb_index; - webui.cb[cb_index](&e); - } - } - - #ifdef WEBUI_LOG - printf("[%d] [Thread] _webui_cb()... Stop.\n", arg->win->core.window_number); - #endif - - // Free - _webui_free_mem((void *) &arg->webui_internal_id); - _webui_free_mem((void *) &arg->element_name); - _webui_free_mem((void *) &arg); - - #ifdef _WIN32 - return 0; - #else - pthread_exit(NULL); - #endif -} - -void _webui_window_event(webui_window_t* win, char* webui_internal_id, char* element, void* data, unsigned int data_len, int event_type) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_window_event([%s], [%s])... \n", win->core.window_number, webui_internal_id, element); - #endif - - // Create a thread, and call the used cb function - webui_cb_t* arg = (webui_cb_t*) _webui_malloc(sizeof(webui_cb_t)); - arg->win = win; - arg->webui_internal_id = webui_internal_id; - arg->element_name = element; - arg->event_type = event_type; - if(data != NULL) { - arg->data = data; - arg->data_len = data_len; - } - else { - arg->data = (void*) webui_empty_string; - arg->data_len = 0; - } - - #ifdef _WIN32 - HANDLE user_fun_thread = CreateThread(NULL, 0, _webui_cb, (void *) arg, 0, NULL); - if(user_fun_thread != NULL) - CloseHandle(user_fun_thread); - #else - pthread_t thread; - pthread_create(&thread, NULL, &_webui_cb, (void *) arg); - pthread_detach(thread); - #endif -} - -void _webui_window_send(webui_window_t* win, char* packet, size_t packets_size) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_window_send([%.*s], [%d])... [ ", win->core.window_number, (int)packets_size, packet, (int)packets_size); - _webui_print_hex(packet, packets_size); - printf("]\n"); - #endif - - if(!win->core.connected || - webui.mg_connections[win->core.window_number] == NULL || - packet == NULL || - packets_size < 4) - return; - - struct mg_connection* c = webui.mg_connections[win->core.window_number]; - mg_ws_send( - c, - packet, - packets_size, - WEBSOCKET_OP_BINARY - ); -} - -bool _webui_get_data(const char* packet, size_t packet_len, unsigned int pos, size_t* data_len, char** data) { - - #ifdef WEBUI_LOG - printf("[0] _webui_get_data()... \n"); - #endif - - if((pos + 1) > packet_len) { - - *data = NULL; - data_len = 0; - return false; - } - - *data = (char*) _webui_malloc((packet_len - pos)); - - // Check mem - if(*data == NULL) { - - data_len = 0; - return false; - } - - // Copy data part - char* p = *data; - for(unsigned int i = pos; i < packet_len; i++) { - - memcpy(p, &packet[i], 1); - p++; - } - - // Check data size - *data_len = strlen(*data); - if(*data_len < 1) { - - _webui_free_mem((void *) data); - *data = NULL; - data_len = 0; - return false; - } - - return true; -} - -void _webui_window_receive(webui_window_t* win, const char* packet, size_t len) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_window_receive([%.*s], [%d])... [ ", win->core.window_number, (int)len, packet, (int)len); - _webui_print_hex(packet, len); - printf("]\n"); - #endif - - if((unsigned char) packet[0] != WEBUI_HEADER_SIGNATURE || len < 4) - return; - - if((unsigned char) packet[1] == WEBUI_HEADER_CLICK) { - - // Click Event - - // 0: [Signature] - // 1: [Type] - // 2: - // 3: [Data] - - // Get html element id - char* element; - size_t element_len; - if(!_webui_get_data(packet, len, 3, &element_len, &element)) - return; - - // Generate WebUI internal id - char* webui_internal_id = _webui_generate_internal_id(win, element); - - _webui_window_event( - win, // Window - webui_internal_id, // WebUI Internal ID - element, // User HTML ID - NULL, // User Custom Data - 0, // User Data Len - WEBUI_EVENT_MOUSE_CLICK // Type of this event - ); - } - else if((unsigned char) packet[1] == WEBUI_HEADER_JS) { - - // JS Result - - // 0: [Signature] - // 1: [Type] - // 2: [ID] - // 3: [Error] - // 4: [Data] - - // Get pipe id - unsigned char run_id = packet[2]; - if(run_id < 0x01) { - - // Fatal. - // The pipe ID is not valid - // we can't send the ready signal to webui_script() - return; - } - - // Get data part - char* data; - size_t data_len; - bool data_status = _webui_get_data(packet, len, 4, &data_len, &data); - - // Get js-error - bool error = true; - if((unsigned char) packet[3] == 0x00) - error = false; - - // Initialize pipe - _webui_free_mem((void *) &webui.run_responses[run_id]); - - // Set pipe - if(data_status && data_len > 0) { - - webui.run_error[run_id] = error; - webui.run_responses[run_id] = data; - } - else { - - // Empty Result - webui.run_error[run_id] = error; - webui.run_responses[run_id] = webui_empty_string; - } - - // Send ready signal to webui_script() - webui.run_done[run_id] = true; - } - else if((unsigned char) packet[1] == WEBUI_HEADER_CALL_FUNC) { - - // Function Call (No response) - - // 0: [Signature] - // 1: [Type] - // 2: - // 3: [ID, Null, Data] - - // Get html element id - char* element; - size_t element_len; - if(!_webui_get_data(packet, len, 3, &element_len, &element)) - return; - - // Get data - void* data; - size_t data_len; - if(!_webui_get_data(packet, len, (3 + element_len + 1), &data_len, (char **) &data)) - return; - - // Generate WebUI internal id - char* webui_internal_id = _webui_generate_internal_id(win, element); - - _webui_window_event( - win, // Window - webui_internal_id, // WebUI Internal ID - element, // User HTML ID - data, // User Custom Data - data_len, // User Data Len - WEBUI_EVENT_CALLBACK // Type of this event - ); - } - else if((unsigned char) packet[1] == WEBUI_HEADER_SWITCH) { - - // Navigation Event - - // 0: [Signature] - // 1: [Type] - // 2: - // 3: [URL] - - // Get URL - char* url; - size_t url_len; - if(!_webui_get_data(packet, len, 3, &url_len, &url)) - return; - - // Generate WebUI internal id - char* webui_internal_id = _webui_generate_internal_id(win, ""); - - _webui_window_event( - win, // Window - webui_internal_id, // WebUI Internal ID - "", // HTML ID - url, // URL - url_len, // URL Len - WEBUI_EVENT_NAVIGATION // Type of this event - ); - } -} - -const char* webui_get_string(webui_event_t* e) { - - #ifdef WEBUI_LOG - printf("[0] webui_get_string()... \n"); - #endif - - if(e->data != NULL) { - size_t len = strlen(e->data); - if(len > 0 && len <= WEBUI_MAX_BUF) - return (const char *) e->data; - } - - return webui_empty_string; -} - -long long int webui_get_int(webui_event_t* e) { - - #ifdef WEBUI_LOG - printf("[0] webui_get_int()... \n"); - #endif - - char *endptr; - - if(e->data != NULL) { - size_t len = strlen(e->data); - if(len > 0 && len <= 20) // 64-bit max is -9,223,372,036,854,775,808 (20 character) - return strtoll((const char *) e->data, &endptr, 10); - } - - return 0; -} - -bool webui_get_bool(webui_event_t* e) { - - #ifdef WEBUI_LOG - printf("[0] webui_get_bool()... \n"); - #endif - - const char* str = webui_get_string(e); - if(str[0] == 't' || str[0] == 'T') // true || True - return true; - - return false; -} - -void webui_return_int(webui_event_t* e, long long int n) { - - #ifdef WEBUI_LOG - printf("[%d] webui_return_int([%lld])... \n", e->window_id, n); - #endif - - // Int to Str - // 64-bit max is -9,223,372,036,854,775,808 (20 character) - char* buf = (char*) _webui_malloc(20); - sprintf(buf, "%lld", n); - - // Set response - e->response = buf; -} - -void webui_return_string(webui_event_t* e, char* s) { - - #ifdef WEBUI_LOG - printf("[%d] webui_return_string([%s])... \n", e->window_id, s); - #endif - - if(_webui_is_empty(s)) - return; - - // Copy Str - int len = strlen(s); - char* buf = (char*) _webui_malloc(len); - memcpy(buf, s, len); - - // Set response - e->response = buf; -} - -void webui_return_bool(webui_event_t* e, bool b) { - - #ifdef WEBUI_LOG - printf("[%d] webui_return_bool([%d])... \n", e->window_id, b); - #endif - - // Bool to Str - int len = 1; - char* buf = (char*) _webui_malloc(len); - sprintf(buf, "%d", b); - - // Set response - e->response = buf; -} - -void _webui_wait_process(webui_window_t* win, bool status) { - - #ifdef WEBUI_LOG - printf("[%d] _webui_wait_process()... \n", win->core.window_number); - #endif - - win->core.detect_process_close = status; -} - -char* _webui_get_current_path(void) { - - #ifdef WEBUI_LOG - printf("[0] _webui_get_current_path()... \n"); - #endif - - char* path = (char*) _webui_malloc(WEBUI_MAX_PATH); - if(WEBUI_GET_CURRENT_DIR (path, WEBUI_MAX_PATH) == NULL) - path[0] = 0x00; - - return path; -} - -void _webui_set_custom_browser(webui_custom_browser_t* p) { - - #ifdef WEBUI_LOG - printf("[0] _webui_set_custom_browser()... \n"); - #endif - - webui.custom_browser = p; -} - -void webui_exit(void) { - - #ifdef WEBUI_LOG - printf("[0] webui_exit()... \n"); - #endif - - webui.wait_for_socket_window = false; - webui.exit_now = true; - - // Let's give other threads more time to - // safely exit and finish their cleaning up. - _webui_sleep(100); -} - -bool webui_is_app_running(void) { - - #ifdef WEBUI_LOG - // printf("[0] webui_is_app_running()... \n"); - #endif - - static bool app_is_running = true; - - // Stop if already flagged - if(!app_is_running) return false; - - // Initialization - if(!webui.initialized) - _webui_init(); - - // Get app status - if(webui.exit_now) { - app_is_running = false; - } - else if(webui.use_timeout) { - if(webui.wait_for_socket_window) { - if(webui.servers < 1) - app_is_running = false; - } - } - - // Final cleaning - if(!app_is_running) { - #ifdef WEBUI_LOG - printf("[0] webui_is_app_running()... -> App Stopped.\n"); - #endif - _webui_clean(); - } - - return app_is_running; -} - -void webui_wait(void) { - - #ifdef WEBUI_LOG - printf("[L] webui_wait()... \n"); - #endif - - _webui_init(); - - if(webui.use_timeout) { - - #ifdef WEBUI_LOG - printf("[L] webui_wait() -> Using timeout %d second\n", webui.startup_timeout); - #endif - - // Wait for browser to start - _webui_wait_for_startup(); - - if(webui.wait_for_socket_window) { - - #ifdef WEBUI_LOG - printf("[L] webui_wait() -> Wait for connected UI...\n"); - #endif - - while(webui.servers > 0) { - - #ifdef WEBUI_LOG - // printf("[%d/%d]", webui.servers, webui.connections); - #endif - _webui_sleep(50); - } - } - else { - - // Probably the app didn't use the show() function - // so, there is no window running. - - #ifdef WEBUI_LOG - printf("[L] webui_wait() -> Ignoring connected UI.\n"); - #endif - } - } - else { - - #ifdef WEBUI_LOG - printf("[L] webui_wait() -> Infinite wait...\n"); - #endif - - // Infinite wait - while(!webui.exit_now) - _webui_sleep(50); - } - - #ifdef WEBUI_LOG - printf("[L] webui_wait() -> Wait finished.\n"); - #endif - - // Final cleaning - _webui_clean(); -} - -void _webui_free_port(unsigned int port) { - - #ifdef WEBUI_LOG - printf("[0] _webui_free_port([%d])... \n", port); - #endif - - for(unsigned int i = 0; i < WEBUI_MAX_ARRAY; i++) { - if(webui.used_ports[i] == port) { - webui.used_ports[i] = 0; - break; - } - } -} - -void _webui_wait_for_startup(void) { - - #ifdef WEBUI_LOG - printf("[0] _webui_wait_for_startup()... \n"); - #endif - - if(webui.connections > 0) - return; - - // Wait for a specific time - for(unsigned int n = 0; n <= (webui.startup_timeout * 10); n++) { - - if(webui.connections > 0) - break; - - // We should wait 100ms, but the server thread - // may add an extras 3 second to the main loop. - _webui_sleep(50); - } - - #ifdef WEBUI_LOG - printf("[0] _webui_wait_for_startup() -> Finish.\n"); - #endif -} - -void webui_set_timeout(unsigned int second) { - - #ifdef WEBUI_LOG - printf("[0] webui_set_timeout([%d])... \n", second); - #endif - - _webui_init(); - - if(second < 1) { - - webui.use_timeout = false; - } - else { - - webui.use_timeout = true; - webui.startup_timeout = second; - webui.timeout_extra = false; - } -} - -unsigned int _webui_get_new_window_number(void) { - - #ifdef WEBUI_LOG - printf("[0] _webui_get_new_window_number()... \n"); - #endif - - return ++webui.last_window; -} - -unsigned int _webui_get_free_port(void) { - - #ifdef WEBUI_LOG - printf("[0] _webui_get_free_port()... \n"); - #endif - - #ifdef _WIN32 - srand((unsigned int)time(NULL)); - #else - srand(time(NULL)); - #endif - - unsigned int port = (rand() % (WEBUI_MAX_PORT + 1 - WEBUI_MIN_PORT)) + WEBUI_MIN_PORT; - - for(unsigned int i = WEBUI_MIN_PORT; i <= WEBUI_MAX_PORT; i++) { - - // Search [port] in [webui.used_ports] - bool found = false; - for(unsigned int j = 0; j < WEBUI_MAX_ARRAY; j++) { - if(webui.used_ports[j] == port) { - found = true; - break; + RegCloseKey(hKey); + return true; } } - if(found) - // Port used by local window - port = (rand() % (WEBUI_MAX_PORT + 1 - WEBUI_MIN_PORT)) + WEBUI_MIN_PORT; - else { - if(_webui_port_is_used(port)) - // Port used by an external app - port = (rand() % (WEBUI_MAX_PORT + 1 - WEBUI_MIN_PORT)) + WEBUI_MIN_PORT; - else - // Port is free - break; - } + return false; } - // Add - for(unsigned int i = 0; i < WEBUI_MAX_ARRAY; i++) { - if(webui.used_ports[i] == 0) { - webui.used_ports[i] = port; - break; - } - } - - return port; -} - -void webui_script_runtime(webui_window_t* win, unsigned int runtime) { - - #ifdef WEBUI_LOG - printf("[%d] webui_script_runtime(%d)... \n", win->core.window_number, runtime); - #endif - - _webui_init(); - - if(runtime != webui.runtime.deno && runtime != webui.runtime.nodejs) - win->core.runtime = webui.runtime.none; - else - win->core.runtime = runtime; -} - -void _webui_init(void) { - - if(webui.initialized) - return; - - #ifdef WEBUI_LOG - printf("[0] WebUI v%s \n", WEBUI_VERSION); - printf("[0] _webui_init()... \n"); - #endif - - // Initializing - memset(&webui, 0x0, sizeof(webui_t)); - webui.initialized = true; - webui.use_timeout = true; - webui.startup_timeout = WEBUI_DEF_TIMEOUT; - webui.timeout_extra = true; - webui.browser.chrome = 1; - webui.browser.firefox = 2; - webui.browser.edge = 3; - webui.browser.safari = 4; - webui.browser.chromium = 5; - webui.browser.opera = 6; - webui.browser.brave = 7; - webui.browser.vivaldi = 8; - webui.browser.epic = 9; - webui.browser.yandex = 10; - webui.browser.custom = 99; - webui.runtime.deno = 1; - webui.runtime.nodejs = 2; - webui.executable_path = _webui_get_current_path(); -} - -unsigned int _webui_get_cb_index(char* webui_internal_id) { - - #ifdef WEBUI_LOG - printf("[0] _webui_get_cb_index([%s])... \n", webui_internal_id); - #endif - - if(webui_internal_id != NULL) { - - for(unsigned int i = 1; i < WEBUI_MAX_ARRAY; i++) { - - if(!_webui_is_empty(webui.html_elements[i])) - if(strcmp(webui.html_elements[i], webui_internal_id) == 0) - return i; - } - } - - return 0; -} - -unsigned int _webui_set_cb_index(char* webui_internal_id) { - - #ifdef WEBUI_LOG - printf("[0] _webui_set_cb_index([%s])... \n", webui_internal_id); - #endif - - // Add - for(unsigned int i = 1; i < WEBUI_MAX_ARRAY; i++) { - - if(_webui_is_empty(webui.html_elements[i])) { - - webui.html_elements[i] = webui_internal_id; - - return i; - } - } - - return 0; -} - -// --[Interface]--------------- - -void webui_bind_interface_handler(webui_event_t* e) { - - #ifdef WEBUI_LOG - printf("[%d] webui_bind_interface_handler()... \n", e->window_id); - #endif - - unsigned int cb_index = e->element_id; - - if(cb_index > 0 && webui.cb_interface[cb_index] != NULL) - webui.cb_interface[cb_index](e->element_id, e->window_id, e->element_name, e->window, (char*)e->data, (char**)&e->response); - - if(_webui_is_empty((const char *)e->response)) { - e->response = (void*)webui_empty_string; - } - else { - - // The response pointer is not guaranteed to stay live - // so let's make our own copy. - size_t len = strlen((const char *)e->response); - char* new_cpy = (char*)_webui_malloc(len); - memcpy(new_cpy, e->response, len); - e->response = new_cpy; - } - - #ifdef WEBUI_LOG - printf("[%d] webui_bind_interface_handler()... user-callback response [%s]\n", e->window_id, (const char *)e->response); - #endif -} - -unsigned int webui_bind_interface(webui_window_t* win, const char* element, void (*func)(unsigned int, unsigned int, char*, webui_window_t*, char*, char**)) { - - #ifdef WEBUI_LOG - printf("[%d] webui_bind_interface()... \n", win->core.window_number); - #endif - - // Bind - unsigned int cb_index = webui_bind(win, element, webui_bind_interface_handler); - webui.cb_interface[cb_index] = func; - return cb_index; -} - -void webui_script_interface(webui_window_t* win, const char* script, unsigned int timeout, bool* error, unsigned int* length, char** data) { - - #ifdef WEBUI_LOG - printf("[%d] webui_script_interface()... \n", win->core.window_number); - #endif - - webui_script_t js = { - .script = script, - .timeout = timeout - }; - - webui_script(win, &js); - - *data = (char*) js.result.data; - *error = js.result.error; - *length = js.result.length; -} - -void webui_script_interface_struct(webui_window_t* win, webui_script_interface_t* js_int) { - - #ifdef WEBUI_LOG - printf("[%d] webui_script_interface_struct()... \n", win->core.window_number); - #endif - - webui_script_t js = { - .script = js_int->script, - .timeout = js_int->timeout - }; - - webui_script(win, &js); - - js_int->data = js.result.data; - js_int->error = js.result.error; - js_int->length = js.result.length; -} - -#ifdef _WIN32 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { return true; } + #endif diff --git a/src/webui_core.h b/src/webui_core.h new file mode 100644 index 00000000..198ebeec --- /dev/null +++ b/src/webui_core.h @@ -0,0 +1,181 @@ +/* + WebUI Library 2.2.0 + http://webui.me + https://github.com/alifcommunity/webui + Copyright (c) 2020-2023 Hassan Draga. + Licensed under GNU General Public License v2.0. + All rights reserved. + Canada. +*/ + +#ifndef _WEBUI_CORE_H +#define _WEBUI_CORE_H + +#include "webui.h" + +#define WEBUI_HEADER_SIGNATURE 0xDD // All packets should start with this 8bit +#define WEBUI_HEADER_JS 0xFE // JavaScript result in frontend +#define WEBUI_HEADER_JS_QUICK 0xFD // JavaScript result in frontend +#define WEBUI_HEADER_CLICK 0xFC // Click event +#define WEBUI_HEADER_SWITCH 0xFB // Frontend refresh +#define WEBUI_HEADER_CLOSE 0xFA // Close window +#define WEBUI_HEADER_CALL_FUNC 0xF9 // Call a backend function +#define WEBUI_MAX_ARRAY (128) // Max threads, servers, windows, pointers.. +#define WEBUI_MIN_PORT (10000) // Minimum socket port +#define WEBUI_MAX_PORT (65500) // Should be less than 65535 +#define WEBUI_MAX_BUF (1024000) // 1024 Kb max dynamic memory allocation +#define WEBUI_DEFAULT_PATH "." // Default root path +#define WEBUI_DEF_TIMEOUT (10) // Default startup timeout in seconds +#define WEBUI_MAX_TIMEOUT (30) // Maximum startup timeout in seconds + +typedef struct _webui_timer_t { + struct timespec start; + struct timespec now; +} _webui_timer_t; + +typedef struct _webui_window_t { + unsigned int window_number; + bool server_running; + bool connected; + bool html_handled; + bool multi_access; + bool is_embedded_html; + unsigned int server_port; + char* url; + const char* html; + const char* icon; + const char* icon_type; + unsigned int current_browser; + char* browser_path; + char* profile_path; + unsigned int connections; + unsigned int runtime; + bool has_events; + char* server_root_path; + #ifdef _WIN32 + HANDLE server_thread; + #else + pthread_t server_thread; + #endif +} _webui_window_t; + +typedef struct _webui_core_t { + unsigned int servers; + unsigned int connections; + char* html_elements[WEBUI_MAX_ARRAY]; + unsigned int used_ports[WEBUI_MAX_ARRAY]; + unsigned int last_window; + unsigned int startup_timeout; + bool exit_now; + const char* run_responses[WEBUI_MAX_ARRAY]; + bool run_done[WEBUI_MAX_ARRAY]; + bool run_error[WEBUI_MAX_ARRAY]; + unsigned char run_last_id; + struct mg_mgr* mg_mgrs[WEBUI_MAX_ARRAY]; + struct mg_connection* mg_connections[WEBUI_MAX_ARRAY]; + bool initialized; + void (*cb[WEBUI_MAX_ARRAY])(webui_event_t* e); + void (*cb_interface[WEBUI_MAX_ARRAY])(void*, unsigned int, char*, char*, char*); + char* executable_path; + void *ptr_list[WEBUI_MAX_ARRAY]; + unsigned int ptr_position; + size_t ptr_size[WEBUI_MAX_ARRAY]; + unsigned int current_browser; +} _webui_core_t; + +typedef struct _webui_cb_t { + _webui_window_t* win; + char* webui_internal_id; + char* element_name; + void* data; + unsigned int data_len; + int event_type; +} _webui_cb_t; + +typedef struct _webui_mg_handler_t { + struct mg_connection* c; + int ev; + void* ev_data; + void* fn_data; +} _webui_mg_handler_t; + +typedef struct _webui_cmd_async_t { + _webui_window_t* win; + char* cmd; +} _webui_cmd_async_t; + +// -- Definitions --------------------- +#ifdef _WIN32 + static const char* webui_sep = "\\"; + DWORD WINAPI _webui_cb(LPVOID _arg); + DWORD WINAPI _webui_run_browser_task(LPVOID _arg); + int _webui_system_win32(char* cmd, bool show); + bool _webui_socket_test_listen_win32(unsigned int port_num); + bool _webui_get_windows_reg_value(HKEY key, const char* reg, const char* value_name, char value[WEBUI_MAX_PATH]); + + #define WEBUI_CB DWORD WINAPI _webui_cb(LPVOID _arg) + #define WEBUI_SERVER_START DWORD WINAPI _webui_server_start(LPVOID arg) + #define THREAD_RETURN return 0; +#else + static const char* webui_sep = "/"; + void* _webui_cb(void* _arg); + void* _webui_run_browser_task(void* _arg); + + #define WEBUI_CB void* _webui_cb(void* _arg) + #define WEBUI_SERVER_START void* _webui_server_start(void* arg) + #define THREAD_RETURN pthread_exit(NULL); +#endif + +static void _webui_init(void); +bool _webui_show(_webui_window_t* window, const char* content, unsigned int browser); +unsigned int _webui_get_cb_index(char* webui_internal_id); +unsigned int _webui_set_cb_index(char* webui_internal_id); +unsigned int _webui_get_free_port(void); +unsigned int _webui_get_new_window_number(void); +static void _webui_wait_for_startup(void); +static void _webui_free_port(unsigned int port); +char* _webui_get_current_path(void); +static void _webui_window_receive(_webui_window_t* win, const char* packet, size_t len); +static void _webui_window_send(_webui_window_t* win, char* packet, size_t packets_size); +static void _webui_window_event(_webui_window_t* win, char* element_id, char* element, void* data, unsigned int data_len, int event_type); +unsigned int _webui_window_get_number(_webui_window_t* win); +static void _webui_window_open(_webui_window_t* win, char* link, unsigned int browser); +int _webui_cmd_sync(char* cmd, bool show); +int _webui_cmd_async(char* cmd, bool show); +int _webui_run_browser(_webui_window_t* win, char* cmd); +static void _webui_clean(void); +bool _webui_browser_exist(_webui_window_t* win, unsigned int browser); +const char* _webui_browser_get_temp_path(unsigned int browser); +bool _webui_folder_exist(char* folder); +bool _webui_browser_create_profile_folder(_webui_window_t* win, unsigned int browser); +bool _webui_browser_start_chrome(_webui_window_t* win, const char* address); +bool _webui_browser_start_edge(_webui_window_t* win, const char* address); +bool _webui_browser_start_epic(_webui_window_t* win, const char* address); +bool _webui_browser_start_vivaldi(_webui_window_t* win, const char* address); +bool _webui_browser_start_brave(_webui_window_t* win, const char* address); +bool _webui_browser_start_firefox(_webui_window_t* win, const char* address); +bool _webui_browser_start_yandex(_webui_window_t* win, const char* address); +bool _webui_browser_start_chromium(_webui_window_t* win, const char* address); +bool _webui_browser_start(_webui_window_t* win, const char* address, unsigned int browser); +long _webui_timer_diff(struct timespec *start, struct timespec *end); +static void _webui_timer_start(_webui_timer_t* t); +bool _webui_timer_is_end(_webui_timer_t* t, unsigned int ms); +static void _webui_timer_clock_gettime(struct timespec *spec); +bool _webui_set_root_folder(_webui_window_t* win, const char* path); +const char* _webui_generate_js_bridge(_webui_window_t* win); +static void _webui_print_hex(const char* data, size_t len); +static void _webui_free_mem(void* ptr); +bool _webui_file_exist_mg(void *ev_data); +bool _webui_file_exist(char* file); +static void _webui_free_all_mem(void); +bool _webui_show_window(_webui_window_t* win, const char* content, bool is_embedded_html, unsigned int browser); +char* _webui_generate_internal_id(_webui_window_t* win, const char* element); +bool _webui_is_empty(const char* s); +unsigned char _webui_get_run_id(void); +void* _webui_malloc(int size); +static void _webui_sleep(long unsigned int ms); + +WEBUI_SERVER_START; +WEBUI_CB; + +#endif /* _WEBUI_CORE_H */ diff --git a/website/docs/c_api.md b/website/docs/c_api.md index 3fe885e2..129039fa 100644 --- a/website/docs/c_api.md +++ b/website/docs/c_api.md @@ -87,7 +87,7 @@ Please visit [C Examples](https://github.com/alifcommunity/webui/tree/main/examp To create a new window object, you can use `webui_new_window()`, which returns a pointer to a struct `webui_window_t`. This pointer does *NOT* need to be freed. ```c -webui_window_t* my_window = webui_new_window(); +void* my_window = webui_new_window(); ``` --- @@ -328,10 +328,10 @@ void my_function(webui_event_t* e){ webui_script(e->window, &js); // Check if there is any JavaScript error - if(js.result.error) - printf("Error: %s\n", js.result.data); + if(js.error) + printf("Error: %s\n", js.data); else - printf("Output: %s\n", js.result.data); + printf("Output: %s\n", js.data); // Free resources webui_script_cleanup(&js); diff --git a/website/index.html b/website/index.html index 251aa352..2d478adb 100644 --- a/website/index.html +++ b/website/index.html @@ -151,8 +151,8 @@ @@ -172,8 +172,8 @@