File indexing completed on 2024-05-12 05:13:45

0001 /*
0002     SPDX-FileCopyrightText: 2023 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include "mocknetworkaccessmanager.h"
0007 
0008 #include <cstring>
0009 
0010 class MockNetworkReply : public QNetworkReply
0011 {
0012     Q_OBJECT
0013 public:
0014     explicit MockNetworkReply(const QNetworkAccessManager::Operation op, const QNetworkRequest &request,  const MockNetworkAccessManager::Reply &replyData, QObject *parent);
0015 
0016     qint64 bytesAvailable() const override;
0017     void abort() override;
0018 
0019 protected:
0020     qint64 readData(char *data, qint64 maxSize) override;
0021 
0022 private:
0023     QByteArray m_data;
0024     qint64 m_offset = 0;
0025 };
0026 
0027 MockNetworkReply::MockNetworkReply(const QNetworkAccessManager::Operation op, const QNetworkRequest &request, const MockNetworkAccessManager::Reply &replyData, QObject *parent)
0028     : QNetworkReply(parent)
0029     , m_data(replyData.data)
0030 {
0031     setRequest(request);
0032     setOpenMode(QIODevice::ReadOnly);
0033     setUrl(request.url());
0034     setOperation(op);
0035     setError(NoError, QString());
0036 
0037     if (!request.sslConfiguration().isNull()) {
0038         setSslConfiguration(request.sslConfiguration());
0039     }
0040 
0041     setError(replyData.error, replyData.errorMessage);
0042     setAttribute(QNetworkRequest::HttpStatusCodeAttribute, replyData.statusCode);
0043     setFinished(true);
0044     QMetaObject::invokeMethod(this, &QNetworkReply::finished, Qt::QueuedConnection);
0045 }
0046 
0047 qint64 MockNetworkReply::bytesAvailable() const
0048 {
0049     return QNetworkReply::bytesAvailable() + m_data.size() - m_offset;
0050 }
0051 
0052 void MockNetworkReply::abort()
0053 {
0054 }
0055 
0056 qint64 MockNetworkReply::readData(char *data, qint64 maxSize)
0057 {
0058     const qint64 length = std::min(qint64(m_data.length() - m_offset), maxSize);
0059 
0060     if (length <= 0) {
0061         return 0;
0062     }
0063 
0064     std::memcpy(data, m_data.constData() + m_offset, length);
0065     m_offset += length;
0066     return length;
0067 }
0068 
0069 QNetworkReply* MockNetworkAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &originalReq, QIODevice *outgoingData)
0070 {
0071     Request r{op, originalReq, outgoingData ? outgoingData->readAll() : QByteArray()};
0072     requests.push_back(std::move(r));
0073 
0074     Reply replyData;
0075     if (!replies.empty()) {
0076         replyData = replies.front();
0077         replies.pop();
0078     }
0079     return new MockNetworkReply(op, originalReq, replyData, this);
0080 }
0081 
0082 #include "mocknetworkaccessmanager.moc"
0083 
0084 #include "moc_mocknetworkaccessmanager.cpp"