diff options
Diffstat (limited to 'src/base/QXmppTask.cpp')
| -rw-r--r-- | src/base/QXmppTask.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/base/QXmppTask.cpp b/src/base/QXmppTask.cpp new file mode 100644 index 00000000..c17a6e4f --- /dev/null +++ b/src/base/QXmppTask.cpp @@ -0,0 +1,85 @@ +// SPDX-FileCopyrightText: 2023 Linus Jahn <lnj@kaidan.im> +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "QXmppTask.h" + +#include <QDebug> + +namespace QXmpp::Private { + +struct TaskData +{ + QPointer<QObject> context; + std::function<void(TaskPrivate &, void *)> continuation; + void *result = nullptr; + void (*freeResult)(void *); + bool finished = false; + + ~TaskData() + { + if (freeResult) { + freeResult(result); + } + } +}; + +} // namespace QXmpp::Private + +QXmpp::Private::TaskPrivate::TaskPrivate(void (*freeResult)(void *)) + : d(std::make_shared<QXmpp::Private::TaskData>()) +{ + d->freeResult = freeResult; +} + +QXmpp::Private::TaskPrivate::~TaskPrivate() +{ +} + +bool QXmpp::Private::TaskPrivate::isFinished() const +{ + return d->finished; +} + +void QXmpp::Private::TaskPrivate::setFinished(bool finished) +{ + d->finished = finished; +} + +bool QXmpp::Private::TaskPrivate::isContextAlive() +{ + return !d->context.isNull(); +} + +void QXmpp::Private::TaskPrivate::setContext(QObject *obj) +{ + d->context = obj; +} + +void *QXmpp::Private::TaskPrivate::result() const +{ + return d->result; +} + +void QXmpp::Private::TaskPrivate::setResult(void *result) +{ + if (d->freeResult) { + d->freeResult(d->result); + } + d->result = result; +} + +const std::function<void(QXmpp::Private::TaskPrivate &, void *)> QXmpp::Private::TaskPrivate::continuation() const +{ + return d->continuation; +} + +void QXmpp::Private::TaskPrivate::setContinuation(std::function<void(TaskPrivate &, void *)> &&continuation) +{ + d->continuation = continuation; +} + +void QXmpp::Private::TaskPrivate::invokeContinuation(void *result) +{ + d->continuation(*this, result); +} |
