Refactor C++ to C string array conversion

This commit is contained in:
Caelan Sayler
2024-10-20 01:28:03 +01:00
committed by Caelan
parent abb220ba3b
commit 1ce12b8b84
2 changed files with 28 additions and 26 deletions

View File

@@ -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

View File

@@ -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<std::string>& 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<std::string>& 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<std::string> 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();