Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
helpbrowsersupport.cpp
Go to the documentation of this file.
1
// Copyright (C) 2016 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4
#
include
"helpbrowsersupport.h"
5
#
include
"helpenginewrapper.h"
6
#
include
"helpviewer.h"
7
#
include
"tracer.h"
8
9
#
include
<
QtHelp
/
QHelpEngineCore
>
10
11
#
include
<
QtNetwork
/
QNetworkAccessManager
>
12
#
include
<
QtNetwork
/
QNetworkReply
>
13
#
include
<
QtNetwork
/
QNetworkRequest
>
14
15
#
include
<
QtCore
/
QTimer
>
16
#
include
<
QtCore
/
QCoreApplication
>
17
#
include
<
QtCore
/
QUrl
>
18
#
include
<
QtCore
/
QDebug
>
19
20
QT_BEGIN_NAMESPACE
21
22
// -- messages
23
24
static
const
char
g_htmlPage
[] =
"<html><head><meta http-equiv=\"content-type\" content=\"text/html; "
25
"charset=UTF-8\"><title>%1</title><style>body{padding: 3em 0em;background: #eeeeee;}"
26
"hr{color: lightgray;width: 100%;}img{float: left;opacity: .8;}#box{background: white;border: 1px solid "
27
"lightgray;width: 600px;padding: 60px;margin: auto;}h1{font-size: 130%;font-weight: bold;border-bottom: "
28
"1px solid lightgray;margin-left: 48px;}h2{font-size: 100%;font-weight: normal;border-bottom: 1px solid "
29
"lightgray;margin-left: 48px;}ul{font-size: 80%;padding-left: 48px;margin: 0;}#reloadButton{padding-left:"
30
"48px;}</style></head><body><div id=\"box\"><h1>%2</h1><h2>%3</h2><h2><b>%4</b></h2></div></body></html>"
;
31
32
QString
HelpBrowserSupport
::
msgError404
()
33
{
34
return
QCoreApplication::translate(
"HelpViewer"
,
"Error 404..."
);
35
}
36
37
QString
HelpBrowserSupport
::
msgPageNotFound
()
38
{
39
return
QCoreApplication::translate(
"HelpViewer"
,
"The page could not be found"
);
40
}
41
42
QString
HelpBrowserSupport
::
msgAllDocumentationSets
()
43
{
44
return
QCoreApplication::translate(
"HelpViewer"
,
45
"Please make sure that you have all "
46
"documentation sets installed."
);
47
}
48
49
QString
HelpBrowserSupport
::
msgLoadError
(
const
QUrl &url)
50
{
51
return
HelpViewer::tr(
"Error loading: %1"
).arg(url.toString());
52
}
53
54
QString
HelpBrowserSupport
::
msgHtmlErrorPage
(
const
QUrl &url)
55
{
56
return
QString::fromLatin1(g_htmlPage)
57
.arg(HelpBrowserSupport::msgError404(), HelpBrowserSupport::msgPageNotFound(),
58
HelpBrowserSupport::msgLoadError(url), HelpBrowserSupport::msgAllDocumentationSets());
59
}
60
61
// A QNetworkAccessManager implementing unhandled URL schema handling for WebKit-type browsers.
62
63
// -- HelpNetworkReply
64
65
class
HelpNetworkReply
:
public
QNetworkReply
66
{
67
public
:
68
HelpNetworkReply
(
const
QNetworkRequest &request,
const
QByteArray
&fileData,
69
const
QString &mimeType);
70
71
void
abort
()
override
;
72
73
qint64
bytesAvailable
()
const
override
74
{
return
data.size() + QNetworkReply::bytesAvailable(); }
75
76
protected
:
77
qint64
readData
(
char
*data, qint64 maxlen)
override
;
78
79
private
:
80
QByteArray
data;
81
const
qint64 origLen;
82
};
83
84
HelpNetworkReply
::
HelpNetworkReply
(
const
QNetworkRequest &request,
85
const
QByteArray
&fileData,
const
QString& mimeType)
86
:
data
(
fileData
),
origLen
(
fileData
.
size
())
87
{
88
TRACE_OBJ
89
setRequest(request);
90
setUrl(request.url());
91
setOpenMode(QIODevice::ReadOnly);
92
93
setHeader(QNetworkRequest::ContentTypeHeader, mimeType);
94
setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(origLen));
95
QTimer::singleShot(0,
this
, &QNetworkReply::metaDataChanged);
96
QTimer::singleShot(0,
this
, &QNetworkReply::readyRead);
97
QTimer::singleShot(0,
this
, &QNetworkReply::finished);
98
}
99
100
void
HelpNetworkReply
::
abort
()
101
{
102
TRACE_OBJ
103
}
104
105
qint64
HelpNetworkReply
::
readData
(
char
*buffer, qint64 maxlen)
106
{
107
TRACE_OBJ
108
qint64 len = qMin(qint64(data.size()), maxlen);
109
if
(len) {
110
memcpy(buffer, data.constData(), len);
111
data.remove(0, len);
112
}
113
if
(!data.size())
114
QTimer::singleShot(0,
this
, &QNetworkReply::finished);
115
return
len;
116
}
117
118
// -- HelpRedirectNetworkReply
119
120
class
HelpRedirectNetworkReply
:
public
QNetworkReply
121
{
122
public
:
123
HelpRedirectNetworkReply
(
const
QNetworkRequest &request,
const
QUrl &newUrl)
124
{
125
setRequest(request);
126
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 301);
127
setAttribute(QNetworkRequest::RedirectionTargetAttribute, newUrl);
128
129
QTimer::singleShot(0,
this
, &QNetworkReply::finished);
130
}
131
132
protected
:
133
void
abort
()
override
{
TRACE_OBJ
}
134
qint64
readData
(
char
*,
qint64
)
override
{
TRACE_OBJ
return
qint64(-1); }
135
};
136
137
// -- HelpNetworkAccessManager
138
139
class
HelpNetworkAccessManager
:
public
QNetworkAccessManager
140
{
141
public
:
142
HelpNetworkAccessManager
(QObject *parent);
143
144
protected
:
145
QNetworkReply
*
createRequest
(Operation op,
146
const
QNetworkRequest &request, QIODevice *outgoingData =
nullptr
)
override
;
147
};
148
149
HelpNetworkAccessManager
::
HelpNetworkAccessManager
(QObject *parent)
150
:
QNetworkAccessManager
(
parent
)
151
{
152
TRACE_OBJ
153
}
154
155
QNetworkReply
*
HelpNetworkAccessManager
::
createRequest
(
Operation
,
const
QNetworkRequest &request, QIODevice*)
156
{
157
TRACE_OBJ
158
159
QByteArray
data;
160
const
QUrl url = request.url();
161
QUrl redirectedUrl;
162
switch
(
HelpBrowserSupport
::
resolveUrl
(
url
,
&redirectedUrl
,
&data
)
) {
163
case
HelpBrowserSupport
::
UrlRedirect
:
164
return
new
HelpRedirectNetworkReply
(request, redirectedUrl);
165
case
HelpBrowserSupport
::
UrlLocalData
: {
166
const
QString mimeType = HelpViewer::mimeFromUrl(url);
167
return
new
HelpNetworkReply
(request, data, mimeType);
168
}
169
case
HelpBrowserSupport
::
UrlResolveError
:
170
break
;
171
}
172
return
new
HelpNetworkReply
(request, HelpBrowserSupport::msgHtmlErrorPage(request.url()).toUtf8(),
173
QStringLiteral(
"text/html"
));
174
}
175
176
QByteArray
HelpBrowserSupport
::
fileDataForLocalUrl
(
const
QUrl &url)
177
{
178
return
HelpEngineWrapper
::
instance
(
)
.fileData(url);
179
}
180
181
HelpBrowserSupport
::
ResolveUrlResult
HelpBrowserSupport
::
resolveUrl
(
const
QUrl &url,
182
QUrl *targetUrlP,
183
QByteArray
*dataP)
184
{
185
const
HelpEngineWrapper
&engine =
HelpEngineWrapper
::
instance
(
)
;
186
187
const
QUrl targetUrl = engine.findFile(url);
188
if
(!targetUrl.isValid())
189
return
UrlResolveError
;
190
191
if
(targetUrl != url) {
192
if
(targetUrlP)
193
*targetUrlP = targetUrl;
194
return
UrlRedirect
;
195
}
196
197
if
(dataP)
198
*dataP = HelpBrowserSupport::fileDataForLocalUrl(targetUrl);
199
return
UrlLocalData
;
200
}
201
202
QNetworkAccessManager *
HelpBrowserSupport
::
createNetworkAccessManager
(QObject *parent)
203
{
204
return
new
HelpNetworkAccessManager
(
parent
)
;
205
}
206
207
QT_END_NAMESPACE
HelpBrowserSupport
Definition
helpbrowsersupport.h:20
HelpBrowserSupport::ResolveUrlResult
ResolveUrlResult
Definition
helpbrowsersupport.h:22
HelpBrowserSupport::UrlLocalData
@ UrlLocalData
Definition
helpbrowsersupport.h:24
HelpBrowserSupport::UrlResolveError
@ UrlResolveError
Definition
helpbrowsersupport.h:25
HelpBrowserSupport::UrlRedirect
@ UrlRedirect
Definition
helpbrowsersupport.h:23
HelpBrowserSupport::createNetworkAccessManager
static QNetworkAccessManager * createNetworkAccessManager(QObject *parent=nullptr)
Definition
helpbrowsersupport.cpp:202
HelpBrowserSupport::fileDataForLocalUrl
static QByteArray fileDataForLocalUrl(const QUrl &url)
Definition
helpbrowsersupport.cpp:176
HelpBrowserSupport::msgAllDocumentationSets
static QString msgAllDocumentationSets()
Definition
helpbrowsersupport.cpp:42
HelpBrowserSupport::msgLoadError
static QString msgLoadError(const QUrl &url)
Definition
helpbrowsersupport.cpp:49
HelpBrowserSupport::msgPageNotFound
static QString msgPageNotFound()
Definition
helpbrowsersupport.cpp:37
HelpBrowserSupport::resolveUrl
static ResolveUrlResult resolveUrl(const QUrl &url, QUrl *targetUrl, QByteArray *data)
Definition
helpbrowsersupport.cpp:181
HelpBrowserSupport::msgHtmlErrorPage
static QString msgHtmlErrorPage(const QUrl &url)
Definition
helpbrowsersupport.cpp:54
HelpBrowserSupport::msgError404
static QString msgError404()
Definition
helpbrowsersupport.cpp:32
HelpEngineWrapper
Definition
helpenginewrapper.h:38
HelpEngineWrapper::instance
static HelpEngineWrapper & instance()
Definition
helpenginewrapper.cpp:90
HelpNetworkAccessManager
Definition
helpbrowsersupport.cpp:140
HelpNetworkAccessManager::createRequest
QNetworkReply * createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData=nullptr) override
Returns a new QNetworkReply object to handle the operation op and request originalReq.
Definition
helpbrowsersupport.cpp:155
HelpNetworkAccessManager::HelpNetworkAccessManager
HelpNetworkAccessManager(QObject *parent)
Definition
helpbrowsersupport.cpp:149
HelpNetworkReply
Definition
helpbrowsersupport.cpp:66
HelpNetworkReply::abort
void abort() override
Aborts the operation immediately and closes any network connections still open.
Definition
helpbrowsersupport.cpp:100
HelpNetworkReply::HelpNetworkReply
HelpNetworkReply(const QNetworkRequest &request, const QByteArray &fileData, const QString &mimeType)
Definition
helpbrowsersupport.cpp:84
HelpNetworkReply::bytesAvailable
qint64 bytesAvailable() const override
Returns the number of bytes that are available for reading.
Definition
helpbrowsersupport.cpp:73
HelpNetworkReply::readData
qint64 readData(char *data, qint64 maxlen) override
Reads up to maxSize bytes from the device into data, and returns the number of bytes read or -1 if an...
Definition
helpbrowsersupport.cpp:105
HelpRedirectNetworkReply
Definition
helpbrowsersupport.cpp:121
HelpRedirectNetworkReply::HelpRedirectNetworkReply
HelpRedirectNetworkReply(const QNetworkRequest &request, const QUrl &newUrl)
Definition
helpbrowsersupport.cpp:123
HelpRedirectNetworkReply::readData
qint64 readData(char *, qint64) override
Reads up to maxSize bytes from the device into data, and returns the number of bytes read or -1 if an...
Definition
helpbrowsersupport.cpp:134
HelpRedirectNetworkReply::abort
void abort() override
Aborts the operation immediately and closes any network connections still open.
Definition
helpbrowsersupport.cpp:133
QByteArray::FromBase64Result
\inmodule QtCore
Definition
qbytearray.h:824
g_htmlPage
static QT_BEGIN_NAMESPACE const char g_htmlPage[]
Definition
helpbrowsersupport.cpp:24
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
TRACE_OBJ
#define TRACE_OBJ
Definition
tracer.h:34
qttools
src
assistant
assistant
helpbrowsersupport.cpp
Generated on
for Qt by
1.18.0