summaryrefslogtreecommitdiff
path: root/src/vdr-plugin/request.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vdr-plugin/request.h')
-rw-r--r--src/vdr-plugin/request.h170
1 files changed, 170 insertions, 0 deletions
diff --git a/src/vdr-plugin/request.h b/src/vdr-plugin/request.h
new file mode 100644
index 0000000..f481fc8
--- /dev/null
+++ b/src/vdr-plugin/request.h
@@ -0,0 +1,170 @@
+/*
+ * request.h: Web video plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id$
+ */
+
+#ifndef __WEBVIDEO_REQUEST_H
+#define __WEBVIDEO_REQUEST_H
+
+#include <vdr/tools.h>
+#include <vdr/thread.h>
+#include <libwebvi.h>
+#include "buffer.h"
+
+enum eRequestType { REQT_NONE, REQT_MENU, REQT_FILE, REQT_STREAM, REQT_TIMER };
+
+class cFileDownloadRequest;
+class cWebviTimer;
+
+// --- cDownloadProgress ---------------------------------------------------
+
+class cDownloadProgress {
+private:
+ const static int NAME_LEN = 128;
+
+ char name[NAME_LEN];
+ long downloaded;
+ long total;
+ int statusCode;
+ cString statusPharse;
+ cFileDownloadRequest *req;
+ cMutex mutex;
+public:
+ cDownloadProgress();
+
+ void AssociateWith(cFileDownloadRequest *request);
+ void SetContentLength(long bytes);
+ void SetTitle(const char *title);
+ void Progress(long downloadedbytes);
+ void MarkDone(int errorcode, cString pharse);
+ bool IsFinished();
+
+ cString GetTitle();
+ cString GetPercentage();
+ cString GetStatusPharse();
+ bool Error();
+ cFileDownloadRequest *GetRequest() { return req; }
+};
+
+// --- cProgressVector -----------------------------------------------------
+
+class cProgressVector : public cVector<cDownloadProgress *> {
+public:
+ cDownloadProgress *NewDownload();
+};
+
+// --- cMenuRequest ----------------------------------------------------
+
+class cMenuRequest {
+private:
+ int reqID;
+ bool aborted;
+ bool finished;
+ int status;
+ cString statusPharse;
+
+protected:
+ WebviCtx webvi;
+ WebviHandle handle;
+ char *wvtref;
+ cMemoryBuffer inBuffer;
+ cWebviTimer *timer;
+
+ virtual ssize_t WriteData(const char *ptr, size_t len);
+ virtual WebviHandle PrepareHandle();
+ static ssize_t WriteCallback(const char *ptr, size_t len, void *request);
+
+ char *ExtractSiteName(const char *ref);
+ void AppendQualityParamsToRef();
+
+public:
+ cMenuRequest(int ID, const char *wvtreference);
+ virtual ~cMenuRequest();
+
+ int GetID() { return reqID; }
+ WebviHandle GetHandle() { return handle; }
+ const char *GetReference() { return wvtref; }
+
+ bool Start(WebviCtx webvictx);
+ virtual void RequestDone(int errorcode, cString pharse);
+ bool IsFinished() { return finished; }
+ void Abort();
+ bool IsAborted() { return aborted; }
+
+ // Return true if the lastest status code indicates success.
+ bool Success();
+ // Return the status code
+ int GetStatusCode() { return status; }
+ // Return the response pharse
+ cString GetStatusPharse();
+
+ virtual eRequestType GetType() { return REQT_MENU; }
+
+ // Return the content of the reponse message
+ virtual cString GetResponse();
+
+ void SetTimer(cWebviTimer *t) { timer = t; }
+ cWebviTimer *GetTimer() { return timer; }
+};
+
+// --- cFileDownloadRequest ------------------------------------------------
+
+class cFileDownloadRequest : public cMenuRequest {
+private:
+ char *destdir;
+ char *title;
+ long bytesDownloaded;
+ long contentLength;
+ cUnbufferedFile *destfile;
+ cDownloadProgress *progressUpdater;
+
+protected:
+ virtual WebviHandle PrepareHandle();
+ virtual ssize_t WriteData(const char *ptr, size_t len);
+ bool OpenDestFile();
+ char *GetExtension(const char *contentType, const char *url);
+
+public:
+ cFileDownloadRequest(int ID, const char *streamref,
+ const char *destdir,
+ cDownloadProgress *progress);
+ virtual ~cFileDownloadRequest();
+
+ eRequestType GetType() { return REQT_FILE; }
+ void RequestDone(int errorcode, cString pharse);
+};
+
+// --- cStreamUrlRequest ---------------------------------------------------
+
+class cStreamUrlRequest : public cMenuRequest {
+protected:
+ virtual WebviHandle PrepareHandle();
+
+public:
+ cStreamUrlRequest(int ID, const char *ref);
+
+ eRequestType GetType() { return REQT_STREAM; }
+};
+
+// --- cTimerRequest -------------------------------------------------------
+
+class cTimerRequest : public cMenuRequest {
+public:
+ cTimerRequest(int ID, const char *ref);
+
+ eRequestType GetType() { return REQT_TIMER; }
+};
+
+// --- cRequestVector ------------------------------------------------------
+
+class cRequestVector : public cVector<cMenuRequest *> {
+public:
+ cRequestVector(int Allocated = 10) : cVector<cMenuRequest *>(Allocated) {}
+
+ cMenuRequest *FindByHandle(WebviHandle handle);
+};
+
+#endif