From 65df8e101336ffa089a0b9e1705fe624a99ceec9 Mon Sep 17 00:00:00 2001 From: Caelan Sayler Date: Fri, 8 Nov 2024 21:18:41 +0000 Subject: [PATCH] Allow void* user data in C API --- samples/CPlusPlusWin32/CppWin32Sample.cpp | 4 ++-- src/lib-cpp/include/Velopack.h | 22 +++++++++++----------- src/lib-cpp/src/bridge.cc | 9 ++++++--- src/lib-cpp/src/bridge.hpp | 19 +++++++++++-------- 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/samples/CPlusPlusWin32/CppWin32Sample.cpp b/samples/CPlusPlusWin32/CppWin32Sample.cpp index 652f130c..564b652f 100644 --- a/samples/CPlusPlusWin32/CppWin32Sample.cpp +++ b/samples/CPlusPlusWin32/CppWin32Sample.cpp @@ -38,7 +38,7 @@ INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); std::wstring Utf8ToWString(std::string const& str); std::string WStringToUtf8(std::wstring const& wstr); -void handle_vpkc_log(const char* pszLevel, const char* pszMessage) +void handle_vpkc_log(void* pUserData, const char* pszLevel, const char* pszMessage) { std::cout << pszLevel << ": " << pszMessage << std::endl; } @@ -57,7 +57,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, // Initialize Velopack log capture std::cout << "Velopack C++ Sample App" << std::endl; - vpkc_set_log(handle_vpkc_log); + vpkc_set_logger(handle_vpkc_log); // This should run as early as possible in the main method. // Velopack may exit / restart the app at this point. diff --git a/src/lib-cpp/include/Velopack.h b/src/lib-cpp/include/Velopack.h index 6548b100..76668d0c 100644 --- a/src/lib-cpp/include/Velopack.h +++ b/src/lib-cpp/include/Velopack.h @@ -41,7 +41,7 @@ #pragma comment(linker, "/EXPORT:vpkc_app_set_hook_restarted") #pragma comment(linker, "/EXPORT:vpkc_app_run") #pragma comment(linker, "/EXPORT:vpkc_get_last_error") -#pragma comment(linker, "/EXPORT:vpkc_set_log") +#pragma comment(linker, "/EXPORT:vpkc_set_logger") #pragma comment(linker, "/EXPORT:vpkc_free_update_manager") #pragma comment(linker, "/EXPORT:vpkc_free_update_info") #pragma comment(linker, "/EXPORT:vpkc_free_asset") @@ -58,9 +58,9 @@ extern "C" { #endif typedef void vpkc_update_manager_t; -typedef void (*vpkc_progress_callback_t)(size_t progress); -typedef void (*vpkc_log_callback_t)(const char* pszLevel, const char* pszMessage); -typedef void (*vpkc_hook_callback_t)(const char* pszAppVersion); +typedef void (*vpkc_progress_callback_t)(void* pUserData, size_t progress); +typedef void (*vpkc_log_callback_t)(void* pUserData, const char* pszLevel, const char* pszMessage); +typedef void (*vpkc_hook_callback_t)(void* pUserData, const char* pszAppVersion); typedef enum vpkc_update_check_t { UPDATE_AVAILABLE = 0, @@ -150,7 +150,7 @@ VPKC_EXPORT bool VPKC_CALL vpkc_update_pending_restart(vpkc_update_manager_t* pM /// \group UpdateManager VPKC_EXPORT vpkc_update_check_t VPKC_CALL vpkc_check_for_updates(vpkc_update_manager_t* pManager, vpkc_update_info_t* pUpdate); /// \group UpdateManager -VPKC_EXPORT bool VPKC_CALL vpkc_download_updates(vpkc_update_manager_t* pManager, vpkc_update_info_t* pUpdate, vpkc_progress_callback_t cbProgress); +VPKC_EXPORT bool VPKC_CALL vpkc_download_updates(vpkc_update_manager_t* pManager, vpkc_update_info_t* pUpdate, vpkc_progress_callback_t cbProgress, void* pUserData = 0); /// \group UpdateManager VPKC_EXPORT bool VPKC_CALL vpkc_wait_exit_then_apply_update(vpkc_update_manager_t* pManager, vpkc_asset_t* pAsset, bool bSilent, bool bRestart, char** pRestartArgs, size_t cRestartArgs); /// \group UpdateManager @@ -162,7 +162,7 @@ VPKC_EXPORT void VPKC_CALL vpkc_free_asset(vpkc_asset_t* pAsset); /// Should be run at the beginning of your application to handle Velopack events. /// \group VelopackApp -VPKC_EXPORT void VPKC_CALL vpkc_app_run(); +VPKC_EXPORT void VPKC_CALL vpkc_app_run(void* pUserData = 0); /// \group VelopackApp VPKC_EXPORT void VPKC_CALL vpkc_app_set_auto_apply_on_startup(bool bAutoApply); /// \group VelopackApp @@ -186,7 +186,7 @@ VPKC_EXPORT void VPKC_CALL vpkc_app_set_hook_restarted(vpkc_hook_callback_t cbRe VPKC_EXPORT size_t VPKC_CALL vpkc_get_last_error(char* pszError, size_t cError); /// Sets the callback to be used/called with log messages from Velopack. -VPKC_EXPORT void VPKC_CALL vpkc_set_log(vpkc_log_callback_t cbLog); +VPKC_EXPORT void VPKC_CALL vpkc_set_logger(vpkc_log_callback_t cbLog, void* pUserData = 0); #ifdef __cplusplus // end of extern "C" } @@ -497,8 +497,8 @@ public: * Runs the Velopack startup logic. This should be the first thing to run in your app. * In some circumstances it may terminate/restart the process to perform tasks. */ - void Run() { - vpkc_app_run(); + void Run(void* pUserData = 0) { + vpkc_app_run(pUserData); }; }; @@ -611,9 +611,9 @@ public: * - If there is no delta update available, or there is an error preparing delta * packages, this method will fall back to downloading the full version of the update. */ - void DownloadUpdates(const UpdateInfo& update, vpkc_progress_callback_t progress = nullptr) { + void DownloadUpdates(const UpdateInfo& update, vpkc_progress_callback_t progress = nullptr, void* pUserData = 0) { vpkc_update_info_t vpkc_update = to_c(update); - if (!vpkc_download_updates(m_pManager, &vpkc_update, progress)) { + if (!vpkc_download_updates(m_pManager, &vpkc_update, progress, pUserData)) { throw_last_error(); } }; diff --git a/src/lib-cpp/src/bridge.cc b/src/lib-cpp/src/bridge.cc index dd120b4a..243bfd33 100644 --- a/src/lib-cpp/src/bridge.cc +++ b/src/lib-cpp/src/bridge.cc @@ -299,7 +299,7 @@ VPKC_EXPORT vpkc_update_check_t VPKC_CALL vpkc_check_for_updates(vpkc_update_man return vpkc_update_check_t::UPDATE_ERROR; } } -VPKC_EXPORT bool VPKC_CALL vpkc_download_updates(vpkc_update_manager_t* pManager, vpkc_update_info_t* pUpdate, vpkc_progress_callback_t cbProgress) { +VPKC_EXPORT bool VPKC_CALL vpkc_download_updates(vpkc_update_manager_t* pManager, vpkc_update_info_t* pUpdate, vpkc_progress_callback_t cbProgress, void* pUserData) { clear_last_error(); try { if (!pUpdate) { @@ -312,6 +312,7 @@ VPKC_EXPORT bool VPKC_CALL vpkc_download_updates(vpkc_update_manager_t* pManager DownloadCallbackManager download{}; download.progress_cb = cbProgress; + download.user_data = pUserData; bridge_download_updates(*pOpaque, update, download); return true; } @@ -382,14 +383,16 @@ VPKC_EXPORT void VPKC_CALL vpkc_app_set_hook_first_run(vpkc_hook_callback_t cbFi VPKC_EXPORT void VPKC_CALL vpkc_app_set_hook_restarted(vpkc_hook_callback_t cbRestarted) { hooks.restarted = cbRestarted; } -VPKC_EXPORT void VPKC_CALL vpkc_app_run() { +VPKC_EXPORT void VPKC_CALL vpkc_app_run(void* pUserData) { + hooks.user_data = pUserData; bridge_appbuilder_run(hooks, args, locator, autoApply); } // Misc functions LoggerCallbackManager logMgr{}; -VPKC_EXPORT void VPKC_CALL vpkc_set_log(vpkc_log_callback_t cbLog) { +VPKC_EXPORT void VPKC_CALL vpkc_set_logger(vpkc_log_callback_t cbLog, void* pUserData) { logMgr.lob_cb = cbLog; + logMgr.user_data = pUserData; bridge_set_logger_callback(&logMgr); } VPKC_EXPORT void VPKC_CALL vpkc_free_update_manager(vpkc_update_manager_t* pManager) { diff --git a/src/lib-cpp/src/bridge.hpp b/src/lib-cpp/src/bridge.hpp index b7da5110..3a646275 100644 --- a/src/lib-cpp/src/bridge.hpp +++ b/src/lib-cpp/src/bridge.hpp @@ -9,58 +9,61 @@ struct HookCallbackManager { vpkc_hook_callback_t after_update = nullptr; vpkc_hook_callback_t first_run = nullptr; vpkc_hook_callback_t restarted = nullptr; + void* user_data = nullptr; void install_hook(::rust::String app_version) const { if (after_install) { - after_install(app_version.c_str()); + after_install(user_data, app_version.c_str()); } }; void update_hook(::rust::String app_version) const { if (after_update) { - after_update(app_version.c_str()); + after_update(user_data, app_version.c_str()); } }; void obsolete_hook(::rust::String app_version) const { if (before_update) { - before_update(app_version.c_str()); + before_update(user_data, app_version.c_str()); } }; void uninstall_hook(::rust::String app_version) const { if (before_uninstall) { - before_uninstall(app_version.c_str()); + before_uninstall(user_data, app_version.c_str()); } }; void firstrun_hook(::rust::String app_version) const { if (first_run) { - first_run(app_version.c_str()); + first_run(user_data, app_version.c_str()); } }; void restarted_hook(::rust::String app_version) const { if (restarted) { - restarted(app_version.c_str()); + restarted(user_data, app_version.c_str()); } }; }; struct DownloadCallbackManager { vpkc_progress_callback_t progress_cb = nullptr; + void* user_data = nullptr; void download_progress(int16_t progress) const { if (progress_cb) { - progress_cb(progress); + progress_cb(user_data, progress); } }; }; struct LoggerCallbackManager { vpkc_log_callback_t lob_cb = nullptr; + void* user_data = nullptr; void log(::rust::String level, ::rust::String message) const { if (lob_cb) { - lob_cb(level.c_str(), message.c_str()); + lob_cb(user_data, level.c_str(), message.c_str()); } }; }; \ No newline at end of file