summaryrefslogtreecommitdiff
path: root/menu.h
diff options
context:
space:
mode:
Diffstat (limited to 'menu.h')
-rw-r--r--menu.h522
1 files changed, 522 insertions, 0 deletions
diff --git a/menu.h b/menu.h
new file mode 100644
index 0000000..afde73e
--- /dev/null
+++ b/menu.h
@@ -0,0 +1,522 @@
+/*
+ * menu.h: EPG2VDR plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ */
+
+#ifndef __EPG2VDR_MENU_H
+#define __EPG2VDR_MENU_H
+
+#include <vdr/osdbase.h>
+#include <vdr/menuitems.h>
+
+#include "lib/common.h"
+#include "lib/db.h"
+#include "lib/epgservice.h"
+#include "lib/searchtimer.h"
+
+#include "menu.h"
+#include "ttools.h"
+#include "parameters.h"
+
+class cMenuEpgEditTimer;
+class cTimerData;
+
+//***************************************************************************
+//
+//***************************************************************************
+
+#define NEWTIMERLIMIT 60 // seconds until the start time of a new timer created from the Schedule menu,
+ // within which it will go directly into the "Edit timer" menu to allow
+ // further parameter settings
+
+#define MAXCHNAMWIDTH 16 // maximum number of characters of channels' short names shown in schedules menus
+
+#if defined (APIVERSNUM) && (APIVERSNUM >= 20301)
+# define CHNUMWIDTH (numdigits(cChannels::MaxNumber()) + 1)
+# define CHNAMWIDTH (std::min(MAXCHNAMWIDTH, cChannels::MaxShortChannelNameLength() + 1))
+#else
+# define CHNUMWIDTH (numdigits(Channels.MaxNumber()) + 1)
+# define CHNAMWIDTH (std::min(MAXCHNAMWIDTH, Channels.MaxShortChannelNameLength() + 1))
+#endif
+
+//***************************************************************************
+// Class cMenuDb
+//***************************************************************************
+
+class cMenuDb : public cParameters
+{
+ friend class cMenuEpgEvent;
+ friend class cMenuEpgEditTimer;
+ friend class cMenuEpgWhatsOn;
+ friend class cMenuEpgSchedule;
+ friend class cMenuEpgTimers;
+ friend class cMenuEpgSearchTimers;
+ friend class cEpgMenuDones;
+ friend class cEpgMenuSearchTimerEdit;
+ friend class cMenuEpgMatchRecordings;
+ friend class cEpgMenuSearchResult;
+ friend class cMenuSetupEPG2VDR;
+
+ public:
+
+ cMenuDb();
+ virtual ~cMenuDb();
+
+ int initDb();
+ int exitDb();
+
+ int initUserTimes();
+ int initUserList(char**& userList, int& count, long int& loginEnabled);
+ int lookupTimer(const cEvent* event, int& timerMatch, int& remote, int force = no);
+
+ // timer db
+
+ int createTimer(cDbRow* timerRow, const char* destUuid);
+ int modifyTimer(cDbRow* timerRow, const char* destUuid = 0);
+ int deleteTimer(long timerid);
+
+ //
+
+ int triggerVdrs(const char* trg, const char* uuid = "", const char* options = "");
+ int triggerVdr(const char* uuid, const char* trg, const char* options = "");
+
+ protected:
+
+ virtual int dbConnected(int force = no)
+ {
+ return dbInitialized
+ && connection
+ && (!force || connection->check() == success);
+ }
+
+ // data
+
+ long webLoginEnabled;
+ std::string user;
+ long startWithSched;
+
+ cUserTimes* userTimes;
+ char** vdrList;
+ char** vdrUuidList;
+ int vdrCount;
+
+ // database
+
+ int dbInitialized;
+ cDbConnection* connection;
+
+ cDbTable* timerDb;
+ cDbTable* vdrDb;
+ cDbTable* timerDoneDb;
+ cDbTable* userDb;
+ cDbTable* searchtimerDb;
+ cDbTable* recordingListDb;
+ cDbTable* useeventsDb;
+
+ cDbStatement* selectTimers;
+ cDbStatement* selectMaxUpdSp;
+ cDbStatement* selectTimerById;
+ cDbStatement* selectActiveVdrs;
+ cDbStatement* selectAllVdrs;
+ cDbStatement* selectDoneTimerByState;
+ cDbStatement* selectAllUser;
+ cDbStatement* selectSearchTimers;
+ cDbStatement* selectSearchTimerByName;
+ cDbStatement* selectDoneTimerByStateTitleOrder;
+ cDbStatement* selectDoneTimerByStateTimeOrder;
+ cDbStatement* selectRecordingForEvent;
+ cDbStatement* selectRecordingForEventByLv;
+
+ cSearchTimer* search;
+
+ cDbValue valueStartTime;
+ cDbValue timerState;
+ cDbValue timerAction;
+
+ class cTimerInfo : public cListObject
+ {
+ public:
+
+ uint timerid;
+ char state;
+ time_t starttime;
+ uint eventid;
+ char channelid[100];
+ char uuid[sizeUuid+TB];
+ };
+
+ cList<cTimerInfo> timers;
+ int timersCacheMaxUpdsp;
+};
+
+//***************************************************************************
+// Class cMenuEditTimer
+//***************************************************************************
+
+class cMenuEpgEditTimer : public cOsdMenu
+{
+ public:
+
+ cMenuEpgEditTimer(cMenuDb* db, cEpgTimer* Timer, bool New = no);
+ virtual ~cMenuEpgEditTimer();
+
+ virtual eOSState ProcessKey(eKeys Key);
+
+ protected:
+
+ eOSState SetFolder();
+ void SetFirstDayItem();
+ void SetHelpKeys();
+
+ public:
+
+ class cTimerData
+ {
+ public:
+
+ cTimerData(cMenuDb* p) { memset(this, 0, sizeof(cTimerData)); db = p; }
+ ~cTimerData() { free(aux); }
+
+ const char* getVdrName() { return db->vdrList[vdrIndex]; }
+ const char* getVdrUuid() { return db->vdrUuidList[vdrIndex]; }
+ const char* getLastVdrUuid() { return lastVdrUuid; }
+ long TimerId() { return timerid; }
+
+ //**************************************************
+ // From Timer
+ //**************************************************
+
+ void fromTimer(cEpgTimer* Timer, bool New = no)
+ {
+ weekdays = Timer->WeekDays();
+ start = Timer->Start();
+ stop = Timer->Stop();
+ priority = Timer->Priority();
+ lifetime = Timer->Lifetime();
+ flags = Timer->Flags();
+ channel = Timer->Channel();
+ day = Timer->Day();
+ strcpy(file, Timer->File());
+ vdrIndex = 0;
+ free(aux); aux = 0;
+
+ if (New)
+ flags |= tfActive;
+
+ if (!isEmpty(Timer->Aux()))
+ aux = strdup(Timer->Aux());
+
+ timerid = Timer->TimerId();
+ eventid = Timer->EventId();
+ state = Timer->State();
+ sprintf(stateInfo, "%.300s", Timer->StateInfo());
+ action = Timer->Action();
+ strcpy(lastVdrUuid, Timer->VdrUuid());
+
+ for (int i = 0; i < db->vdrCount; i++)
+ if (strncmp(db->vdrList[i], Timer->VdrName(), strlen(db->vdrList[i])-1) == 0)
+ vdrIndex = i;
+
+#ifdef WITH_PIN
+ fskProtection = Timer->FskProtection();
+#endif
+ }
+
+ int toRow(cDbRow* timerRow)
+ {
+ timerRow->clear();
+
+ timerRow->setValue("ID", timerid);
+ timerRow->setValue("VDRUUID", lastVdrUuid);
+ timerRow->setValue("ACTIVE", (int)flags & tfActive);
+ timerRow->setValue("CHILDLOCK", fskProtection);
+ timerRow->setValue("CHANNELID", channel->GetChannelID().ToString());
+ timerRow->setValue("FILE", file);
+ timerRow->setValue("VPS", (int)flags & tfVps);
+ timerRow->setValue("DAY", day);
+ timerRow->setValue("WEEKDAYS", weekdays);
+ timerRow->setValue("STARTTIME", start);
+ timerRow->setValue("ENDTIME", stop);
+ timerRow->setValue("PRIORITY", priority);
+ timerRow->setValue("LIFETIME", lifetime);
+ timerRow->setValue("EVENTID", eventid);
+
+ return done;
+ }
+
+ long timerid;
+ long eventid;
+ int weekdays; // bitmask, lowest bits: SSFTWTM (the 'M' is the LSB)
+ int start;
+ int stop;
+ int priority;
+ int fskProtection;
+ int lifetime;
+ uint flags;
+ char state;
+ char stateInfo[300+TB];
+ char action;
+ int vdrIndex;
+ const cChannel* channel;
+ mutable time_t day;
+ mutable char file[NAME_MAX*2 + TB]; // *2 to be able to hold 'title' and 'episode', which can each be up to 255 characters long
+ char* aux;
+
+ cMenuDb* db;
+ char lastVdrUuid[sizeUuid+TB];
+ };
+
+ protected:
+
+ cMenuDb* menuDb;
+ cTimerData data;
+ int channelNr;
+ cMenuEditStrItem* file;
+ cMenuEditDateItem* day;
+ cMenuEditDateItem* firstday;
+};
+
+//***************************************************************************
+// class cEpgMenuTextItem
+//***************************************************************************
+
+class cEpgMenuTextItem : public cOsdItem
+{
+ public:
+
+ cEpgMenuTextItem(long aId, const char* text)
+ {
+ cid = 0;
+ id = aId;
+ SetText(text);
+ }
+
+ cEpgMenuTextItem(const char* aId, const char* text)
+ {
+ cid = strdup(aId);
+ SetText(text);
+ }
+
+ virtual ~cEpgMenuTextItem() { free(cid); }
+
+ long getId() { return id; }
+ const char* getCharId() { return cid; }
+
+ protected:
+
+ long id;
+ char* cid;
+};
+
+//***************************************************************************
+// Class cMenuEpgTimers
+//***************************************************************************
+
+class cMenuEpgTimers : public cOsdMenu
+{
+ public:
+
+ cMenuEpgTimers();
+ virtual ~cMenuEpgTimers();
+
+ virtual eOSState ProcessKey(eKeys Key);
+ int refresh();
+
+ private:
+
+ eOSState edit();
+ eOSState create();
+ eOSState remove();
+ eOSState toggleState();
+ eOSState info();
+ cEpgTimer* currentTimer();
+ void SetHelpKeys();
+
+ cMenuDb* menuDb;
+ int helpKeys;
+ int timersMaxUpdsp;
+};
+
+//***************************************************************************
+// Class cMenuEpgSearchTimers
+//***************************************************************************
+
+class cMenuEpgSearchTimers : public cOsdMenu
+{
+ public:
+
+ cMenuEpgSearchTimers();
+ virtual ~cMenuEpgSearchTimers();
+
+ virtual eOSState ProcessKey(eKeys Key);
+ int refresh();
+ void setHelpKeys();
+
+ private:
+
+ cMenuDb* menuDb;
+ int helpKeys;
+};
+
+//***************************************************************************
+// Class cMenuEpgEvent
+//***************************************************************************
+
+class cMenuEpgEvent : public cOsdMenu
+{
+ public:
+
+ cMenuEpgEvent(cMenuDb* db, const cEvent* Event, const cSchedules* schedules,
+ int timerMatch, bool DispSchedule, bool CanSwitch = false);
+ virtual void Display(void);
+ virtual eOSState ProcessKey(eKeys Key);
+ virtual const char* MenuKind() { return "MenuEvent"; }
+
+ private:
+
+ const cEvent* getNextPrevEvent(const cEvent* event, int step);
+ int setEvent(const cEvent* Event, int timerMatch);
+
+ cMenuDb* menuDb;
+ const cSchedules* schedules;
+ const cEvent* event;
+ bool dispSchedule;
+ bool canSwitch;
+
+ std::string prevTime;
+ std::string nextTime;
+};
+
+//***************************************************************************
+// Class cMenuEpgScheduleItem
+//***************************************************************************
+
+class cMenuEpgScheduleItem : public cOsdItem
+{
+ public:
+
+ enum eScheduleSortMode { ssmAllThis, ssmThisThis, ssmThisAll, ssmAllAll }; // "which event(s) on which channel(s)"
+
+ cMenuEpgScheduleItem(cMenuDb* db, const cEvent* Event, const cChannel* Channel = 0, bool WithDate = no);
+
+ static void SetSortMode(eScheduleSortMode SortMode) { sortMode = SortMode; }
+ static void IncSortMode() { sortMode = eScheduleSortMode((sortMode == ssmAllAll) ? ssmAllThis : sortMode + 1); }
+ static eScheduleSortMode SortMode() { return sortMode; }
+
+ virtual int Compare(const cListObject &ListObject) const;
+ virtual bool Update(bool Force = false);
+ virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
+
+ const cEvent* event;
+ const cChannel* channel;
+ bool withDate;
+ int timerMatch;
+
+ private:
+
+ cMenuDb* menuDb;
+ static eScheduleSortMode sortMode;
+};
+
+//***************************************************************************
+// Class cMenuEpgWhatsOn
+//***************************************************************************
+
+class cMenuEpgWhatsOn : public cOsdMenu
+{
+ public:
+
+ cMenuEpgWhatsOn(const cEvent* aSearchEvent = 0);
+ ~cMenuEpgWhatsOn();
+
+ static int CurrentChannel() { return currentChannel; }
+ static void SetCurrentChannel(int ChannelNr) { currentChannel = ChannelNr; }
+ virtual eOSState ProcessKey(eKeys Key);
+ virtual void Display();
+
+ private:
+
+ int LoadAt();
+ int LoadSearch(const cUserTimes::UserTime* userTime);
+ int LoadSchedule();
+ int LoadQuery(const cEvent* searchEvent);
+
+ bool canSwitch;
+ int helpKeys;
+ time_t helpKeyTime;
+ int helpKeyTimeMode;
+ int timerState;
+ eOSState Record();
+ eOSState Switch();
+ bool Update();
+ void SetHelpKeys();
+
+ cMenuDb* menuDb;
+ const cSchedules* schedules;
+#if defined (APIVERSNUM) && (APIVERSNUM >= 20301)
+ cStateKey schedulesKey;
+#else
+ cSchedulesLock* schedulesLock;
+#endif
+ const cEvent* searchEvent;
+ int dispSchedule;
+
+ static int currentChannel;
+ static const cEvent* scheduleEvent;
+};
+
+//***************************************************************************
+// class cEpgMenuDones
+//***************************************************************************
+
+class cEpgMenuDones : public cOsdMenu
+{
+ public:
+
+ enum JournalFilter
+ {
+ jfAll = 0,
+
+ jfFirst = 1,
+ jfRecorded = jfFirst,
+ jfCreated,
+ jfFailed,
+ jfDeleted,
+
+ jfCount
+ };
+
+ cEpgMenuDones();
+ virtual ~cEpgMenuDones();
+ virtual eOSState ProcessKey(eKeys Key);
+
+ protected:
+
+ int refresh();
+ void setHelp();
+
+ // data
+
+ cMenuDb* menuDb;
+ int journalFilter;
+ int order;
+};
+
+//***************************************************************************
+// class cMenuEpgMatchRecordings
+//***************************************************************************
+
+class cMenuEpgMatchRecordings : public cOsdMenu
+{
+ public:
+
+ cMenuEpgMatchRecordings(cMenuDb* db, const cEvent* event);
+ virtual ~cMenuEpgMatchRecordings() {};
+ virtual eOSState ProcessKey(eKeys Key);
+};
+
+//***************************************************************************
+
+#endif // __EPG2VDR_MENU_H