job->deref();
}
+void QWebNetworkManager::addHttpJob(QWebNetworkJob *job)
+{
+ HostInfo hostInfo(job->url());
+ WebCoreHttp *httpConnection = m_hostMapping.value(hostInfo);
+ if (!httpConnection) {
+ // #### fix custom ports
+ DEBUG() << " new connection to" << hostInfo.host << hostInfo.port;
+ httpConnection = new WebCoreHttp(this, hostInfo);
+ QObject::connect(httpConnection, SIGNAL(connectionClosed(const WebCore::HostInfo&)),
+ this, SLOT(httpConnectionClosed(const WebCore::HostInfo&)));
+
+ m_hostMapping[hostInfo] = httpConnection;
+ }
+ httpConnection->request(job);
+}
+
+void QWebNetworkManager::cancelHttpJob(QWebNetworkJob *job)
+{
+ WebCoreHttp *httpConnection = m_hostMapping.value(job->url());
+ if (httpConnection)
+ httpConnection->cancel(job);
+}
+
+void QWebNetworkManager::httpConnectionClosed(const WebCore::HostInfo &info)
+{
+ WebCoreHttp *connection = m_hostMapping.take(info);
+ delete connection;
+}
+
void QWebNetworkInterfacePrivate::sendFileData(QWebNetworkJob* job, int statusCode, const QByteArray &data)
{
int error = statusCode >= 400 ? 1 : 0;
sendFileData(job, statusCode, data);
}
-void QWebNetworkInterfacePrivate::addHttpJob(QWebNetworkJob *job)
-{
- HostInfo hostInfo(job->url());
- WebCoreHttp *httpConnection = m_hostMapping.value(hostInfo);
- if (!httpConnection) {
- // #### fix custom ports
- DEBUG() << " new connection to" << hostInfo.host << hostInfo.port;
- httpConnection = new WebCoreHttp(q, hostInfo);
- QObject::connect(httpConnection, SIGNAL(connectionClosed(const WebCore::HostInfo&)),
- q, SLOT(httpConnectionClosed(const WebCore::HostInfo&)));
-
- m_hostMapping[hostInfo] = httpConnection;
- }
- httpConnection->request(job);
-}
-
-void QWebNetworkInterfacePrivate::httpConnectionClosed(const WebCore::HostInfo &info)
-{
- WebCoreHttp *connection = m_hostMapping.take(info);
- delete connection;
-}
-
/*!
\class QWebNetworkInterface
{
QString protocol = job->url().scheme();
if (protocol == QLatin1String("http")) {
- //DEBUG() << "networkRequest";
- d->addHttpJob(job);
+ QWebNetworkManager::self()->addHttpJob(job);
return;
}
void QWebNetworkInterface::cancelJob(QWebNetworkJob *job)
{
QString protocol = job->url().scheme();
- if (protocol == QLatin1String("http")) {
- WebCoreHttp *httpConnection = d->m_hostMapping.value(job->url());
- if (httpConnection)
- httpConnection->cancel(job);
- }
+ if (protocol == QLatin1String("http"))
+ QWebNetworkManager::self()->cancelHttpJob(job);
}
/////////////////////////////////////////////////////////////////////////////
-WebCoreHttp::WebCoreHttp(QWebNetworkInterface* parent, const HostInfo &hi)
- : info(hi),
- m_networkInterface(parent),
+WebCoreHttp::WebCoreHttp(QObject* parent, const HostInfo &hi)
+ : QObject(parent), info(hi),
m_inCancel(false)
{
for (int i = 0; i < 2; ++i) {
while (!job && !m_pendingRequests.isEmpty()) {
job = m_pendingRequests.takeFirst();
if (job->cancelled()) {
- emit m_networkInterface->finished(job, 1);
+ emit job->networkInterface()->finished(job, 1);
job = 0;
}
}
job->setResponse(resp);
- emit m_networkInterface->started(job);
+ emit job->networkInterface()->started(job);
}
void WebCoreHttp::onReadyRead()
QByteArray data;
data.resize(http->bytesAvailable());
http->read(data.data(), data.length());
- emit m_networkInterface->data(req, data);
+ emit req->networkInterface()->data(req, data);
}
void WebCoreHttp::onRequestFinished(int, bool error)
QByteArray data;
data.resize(http->bytesAvailable());
http->read(data.data(), data.length());
- emit m_networkInterface->data(req, data);
+ emit req->networkInterface()->data(req, data);
}
- emit m_networkInterface->finished(req, error ? 1 : 0);
+ emit req->networkInterface()->finished(req, error ? 1 : 0);
connection[c].current = 0;
scheduleNextRequest();
m_inCancel = false;
if (doEmit)
- emit m_networkInterface->finished(request, 1);
+ emit request->networkInterface()->finished(request, 1);
if (m_pendingRequests.isEmpty()
&& !connection[0].current && !connection[1].current)
bool add(WebCore::ResourceHandle *resourceHandle, QWebNetworkInterface *interface);
void cancel(WebCore::ResourceHandle *resourceHandle);
+ void addHttpJob(QWebNetworkJob *job);
+ void cancelHttpJob(QWebNetworkJob *job);
+
public slots:
void started(QWebNetworkJob *);
void data(QWebNetworkJob *, const QByteArray &data);
signals:
void fileRequest(QWebNetworkJob*);
+private slots:
+ void httpConnectionClosed(const WebCore::HostInfo &);
+
private:
friend class QWebNetworkInterface;
QWebNetworkManager();
+ QHash<WebCore::HostInfo, WebCore::WebCoreHttp *> m_hostMapping;
};
{
Q_OBJECT
public:
- WebCoreHttp(QWebNetworkInterface* parent, const HostInfo&);
+ WebCoreHttp(QObject *parent, const HostInfo&);
~WebCoreHttp();
void request(QWebNetworkJob* resource);
public:
HostInfo info;
private:
- QWebNetworkInterface* m_networkInterface;
QList<QWebNetworkJob *> m_pendingRequests;
struct HttpConnection {
QHttp *http;
void sendFileData(QWebNetworkJob* job, int statusCode, const QByteArray &data);
void parseDataUrl(QWebNetworkJob* job);
- void addHttpJob(QWebNetworkJob *job);
-
- void httpConnectionClosed(const WebCore::HostInfo &);
-
- QHash<WebCore::HostInfo, WebCore::WebCoreHttp *> m_hostMapping;
QWebNetworkInterface *q;
};
+2007-05-23 Simon Hausmann <hausmann@kde.org>
+
+ Reviewed by Zack, idea from Lars.
+
+ Share WebCoreHttp and therefore HTTP connections among multiple
+ QWebNetworkInterface instances by moving the code into
+ QWebNetworkManager.
+
+ * Api/qwebnetworkinterface.cpp:
+ (QWebNetworkManager::addHttpJob):
+ (QWebNetworkManager::cancelHttpJob):
+ (QWebNetworkManager::httpConnectionClosed):
+ (QWebNetworkInterface::addJob):
+ (QWebNetworkInterface::cancelJob):
+ (WebCoreHttp::scheduleNextRequest):
+ (WebCoreHttp::onResponseHeaderReceived):
+ (WebCoreHttp::onReadyRead):
+ (WebCoreHttp::onRequestFinished):
+ (WebCoreHttp::cancel):
+ * Api/qwebnetworkinterface.h:
+ * Api/qwebnetworkinterface_p.h:
+
2007-05-23 Simon Hausmann <hausmann@kde.org>
Reviewed by Zack, discussed also with Lars.