summaryrefslogtreecommitdiff
path: root/src/vdr-plugin/timer.h
blob: 3db0d8c6824a2aa8332254e66271d86156e05692 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 * timer.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_TIMER_H
#define __WEBVIDEO_TIMER_H

#include <time.h>
#include <stdio.h>
#include <vdr/tools.h>
#include "request.h"

#define REQ_ID_TIMER -2
#define DEFAULT_TIMER_INTERVAL 7*24*60*60
#define RETRY_TIMER_INTERVAL 60*60
#define MIN_TIMER_INTERVAL 10*60
#define MAX_TIMER_HISTORY_SIZE 2000

class cWebviTimerManager;
class iAsyncFileDownloaderManager;

// --- cWebviTimer -----------------------------------------------

class cWebviTimer : public cListObject {
private:
  int id;
  char *title;
  char *reference;

  time_t lastUpdate;
  int interval;

  bool running;
  cStringList activeStreams;
  bool lastSucceeded;
  char *lastError;

  cWebviTimerManager *parent;

public:
  cWebviTimer(int ID, const char *title, const char *ref,
              cWebviTimerManager *manager,
              time_t last=0, int interval=DEFAULT_TIMER_INTERVAL,
              bool success=true, const char *errmsg=NULL);
  ~cWebviTimer();

  int GetID() const { return id; }
  void SetTitle(const char *newTitle);
  const char *GetTitle() const { return title; }
  void SetInterval(int interval);
  int GetInterval() const;
  const char *GetReference() const { return reference; }

  time_t LastUpdate() const { return lastUpdate; }
  time_t NextUpdate() const;

  void SetError(const char *errmsg);
  bool Success() const { return lastSucceeded; }
  const char *LastError() const;

  void Execute();
  bool Running() { return running; }
  void DownloadStreams(const char *menuxml, cProgressVector& summaries);
  void CheckFailed(const char *errmsg);
  void RequestFinished(const char *ref, const char *errmsg);
};

// --- cWebviTimerManager ----------------------------------------

class cWebviTimerManager {
private:
  cList<cWebviTimer> timers;
  int nextID;
  cStringList refHistory;
  bool modified;
  bool disableSaving;
  bool convertTemplatePaths;

  cWebviTimerManager();
  ~cWebviTimerManager() {};
  cWebviTimerManager(const cWebviTimerManager &);             // intentionally undefined
  cWebviTimerManager &operator=(const cWebviTimerManager &);  // intentionally undefined

  void LoadTimers(FILE *f);
  void LoadHistory(FILE *f);
  void SaveTimers(FILE *f, const char *version);
  void SaveHistory(FILE *f);
 
  char *UpgradedTemplatePath(char *ref);
  void ConvertTimerHistoryTemplates();

public:
  static cWebviTimerManager &Instance();

  bool Load(const char *path);
  bool Save(const char *path, const char *version);

  cWebviTimer *Create(const char *title, const char *reference,
                      bool getExisting=true);
  void Remove(cWebviTimer *timer);
  cWebviTimer *First() const { return timers.First(); }
  cWebviTimer *Next(const cWebviTimer *cur) const { return timers.Next(cur); }
  cWebviTimer *GetLinear(int idx) const { return timers.Get(idx); }
  cWebviTimer *GetByID(int id) const;
  void SetModified() { modified = true; }

  void Update();
  void MarkDownloaded(const char *ref);
  bool AlreadyDownloaded(const char *ref);
};

#endif