// SPDX-FileCopyrightText: 2022 Linus Jahn // // SPDX-License-Identifier: LGPL-2.1-or-later #ifndef OMEMOLIBWRAPPERS_H #define OMEMOLIBWRAPPERS_H #include #include #include #include #include // Wraps various types of the OMEMO library. template class OmemoLibPtr { T *m_ptr = nullptr; public: OmemoLibPtr(T *ptr = nullptr) : m_ptr(ptr) { } OmemoLibPtr(const OmemoLibPtr &) = delete; ~OmemoLibPtr() { if (m_ptr) { destruct(m_ptr); } } OmemoLibPtr &operator=(const OmemoLibPtr &) = delete; OmemoLibPtr &operator=(T *ptr) { reset(ptr); return *this; } operator bool() const { return m_ptr != nullptr; } T *operator->() const { return m_ptr; } T *get() const { return m_ptr; } T **ptrRef() { return &m_ptr; } void reset(T *ptr) { if (m_ptr) { destruct(m_ptr); } m_ptr = ptr; } }; template void omemoLibUnrefHelper(T *ptr) { SIGNAL_UNREF(ptr); } template using RefCountedPtr = OmemoLibPtr>; static QByteArray omemoLibBufferToByteArray(signal_buffer *buffer) { return QByteArray(reinterpret_cast(signal_buffer_data(buffer)), signal_buffer_len(buffer)); } static signal_buffer *omemoLibBufferFromByteArray(const QByteArray &bytes) { return signal_buffer_create(reinterpret_cast(bytes.constData()), bytes.size()); } template class BufferPtrBase : public OmemoLibPtr { public: BufferPtrBase(signal_buffer *ptr) : OmemoLibPtr(ptr) { } QByteArray toByteArray() const { return omemoLibBufferToByteArray(this->get()); } }; class BufferSecurePtr : public BufferPtrBase { public: BufferSecurePtr() : BufferPtrBase(nullptr) { } BufferSecurePtr(signal_buffer *ptr) : BufferPtrBase(ptr) { } static BufferSecurePtr fromByteArray(const QByteArray &bytes) { return { omemoLibBufferFromByteArray(bytes) }; } }; class BufferPtr : public BufferPtrBase { public: BufferPtr() : BufferPtrBase(nullptr) { } BufferPtr(signal_buffer *ptr) : BufferPtrBase(ptr) { } static BufferPtr fromByteArray(const QByteArray &bytes) { return { omemoLibBufferFromByteArray(bytes) }; } }; using KeyListNodePtr = OmemoLibPtr; using SessionCipherPtr = OmemoLibPtr; using SessionBuilderPtr = OmemoLibPtr; using OmemoContextPtr = OmemoLibPtr; using StoreContextPtr = OmemoLibPtr; #endif // OMEMOLIBWRAPPERS_H