File indexing completed on 2024-05-05 04:40:50

0001 /*
0002     SPDX-FileCopyrightText: 2009 Aleix Pol <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "qthelpnetwork.h"
0008 
0009 HelpNetworkAccessManager::HelpNetworkAccessManager(QHelpEngineCore* engine, QObject* parent)
0010     : QNetworkAccessManager(parent), m_helpEngine(engine)
0011 {}
0012 
0013 HelpNetworkAccessManager::~HelpNetworkAccessManager()
0014 {
0015 }
0016 
0017 HelpNetworkReply::HelpNetworkReply(const QNetworkRequest &request, const QByteArray &fileData, const QString &mimeType)
0018     : data(fileData), origLen(fileData.length())
0019 {
0020     setRequest(request);
0021     setOpenMode(QIODevice::ReadOnly);
0022 
0023     // Instantly finish processing if data is empty. Without this code the loadFinished()
0024     // signal will never be emitted by the corresponding QWebView.
0025     if (!origLen) {
0026         qCDebug(QTHELP) << "Empty data for" << request.url().toDisplayString();
0027         QTimer::singleShot(0, this, &QNetworkReply::finished);
0028     }
0029 
0030 #ifdef USE_QTWEBKIT
0031     // Fix broken CSS images (tested on Qt 5.5.1, 5.7.0, 5.9.7 and 5.14.1)
0032     if (request.url().fileName() == QLatin1String("offline.css")) {
0033         data.replace("../images", "images");
0034     }
0035 #endif
0036 
0037     // Fix flickering when loading, the page has the offline-simple.css stylesheet which is replaced
0038     // later by offline.css  by javascript which causes flickering so we force the full stylesheet
0039     // from the beginning
0040     if (request.url().fileName().endsWith(QLatin1String(".html"))) {
0041         data.replace("offline-simple.css", "offline.css");
0042     }
0043 
0044     setHeader(QNetworkRequest::ContentTypeHeader, mimeType);
0045     setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(origLen));
0046     QTimer::singleShot(0, this, &QNetworkReply::metaDataChanged);
0047     QTimer::singleShot(0, this, &QIODevice::readyRead);
0048 }
0049 
0050 qint64 HelpNetworkReply::readData(char *buffer, qint64 maxlen)
0051 {
0052     qint64 len = qMin(qint64(data.length()), maxlen);
0053     if (len) {
0054         memcpy(buffer, data.constData(), len);
0055         data.remove(0, len);
0056     }
0057     if (!data.length())
0058         QTimer::singleShot(0, this, &QNetworkReply::finished);
0059     return len;
0060 }
0061 
0062 QNetworkReply *HelpNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
0063 {
0064     QString scheme = request.url().scheme();
0065     if (scheme == QLatin1String("qthelp") || scheme == QLatin1String("about")) {
0066         QString mimeType = QMimeDatabase().mimeTypeForUrl(request.url()).name();
0067         if (mimeType == QLatin1String("application/x-extension-html")) {
0068             // see also: https://bugs.kde.org/show_bug.cgi?id=288277
0069             // firefox seems to add this bullshit mimetype above
0070             // which breaks displaying of qthelp documentation :(
0071             mimeType = QStringLiteral("text/html");
0072         }
0073         return new HelpNetworkReply(request, m_helpEngine->fileData(request.url()), mimeType);
0074     }
0075     return QNetworkAccessManager::createRequest(op, request, outgoingData);
0076 }
0077 
0078 #include "moc_qthelpnetwork.cpp"