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"