00001 #ifndef MYTHDOWNLOADMANAGER_H
00002 #define MYTHDOWNLOADMANAGER_H
00003
00004 #include <QDateTime>
00005 #include <QTimer>
00006 #include <QMutex>
00007 #include <QNetworkAccessManager>
00008 #include <QNetworkDiskCache>
00009 #include <QNetworkReply>
00010 #include <QNetworkProxy>
00011 #include <QWaitCondition>
00012 #include <QString>
00013
00014 #include "mythbaseexp.h"
00015 #include "mthread.h"
00016
00017 class MythDownloadInfo;
00018 class RemoteFileDownloadThread;
00019
00020 void ShutdownMythDownloadManager(void);
00021
00022
00023 typedef enum MRequestType {
00024 kRequestGet,
00025 kRequestHead,
00026 kRequestPost
00027 } MRequestType;
00028
00029 typedef void (*AuthCallback)(QNetworkReply*, QAuthenticator*, void*);
00030
00031 class MBASE_PUBLIC MythDownloadManager : public QObject, public MThread
00032 {
00033 Q_OBJECT
00034
00035 public:
00036 MythDownloadManager();
00037 ~MythDownloadManager();
00038
00039
00040 void run(void);
00041 void setRunThread(void) { m_runThread = true; }
00042 QThread *getQueueThread(void) { return m_queueThread; }
00043 bool isRunning(void) { return m_isRunning; }
00044
00045
00046 void preCache(const QString &url);
00047 void queueDownload(const QString &url, const QString &dest,
00048 QObject *caller, const bool reload = false);
00049 void queueDownload(QNetworkRequest *req, QByteArray *data,
00050 QObject *caller);
00051 bool download(const QString &url, const QString &dest,
00052 const bool reload = false);
00053 bool download(const QString &url, QByteArray *data,
00054 const bool reload = false);
00055 QNetworkReply *download(const QString &url, const bool reload = false);
00056 bool download(QNetworkRequest *req, QByteArray *data);
00057 bool downloadAuth(const QString &url, const QString &dest,
00058 const bool reload = false,
00059 AuthCallback authCallback = NULL,
00060 void *authArg = NULL, const QByteArray *header = NULL,
00061 const QByteArray *headerVal = NULL);
00062
00063
00064 void queuePost(const QString &url, QByteArray *data, QObject *caller);
00065 void queuePost(QNetworkRequest *req, QByteArray *data, QObject *caller);
00066 bool post(const QString &url, QByteArray *data);
00067 bool post(QNetworkRequest *req, QByteArray *data);
00068 bool postAuth(const QString &url, QByteArray *data,
00069 AuthCallback authCallback, void *authArg,
00070 const QByteArray *header = NULL,
00071 const QByteArray *headerVal = NULL);
00072
00073
00074 void cancelDownload(const QString &url);
00075
00076
00077 void removeListener(QObject *caller);
00078 QDateTime GetLastModified(const QString &url);
00079
00080 void loadCookieJar(const QString &filename);
00081 void saveCookieJar(const QString &filename);
00082 void setCookieJar(QNetworkCookieJar *cookieJar);
00083
00084 QNetworkCookieJar *copyCookieJar(void);
00085 void refreshCookieJar(QNetworkCookieJar *jar);
00086 void updateCookieJar(void);
00087
00088 QString getHeader(const QUrl &url, const QString &header);
00089 QString getHeader(const QNetworkCacheMetaData &cacheData, const QString &header);
00090
00091 private slots:
00092
00093 void downloadFinished(QNetworkReply* reply);
00094 void authCallback(QNetworkReply *reply, QAuthenticator *authenticator);
00095
00096
00097 void downloadError(QNetworkReply::NetworkError errorCode);
00098 void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
00099
00100 private:
00101
00102 void downloadFinished(MythDownloadInfo *dlInfo);
00103
00104
00105 void queueItem(const QString &url, QNetworkRequest *req,
00106 const QString &dest, QByteArray *data, QObject *caller,
00107 const MRequestType reqType = kRequestGet,
00108 const bool reload = false);
00109
00110 bool processItem(const QString &url, QNetworkRequest *req,
00111 const QString &dest, QByteArray *data,
00112 const MRequestType reqType = kRequestGet,
00113 const bool reload = false,
00114 AuthCallback authCallback = NULL,
00115 void *authArg = NULL, const QByteArray *header = NULL,
00116 const QByteArray *headerVal = NULL);
00117
00118 void downloadRemoteFile(MythDownloadInfo *dlInfo);
00119 void downloadQNetworkRequest(MythDownloadInfo *dlInfo);
00120 bool downloadNow(MythDownloadInfo *dlInfo, bool deleteInfo = true);
00121
00122 QUrl redirectUrl(const QUrl& possibleRedirectUrl,
00123 const QUrl& oldRedirectUrl) const;
00124
00125 bool saveFile(const QString &outFile, const QByteArray &data,
00126 const bool append = false);
00127
00128 void updateCookieJar(QNetworkCookieJar *jar);
00129
00130 QNetworkAccessManager *m_manager;
00131 QNetworkDiskCache *m_diskCache;
00132 QNetworkProxy *m_proxy;
00133
00134 QWaitCondition m_queueWaitCond;
00135 QMutex m_queueWaitLock;
00136
00137 QMutex *m_infoLock;
00138 QMap <QString, MythDownloadInfo*> m_downloadInfos;
00139 QMap <QNetworkReply*, MythDownloadInfo*> m_downloadReplies;
00140 QList <MythDownloadInfo*> m_downloadQueue;
00141
00142 QThread *m_queueThread;
00143
00144 bool m_runThread;
00145 bool m_isRunning;
00146
00147 QNetworkCookieJar *m_inCookieJar;
00148 QMutex m_cookieLock;
00149
00150 friend class RemoteFileDownloadThread;
00151 };
00152
00153 MBASE_PUBLIC MythDownloadManager *GetMythDownloadManager(void);
00154
00155 #endif
00156
00157
00158