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"