Messagelib

webengineparthtmlwriter.cpp
1 /*
2  SPDX-FileCopyrightText: 2016-2023 Laurent Montel <[email protected]>
3 
4  SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 #include "webengineparthtmlwriter.h"
7 #include "webengineembedpart.h"
8 
9 #include "messageviewer/messageviewerutil.h"
10 #include "messageviewer_debug.h"
11 #include "viewer/webengine/mailwebengineview.h"
12 #include <QUrl>
13 
14 #include <QDir>
15 #include <QTemporaryFile>
16 #include <cassert>
17 
18 using namespace MessageViewer;
19 
20 WebEnginePartHtmlWriter::WebEnginePartHtmlWriter(MailWebEngineView *view, QObject *parent)
21  : QObject(parent)
22  , mHtmlView(view)
23 {
24  assert(view);
25 }
26 
27 WebEnginePartHtmlWriter::~WebEnginePartHtmlWriter()
28 {
29  delete mTempFile;
30 }
31 
32 void WebEnginePartHtmlWriter::begin()
33 {
34  if (mState != Ended) {
35  qCWarning(MESSAGEVIEWER_LOG) << "begin() called on non-ended session!";
36  reset();
37  }
38 
39  delete mTempFile;
40  mTempFile = nullptr;
41 
42  BufferedHtmlWriter::begin();
43  MessageViewer::WebEngineEmbedPart::self()->clear();
44  mState = Begun;
45 }
46 
47 void WebEnginePartHtmlWriter::end()
48 {
49  BufferedHtmlWriter::end();
50  if (mState != Begun) {
51  qCWarning(MESSAGEVIEWER_LOG) << "Called on non-begun or queued session!";
52  }
53  if (!mExtraHead.isEmpty()) {
54  insertExtraHead();
55  mExtraHead.clear();
56  }
57  if (!mStyleBody.isEmpty()) {
58  insertBodyStyle();
59  mStyleBody.clear();
60  }
61  if (data().size() > 2000000) {
62  // qDebug() << " load big message ";
63  mTempFile = new QTemporaryFile(QDir::tempPath() + QLatin1String("/messageviewer_XXXXXX") + QLatin1String(".html"));
64  mTempFile->open();
65  QTextStream stream(mTempFile);
66 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
67  const QByteArray codecValue = Util::htmlCodec(data(), codec());
68  stream.setCodec(codecValue.constData());
69 #else
70  stream.setEncoding(Util::htmlEncoding(data(), codec()));
71 #endif
72  stream << data();
73  // Bug 387061
74  mHtmlView->load(QUrl::fromLocalFile(mTempFile->fileName()));
75  // qDebug() << " tempFile.fileName()" << mTempFile->fileName();
76  mHtmlView->show();
77  mTempFile->close();
78  } else {
79  mHtmlView->setContent(data(), QStringLiteral("text/html;charset=UTF-8"), QUrl(QStringLiteral("file:///")));
80  mHtmlView->show();
81  }
82  clear();
83 
84  mHtmlView->setUpdatesEnabled(true);
85  mHtmlView->update();
86  mState = Ended;
87  Q_EMIT finished();
88 }
89 
90 void WebEnginePartHtmlWriter::reset()
91 {
92  BufferedHtmlWriter::reset();
93  if (mState != Ended) {
94  mState = Begun; // don't run into end()'s warning
95  end();
96  mState = Ended;
97  }
98 }
99 
100 void WebEnginePartHtmlWriter::embedPart(const QByteArray &contentId, const QString &contentURL)
101 {
102  MessageViewer::WebEngineEmbedPart::self()->addEmbedPart(contentId, contentURL);
103 }
104 
105 void WebEnginePartHtmlWriter::insertExtraHead()
106 {
107  const auto headTag(QByteArrayLiteral("<head>"));
108  const int index = m_data.indexOf(headTag);
109  if (index != -1) {
110  m_data.insert(index + headTag.length(), mExtraHead.toUtf8());
111  }
112 }
113 
114 void WebEnginePartHtmlWriter::insertBodyStyle()
115 {
116  const auto bodyTag(QByteArrayLiteral("<body>"));
117  const int index = m_data.indexOf(bodyTag);
118  if (index != -1) {
119  m_data.insert(index + bodyTag.length() - 1, mStyleBody.toUtf8());
120  }
121 }
122 
123 void WebEnginePartHtmlWriter::setStyleBody(const QString &styleBody)
124 {
125  mStyleBody = styleBody;
126 }
127 
128 void WebEnginePartHtmlWriter::setExtraHead(const QString &str)
129 {
130  mExtraHead = str;
131 }
The MailWebEngineView class.
QString tempPath()
KGuiItem clear()
QUrl fromLocalFile(const QString &localFile)
const char * constData() const const
KGuiItem reset()
const QList< QKeySequence > & end()
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sun Mar 26 2023 04:08:12 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.