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

source code of qtbase/src/network/access/qrestaccessmanager.h