summaryrefslogtreecommitdiffstats
path: root/rbutil
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2007-08-14 22:47:01 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2007-08-14 22:47:01 +0000
commit07e4ddb79da7d0c3e0b4819ef8e7fc89adbae0aa (patch)
tree83b34502679388be4286c37aaf688d29f9d4c1de /rbutil
parentcacd38296386c499293f9f6be4d4f369c103422c (diff)
downloadrockbox-07e4ddb79da7d0c3e0b4819ef8e7fc89adbae0aa.tar.gz
rockbox-07e4ddb79da7d0c3e0b4819ef8e7fc89adbae0aa.zip
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
Diffstat (limited to 'rbutil')
-rw-r--r--rbutil/rbutilqt/httpget.cpp81
-rw-r--r--rbutil/rbutilqt/httpget.h7
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