1 | // Copyright (C) 2023 The Qt Company Ltd. |
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | |
4 | #ifndef QRESTACCESSMANAGER_H |
5 | #define QRESTACCESSMANAGER_H |
6 | |
7 | #if 0 |
8 | #pragma qt_class(QRestAccessManager) |
9 | #endif |
10 | |
11 | #include <QtNetwork/qnetworkaccessmanager.h> |
12 | |
13 | QT_BEGIN_NAMESPACE |
14 | |
15 | class QDebug; |
16 | class QRestReply; |
17 | |
18 | #define QREST_METHOD_WITH_DATA(METHOD, DATA) \ |
19 | public: \ |
20 | template <typename Functor, if_compatible_callback<Functor> = true> \ |
21 | QNetworkReply *METHOD(const QNetworkRequest &request, DATA data, \ |
22 | const ContextTypeForFunctor<Functor> *context, \ |
23 | Functor &&callback) \ |
24 | { \ |
25 | return METHOD##WithDataImpl(request, data, context, \ |
26 | QtPrivate::makeCallableObject<CallbackPrototype>(std::forward<Functor>(callback))); \ |
27 | } \ |
28 | QNetworkReply *METHOD(const QNetworkRequest &request, DATA data) \ |
29 | { \ |
30 | return METHOD##WithDataImpl(request, data, nullptr, nullptr); \ |
31 | } \ |
32 | private: \ |
33 | QNetworkReply *METHOD##WithDataImpl(const QNetworkRequest &request, DATA data, \ |
34 | const QObject *context, QtPrivate::QSlotObjectBase *slot); \ |
35 | /* end */ |
36 | |
37 | #define QREST_METHOD_NO_DATA(METHOD) \ |
38 | public: \ |
39 | template <typename Functor, if_compatible_callback<Functor> = true> \ |
40 | QNetworkReply *METHOD(const QNetworkRequest &request, \ |
41 | const ContextTypeForFunctor<Functor> *context, \ |
42 | Functor &&callback) \ |
43 | { \ |
44 | return METHOD##NoDataImpl(request, context, \ |
45 | QtPrivate::makeCallableObject<CallbackPrototype>(std::forward<Functor>(callback))); \ |
46 | } \ |
47 | QNetworkReply *METHOD(const QNetworkRequest &request) \ |
48 | { \ |
49 | return METHOD##NoDataImpl(request, nullptr, nullptr); \ |
50 | } \ |
51 | private: \ |
52 | QNetworkReply *METHOD##NoDataImpl(const QNetworkRequest &request, \ |
53 | const QObject *context, QtPrivate::QSlotObjectBase *slot); \ |
54 | /* end */ |
55 | |
56 | #define QREST_METHOD_CUSTOM_WITH_DATA(DATA) \ |
57 | public: \ |
58 | template <typename Functor, if_compatible_callback<Functor> = true> \ |
59 | QNetworkReply *sendCustomRequest(const QNetworkRequest& request, const QByteArray &method, DATA data, \ |
60 | const ContextTypeForFunctor<Functor> *context, \ |
61 | Functor &&callback) \ |
62 | { \ |
63 | return customWithDataImpl(request, method, data, context, \ |
64 | QtPrivate::makeCallableObject<CallbackPrototype>(std::forward<Functor>(callback))); \ |
65 | } \ |
66 | QNetworkReply *sendCustomRequest(const QNetworkRequest& request, const QByteArray &method, DATA data) \ |
67 | { \ |
68 | return customWithDataImpl(request, method, data, nullptr, nullptr); \ |
69 | } \ |
70 | private: \ |
71 | QNetworkReply *customWithDataImpl(const QNetworkRequest& request, const QByteArray &method, \ |
72 | DATA data, const QObject* context, \ |
73 | QtPrivate::QSlotObjectBase *slot); \ |
74 | /* end */ |
75 | |
76 | class QRestAccessManagerPrivate; |
77 | class Q_NETWORK_EXPORT QRestAccessManager : public QObject |
78 | { |
79 | Q_OBJECT |
80 | using CallbackPrototype = void(*)(QRestReply&); |
81 | template <typename Functor> |
82 | using ContextTypeForFunctor = typename QtPrivate::ContextTypeForFunctor<Functor>::ContextType; |
83 | template <typename Functor> |
84 | using if_compatible_callback = std::enable_if_t< |
85 | QtPrivate::AreFunctionsCompatible<CallbackPrototype, Functor>::value, bool>; |
86 | public: |
87 | explicit QRestAccessManager(QNetworkAccessManager *manager, QObject *parent = nullptr); |
88 | ~QRestAccessManager() override; |
89 | |
90 | QNetworkAccessManager *networkAccessManager() const; |
91 | |
92 | QREST_METHOD_NO_DATA(deleteResource) |
93 | QREST_METHOD_NO_DATA() |
94 | QREST_METHOD_NO_DATA(get) |
95 | QREST_METHOD_WITH_DATA(get, const QByteArray &) |
96 | QREST_METHOD_WITH_DATA(get, const QJsonDocument &) |
97 | QREST_METHOD_WITH_DATA(get, QIODevice *) |
98 | QREST_METHOD_WITH_DATA(post, const QJsonDocument &) |
99 | QREST_METHOD_WITH_DATA(post, const QVariantMap &) |
100 | QREST_METHOD_WITH_DATA(post, const QByteArray &) |
101 | QREST_METHOD_WITH_DATA(post, QHttpMultiPart *) |
102 | QREST_METHOD_WITH_DATA(post, QIODevice *) |
103 | QREST_METHOD_WITH_DATA(put, const QJsonDocument &) |
104 | QREST_METHOD_WITH_DATA(put, const QVariantMap &) |
105 | QREST_METHOD_WITH_DATA(put, const QByteArray &) |
106 | QREST_METHOD_WITH_DATA(put, QHttpMultiPart *) |
107 | QREST_METHOD_WITH_DATA(put, QIODevice *) |
108 | QREST_METHOD_WITH_DATA(patch, const QJsonDocument &) |
109 | QREST_METHOD_WITH_DATA(patch, const QVariantMap &) |
110 | QREST_METHOD_WITH_DATA(patch, const QByteArray &) |
111 | QREST_METHOD_WITH_DATA(patch, QIODevice *) |
112 | QREST_METHOD_CUSTOM_WITH_DATA(const QByteArray &) |
113 | QREST_METHOD_CUSTOM_WITH_DATA(QIODevice *) |
114 | QREST_METHOD_CUSTOM_WITH_DATA(QHttpMultiPart *) |
115 | |
116 | private: |
117 | Q_DECLARE_PRIVATE(QRestAccessManager) |
118 | Q_DISABLE_COPY(QRestAccessManager) |
119 | }; |
120 | |
121 | #undef QREST_METHOD_NO_DATA |
122 | #undef QREST_METHOD_WITH_DATA |
123 | #undef QREST_METHOD_CUSTOM_WITH_DATA |
124 | |
125 | QT_END_NAMESPACE |
126 | |
127 | #endif |
128 | |