From 1ce12b8b843dbdeb67565a08cf67a96674dce0c9 Mon Sep 17 00:00:00 2001 From: Caelan Sayler Date: Sun, 20 Oct 2024 01:28:03 +0100 Subject: [PATCH] Refactor C++ to C string array conversion --- .github/workflows/build.yml | 6 ++--- src/lib-cpp/include/Velopack.h | 48 ++++++++++++++++++---------------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 16ea7078..96f05635 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,7 +30,7 @@ jobs: - name: Update Version shell: pwsh run: .\set-nbgv-version.ps1 - - name: Build Rust Bins (x86) + - name: Build Rust (x86) run: cargo +1.75.0-x86_64-pc-windows-msvc build --target i686-pc-windows-msvc --features windows --release - name: Upload Rust Build Artifacts uses: actions/upload-artifact@v4 @@ -39,11 +39,11 @@ jobs: path: | target\i686-pc-windows-msvc\release\*.exe target\i686-pc-windows-msvc\release\*.pdb - - name: Build velopack_nodeffi (x64) + - name: Build Rust (x64) run: | cargo +1.75.0-x86_64-pc-windows-msvc build --target x86_64-pc-windows-msvc --release --package velopack_nodeffi cargo +1.75.0-x86_64-pc-windows-msvc build --target x86_64-pc-windows-msvc --release --package velopack_libc - - name: Build velopack_nodeffi (arm64) + - name: Build Rust (arm64) run: | cargo +1.75.0-x86_64-pc-windows-msvc build --target aarch64-pc-windows-msvc --release --package velopack_nodeffi cargo +1.75.0-x86_64-pc-windows-msvc build --target aarch64-pc-windows-msvc --release --package velopack_libc diff --git a/src/lib-cpp/include/Velopack.h b/src/lib-cpp/include/Velopack.h index 0f7c16da..92f4698e 100644 --- a/src/lib-cpp/include/Velopack.h +++ b/src/lib-cpp/include/Velopack.h @@ -268,6 +268,27 @@ static inline UpdateOptions to_cpp(const vpkc_update_options_t& dto) { } // !! AUTO-GENERATED-END CPP_TYPES +static inline char** to_cstring_array(const std::vector& vec) { + char** result = new char*[vec.size()]; + for (size_t i = 0; i < vec.size(); ++i) { + result[i] = new char[vec[i].size() + 1]; // +1 for null-terminator +#ifdef _WIN32 + strcpy_s(result[i], vec[i].size() + 1, vec[i].c_str()); // Copy string content +#else + strcpy(result[i], vec[i].c_str()); // Copy string content +#endif + } + return result; +} + +static inline void free_cstring_array(char** arr, size_t size) { + for (size_t i = 0; i < size; ++i) { + delete[] arr[i]; + } + delete[] arr; +} + + class VelopackApp { private: VelopackApp() {}; @@ -280,18 +301,9 @@ public: return *this; }; VelopackApp& SetArgs(const std::vector& args) { - char** pArgs = new char*[args.size()]; - for (size_t i = 0; i < args.size(); i++) { - pArgs[i] = new char[args[i].size() + 1]; - strcpy_s(pArgs[i], args[i].size() + 1, args[i].c_str()); - } + char** pArgs = to_cstring_array(args); vpkc_app_set_args(pArgs, args.size()); - - // Free all the memory - for (size_t i = 0; i < args.size(); i++) { - delete[] pArgs[i]; - } - delete[] pArgs; + free_cstring_array(pArgs, args.size()); return *this; }; VelopackApp& SetLocator(const VelopackLocatorConfig& locator) { @@ -399,20 +411,10 @@ public: } }; void WaitExitThenApplyUpdate(const VelopackAsset& asset, bool silent = false, bool restart = true, std::vector restartArgs = {}) { - char** pRestartArgs = new char*[restartArgs.size()]; - for (size_t i = 0; i < restartArgs.size(); i++) { - pRestartArgs[i] = new char[restartArgs[i].size() + 1]; - strcpy_s(pRestartArgs[i], restartArgs[i].size() + 1, restartArgs[i].c_str()); - } - + char** pRestartArgs = to_cstring_array(restartArgs); vpkc_asset_t vpkc_asset = to_c(asset); bool result = vpkc_wait_exit_then_apply_update(m_pManager, &vpkc_asset, silent, restart, pRestartArgs, restartArgs.size()); - - // Free all the memory - for (size_t i = 0; i < restartArgs.size(); i++) { - delete[] pRestartArgs[i]; - } - delete[] pRestartArgs; + free_cstring_array(pRestartArgs, restartArgs.size()); if (!result) { throw_last_error();