summaryrefslogtreecommitdiffstats
path: root/WebKit/qt/Api/qwebnetworkinterface_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/qt/Api/qwebnetworkinterface_p.h')
-rw-r--r--WebKit/qt/Api/qwebnetworkinterface_p.h219
1 files changed, 219 insertions, 0 deletions
diff --git a/WebKit/qt/Api/qwebnetworkinterface_p.h b/WebKit/qt/Api/qwebnetworkinterface_p.h
new file mode 100644
index 0000000..56e8617
--- /dev/null
+++ b/WebKit/qt/Api/qwebnetworkinterface_p.h
@@ -0,0 +1,219 @@
+/*
+ Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef QWEBNETWORKINTERFACE_P_H
+#define QWEBNETWORKINTERFACE_P_H
+
+#include "qwebnetworkinterface.h"
+#if QT_VERSION < 0x040400
+#include <qthread.h>
+#include <qmutex.h>
+
+namespace WebCore {
+ struct HostInfo;
+ class ResourceRequest;
+};
+uint qHash(const WebCore::HostInfo &info);
+#include <qhash.h>
+
+namespace WebCore {
+ class ResourceHandle;
+}
+
+struct QWebNetworkRequestPrivate
+{
+ QUrl url;
+ QHttpRequestHeader httpHeader;
+ QByteArray postData;
+
+ void init(const WebCore::ResourceRequest &resourceRequest);
+ void init(const QString &method, const QUrl &url, const WebCore::ResourceRequest *resourceRequest = 0);
+ void setURL(const QUrl &u);
+};
+
+class QWebNetworkJobPrivate
+{
+public:
+ QWebNetworkJobPrivate()
+ : ref(1)
+ , resourceHandle(0)
+ , redirected(false)
+ , interface(0)
+ , jobStatus(QWebNetworkJob::JobCreated)
+ {}
+ int ref;
+
+ QWebNetworkRequestPrivate request;
+ QHttpResponseHeader response;
+
+ WebCore::ResourceHandle *resourceHandle;
+ bool redirected;
+
+ QWebNetworkInterface *interface;
+ QWebNetworkJob::JobStatus jobStatus;
+ QString errorString;
+};
+
+class QWebNetworkManager : public QObject
+{
+ Q_OBJECT
+public:
+ enum JobMode {
+ AsynchronousJob,
+ SynchronousJob
+ };
+
+ static QWebNetworkManager *self();
+
+ bool add(WebCore::ResourceHandle *resourceHandle, QWebNetworkInterface *interface, JobMode = AsynchronousJob);
+ void cancel(WebCore::ResourceHandle *resourceHandle);
+
+ void addHttpJob(QWebNetworkJob *job);
+ void cancelHttpJob(QWebNetworkJob *job);
+
+protected:
+ void queueStart(QWebNetworkJob*);
+ void queueData(QWebNetworkJob*, const QByteArray&);
+ void queueFinished(QWebNetworkJob*, int errorCode);
+
+private:
+ void started(QWebNetworkJob *);
+ void data(QWebNetworkJob *, const QByteArray &data);
+ void finished(QWebNetworkJob *, int errorCode);
+ void doScheduleWork();
+
+signals:
+ void fileRequest(QWebNetworkJob*);
+ void scheduleWork();
+
+private slots:
+ void httpConnectionClosed(const WebCore::HostInfo &);
+ void doWork();
+
+private:
+ friend class QWebNetworkInterface;
+ QWebNetworkManager();
+ QHash<WebCore::HostInfo, WebCore::WebCoreHttp *> m_hostMapping;
+
+ struct JobWork {
+ enum WorkType {
+ JobStarted,
+ JobData,
+ JobFinished
+ };
+
+ explicit JobWork(QWebNetworkJob* _job)
+ : workType(JobStarted)
+ , errorCode(-1)
+ , job(_job)
+ {}
+
+ explicit JobWork(QWebNetworkJob* _job, int _errorCode)
+ : workType(JobFinished)
+ , errorCode(_errorCode)
+ , job(_job)
+ {}
+
+ explicit JobWork(QWebNetworkJob* _job, const QByteArray& _data)
+ : workType(JobData)
+ , errorCode(-1)
+ , job(_job)
+ , data(_data)
+ {}
+
+ const WorkType workType;
+ int errorCode;
+ QByteArray data;
+ QWebNetworkJob* job;
+ };
+
+ QMutex m_queueMutex;
+ bool m_scheduledWork;
+ QList<JobWork*> m_pendingWork;
+ QHash<QWebNetworkJob*, int> m_synchronousJobs;
+};
+
+
+namespace WebCore {
+
+ class NetworkLoader;
+
+ struct HostInfo {
+ HostInfo() {}
+ HostInfo(const QUrl& url);
+ QString protocol;
+ QString host;
+ int port;
+ };
+
+ class WebCoreHttp : public QObject
+ {
+ Q_OBJECT
+ public:
+ WebCoreHttp(QObject *parent, const HostInfo&);
+ ~WebCoreHttp();
+
+ void request(QWebNetworkJob* resource);
+ void cancel(QWebNetworkJob*);
+
+ signals:
+ void connectionClosed(const WebCore::HostInfo &);
+
+ private slots:
+ void onResponseHeaderReceived(const QHttpResponseHeader& resp);
+ void onReadyRead();
+ void onRequestFinished(int, bool);
+ void onDone(bool);
+ void onStateChanged(int);
+ void onSslErrors(const QList<QSslError>&);
+ void onAuthenticationRequired(const QString& hostname, quint16 port, QAuthenticator *);
+ void onProxyAuthenticationRequired(const QNetworkProxy& proxy, QAuthenticator *);
+
+ void scheduleNextRequest();
+
+ int getConnection();
+
+ public:
+ HostInfo info;
+ private:
+ QList<QWebNetworkJob *> m_pendingRequests;
+ struct HttpConnection {
+ HttpConnection() : http(0), current(0), id(-1) {}
+ QHttp *http;
+ QWebNetworkJob *current;
+ int id; // the QHttp id
+ };
+ HttpConnection connection[2];
+ bool m_inCancel;
+ };
+
+}
+
+class QWebNetworkInterfacePrivate
+{
+public:
+ void sendFileData(QWebNetworkJob* job, int statusCode, const QByteArray &data);
+ void parseDataUrl(QWebNetworkJob* job);
+
+ QWebNetworkInterface *q;
+};
+
+#endif
+
+#endif