fix: solve memory issues of sdk apis
This commit is contained in:
parent
39cee0e7ef
commit
fb3bcfca28
@ -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;
|
||||
void GFExecuteCommandBatchSync(GFCommandExecuteContext** contexts,
|
||||
int32_t contexts_size) {
|
||||
QList<GpgFrontend::GpgCommandExecutor::ExecuteContext> core_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](
|
||||
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 {
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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*)));
|
||||
|
||||
|
@ -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 **;
|
||||
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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user