File indexing completed on 2025-03-09 04:54:33
0001 /* 0002 SPDX-FileCopyrightText: 2016-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 #include "webengineparthtmlwriter.h" 0007 #include "webengineembedpart.h" 0008 0009 #include "messageviewer/messageviewerutil.h" 0010 #include "messageviewer_debug.h" 0011 #include "viewer/webengine/mailwebengineview.h" 0012 #include <QUrl> 0013 0014 #include <QDir> 0015 #include <QTemporaryFile> 0016 #include <cassert> 0017 0018 using namespace MessageViewer; 0019 0020 WebEnginePartHtmlWriter::WebEnginePartHtmlWriter(MailWebEngineView *view, QObject *parent) 0021 : QObject(parent) 0022 , mHtmlView(view) 0023 { 0024 assert(view); 0025 } 0026 0027 WebEnginePartHtmlWriter::~WebEnginePartHtmlWriter() 0028 { 0029 delete mTempFile; 0030 } 0031 0032 void WebEnginePartHtmlWriter::begin() 0033 { 0034 if (mState != Ended) { 0035 qCWarning(MESSAGEVIEWER_LOG) << "begin() called on non-ended session!"; 0036 reset(); 0037 } 0038 0039 delete mTempFile; 0040 mTempFile = nullptr; 0041 0042 BufferedHtmlWriter::begin(); 0043 MessageViewer::WebEngineEmbedPart::self()->clear(); 0044 mState = Begun; 0045 } 0046 0047 void WebEnginePartHtmlWriter::end() 0048 { 0049 BufferedHtmlWriter::end(); 0050 if (mState != Begun) { 0051 qCWarning(MESSAGEVIEWER_LOG) << "Called on non-begun or queued session!"; 0052 } 0053 if (!mExtraHead.isEmpty()) { 0054 insertExtraHead(); 0055 mExtraHead.clear(); 0056 } 0057 if (!mStyleBody.isEmpty()) { 0058 insertBodyStyle(); 0059 mStyleBody.clear(); 0060 } 0061 if (data().size() > 2000000) { 0062 // qDebug() << " load big message "; 0063 mTempFile = new QTemporaryFile(QDir::tempPath() + QLatin1StringView("/messageviewer_XXXXXX") + QLatin1StringView(".html")); 0064 mTempFile->open(); 0065 QTextStream stream(mTempFile); 0066 stream.setEncoding(Util::htmlEncoding(data(), codec())); 0067 stream << data(); 0068 // Bug 387061 0069 mHtmlView->load(QUrl::fromLocalFile(mTempFile->fileName())); 0070 // qDebug() << " tempFile.fileName()" << mTempFile->fileName(); 0071 mHtmlView->show(); 0072 mTempFile->close(); 0073 } else { 0074 mHtmlView->setContent(data(), QStringLiteral("text/html;charset=UTF-8"), QUrl(QStringLiteral("file:///"))); 0075 mHtmlView->show(); 0076 } 0077 clear(); 0078 0079 mHtmlView->setUpdatesEnabled(true); 0080 mHtmlView->update(); 0081 mState = Ended; 0082 Q_EMIT finished(); 0083 } 0084 0085 void WebEnginePartHtmlWriter::reset() 0086 { 0087 BufferedHtmlWriter::reset(); 0088 if (mState != Ended) { 0089 mState = Begun; // don't run into end()'s warning 0090 end(); 0091 mState = Ended; 0092 } 0093 } 0094 0095 void WebEnginePartHtmlWriter::embedPart(const QByteArray &contentId, const QString &contentURL) 0096 { 0097 MessageViewer::WebEngineEmbedPart::self()->addEmbedPart(contentId, contentURL); 0098 } 0099 0100 void WebEnginePartHtmlWriter::insertExtraHead() 0101 { 0102 const auto headTag(QByteArrayLiteral("<head>")); 0103 const int index = m_data.indexOf(headTag); 0104 if (index != -1) { 0105 m_data.insert(index + headTag.length(), mExtraHead.toUtf8()); 0106 } 0107 } 0108 0109 void WebEnginePartHtmlWriter::insertBodyStyle() 0110 { 0111 const auto bodyTag(QByteArrayLiteral("<body>")); 0112 const int index = m_data.indexOf(bodyTag); 0113 if (index != -1) { 0114 m_data.insert(index + bodyTag.length() - 1, mStyleBody.toUtf8()); 0115 } 0116 } 0117 0118 void WebEnginePartHtmlWriter::setStyleBody(const QString &styleBody) 0119 { 0120 mStyleBody = styleBody; 0121 } 0122 0123 void WebEnginePartHtmlWriter::setExtraHead(const QString &str) 0124 { 0125 mExtraHead = str; 0126 } 0127 0128 #include "moc_webengineparthtmlwriter.cpp"