summaryrefslogtreecommitdiffstats
path: root/src/grpc/qgrpcoperation.h
blob: 0314d22f3f70283c9ae98b1b9a8449622c1cbf33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Copyright (C) 2022 The Qt Company Ltd.
// Copyright (C) 2019 Alexey Edelev <semlanik@gmail.com>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#ifndef QGRPCOPERATION_H
#define QGRPCOPERATION_H

#include <QtGrpc/qgrpcstatus.h>
#include <QtGrpc/qtgrpcglobal.h>
#include <QtGrpc/qtgrpcnamespace.h>

#include <QtProtobuf/qtprotobuftypes.h>

#include <QtCore/qhash.h>
#include <QtCore/qobject.h>
#include <QtCore/qstringfwd.h>
#include <QtCore/qtdeprecationdefinitions.h>

#include <optional>

QT_BEGIN_NAMESPACE

class QGrpcOperationContext;
class QGrpcOperationPrivate;
class QAbstractGrpcChannel;
class QGrpcCallOptions;

class Q_GRPC_EXPORT QGrpcOperation : public QObject
{
    Q_OBJECT
public:
    ~QGrpcOperation() override;

    template <typename T, QtProtobuf::if_protobuf_message<T> = true>
    std::optional<T> read() const
    {
        std::optional<T> r(std::in_place);
        if (!read(&*r))
            r.reset();
        return r;
    }
    bool read(QProtobufMessage *message) const;

#if QT_DEPRECATED_SINCE(6, 13)
    QT_DEPRECATED_VERSION_X_6_13("Use serverInitialMetadata()")
    [[nodiscard]] const QHash<QByteArray, QByteArray> &metadata() const & noexcept;
    void metadata() const && = delete;
#endif

    [[nodiscard]] const QMultiHash<QByteArray, QByteArray> &
    serverInitialMetadata() const & noexcept;
    void serverInitialMetadata() const && = delete;
    [[nodiscard]] const QMultiHash<QByteArray, QByteArray> &
    serverTrailingMetadata() const & noexcept;
    void serverTrailingMetadata() const && = delete;

    [[nodiscard]] QLatin1StringView method() const noexcept;

    [[nodiscard]] bool isFinished() const noexcept;

    [[nodiscard]] QMetaType responseMetaType() const;

Q_SIGNALS:
    void finished(const QGrpcStatus &status);
    void serverInitialMetadataReceived();

public Q_SLOTS:
    void cancel();

protected:
    explicit QGrpcOperation(QtGrpc::RpcDescriptor descriptor, const QGrpcCallOptions &options,
                            const std::weak_ptr<QAbstractGrpcChannel> &channel);

    [[nodiscard]] const QGrpcOperationContext &context() const & noexcept;
    [[nodiscard]] QGrpcOperationContext &context() & noexcept
    {
        return const_cast<QGrpcOperationContext &>(std::as_const(*this).context());
    }
    void context() const && = delete;
    void writeMessage(const QProtobufMessage &message);
    void writesDone();

private:
    void onMessageReceived(const QByteArray &data);
    void onFinished(const QGrpcStatus &status);

private:
    Q_DISABLE_COPY_MOVE(QGrpcOperation)
    Q_DECLARE_PRIVATE(QGrpcOperation)
    friend class QGrpcOperationContext;

public:
    bool event(QEvent *event) override;
};

QT_END_NAMESPACE

#endif // QGRPCOPERATION_H