mirror of
https://github.com/velopack/velopack.git
synced 2025-10-25 15:19:22 +00:00
Allow void* user data in C API
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user