1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the QtNetwork module of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 21 ** packaging of this file. Please review the following information to 22 ** ensure the GNU Lesser General Public License version 3 requirements 23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 24 ** 25 ** GNU General Public License Usage 26 ** Alternatively, this file may be used under the terms of the GNU 27 ** General Public License version 2.0 or (at your option) the GNU General 28 ** Public license version 3 or any later version approved by the KDE Free 29 ** Qt Foundation. The licenses are as published by the Free Software 30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 31 ** included in the packaging of this file. Please review the following 32 ** information to ensure the GNU General Public License requirements will 33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and 34 ** https://www.gnu.org/licenses/gpl-3.0.html. 35 ** 36 ** $QT_END_LICENSE$ 37 ** 38 ****************************************************************************/ 39 40 #ifndef QHTTPMULTIPART_P_H 41 #define QHTTPMULTIPART_P_H 42 43 // 44 // W A R N I N G 45 // ------------- 46 // 47 // This file is not part of the Qt API. It exists for the convenience 48 // of the Network Access API. This header file may change from 49 // version to version without notice, or even be removed. 50 // 51 // We mean it. 52 // 53 54 #include <QtNetwork/private/qtnetworkglobal_p.h> 55 #include "QtCore/qshareddata.h" 56 #include "qnetworkrequest_p.h" // for deriving QHttpPartPrivate from QNetworkHeadersPrivate 57 #include "private/qobject_p.h" 58 59 QT_REQUIRE_CONFIG(http); 60 61 QT_BEGIN_NAMESPACE 62 63 64 class QHttpPartPrivate: public QSharedData, public QNetworkHeadersPrivate 65 { 66 public: QHttpPartPrivate()67 inline QHttpPartPrivate() : bodyDevice(nullptr), headerCreated(false), readPointer(0) 68 { 69 } ~QHttpPartPrivate()70 ~QHttpPartPrivate() 71 { 72 } 73 74 QHttpPartPrivate(const QHttpPartPrivate & other)75 QHttpPartPrivate(const QHttpPartPrivate &other) 76 : QSharedData(other), QNetworkHeadersPrivate(other), body(other.body), 77 header(other.header), headerCreated(other.headerCreated), readPointer(other.readPointer) 78 { 79 bodyDevice = other.bodyDevice; 80 } 81 82 inline bool operator==(const QHttpPartPrivate &other) const 83 { 84 return rawHeaders == other.rawHeaders && body == other.body && 85 bodyDevice == other.bodyDevice && readPointer == other.readPointer; 86 } 87 setBodyDevice(QIODevice * device)88 void setBodyDevice(QIODevice *device) { 89 bodyDevice = device; 90 readPointer = 0; 91 } setBody(const QByteArray & newBody)92 void setBody(const QByteArray &newBody) { 93 body = newBody; 94 readPointer = 0; 95 } 96 97 // QIODevice-style methods called by QHttpMultiPartIODevice (but this class is 98 // not a QIODevice): 99 qint64 bytesAvailable() const; 100 qint64 readData(char *data, qint64 maxSize); 101 qint64 size() const; 102 bool reset(); 103 104 QByteArray body; 105 QIODevice *bodyDevice; 106 107 private: 108 void checkHeaderCreated() const; 109 110 mutable QByteArray header; 111 mutable bool headerCreated; 112 qint64 readPointer; 113 }; 114 115 116 117 class QHttpMultiPartPrivate; 118 119 class Q_AUTOTEST_EXPORT QHttpMultiPartIODevice : public QIODevice 120 { 121 public: QHttpMultiPartIODevice(QHttpMultiPartPrivate * parentMultiPart)122 QHttpMultiPartIODevice(QHttpMultiPartPrivate *parentMultiPart) : 123 QIODevice(), multiPart(parentMultiPart), readPointer(0), deviceSize(-1) { 124 } 125 ~QHttpMultiPartIODevice()126 ~QHttpMultiPartIODevice() { 127 } 128 atEnd()129 virtual bool atEnd() const override { 130 return readPointer == size(); 131 } 132 bytesAvailable()133 virtual qint64 bytesAvailable() const override { 134 return size() - readPointer; 135 } 136 close()137 virtual void close() override { 138 readPointer = 0; 139 partOffsets.clear(); 140 deviceSize = -1; 141 QIODevice::close(); 142 } 143 bytesToWrite()144 virtual qint64 bytesToWrite() const override { 145 return 0; 146 } 147 148 virtual qint64 size() const override; 149 virtual bool isSequential() const override; 150 virtual bool reset() override; 151 virtual qint64 readData(char *data, qint64 maxSize) override; 152 virtual qint64 writeData(const char *data, qint64 maxSize) override; 153 154 QHttpMultiPartPrivate *multiPart; 155 qint64 readPointer; 156 mutable QList<qint64> partOffsets; 157 mutable qint64 deviceSize; 158 }; 159 160 161 162 class QHttpMultiPartPrivate: public QObjectPrivate 163 { 164 public: 165 166 QHttpMultiPartPrivate(); 167 ~QHttpMultiPartPrivate()168 ~QHttpMultiPartPrivate() 169 { 170 delete device; 171 } 172 173 QList<QHttpPart> parts; 174 QByteArray boundary; 175 QHttpMultiPart::ContentType contentType; 176 QHttpMultiPartIODevice *device; 177 178 }; 179 180 QT_END_NAMESPACE 181 182 183 #endif // QHTTPMULTIPART_P_H 184