From c27c541257585878e4db705559c5cb953dc860b7 Mon Sep 17 00:00:00 2001 From: saturneric Date: Sun, 28 Jul 2024 10:18:33 +0200 Subject: feat: add pinentry module and paper key module --- include/GFModuleCommonUtils.hpp | 117 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) (limited to 'include/GFModuleCommonUtils.hpp') diff --git a/include/GFModuleCommonUtils.hpp b/include/GFModuleCommonUtils.hpp index 392aaef..d65b356 100644 --- a/include/GFModuleCommonUtils.hpp +++ b/include/GFModuleCommonUtils.hpp @@ -29,6 +29,7 @@ #pragma once #include +#include #include #include @@ -113,6 +114,71 @@ inline auto QMapToGFModuleMetaDataList(const QMap& map) return head; } +inline auto ConvertEventParamsToMap(GFModuleEventParam* params) + -> QMap { + QMap param_map; + GFModuleEventParam* current = params; + GFModuleEventParam* last; + + while (current != nullptr) { + param_map[current->name] = UDUP(current->value); + + last = current; + current = current->next; + GFFreeMemory(last); + } + + return param_map; +} + +inline auto ConvertMapToParams(const QMap& param_map) + -> GFModuleEventParam* { + GFModuleEventParam* head = nullptr; + GFModuleEventParam* prev = nullptr; + + for (const auto& [key, value] : param_map.asKeyValueRange()) { + auto* param = static_cast( + GFAllocateMemory(sizeof(GFModuleEventParam))); + + param->name = DUP(key.toUtf8()); + param->value = DUP(value.toUtf8()); + param->next = nullptr; + + if (prev == nullptr) { + head = param; + } else { + prev->next = param; + } + prev = param; + } + + return head; +} + +inline auto ConvertEventToMap(GFModuleEvent* event) -> QMap { + QMap event_map; + + event_map["event_id"] = UDUP(event->id); + event_map["trigger_id"] = UDUP(event->trigger_id); + event_map.insert(ConvertEventParamsToMap(event->params)); + + GFFreeMemory(event); + + return event_map; +} + +inline auto ConvertMapToEvent(QMap event_map) + -> GFModuleEvent* { + auto* event = + static_cast(GFAllocateMemory(sizeof(GFModuleEvent))); + + event->id = DUP(event_map["event_id"].toUtf8()); + event->trigger_id = DUP(event_map["trigger_id"].toUtf8()); + event->params = nullptr; + + return event; +} + inline auto AllocBufferAndCopy(const QByteArray& b) -> char* { auto* p = static_cast(GFAllocateMemory(sizeof(char) * b.size())); memcpy(p, b.constData(), b.size()); @@ -136,6 +202,55 @@ auto SecureCreateSharedObject(Args&&... args) -> std::shared_ptr { } } +template +class PointerConverter { + public: + explicit PointerConverter(void* ptr) : ptr_(ptr) {} + + auto AsType() const -> T* { return static_cast(ptr_); } + + private: + void* ptr_; +}; + +/** + * @brief + * + * @tparam T + * @return T* + */ +template +auto SecureMallocAsType(std::size_t size) -> T* { + return PointerConverter(GFAllocateMemory(size)).AsType(); +} + +/** + * @brief + * + * @return void* + */ +template +auto SecureReallocAsType(T* ptr, std::size_t size) -> T* { + return PointerConverter(GFReallocateMemory(ptr, size)).AsType(); +} + +template +auto SecureCreateQSharedObject(Args&&... args) -> QSharedPointer { + void* mem = GFAllocateMemory(sizeof(T)); + if (!mem) throw std::bad_alloc(); + + try { + T* obj = new (mem) T(std::forward(args)...); + return QSharedPointer(obj, [](T* ptr) { + ptr->~T(); + GFFreeMemory(ptr); + }); + } catch (...) { + GFFreeMemory(mem); + throw; + } +} + inline auto CharArrayToQStringList(char** pl_components, int size) -> QStringList { QStringList list; @@ -145,4 +260,4 @@ inline auto CharArrayToQStringList(char** pl_components, } GFFreeMemory(pl_components); return list; -} \ No newline at end of file +} -- cgit v1.2.3