From 07e4ddb79da7d0c3e0b4819ef8e7fc89adbae0aa Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Tue, 14 Aug 2007 22:47:01 +0000 Subject: [PATCH] Extend HttpGet class to allow downloading a file to a buffer instead of a file. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14347 a1c6a512-1295-4272-9138-f99709370657 --- rbutil/rbutilqt/httpget.cpp | 81 ++++++++++++++++++++++++++++--------- rbutil/rbutilqt/httpget.h | 7 +++- 2 files changed, 68 insertions(+), 20 deletions(-) diff --git a/rbutil/rbutilqt/httpget.cpp b/rbutil/rbutilqt/httpget.cpp index b567a7df80..d0c9578070 100644 --- a/rbutil/rbutilqt/httpget.cpp +++ b/rbutil/rbutilqt/httpget.cpp @@ -7,7 +7,7 @@ * \/ \/ \/ \/ \/ * * Copyright (C) 2007 by Dominik Riebeling - * $Id:$ + * $Id$ * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. @@ -27,12 +27,25 @@ HttpGet::HttpGet(QObject *parent) : QObject(parent) { - + qDebug() << "--> HttpGet::HttpGet()"; outputFile = new QFile(this); + outputFile->setFileName(""); + getRequest = -1; connect(&http, SIGNAL(done(bool)), this, SLOT(httpDone(bool))); connect(&http, SIGNAL(dataReadProgress(int, int)), this, SLOT(httpProgress(int, int))); connect(&http, SIGNAL(requestFinished(int, bool)), this, SLOT(httpFinished(int, bool))); connect(&http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader&)), this, SLOT(httpResponseHeader(const QHttpResponseHeader&))); + connect(&http, SIGNAL(stateChanged(int)), this, SLOT(httpState(int))); + //connect(&http, SIGNAL(requestStarted(int)), this, SLOT(httpStarted(int))); + + connect(&http, SIGNAL(readyRead(const QHttpResponseHeader&)), this, SLOT(httpResponseHeader(const QHttpResponseHeader&))); + +} + + +QByteArray HttpGet::readAll() +{ + return dataBuffer; } @@ -41,6 +54,7 @@ QHttp::Error HttpGet::error() return http.error(); } + void HttpGet::httpProgress(int read, int total) { emit dataReadProgress(read, total); @@ -64,7 +78,8 @@ void HttpGet::setFile(QFile *file) void HttpGet::abort() { http.abort(); - outputFile->close(); + if(!outputFile->fileName().isEmpty()); + outputFile->close(); } @@ -84,45 +99,61 @@ bool HttpGet::getFile(const QUrl &url) qDebug() << "Error: URL has no path" << endl; return false; } - - QString localFileName = outputFile->fileName(); - if (localFileName.isEmpty()) - outputFile->setFileName(QFileInfo(url.path()).fileName()); - - if (!outputFile->open(QIODevice::ReadWrite)) { - qDebug() << "Error: Cannot open " << qPrintable(outputFile->fileName()) - << " for writing: " << qPrintable(outputFile->errorString()) - << endl; - return false; + // if no output file was set write to buffer + if(!outputFile->fileName().isEmpty()) { + if (!outputFile->open(QIODevice::ReadWrite)) { + qDebug() << "Error: Cannot open " << qPrintable(outputFile->fileName()) + << " for writing: " << qPrintable(outputFile->errorString()) + << endl; + return false; + } } - + qDebug() << "starting download to " << qPrintable(outputFile->fileName()); http.setHost(url.host(), url.port(80)); - http.get(url.path(), outputFile); + if(outputFile->fileName().isEmpty()) { + qDebug() << "downloading to buffer"; + getRequest = http.get(QString(url.toEncoded())); + } + else { + qDebug() << "downloading to file"; + getRequest = http.get(QString(url.toEncoded()), outputFile); + } + qDebug() << "request scheduled: GET" << getRequest; + http.close(); return true; } + void HttpGet::httpDone(bool error) { + qDebug() << "bytesAvailable =" << http.bytesAvailable(); if (error) { qDebug() << "Error: " << qPrintable(http.errorString()) << endl; } else { qDebug() << "File downloaded as " << qPrintable(outputFile->fileName()) << endl; } - outputFile->close(); + if(!outputFile->fileName().isEmpty()) + outputFile->close(); + emit done(error); } void HttpGet::httpFinished(int id, bool error) { - qDebug() << "HttpGet::httpFinished"; - qDebug() << "id:" << id << "error:" << error; + qDebug() << "HttpGet::httpFinished(int, bool) =" << id << error; + if(id == getRequest) dataBuffer = http.readAll(); emit requestFinished(id, error); } +void HttpGet::httpStarted(int id) +{ + qDebug() << "HttpGet::httpStarted(int) =" << id; +} + QString HttpGet::errorString() { @@ -132,7 +163,8 @@ QString HttpGet::errorString() void HttpGet::httpResponseHeader(const QHttpResponseHeader &resp) { - qDebug() << "HttpGet::httpResponseHeader()" << resp.statusCode(); + // if there is a network error abort all scheduled requests for + // this download response = resp.statusCode(); if(response != 200) http.abort(); } @@ -142,3 +174,14 @@ int HttpGet::httpResponse() { return response; } + + +void HttpGet::httpState(int state) +{ + QString s[] = {"Unconnected", "HostLookup", "Connecting", "Sending", + "Reading", "Connected", "Closing"}; + if(state <= 6) + qDebug() << "HttpGet::httpState() = " << s[state]; + else qDebug() << "HttpGet::httpState() = " << state; +} + diff --git a/rbutil/rbutilqt/httpget.h b/rbutil/rbutilqt/httpget.h index 1a86e1d4ce..b35133e5fc 100644 --- a/rbutil/rbutilqt/httpget.h +++ b/rbutil/rbutilqt/httpget.h @@ -7,7 +7,7 @@ * \/ \/ \/ \/ \/ * * Copyright (C) 2007 by Dominik Riebeling - * $Id:$ + * $Id$ * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. @@ -39,6 +39,7 @@ class HttpGet : public QObject QString errorString(void); void setFile(QFile*); int httpResponse(void); + QByteArray readAll(void); public slots: void abort(void); @@ -53,11 +54,15 @@ class HttpGet : public QObject void httpProgress(int, int); void httpFinished(int, bool); void httpResponseHeader(const QHttpResponseHeader&); + void httpState(int); + void httpStarted(int); private: QHttp http; QFile *outputFile; int response; + int getRequest; + QByteArray dataBuffer; }; #endif