1 | // Copyright (C) 2024 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 QFORMDATABUILDER_H |
5 | #define QFORMDATABUILDER_H |
6 | |
7 | #include <QtNetwork/qtnetworkglobal.h> |
8 | #include <QtNetwork/qhttpheaders.h> |
9 | #include <QtNetwork/qhttpmultipart.h> |
10 | |
11 | #include <QtCore/qbytearray.h> |
12 | #include <QtCore/qflags.h> |
13 | #include <QtCore/qiodevice.h> |
14 | #include <QtCore/qstring.h> |
15 | |
16 | #include <memory> |
17 | #include <variant> |
18 | |
19 | #ifndef Q_OS_WASM |
20 | QT_REQUIRE_CONFIG(http); |
21 | #endif |
22 | |
23 | QT_BEGIN_NAMESPACE |
24 | |
25 | class QHttpPartPrivate; |
26 | class QHttpMultiPart; |
27 | class QDebug; |
28 | |
29 | class QFormDataBuilderPrivate; |
30 | class QFormDataPartBuilderPrivate; |
31 | |
32 | class QFormDataPartBuilder |
33 | { |
34 | QFormDataPartBuilder(QFormDataBuilderPrivate *qfdb, qsizetype idx) : d(qfdb), m_index(idx) {} |
35 | public: |
36 | void swap(QFormDataPartBuilder &other) noexcept |
37 | { |
38 | qt_ptr_swap(lhs&: d, rhs&: other.d); |
39 | std::swap(a&: m_index, b&: other.m_index); |
40 | } |
41 | |
42 | QFormDataPartBuilder() = default; |
43 | // Rule of zero applies |
44 | |
45 | Q_WEAK_OVERLOAD QFormDataPartBuilder setBody(const QByteArray &data, |
46 | QAnyStringView fileName = {}, |
47 | QAnyStringView mimeType = {}) |
48 | { return setBodyHelper(data, fileName, mimeType); } |
49 | |
50 | Q_NETWORK_EXPORT QFormDataPartBuilder setBody(QByteArrayView data, |
51 | QAnyStringView fileName = {}, |
52 | QAnyStringView mimeType = {}); |
53 | Q_NETWORK_EXPORT QFormDataPartBuilder setBodyDevice(QIODevice *body, |
54 | QAnyStringView fileName = {}, |
55 | QAnyStringView mimeType = {}); |
56 | Q_NETWORK_EXPORT QFormDataPartBuilder (const QHttpHeaders &); |
57 | private: |
58 | Q_NETWORK_EXPORT QFormDataPartBuilder setBodyHelper(const QByteArray &data, |
59 | QAnyStringView fileName, |
60 | QAnyStringView mimeType); |
61 | |
62 | QFormDataPartBuilderPrivate* d_func(); |
63 | const QFormDataPartBuilderPrivate* d_func() const; |
64 | |
65 | QFormDataBuilderPrivate *d; |
66 | size_t m_index; |
67 | |
68 | friend class QFormDataBuilder; |
69 | }; |
70 | |
71 | Q_DECLARE_SHARED(QFormDataPartBuilder) |
72 | |
73 | class QFormDataBuilder |
74 | { |
75 | public: |
76 | enum class Option { |
77 | Default = 0x00, |
78 | OmitRfc8187EncodedFilename = 0x01, |
79 | UseRfc7578PercentEncodedFilename = 0x02, |
80 | PreferLatin1EncodedFilename = 0x04, |
81 | |
82 | StrictRfc7578 = OmitRfc8187EncodedFilename | UseRfc7578PercentEncodedFilename, |
83 | }; |
84 | Q_DECLARE_FLAGS(Options, Option) |
85 | |
86 | Q_NETWORK_EXPORT QFormDataBuilder(); |
87 | |
88 | QFormDataBuilder(QFormDataBuilder &&other) noexcept : d_ptr(std::exchange(obj&: other.d_ptr, new_val: nullptr)) {} |
89 | |
90 | QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QFormDataBuilder) |
91 | void swap(QFormDataBuilder &other) noexcept |
92 | { |
93 | qt_ptr_swap(lhs&: d_ptr, rhs&: other.d_ptr); |
94 | } |
95 | |
96 | Q_NETWORK_EXPORT ~QFormDataBuilder(); |
97 | Q_NETWORK_EXPORT QFormDataPartBuilder part(QAnyStringView name); |
98 | Q_NETWORK_EXPORT std::unique_ptr<QHttpMultiPart> buildMultiPart(Options options = {}); |
99 | private: |
100 | QFormDataBuilderPrivate *d_ptr; |
101 | |
102 | Q_DECLARE_PRIVATE(QFormDataBuilder) |
103 | Q_DISABLE_COPY(QFormDataBuilder) |
104 | }; |
105 | Q_DECLARE_OPERATORS_FOR_FLAGS(QFormDataBuilder::Options) |
106 | |
107 | Q_DECLARE_SHARED(QFormDataBuilder) |
108 | |
109 | QT_END_NAMESPACE |
110 | |
111 | #endif // QFORMDATABUILDER_H |
112 | |