First Commit

This commit is contained in:
2025-10-14 23:17:27 -05:00
commit f5890d070f
6 changed files with 243 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.vscode
build

98
CMakeLists.txt Normal file
View File

@@ -0,0 +1,98 @@
cmake_minimum_required(VERSION 3.16)
option(TFWEBAPP_ENABLE_STATIC "Enable static build" ON)
option(TFWEBAPP_ENABLE_SHARED "Enable shared build" ON)
option(TFWEBAPP_ENABLE_EXAMPLES "Enable examples" OFF)
option(TFWEBAPP_FETCHCONTENT "Fetch content" ON)
set(TFWEBAPP_SOURCES
src/lib.cpp
)
include(FetchContent)
FetchContent_Declare(
WebView
GIT_REPOSITORY https://github.com/webview/webview.git
)
set(WEBVIEW_INSTALL_TARGETS ON)
FetchContent_MakeAvailable(WebView)
list(APPEND TessesFrameworkWebAppLibs webview_core_headers)
if(TFWEBAPP_ENABLE_STATIC)
add_library(tessesframework_webapp STATIC ${TFWEBAPP_SOURCES})
target_link_libraries(tessesframework_webapp PRIVATE webview::core)
list(APPEND TessesFrameworkWebAppLibs tessesframework_webapp)
target_include_directories(tessesframework_webapp
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
endif()
if(TFWEBAPP_ENABLE_SHARED)
add_library(tessesframework_webapp_shared STATIC ${TFWEBAPP_SOURCES})
target_link_libraries(tessesframework_webapp_shared PRIVATE webview::core)
list(APPEND TessesFrameworkWebAppLibs tessesframework_webapp_shared)
target_include_directories(tessesframework_webapp_shared
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
endif()
if(TFWEBAPP_FETCHCONTENT)
FetchContent_Declare(
TessesFramework
GIT_REPOSITORY https://onedev.site.tesses.net/tesses-framework.git
)
FetchContent_MakeAvailable(TessesFramework)
if(TFWEBAPP_ENABLE_STATIC)
target_link_libraries(tessesframework_webapp PUBLIC tessesframework)
endif()
if(TFWEBAPP_ENABLE_SHARED)
target_link_libraries(tessesframework_webapp_shared PUBLIC tessesframework_shared)
endif()
list(APPEND TessesFrameworkWebAppLibs ${TessesFrameworkTargets})
else()
find_package(TessesFramework REQUIRED)
if(TFWEBAPP_ENABLE_STATIC)
target_link_libraries(tessesframework_webapp PUBLIC TessesFramework::tessesframework)
endif()
if(TFWEBAPP_ENABLE_SHARED)
target_link_libraries(tessesframework_webapp_shared PUBLIC TessesFramework::tessesframework_shared)
endif()
endif()
if(TFWEBAPP_ENABLE_EXAMPLES)
add_executable(printargs examples/printargs.cpp)
target_link_libraries(printargs PUBLIC tessesframework_webapp)
endif()
install(TARGETS ${TessesFrameworkWebAppLibs}
EXPORT TessesFrameworkWebAppTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(FILES include/TF_WebApp.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT TessesFrameworkWebAppTargets
FILE TessesFrameworkWebAppTargets.cmake
NAMESPACE TessesFrameworkWebApp::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TessesFrameworkWebApp
)
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/TessesFrameworkWebAppConfig.cmake"
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TessesFrameworkWebApp)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/TessesFrameworkWebAppConfig.cmake"
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TessesFrameworkWebApp)

7
Config.cmake.in Normal file
View File

@@ -0,0 +1,7 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/TessesFrameworkWebAppTargets.cmake")
check_required_components(TessesFrameworkWebApp)
find_package(TessesFramework REQUIRED)
find_package(webview REQUIRED)

23
examples/printargs.cpp Normal file
View File

@@ -0,0 +1,23 @@
#include "TF_WebApp.hpp"
using namespace Tesses::Framework::Http;
using namespace Tesses::Framework;
TF_WebApp(MyApp,nullptr)
std::shared_ptr<IHttpServer> MyApp(std::vector<std::string>& args)
{
TF_WebAppSetTitle("Print Args");
return std::make_shared<CallbackServer>([&args](ServerContext& ctx)->bool {
if(ctx.path == "/")
{
std::string text = "<h1>Hello, world</h1><ul>";
for(auto item : args)
text += "<li>" + HttpUtils::HtmlEncode(item) + "</li>";
text += "</ul>";
ctx.WithMimeType("text/html").SendText(text);
return true;
}
return false;
});
}

14
include/TF_WebApp.hpp Normal file
View File

@@ -0,0 +1,14 @@
#pragma once
#include <TessesFramework/TessesFramework.hpp>
namespace Tesses::Framework {
#if defined(_WIN32)
int TF_Main(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd, std::function<std::shared_ptr<Tesses::Framework::Http::IHttpServer>(std::vector<std::string>& args)> cb, std::function<void(std::shared_ptr<Tesses::Framework::Http::IHttpServer>)> clo);
#define TF_WebApp(fn,clo) std::shared_ptr<Tesses::Framework::Http::IHttpServer> fn(std::vector<std::string>& args); int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { return Tesses::Framework::TF_Main(hInstance,hPrevInstance,lpCmdLine,nShowCmd,fn,clo);}
#else
int TF_Main(int argc, char** argv, std::function<std::shared_ptr<Tesses::Framework::Http::IHttpServer>(std::vector<std::string>& args)> cb, std::function<void(std::shared_ptr<Tesses::Framework::Http::IHttpServer>)> clo);
#define TF_WebApp(fn,clo) std::shared_ptr<Tesses::Framework::Http::IHttpServer> fn(std::vector<std::string>& args); int main(int argc, char** argv) { return Tesses::Framework::TF_Main(argc, argv, fn, clo); }
#endif
void TF_WebAppSetTitle(std::string title);
};

99
src/lib.cpp Normal file
View File

@@ -0,0 +1,99 @@
#include "TF_WebApp.hpp"
#include "webview/webview.h"
namespace Tesses::Framework {
static std::string wv_title;
static webview::webview* wv_hdl=nullptr;
static Tesses::Framework::Threading::Mutex wv_mtx;
void TF_WebAppSetTitle(std::string title)
{
wv_mtx.Lock();
wv_title = title;
if(wv_hdl != nullptr)
{
wv_hdl->dispatch([title]()->void {
wv_hdl->set_title(title);
});
}
wv_mtx.Unlock();
}
#if defined(_WIN32)
int TF_Main(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd, std::function<std::shared_ptr<Tesses::Framework::Http::IHttpServer>(std::vector<std::string>& args)> cb, std::function<void(std::shared_ptr<Tesses::Framework::Http::IHttpServer>)> clo)
#else
int TF_Main(int argc, char** argv, std::function<std::shared_ptr<Tesses::Framework::Http::IHttpServer>(std::vector<std::string>& args)> cb, std::function<void(std::shared_ptr<Tesses::Framework::Http::IHttpServer>)> clo)
#endif
{
TF_InitWithConsole();
std::vector<std::string> args;
#if defined(_WIN32)
auto winargs = GetCommandLineW();
int argc=0;
auto argv = CommandLineToArgvW(
winargs,
&argc
);
for(int i = 0; i < argc; i++)
{
std::u16string str = (const char16_t*)argv[i];
std::string utf8;
Tesses::Framework::Text::StringConverter::UTF8::FromUTF16(utf8,str);
args.push_back(utf8);
}
LocalFree(argv);
#else
for(int i = 0; i < argc; i++)
{
args.push_back(argv[i]);
}
#endif
{
auto req = cb(args);
if(req)
{
Tesses::Framework::Http::HttpServer svr(0,req,false);
svr.StartAccepting();
auto port = svr.GetPort();
std::string url = "http://127.0.0.1:" + std::to_string((int)port) + "/";
webview::webview w(false, nullptr);
wv_mtx.Lock();
wv_hdl = &w;
w.set_title(wv_title);
wv_mtx.Unlock();
w.set_size(480, 320, WEBVIEW_HINT_NONE);
w.navigate(url);
w.run();
wv_mtx.Lock();
wv_mtx.Unlock();
}
else {
if(clo)
clo(req);
TF_Quit();
return 1;
}
if(clo)
clo(req);
}
TF_Quit();
return 0;
}
}