summaryrefslogtreecommitdiff
path: root/src/vdr-plugin/filedownloader.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vdr-plugin/filedownloader.h')
-rw-r--r--src/vdr-plugin/filedownloader.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/vdr-plugin/filedownloader.h b/src/vdr-plugin/filedownloader.h
new file mode 100644
index 0000000..5a65498
--- /dev/null
+++ b/src/vdr-plugin/filedownloader.h
@@ -0,0 +1,85 @@
+/*
+ * filedownloader.h: Web video plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id$
+ */
+
+#include <sys/select.h>
+#include <curl/curl.h>
+#include <list>
+
+#ifndef __WEBVIDEO_FILEDOWNLOADER_H
+#define __WEBVIDEO_FILEDOWNLOADER_H
+
+// --- iFileDownloadTask ---------------------------------------------------
+
+class iFileDownloadTask {
+public:
+ virtual ~iFileDownloadTask() {};
+ virtual void SetReadCallback(ssize_t (*cb)(void *buf, size_t count, void *data), void *data) = 0;
+ virtual void SetFinishedCallback(void (*cb)(void *data), void *data) = 0;
+};
+
+// --- iAsyncFileDownloaderManager -----------------------------------------
+
+class iAsyncFileDownloaderManager {
+public:
+ virtual ~iAsyncFileDownloaderManager() {};
+ virtual iFileDownloadTask *CreateDownloadTask(const cString& url) = 0;
+ virtual void FDSet(fd_set *readfds, fd_set *writefds, fd_set *excfds, int *maxfd) = 0;
+ virtual void HandleSocket(int fd, int ev_bitmask, long *running_handles) = 0;
+ virtual void CheckForFinished() = 0;
+};
+
+// --- cCurlDownloadTask ---------------------------------------------------
+
+class cCurlMultiManager;
+
+class cCurlDownloadTask : public iFileDownloadTask {
+private:
+ cCurlMultiManager *manager;
+ CURL *curl;
+ ssize_t (*writeCallback)(void *buf, size_t count, void *data);
+ void *writeData;
+ void (*finishCallback)(void *data);
+ void *finishData;
+
+ static size_t ReadWrapper(char *ptr, size_t size, size_t nmemb, void *userdata);
+ size_t ExecuteReadCallback(void *buf, size_t count);
+
+public:
+ cCurlDownloadTask(cCurlMultiManager *manager, const cString& url);
+ virtual ~cCurlDownloadTask();
+
+ CURL *Handle() { return curl; }
+ void MarkFinished(CURLcode result);
+ virtual void SetReadCallback(ssize_t (*cb)(void *buf, size_t count, void *data), void *data) = 0;
+ virtual void SetFinishedCallback(void (*cb)(void *data), void *data) = 0;
+};
+
+// --- cCurlMultiManager ---------------------------------------------------
+
+class cCurlMultiManager : public iAsyncFileDownloaderManager {
+private:
+ CURLM *curlmulti;
+ std::list<cCurlDownloadTask *> activeTasks;
+
+ cCurlDownloadTask *FindByHandle(CURL *handle);
+
+public:
+ cCurlMultiManager();
+ virtual ~cCurlMultiManager();
+
+ CURLM *CurlMultiHandle() { return curlmulti; }
+
+ virtual iFileDownloadTask *CreateDownloadTask(const cString& url);
+ virtual void FDSet(fd_set *readfds, fd_set *writefds, fd_set *excfds, int *maxfd);
+ virtual void HandleSocket(int fd, int ev_bitmask, long *running_handles);
+ virtual void CheckForFinished();
+
+ void RemoveTask(cCurlDownloadTask *task);
+};
+
+#endif