32 #ifndef pqHelpWindowWebKit_h 33 #define pqHelpWindowWebKit_h 41 #include <QNetworkAccessManager> 42 #include <QNetworkProxy> 46 #include <QtNetwork/QNetworkReply> 55 class pqHelpWindowNetworkReply :
public QNetworkReply
57 typedef QNetworkReply Superclass;
59 pqHelpWindowNetworkReply(
const QUrl& url, QHelpEngineCore* helpEngine);
61 virtual void abort() {}
62 virtual qint64 bytesAvailable()
const 64 return (this->RawData.size() - this->Offset) +
65 this->Superclass::bytesAvailable();
67 virtual bool isSequential()
const {
return true;}
69 virtual qint64 readData(
char *data, qint64 maxSize);
74 Q_DISABLE_COPY(pqHelpWindowNetworkReply)
78 pqHelpWindowNetworkReply::pqHelpWindowNetworkReply(
79 const QUrl& my_url, QHelpEngineCore* engine) : Superclass(engine), Offset(0)
83 this->RawData = engine->fileData(my_url);
85 QString content_type =
"text/plain";
86 QString extension = QFileInfo(my_url.path()).suffix().toLower();
87 QMap<QString, QString> extension_type_map;
88 extension_type_map[
"jpg"] =
"image/jpeg";
89 extension_type_map[
"jpeg"] =
"image/jpeg";
90 extension_type_map[
"png"] =
"image/png";
91 extension_type_map[
"gif"] =
"image/gif";
92 extension_type_map[
"tiff"] =
"image/tiff";
93 extension_type_map[
"htm"] =
"text/html";
94 extension_type_map[
"html"] =
"text/html";
95 extension_type_map[
"css"] =
"text/css";
96 extension_type_map[
"xml"] =
"text/xml";
98 if (extension_type_map.contains(extension))
100 content_type = extension_type_map[extension];
103 this->setHeader(QNetworkRequest::ContentLengthHeader,
104 QVariant(this->RawData.size()));
105 this->setHeader(QNetworkRequest::ContentTypeHeader, content_type);
106 this->open(QIODevice::ReadOnly|QIODevice::Unbuffered);
107 this->setUrl(my_url);
108 QTimer::singleShot(0,
this, SIGNAL(readyRead()));
109 QTimer::singleShot(0,
this, SLOT(finished()));
113 qint64 pqHelpWindowNetworkReply::readData(
char *data, qint64 maxSize)
115 if (this->Offset <= this->RawData.size())
117 qint64 end = qMin(this->Offset + maxSize,
118 static_cast<qint64>(this->RawData.size()));
119 qint64 delta = end - this->Offset;
120 memcpy(data, this->RawData.constData() + this->Offset, delta);
121 this->Offset += delta;
131 class pqNetworkAccessManager :
public QNetworkAccessManager
133 typedef QNetworkAccessManager Superclass;
134 QPointer<QHelpEngineCore> Engine;
136 pqNetworkAccessManager(
137 QHelpEngineCore* helpEngine, QNetworkAccessManager *manager,
138 QObject *parentObject) :
139 Superclass(parentObject),
142 Q_ASSERT(manager != NULL && helpEngine != NULL);
144 this->setCache(manager->cache());
145 this->setCookieJar(manager->cookieJar());
146 this->setProxy(manager->proxy());
147 this->setProxyFactory(manager->proxyFactory());
151 virtual QNetworkReply *createRequest(
152 Operation operation,
const QNetworkRequest &request, QIODevice *device)
154 if (request.url().scheme() ==
"qthelp" && operation == GetOperation)
156 return new pqHelpWindowNetworkReply(request.url(), this->Engine);
160 return this->Superclass::createRequest(operation, request, device);
165 Q_DISABLE_COPY(pqNetworkAccessManager)
170 class pqWebView :
public QWebView
172 typedef QWebView Superclass;
174 pqWebView(QWidget* parentObject)
175 : Superclass(parentObject)
182 static pqWebView* newInstance(QHelpEngine* engine, QWidget* parentObject)
184 pqWebView* instance =
new pqWebView(parentObject);
185 QNetworkAccessManager *oldManager = instance->page()->networkAccessManager();
186 pqNetworkAccessManager* newManager =
new pqNetworkAccessManager(engine, oldManager, parentObject);
187 instance->page()->setNetworkAccessManager(newManager);
188 instance->page()->setForwardUnsupportedContent(
false);
193 Q_DISABLE_COPY(pqWebView)