32 #ifndef pqHelpWindowWebKit_h 33 #define pqHelpWindowWebKit_h 43 #include <QNetworkAccessManager> 44 #include <QNetworkProxy> 48 #include <QtNetwork/QNetworkReply> 59 class pqHelpWindowNetworkReply :
public QNetworkReply
61 typedef QNetworkReply Superclass;
64 pqHelpWindowNetworkReply(
const QUrl& url, QHelpEngineCore* helpEngine);
66 virtual void abort() {}
67 virtual qint64 bytesAvailable()
const 69 return (this->RawData.size() - this->Offset) + this->Superclass::bytesAvailable();
71 virtual bool isSequential()
const {
return true; }
73 virtual qint64 readData(
char* data, qint64 maxSize);
79 Q_DISABLE_COPY(pqHelpWindowNetworkReply)
83 pqHelpWindowNetworkReply::pqHelpWindowNetworkReply(
const QUrl& my_url, QHelpEngineCore* engine)
89 this->RawData = engine->fileData(my_url);
91 QString content_type =
"text/plain";
92 QString extension = QFileInfo(my_url.path()).suffix().toLower();
93 QMap<QString, QString> extension_type_map;
94 extension_type_map[
"jpg"] =
"image/jpeg";
95 extension_type_map[
"jpeg"] =
"image/jpeg";
96 extension_type_map[
"png"] =
"image/png";
97 extension_type_map[
"gif"] =
"image/gif";
98 extension_type_map[
"tiff"] =
"image/tiff";
99 extension_type_map[
"htm"] =
"text/html";
100 extension_type_map[
"html"] =
"text/html";
101 extension_type_map[
"css"] =
"text/css";
102 extension_type_map[
"xml"] =
"text/xml";
104 if (extension_type_map.contains(extension))
106 content_type = extension_type_map[extension];
109 this->setHeader(QNetworkRequest::ContentLengthHeader, QVariant(this->RawData.size()));
110 this->setHeader(QNetworkRequest::ContentTypeHeader, content_type);
111 this->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
112 this->setUrl(my_url);
113 QTimer::singleShot(0,
this, SIGNAL(readyRead()));
114 QTimer::singleShot(0,
this, SLOT(finished()));
118 qint64 pqHelpWindowNetworkReply::readData(
char* data, qint64 maxSize)
120 if (this->Offset <= this->RawData.size())
122 qint64 end = qMin(this->Offset + maxSize, static_cast<qint64>(this->RawData.size()));
123 qint64 delta = end - this->Offset;
124 memcpy(data, this->RawData.constData() + this->Offset, delta);
125 this->Offset += delta;
135 class pqNetworkAccessManager :
public QNetworkAccessManager
137 typedef QNetworkAccessManager Superclass;
138 QPointer<QHelpEngineCore> Engine;
141 pqNetworkAccessManager(
142 QHelpEngineCore* helpEngine, QNetworkAccessManager* manager, QObject* parentObject)
143 : Superclass(parentObject)
146 Q_ASSERT(manager != NULL && helpEngine != NULL);
148 this->setCache(manager->cache());
149 this->setCookieJar(manager->cookieJar());
150 this->setProxy(manager->proxy());
151 this->setProxyFactory(manager->proxyFactory());
155 virtual QNetworkReply* createRequest(
156 Operation operation,
const QNetworkRequest& request, QIODevice* device)
158 if (request.url().scheme() ==
"qthelp" && operation == GetOperation)
160 return new pqHelpWindowNetworkReply(request.url(), this->Engine);
164 return this->Superclass::createRequest(operation, request, device);
169 Q_DISABLE_COPY(pqNetworkAccessManager)
176 class pqWebView :
public QWebView
178 typedef QWebView Superclass;
181 pqWebView(QWidget* parentObject)
182 : Superclass(parentObject)
187 static pqWebView* newInstance(QHelpEngine* engine, QWidget* parentObject)
189 pqWebView* instance =
new pqWebView(parentObject);
190 QNetworkAccessManager* oldManager = instance->page()->networkAccessManager();
191 pqNetworkAccessManager* newManager =
192 new pqNetworkAccessManager(engine, oldManager, parentObject);
193 instance->page()->setNetworkAccessManager(newManager);
194 instance->page()->setForwardUnsupportedContent(
false);
199 Q_DISABLE_COPY(pqWebView)