BALL  1.4.1
simpleDownloader.h
Go to the documentation of this file.
00001 #ifndef BALL_SYSTEM_SIMPLEDOWNLOADER_H
00002 #define BALL_SYSTEM_SIMPLEDOWNLOADER_H
00003 
00004 #ifndef BALL_DATATYPE_STRING_H
00005   #include <BALL/DATATYPE/string.h>
00006 #endif
00007 
00008 #include <QtCore/QThread>
00009 #include <QtCore/QFile>
00010 #include <QtNetwork/QFtp>
00011 
00012 #include <QtNetwork/QNetworkReply>
00013 
00014 class QByteArray;
00015 
00016 namespace BALL
00017 {
00018   namespace SimpleDownloaderHelper
00019   {
00020     class HelperThread;
00021   }
00022 
00033   class BALL_EXPORT SimpleDownloader
00034     : public QObject
00035   {
00036     Q_OBJECT
00037 
00038     public:
00039       /*
00040        * Default Constructor.
00041        *
00042        * @param url The URL to download.
00043        * @param timeout The maximum number of milliseconds the download is allowed to take.
00044        *                default: infinite
00045        */
00046       SimpleDownloader(const String& url, unsigned int timeout = UINT_MAX);
00047 
00048       /*
00049        * Default Constructor.
00050        *
00051        * @param url The URL to download.
00052        * @param timeout The maximum number of milliseconds the download is allowed to take.
00053        *                default: infinite
00054        */
00055       SimpleDownloader(const QUrl& url, unsigned int timeout = UINT_MAX);
00056 
00064       int downloadToBuffer(std::vector<char>& buffer);
00065 
00072       int downloadToFile(const String& path);
00073 
00082       int uploadStringToBuffer(const String& data, std::vector<char>& response);
00083 
00092       int uploadStringToFile(const String& data, const String& response);
00093 
00102       int uploadFileToBuffer(const String& path, std::vector<char>& response);
00103 
00112       int uploadFileToFile(const String& path, const String& response);
00113 
00120       void setTimeout(unsigned int timeout);
00121 
00127       void setURL(const String& url);
00128 
00134       void setURL(const QUrl& url);
00135 
00141       const QUrl& getURL() const;
00142 
00143     private:
00144       int download_(SimpleDownloaderHelper::HelperThread& thread);
00145       int qftpDownloadHack_(QIODevice* iodev);
00146 
00147       QUrl url_;
00148       unsigned int timeout_;
00149   };
00150 
00151   namespace SimpleDownloaderHelper
00152   {
00153     class HelperThread : public QThread
00154     {
00155       public:
00156         HelperThread(const QUrl& url, QByteArray* result, SimpleDownloader* parent);
00157         HelperThread(const QUrl& url, const String& path, SimpleDownloader* parent);
00158 
00159         int getStatus();
00160 
00161       protected:
00162         virtual QNetworkReply* getReply_(QNetworkAccessManager* man) = 0;
00163 
00164         void run();
00165 
00166         int err_;
00167         QUrl url_;
00168         QByteArray* result_;
00169         String path_;
00170         SimpleDownloader* parent_;
00171     };
00172 
00173     class DLThread : public HelperThread
00174     {
00175       public:
00176         DLThread(const QUrl& url, QByteArray* result, SimpleDownloader* parent);
00177         DLThread(const QUrl& url, const String& path, SimpleDownloader* parent);
00178 
00179       protected:
00180         virtual QNetworkReply* getReply_(QNetworkAccessManager* man);
00181     };
00182 
00183     class UPThread : public HelperThread
00184     {
00185       public:
00186         UPThread(const QUrl& url, const QByteArray* data, QByteArray* result, SimpleDownloader* parent);
00187         UPThread(const QUrl& url, const QByteArray* data, const String& path, SimpleDownloader* parent);
00188         UPThread(const QUrl& url, QIODevice* file, QByteArray* result, SimpleDownloader* parent);
00189         UPThread(const QUrl& url, QIODevice* file, const String& path, SimpleDownloader* parent);
00190 
00191       protected:
00192         virtual QNetworkReply* getReply_(QNetworkAccessManager* man);
00193 
00194         const QByteArray* data_;
00195         QIODevice* file_;
00196     };
00197 
00198     class BasicHelper : public QObject
00199     {
00200       Q_OBJECT
00201 
00202       public:
00203         BasicHelper(HelperThread* caller, QNetworkReply* reply);
00204         virtual ~BasicHelper(){}
00205 
00206       public slots:
00207         void error(QNetworkReply::NetworkError error);
00208 #ifndef QT_NO_OPENSSL
00209         void sslErrors(const QList<QSslError>& errors);
00210 #endif
00211         virtual void finished() = 0;
00212 
00213       protected:
00214         HelperThread* caller_;
00215         QNetworkReply* reply_;
00216     };
00217 
00218     class DLArrayHelper : public BasicHelper
00219     {
00220       Q_OBJECT
00221 
00222       public:
00223         DLArrayHelper(HelperThread* caller, QNetworkReply* reply, QByteArray* result);
00224 
00225       public slots:
00226         void finished();
00227 
00228       private:
00229         QByteArray* result_;
00230     };
00231 
00232     class DLHelper : public BasicHelper
00233     {
00234       Q_OBJECT
00235 
00236       public:
00237         DLHelper(HelperThread* caller, QNetworkReply* reply, const String& path);
00238 
00239       public slots:
00240         void finished();
00241         void receivedData();
00242 
00243       private:
00244         QFile file_;
00245     };
00246 
00247 
00248     // We need this due to a bug in QNetworkAccessManager that basically
00249     // screws up the FTP download code. This should be fixed upstream with
00250     // the advent of Qt5
00251 
00252     class QFtpHackHelper;
00253 
00254     class QFtpHackThread : public QThread
00255     {
00256       Q_OBJECT
00257 
00258       public:
00259         QFtpHackThread(const QUrl& url, QIODevice* iodev, SimpleDownloader* parent);
00260         ~QFtpHackThread();
00261 
00262       protected:
00263         void run();
00264 
00265       private:
00266         QFtp* ftp_;
00267         QFtpHackHelper* helper_;
00268         QUrl url_;
00269         QIODevice* iodev_;
00270         SimpleDownloader* parent_;
00271     };
00272 
00273     class QFtpHackHelper : public QObject
00274     {
00275       Q_OBJECT
00276 
00277       public:
00278         QFtpHackHelper(QFtpHackThread* th);
00279 
00280       public slots:
00281         void done(bool error);
00282 
00283       private:
00284         QFtpHackThread* th_;
00285     };
00286 
00287   }
00288 }
00289 
00290 #endif //BALL_SYSTEM_SIMPLEDOWNLOADER_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines