diff options
author | saturneric <[email protected]> | 2024-12-02 22:52:57 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2024-12-02 22:52:57 +0000 |
commit | fb3bcfca2819eb43a84ee47c206140346c5d3459 (patch) | |
tree | 77972fa0c6c2da706143469ef37f7b5f492e12cb /src/sdk | |
parent | fix: ui initializes before core fully initialized (diff) | |
download | GpgFrontend-fb3bcfca2819eb43a84ee47c206140346c5d3459.tar.gz GpgFrontend-fb3bcfca2819eb43a84ee47c206140346c5d3459.zip |
fix: solve memory issues of sdk apis
Diffstat (limited to 'src/sdk')
-rw-r--r-- | src/sdk/GFSDKBasic.cpp | 39 | ||||
-rw-r--r-- | src/sdk/GFSDKBasic.h | 10 | ||||
-rw-r--r-- | src/sdk/GFSDKGpg.cpp | 4 | ||||
-rw-r--r-- | src/sdk/private/GFSDKPrivat.cpp | 4 | ||||
-rw-r--r-- | src/sdk/private/GFSDKPrivat.h | 37 |
5 files changed, 58 insertions, 36 deletions
diff --git a/src/sdk/GFSDKBasic.cpp b/src/sdk/GFSDKBasic.cpp index 2815d17a..2b37ada4 100644 --- a/src/sdk/GFSDKBasic.cpp +++ b/src/sdk/GFSDKBasic.cpp @@ -53,43 +53,34 @@ auto GFProjectVersion() -> const char* { auto GFQtEnvVersion() -> const char* { return GFStrDup(QT_VERSION_STR); } -void GFExecuteCommandSync(const char* cmd, int32_t argc, const char** argv, +void GFExecuteCommandSync(const char* cmd, int32_t argc, char** argv, GFCommandExecuteCallback cb, void* data) { - QStringList args; - for (int i = 0; i < argc; i++) { - args.append(GFUnStrDup(argv[i])); - } - + QStringList args = CharArrayToQStringList(argv, argc); GpgFrontend::GpgCommandExecutor::ExecuteContext const context{ cmd, args, [=](int exit_code, const QString& out, const QString& err) { cb(data, exit_code, out.toUtf8(), err.toUtf8()); }}; - GpgFrontend::GpgCommandExecutor::ExecuteSync(context); } -void GFExecuteCommandBatchSync(int32_t context_size, - const GFCommandExecuteContext* context) { - QList<GpgFrontend::GpgCommandExecutor::ExecuteContext> contexts; - - for (int i = 0; i < context_size; i++) { - const auto& exec_context = context[i]; - - QStringList args; - const char** argv = exec_context.argv; - for (int j = 0; j < exec_context.argc; j++) { - args.append(GFUnStrDup(argv[j])); - } - - contexts.append( - {exec_context.cmd, args, - [data = exec_context.data, cb = exec_context.cb]( +void GFExecuteCommandBatchSync(GFCommandExecuteContext** contexts, + int32_t contexts_size) { + QList<GpgFrontend::GpgCommandExecutor::ExecuteContext> core_contexts; + + QList<GFCommandExecuteContext> sdk_contexts = + ArrayToQList(contexts, contexts_size); + for (const auto sdk_context : sdk_contexts) { + QStringList args = + CharArrayToQStringList(sdk_context.argv, sdk_context.argc); + core_contexts.append( + {GFUnStrDup(sdk_context.cmd), args, + [data = sdk_context.data, cb = sdk_context.cb]( int exit_code, const QString& out, const QString& err) { cb(data, exit_code, out.toUtf8(), err.toUtf8()); }}); } - GpgFrontend::GpgCommandExecutor::ExecuteConcurrentlySync(contexts); + GpgFrontend::GpgCommandExecutor::ExecuteConcurrentlySync(core_contexts); } auto StrlenSafe(const char* str, size_t max_len) -> size_t { diff --git a/src/sdk/GFSDKBasic.h b/src/sdk/GFSDKBasic.h index 1c81299a..6af2176d 100644 --- a/src/sdk/GFSDKBasic.h +++ b/src/sdk/GFSDKBasic.h @@ -42,11 +42,11 @@ using GFCommandExecuteCallback = void (*)(void* data, int errcode, const char* out, const char* err); using GFCommandExecuteContext = struct { - const char* cmd; + char* cmd; int32_t argc; - const char** argv; + char** argv; GFCommandExecuteCallback cb; - void* data; + void* data; ///< must free by user }; using GFTranslatorDataReader = int (*)(const char* locale, char** data); @@ -106,7 +106,7 @@ void GPGFRONTEND_MODULE_SDK_EXPORT GFFreeMemory(void*); * @param data */ void GPGFRONTEND_MODULE_SDK_EXPORT -GFExecuteCommandSync(const char* cmd, int32_t argc, const char** argv, +GFExecuteCommandSync(const char* cmd, int32_t argc, char** argv, GFCommandExecuteCallback cb, void* data); /** @@ -116,7 +116,7 @@ GFExecuteCommandSync(const char* cmd, int32_t argc, const char** argv, * @param context */ void GPGFRONTEND_MODULE_SDK_EXPORT GFExecuteCommandBatchSync( - int32_t context_size, const GFCommandExecuteContext* context); + GFCommandExecuteContext** contexts, int32_t contexts_size); /** * @brief diff --git a/src/sdk/GFSDKGpg.cpp b/src/sdk/GFSDKGpg.cpp index 52ea0520..3cbaba7e 100644 --- a/src/sdk/GFSDKGpg.cpp +++ b/src/sdk/GFSDKGpg.cpp @@ -48,7 +48,7 @@ auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgSignData(int channel, char** key_ids, int key_ids_size, char* data, int sign_mode, int ascii, GFGpgSignResult** ps) -> int { - auto singer_ids = CharArrayToQList(key_ids, key_ids_size); + auto singer_ids = CharArrayToQStringList(key_ids, key_ids_size); GpgFrontend::KeyArgsList signer_keys; for (const auto& signer_id : singer_ids) { @@ -130,7 +130,7 @@ auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgKeyPrimaryUID(int channel, char* key_id, auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgEncryptData(int channel, char** key_ids, int key_ids_size, char* data, int ascii, GFGpgEncryptionResult** ps) -> int { - auto encrypt_key_ids = CharArrayToQList(key_ids, key_ids_size); + auto encrypt_key_ids = CharArrayToQStringList(key_ids, key_ids_size); GpgFrontend::KeyArgsList encrypt_keys; for (const auto& encrypt_key_id : encrypt_key_ids) { diff --git a/src/sdk/private/GFSDKPrivat.cpp b/src/sdk/private/GFSDKPrivat.cpp index 71136535..5a2c5256 100644 --- a/src/sdk/private/GFSDKPrivat.cpp +++ b/src/sdk/private/GFSDKPrivat.cpp @@ -105,7 +105,7 @@ auto ConvertEventParamsToMap(GFModuleEventParam* params) return param_map; } -auto CharArrayToQList(char** char_array, int size) -> QStringList { +auto CharArrayToQStringList(char** char_array, int size) -> QStringList { QStringList list; for (int i = 0; i < size; ++i) { if (char_array[i] != nullptr) { @@ -117,7 +117,7 @@ auto CharArrayToQList(char** char_array, int size) -> QStringList { return list; } -auto QListToCharArray(const QStringList& list) -> char** { +auto QStringListToCharArray(const QStringList& list) -> char** { char** char_array = static_cast<char**>( GpgFrontend::SecureMalloc(list.size() * sizeof(char*))); diff --git a/src/sdk/private/GFSDKPrivat.h b/src/sdk/private/GFSDKPrivat.h index 7cfa2c76..1d1cc8d3 100644 --- a/src/sdk/private/GFSDKPrivat.h +++ b/src/sdk/private/GFSDKPrivat.h @@ -28,7 +28,8 @@ #pragma once -// declare logging category +#include <core/function/SecureMemoryAllocator.h> + Q_DECLARE_LOGGING_CATEGORY(sdk) #define LOG_D() qCDebug(sdk) @@ -95,7 +96,7 @@ auto ConvertEventParamsToMap(GFModuleEventParam *params) * @param size * @return QStringList */ -auto CharArrayToQList(char **char_array, int size) -> QStringList; +auto CharArrayToQStringList(char **char_array, int size) -> QStringList; /** * @brief @@ -104,4 +105,34 @@ auto CharArrayToQList(char **char_array, int size) -> QStringList; * @param size * @return char** */ -auto QListToCharArray(const QStringList &list) -> char **;
\ No newline at end of file +auto QStringListToCharArray(const QStringList &list) -> char **; + +template <typename T> +inline auto ArrayToQList(T **pl_components, int size) -> QList<T> { + if (pl_components == nullptr || size <= 0) { + return QList<T>(); + } + + QList<T> list; + for (int i = 0; i < size; ++i) { + list.append(*pl_components[i]); + GpgFrontend::SecureMemoryAllocator::Deallocate(pl_components[i]); + } + GpgFrontend::SecureMemoryAllocator::Deallocate(pl_components); + return list; +} + +template <typename T> +inline auto QListToArray(const QList<T> &list) -> T ** { + T **array = static_cast<T **>( + GpgFrontend::SecureMemoryAllocator::Allocate(list.size() * sizeof(T *))); + int index = 0; + for (const T &item : list) { + auto mem = static_cast<T *>( + GpgFrontend::SecureMemoryAllocator::Allocate(sizeof(T))); + array[index] = new (mem) T(item); + index++; + } + + return array; +}
\ No newline at end of file |