File indexing completed on 2024-05-19 12:25:02
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"