e68f334f7964d92c39cf8311a70bfc66da4eb6c7
[WebKit-https.git] / WebKitQt / Api / qwebnetworkinterface_p.h
1 /*
2   Copyright (C) 2007 Trolltech ASA
3   
4   This library is free software; you can redistribute it and/or
5   modify it under the terms of the GNU Library General Public
6   License as published by the Free Software Foundation; either
7   version 2 of the License, or (at your option) any later version.
8   
9   This library is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12   Library General Public License for more details.
13   
14   You should have received a copy of the GNU Library General Public License
15   along with this library; see the file COPYING.LIB.  If not, write to
16   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17   Boston, MA 02111-1307, USA.
18   
19   This class provides all functionality needed for loading images, style sheets and html
20   pages from the web. It has a memory cache for these objects.
21 */
22 #ifndef QWEBNETWORKINTERFACE_P_H
23 #define QWEBNETWORKINTERFACE_P_H
24
25 #include "qwebnetworkinterface.h"
26 #include <qthread.h>
27
28 namespace WebCore {
29     struct HostInfo;
30     class ResourceRequest;
31 };
32 uint qHash(const WebCore::HostInfo &info);
33 #include <qhash.h>
34
35 namespace WebCore {
36     class ResourceHandle;
37 }
38
39 struct QWebNetworkRequest
40 {
41     QUrl url;
42     QHttpRequestHeader request;
43     QByteArray postData;
44
45     void init(const QString &method, const QUrl &url, const WebCore::ResourceRequest *resourceRequest = 0);
46     void setURL(const QUrl &u);
47 };
48
49 class QWebNetworkJobPrivate : public QWebNetworkRequest
50 {
51 public:
52     QWebNetworkJobPrivate()
53         : ref(1)
54         , resourceHandle(0)
55         , redirected(false)
56         , interface(0)
57         , connector(0)
58         {}
59     int ref;
60
61     QHttpResponseHeader response;
62
63     WebCore::ResourceHandle *resourceHandle;
64     bool redirected;
65
66     QWebNetworkInterface *interface;
67     QWebObjectPluginConnector *connector;
68 };
69
70
71 class QWebNetworkManager : public QObject
72 {
73     Q_OBJECT
74 public:
75     static QWebNetworkManager *self();
76
77     bool add(WebCore::ResourceHandle *resourceHandle, QWebNetworkInterface *interface);
78     void cancel(WebCore::ResourceHandle *resourceHandle);
79
80     void addHttpJob(QWebNetworkJob *job);
81     void cancelHttpJob(QWebNetworkJob *job);
82
83 public slots:
84     void started(QWebNetworkJob *);
85     void data(QWebNetworkJob *, const QByteArray &data);
86     void finished(QWebNetworkJob *, int errorCode);
87
88 signals:
89     void fileRequest(QWebNetworkJob*);
90
91 private slots:
92     void httpConnectionClosed(const WebCore::HostInfo &);
93
94 private:
95     friend class QWebNetworkInterface;
96     QWebNetworkManager();
97     QHash<WebCore::HostInfo, WebCore::WebCoreHttp *> m_hostMapping;
98 };
99
100
101 namespace WebCore {
102
103     class NetworkLoader;
104
105     struct HostInfo {
106         HostInfo() {}
107         HostInfo(const QUrl& url);
108         QString protocol;
109         QString host;
110         int port;
111     };
112
113     class WebCoreHttp : public QObject
114     {
115         Q_OBJECT
116     public:
117         WebCoreHttp(QObject *parent, const HostInfo&);
118         ~WebCoreHttp();
119
120         void request(QWebNetworkJob* resource);
121         void cancel(QWebNetworkJob*);
122
123     signals:
124         void connectionClosed(const WebCore::HostInfo &);
125
126     private slots:
127         void onResponseHeaderReceived(const QHttpResponseHeader& resp);
128         void onReadyRead();
129         void onRequestFinished(int, bool);
130         void onStateChanged(int);
131
132         void scheduleNextRequest();
133
134         int getConnection();
135
136     public:
137         HostInfo info;
138     private:
139         QList<QWebNetworkJob *> m_pendingRequests;
140         struct HttpConnection {
141             QHttp *http;
142             QWebNetworkJob *current;
143         };
144         HttpConnection connection[2];
145         bool m_inCancel;
146     };
147
148 }
149
150 class QWebNetworkInterfacePrivate
151 {
152 public:
153     void sendFileData(QWebNetworkJob* job, int statusCode, const QByteArray &data);
154     void parseDataUrl(QWebNetworkJob* job);
155
156     QWebNetworkInterface *q;
157 };
158
159 #endif