summaryrefslogtreecommitdiff
path: root/menuundelete.c
diff options
context:
space:
mode:
Diffstat (limited to 'menuundelete.c')
-rw-r--r--menuundelete.c802
1 files changed, 472 insertions, 330 deletions
diff --git a/menuundelete.c b/menuundelete.c
index 8164b5d..ec8abc6 100644
--- a/menuundelete.c
+++ b/menuundelete.c
@@ -3,33 +3,32 @@
*
* See the README file for copyright information and how to reach the author.
*
- * $Id: menuundelete.c 0.3 2005/10/04 12:35:20 hflor Exp $
+ * $Id: menuundelete.c 0.5 2005/11/17 21:05:05 hflor Exp $
*/
#include "menuundelete.h"
#if VDRVERSNUM < 10307
-#include "menuitemtext.h"
+ #include "menutext.h"
#endif
#include "undelete.h"
+#include "menudispkey.h"
#include "i18n.h"
#include "vdrtools.h"
#include <vdr/interface.h>
#include <vdr/videodir.h>
#include <vdr/remote.h>
-#include <vdr/recording.h>
#ifdef HAVE_ICONPATCH
-#include <vdr/iconpatch.h>
-#endif
-
-#ifndef RECEXT
-#define RECEXT ".rec"
-#define DELEXT ".del"
+ #include <vdr/iconpatch.h>
#endif
+#include <typeinfo>
// --- cMenuRecordingSelectItem --------------------------------------------------------
cMenuRecordingSelectItem::cMenuRecordingSelectItem(cRecording *Recording, int Level)
{
+#ifdef UND_Debug
+ objID = ++cMenuRecordingSelectItem_nextID;
+#endif
filename = strdup(Recording->FileName());
totalEntries = newEntries = 0;
start = Recording->start;
@@ -39,20 +38,27 @@ cMenuRecordingSelectItem::cMenuRecordingSelectItem(cRecording *Recording, int Le
else
name = strdup(Recording->Name());
level = Level;
-#ifdef UND_Debug2
- dsyslog("%s: cMenuRecordingSelectItem::cMenuRecordingSelectItem FileName=%s Level=%d Name=%s", plugin_name, filename, level, name);
-#endif
+ d2syslog("cMenuRecordingSelectItem::cMenuRecordingSelectItem", "FileName=%s Level=%d Name=%s", filename, level, name);
}
cMenuRecordingSelectItem::~cMenuRecordingSelectItem()
{
-#ifdef UND_Debug2
- dsyslog("%s: cMenuRecordingSelectItem::~cMenuRecordingSelectItem FileName=%s Name=%s", plugin_name, filename, name);
-#endif
- FREENULL(filename);
- FREENULL(name);
+ d2syslog("cMenuRecordingSelectItem::~cMenuRecordingSelectItem", "FileName=%s Name=%s", filename, name);
+ freenull(filename);
+ freenull(name);
}
+#if VDRVERSNUM >= 10315
+int cMenuRecordingSelectItem::compare(const cListObject &ListObject) const
+{
+ cMenuRecordingSelectItem *temp = (cMenuRecordingSelectItem *)&ListObject;
+ if (isdir != temp->isdir)
+ return isdir ? -1 : 1;
+ if (isdir)
+ return strcasecmp(name, temp->name);
+ return start == temp->start ? 0 : start < temp->start ? -1 : 1;
+}
+#else
bool cMenuRecordingSelectItem::operator< (const cListObject &ListObject)
{
cMenuRecordingSelectItem *temp = (cMenuRecordingSelectItem *)&ListObject;
@@ -62,6 +68,7 @@ bool cMenuRecordingSelectItem::operator< (const cListObject &ListObject)
return strcasecmp(name, temp->name) < 0;
return start < temp->start;
}
+#endif
void cMenuRecordingSelectItem::IncrementCounter(bool New)
{
@@ -71,16 +78,12 @@ void cMenuRecordingSelectItem::IncrementCounter(bool New)
char *buffer = NULL;
asprintf(&buffer, "%d\t%d\t%s", totalEntries, newEntries, name);
SetText(buffer, false);
-#ifdef UND_Debug2
- dsyslog("%s: cMenuRecordingSelectItem::IncrementCounter FileName=%s New=%s Buffer=%s", plugin_name, filename, New ? "true" : "false", buffer);
-#endif
+ d2syslog("cMenuRecordingSelectItem::IncrementCounter", "FileName=%s New=%s Buffer=%s", filename, New ? "true" : "false", buffer);
}
void cMenuRecordingSelectItem::RefreshCounter(void)
{
-#ifdef UND_Debug2
- dsyslog("%s: cMenuRecordingSelectItem::RefeshCounter FileName=%s", plugin_name, filename);
-#endif
+ d2syslog("cMenuRecordingSelectItem::RefeshCounter", "FileName=%s", filename);
if (isdir)
{
char *dirname = DirName();
@@ -89,20 +92,22 @@ void cMenuRecordingSelectItem::RefreshCounter(void)
totalEntries = 0;
newEntries = 0;
for (cRecording *recording = DeletedRecordings.First(); recording; recording = DeletedRecordings.Next(recording))
- if (strncmp(recording->FileName(), dirname, strlen(dirname)) == 0)
- IncrementCounter(recording->IsNew());
+ if (!strncmp(recording->FileName(), dirname, strlen(dirname)))
+ if (strchr(recording->FileName() + strlen(dirname), '/'))
+ IncrementCounter(recording->IsNew());
free(dirname);
}
}
}
-char *cMenuRecordingSelectItem::DirName(void)
+char *cMenuRecordingSelectItem::DirName(bool Parent)
{
- if (isdir)
+ char *temp = NULL;
+ if (isdir || Parent)
{
- char *temp = strdup(filename);
+ temp = strdup(filename);
char *last = temp + strlen(VideoDirectory) + 1;
- for (int i = level; *last && i >= 0; i--)
+ for (int i = level; *last && i >= Parent ? -1 : 0; i--)
{
last = strchr(last, '/');
if (!last)
@@ -111,31 +116,29 @@ char *cMenuRecordingSelectItem::DirName(void)
}
if (last)
*last = 0;
- return temp;
- } else
- return NULL;
+ }
+ d2syslog("cMenuRecordingSelectItem::DirName", "Level=%d Parent=%s DirName=%s", level, Parent ? "yes" : "no", temp ? temp : "(NULL)");
+ return temp;
}
// --- cMenuRecordingSelect --------------------------------------------------------
-cMenuRecordingSelect::cMenuRecordingSelect(const char *Base, int Level, bool OpenSubMenus)
+cMenuRecordingSelect::cMenuRecordingSelect(const char *Base, int Level)
+#if VDRVERSNUM >= 10307
+:cOsdMenu(Base ? Base : tr("Deleted Recordings"), 9, 6, 6)
+#else
:cOsdMenu(Base ? Base : tr("Deleted Recordings"), 6, 6, 6)
-{
-#ifdef UND_Debug2
- dsyslog("%s: cMenuRecordingSelect::cMenuRecordingSelect Base=%s Level=%d OpenSubMenus=%s", plugin_name, Base, Level, OpenSubMenus ? "true" : "false");
#endif
-#if VDRVERSNUM < 10307
-#ifdef HAVE_ELCHI
- Interface->Status(tr("Display$prepare recording display..."), Setup.Theme == themeVanilla ? clrBlack : (eDvbColor)fginfofont, Setup.Theme == themeVanilla ? clrCyan : clrInfoLine);
-#else
- Interface->Status(tr("Display$prepare recording display..."));
+{
+#ifdef UND_Debug
+ objID = ++cMenuRecordingSelect_nextID;
#endif
- Interface->Flush();
-#else
+ d2syslog("cMenuRecordingSelect::cMenuRecordingSelect", "Base=%s Level=%d", Base, Level);
STATUS(tr("Display$prepare recording display..."));
-#endif
base = Base ? strdup(Base) : NULL;
level = Level;
+ top_line[0] = top_line[1] = bottom_line[0] = bottom_line[1] = false;
+
Display();
cMenuRecordingSelectItem *LastItem = NULL;
char *LastItemText = NULL;
@@ -144,11 +147,11 @@ cMenuRecordingSelect::cMenuRecordingSelect(const char *Base, int Level, bool Ope
if (!Base || (strstr(recording->Name(), Base) == recording->Name() && recording->Name()[strlen(Base)] == '~'))
{
cMenuRecordingSelectItem *Item = new cMenuRecordingSelectItem(recording, level);
- if (*Item->Text() && (!LastItem || strcmp(Item->Text(), LastItemText) != 0))
+ if (*Item->Text() && (!LastItem || strcmp(Item->Text(), LastItemText)))
{
Add(Item);
LastItem = Item;
- FREENULL(LastItemText);
+ freenull(LastItemText);
LastItemText = strdup(LastItem->Text());
} else
delete Item;
@@ -159,232 +162,400 @@ cMenuRecordingSelect::cMenuRecordingSelect(const char *Base, int Level, bool Ope
}
}
}
- free(LastItemText);
- LastItem = Current() < 0 ? NULL : (cMenuRecordingSelectItem *)Get(Current());
+ freenull(LastItemText);
Sort();
- if (LastItem)
- {
- SetCurrent(LastItem);
- if (OpenSubMenus && Open(true) == osContinue)
- return;
- } else
- SetCurrent(First());
+ AddFunctionLines();
+ d1listlog("cMenuRecordingSelect::cMenuRecordingSelect");
+ SetCurrent(First());
SetHelpKeys();
}
cMenuRecordingSelect::~cMenuRecordingSelect()
{
-#ifdef UND_Debug2
- dsyslog("%s: cMenuRecordingSelect::~cMenuRecordingSelect Base=%s Level=%d", plugin_name, base, level);
-#endif
- FREENULL(base);
+ d2syslog("cMenuRecordingSelect::~cMenuRecordingSelect", "Base=%s Level=%d", base, level);
+ freenull(base);
}
-void cMenuRecordingSelect::SetHelpKeys(void)
+bool cMenuRecordingSelect::IsMenuRecordingSelectItem(cOsdItem *Item)
{
-#ifdef UND_Debug2
- dsyslog("%s: cMenuRecordingSelect::SetHelpKeys", plugin_name);
-#endif
-
- cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
- if (ri)
- {
- if (ri->IsDirectory())
- SetHelp(tr("Open"), tr("Undelete"), tr("Delete"), NULL);
- else
- {
- cRecording *recording = GetRecording(ri);
-#if VDRVERSNUM >= 10325
- SetHelp(NULL, tr("Undelete"), tr("Delete"), (recording && recording->Info()->Title() && *recording->Info()->Title()) ? tr("Summary") : NULL);
-#else
- SetHelp(NULL, tr("Undelete"), tr("Delete"), (recording && recording->Summary() && *recording->Summary()) ? tr("Summary") : NULL);
-#endif
- }
- } else
+ if (Item)
{
- SetHelp(NULL);
+ d1syslog("cMenuRecordingSelect::IsMenuRecordingSelectItem", "Type(Item)=%s Text(Item)=%s", typeid(*Item).name(), Item->Text());
+ return typeid(*Item) == typeid(cMenuRecordingSelectItem);
}
+ d1syslog("cMenuRecordingSelect::IsMenuRecordingSelectItem", "Item=%s", "(NULL)");
+ return false;
}
-cRecording *cMenuRecordingSelect::GetRecording(cMenuRecordingSelectItem *Item)
+bool cMenuRecordingSelect::IsDirectory(cOsdItem *Item)
{
- cRecording *recording = DeletedRecordings.GetByName(Item->FileName());
- if (!recording)
- ERROR(tr("Error while accessing recording!"));
- return recording;
+ if (IsMenuRecordingSelectItem(Item))
+ return ((cMenuRecordingSelectItem *)Item)->IsDirectory();
+ return false;
}
-eOSState cMenuRecordingSelect::Open(bool OpenSubMenus)
+bool cMenuRecordingSelect::IsRecording(cOsdItem *Item)
{
- cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
- if (ri)
- {
- if (ri->IsDirectory())
- {
- const char *t = ri->Name();
- char *buffer = NULL;
- if (base)
- {
- asprintf(&buffer, "%s~%s", base, t);
- t = buffer;
- }
- AddSubMenu(new cMenuRecordingSelect(t, level + 1, OpenSubMenus));
- FREENULL(buffer);
- return osContinue;
- }
- }
- return osUnknown;
+ if (IsMenuRecordingSelectItem(Item))
+ return !((cMenuRecordingSelectItem *)Item)->IsDirectory();
+ return false;
}
-eOSState cMenuRecordingSelect::UnDelete(void)
+bool cMenuRecordingSelect::IsReady(void)
{
- if (HasSubMenu() || Count() == 0)
- return osContinue;
if (WorkFilename)
- {
esyslog("%s: Error previous jobs not completed (%s)", plugin_name, WorkFilename);
- return osContinue;
- }
- cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
- if (ri && ((!ri->IsDirectory() && (!confirmundel.u || Interface->Confirm(tr("Question$Undelete recording?")))) || (ri->IsDirectory() && (!confirmundeldir.u || Interface->Confirm(tr("Question$Undelete recordings in directory?"))))))
+ return !WorkFilename;
+}
+
+cRecording *cMenuRecordingSelect::GetRecording(cOsdItem *Item)
+{
+ if (IsRecording(Item))
{
- if (ri->IsDirectory())
- WorkFilename = ri->DirName(); // WorkFilename is NULL see up
- else
- WorkFilename = strdup(ri->FileName());
- cRemote::Put((eKeys)kUnDelRec);
- cOsdMenu::Del(Current());
- Display();
- if (!Count())
- return osBack;
- }
- return osContinue;
+ cRecording *recording = DeletedRecordings.GetByName(((cMenuRecordingSelectItem *)Item)->FileName());
+ if (!recording)
+ ERROR(tr("Error while accessing recording!"));
+ return recording;
+ } else
+ return NULL;
}
-eOSState cMenuRecordingSelect::Delete(void)
+void cMenuRecordingSelect::AddFunctionLines(void)
{
- if (HasSubMenu() || Count() == 0)
- return osContinue;
- if (WorkFilename)
+ d1syslog("cMenuRecordingSelect::AddFunctionLines", "Count=%d purge=%s lines=%d salvage=%s lines=%d", Count(), FunctionLine[functionline_b_e[0].u], functionline_num[0].u, FunctionLine[functionline_b_e[1].u], functionline_num[1].u);
+ for (int i = 0; i < 2; i++)
{
- esyslog("%s: Error previous jobs not completed (%s)", plugin_name, WorkFilename);
- return osContinue;
+ if (functionline_b_e[i].u != 0x0 && Count())
+ {
+ if (functionline_b_e[i].u & 0x1)
+ top_line[i] = true;
+ if ((functionline_b_e[i].u & 0x2) && (!top_line[i] || Count() >= functionline_num[i].u))
+ bottom_line[i] = true;
+ }
}
- cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
- if (ri && ((!ri->IsDirectory() && (!confirmdel.u || Interface->Confirm(tr("Question$Delete recording definitive?")))) || (ri->IsDirectory() && (!confirmdeldir.u || Interface->Confirm(tr("Question$Delete recordings in diretory definitive?"))))))
+ if (firstsalvage.u)
+ {
+ if (top_line[0])
+ Ins(new cOsdItem(tr("Display$Purge all records ..."), osUser2));
+ if (top_line[1])
+ Ins(new cOsdItem(tr("Display$Salavge all records ..."), osUser3));
+ if (bottom_line[0])
+ Add(new cOsdItem(tr("Display$Purge all records ..."), osUser2));
+ if (bottom_line[1])
+ Add(new cOsdItem(tr("Display$Salavge all records ..."), osUser3));
+ } else
{
- if (ri->IsDirectory())
- WorkFilename = ri->DirName(); // WorkFilename is NULL see up
- else
- WorkFilename = strdup(ri->FileName());
- cRemote::Put((eKeys)kDelRec);
- cOsdMenu::Del(Current());
- Display();
- if (!Count())
- return osBack;
+ if (top_line[1])
+ Ins(new cOsdItem(tr("Display$Salavge all records ..."), osUser3));
+ if (top_line[0])
+ Ins(new cOsdItem(tr("Display$Purge all records ..."), osUser2));
+ if (bottom_line[1])
+ Add(new cOsdItem(tr("Display$Salavge all records ..."), osUser3));
+ if (bottom_line[0])
+ Add(new cOsdItem(tr("Display$Purge all records ..."), osUser2));
}
- return osContinue;
+ d1syslog("cMenuRecordingSelect::AddFunctionLines", "new top(purge)=%s top(salavge)=%s bottom(purge)=%s bottom(salvage)=%s", top_line[0] ? "yes" : "no", top_line[1] ? "yes" : "no", bottom_line[0] ? "yes" : "no", bottom_line[1] ? "yes" : "no");
}
-eOSState cMenuRecordingSelect::Summary(void)
+void cMenuRecordingSelect::DelFunctionLines(void)
{
- if (HasSubMenu() || Count() == 0)
- return osContinue;
- cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
- if (ri && !ri->IsDirectory())
+ if (top_line[0] || top_line[1])
+ Del(0);
+ if (top_line[0] && top_line[1])
+ Del(0);
+ if (bottom_line[0] || bottom_line[1])
+ Del(Count() - 1);
+ if (bottom_line[0] && bottom_line[1])
+ Del(Count() - 1);
+ top_line[0] = top_line[1] = bottom_line[0] = bottom_line[1] = false;
+}
+
+void cMenuRecordingSelect::SetHelpKeys(void)
+{
+ const char *helptext[4] = { NULL, NULL, NULL, NULL };
+ cOsdItem *item = Get(Current());
+
+ for (int i = 2; i < MaxFunctionName; i++)
{
- cRecording *recording = GetRecording(ri);
-#if VDRVERSNUM >= 10325
- if (recording && recording->Info()->Title() && *recording->Info()->Title())
-#else
- if (recording && recording->Summary() && *recording->Summary())
-#endif
-#if VDRVERSNUM >= 10307
+ bool functionavailable = false;
+ switch (i)
+ {
+ case 2:
+ case 3: functionavailable = IsMenuRecordingSelectItem(item);
+ break;
+ case 4:
+ case 5: functionavailable = Count();
+ break;
+ case 6: functionavailable = IsDirectory(item);
+ break;
+ case 7: if (IsRecording(item))
+ {
+ cRecording *recording = GetRecording(item);
#if VDRVERSNUM >= 10325
- return AddSubMenu(new cMenuText(tr("Summary"), recording->Info()->Title()));
-#else
- return AddSubMenu(new cMenuText(tr("Summary"), recording->Summary()));
-#endif
-#else
+ functionavailable = (recording && recording->Info() && recording->Info()->Description() && *recording->Info()->Description());
+#else
+ functionavailable = (recording && recording->Summary() && *recording->Summary());
+#endif
+ }
+ break;
+ case 8: functionavailable = KeyState != 1 || functionkey[8].u != functionkey[9].u;
+ break;
+ case 9: functionavailable = KeyState != 2 || functionkey[8].u != functionkey[9].u;
+ break;
+ case 10: functionavailable = true;
+ break;
+ }
+ if (functionavailable)
+ switch (functionkey[i].u)
+ {
+ case 1:
+ case 3:
+ case 5:
+ case 7: if (KeyState == 1)
+ helptext[functionkey[i].u >> 1] = FunctionHotKey[i];
+ break;
+ case 2:
+ case 4:
+ case 6:
+ case 8: if (KeyState == 2)
+ helptext[(functionkey[i].u - 1) >> 1] = FunctionHotKey[i];
+ break;
+ }
+ }
+ SetHelp(helptext[0], helptext[1], helptext[2], helptext[3]);
+ d2syslog("cMenuRecordingSelect::SetHelpKeys", "KeyState=%d Item=%s red=%s green=%s yellow=%s blue=%s", KeyState, item ? item->Text() : "(NULL)", helptext[0] ? helptext[0] : "(NULL)", helptext[1] ? helptext[1] : "(NULL)", helptext[2] ? helptext[2] : "(NULL)", helptext[3] ? helptext[3] : "(NULL)");
+}
+
+eOSState cMenuRecordingSelect::FunctionCall(int FunctionNumber)
+{
+ eOSState state = osUnknown;
+ cOsdItem *item = Get(Current());
+ d2syslog("cMenuRecordingSelect::FunctionCall", "FunctionNumber=%d HasSubMenu=%s Item=%s", FunctionNumber, HasSubMenu() ? "yes" : "no", item ? item->Text() : "(NULL)");
+ cMenuRecordingSelectItem *ri = NULL;
+ cRecording *recording = NULL;
+ if (!item || HasSubMenu())
+ return osContinue;
+ switch (FunctionNumber)
+ {
+ // open/summary
+ case 1: if (IsDirectory(item))
+ state = FunctionCall(6);
+ else if (IsRecording(item))
+ state = FunctionCall(7);
+ break;
+
+ // purge
+ case 2: state = osContinue;
+ if (IsMenuRecordingSelectItem(item) && IsReady())
+ {
+ ri = (cMenuRecordingSelectItem *)item;
+ if ((!ri->IsDirectory() && (!confirmpurge.u || Interface->Confirm(tr("Question$Purge recording?")))) || (ri->IsDirectory() && (!confirmpurgedir.u || Interface->Confirm(tr("Question$Purge recordings in diretory?")))))
+ {
+ cRemote::Put((eKeys)kPurgeRec);
+ if (ri->IsDirectory())
+ WorkFilename = ri->DirName(); // WorkFilename is NULL see IsReady()
+ else
+ WorkFilename = strdup(ri->FileName());
+ }
+ }
+ break;
+
+ // salvage
+ case 3: state = osContinue;
+ if (IsMenuRecordingSelectItem(item) && IsReady())
+ {
+ ri = (cMenuRecordingSelectItem *)item;
+ if ((!ri->IsDirectory() && (!confirmsalvage.u || Interface->Confirm(tr("Question$Salvage recording?")))) || (ri->IsDirectory() && (!confirmsalvagedir.u || Interface->Confirm(tr("Question$Salvage recordings in directory?")))))
+ {
+ cRemote::Put((eKeys)kSalvageRec);
+ if (ri->IsDirectory())
+ WorkFilename = ri->DirName(); // WorkFilename is NULL see IsReady()
+ else
+ WorkFilename = strdup(ri->FileName());
+ }
+ }
+ break;
+
+ // purge all
+ case 4: state = osContinue;
+ if (IsReady() && (!confirmpurgeall.u || Interface->Confirm(tr("Question$Purge all recordings?"))))
+ {
+ cRemote::Put((eKeys)kPurgeRec);
+ for (item = First(); !WorkFilename && item; item = Next(item))
+ if (IsMenuRecordingSelectItem(item))
+ WorkFilename = ((cMenuRecordingSelectItem *)item)->DirName(true);
+ Clear();
+ top_line[0] = top_line[1] = bottom_line[0] = bottom_line[1] = false;
+ }
+ break;
+
+ // salvage all
+ case 5: state = osContinue;
+ if (IsReady() && (!confirmsalvageall.u || Interface->Confirm(tr("Question$Salvage all recordings?"))))
+ {
+ cRemote::Put((eKeys)kSalvageRec);
+ for (item = First(); !WorkFilename && item; item = Next(item))
+ if (IsMenuRecordingSelectItem(item))
+ WorkFilename = ((cMenuRecordingSelectItem *)item)->DirName(true);
+ Clear();
+ top_line[0] = top_line[1] = bottom_line[0] = bottom_line[1] = false;
+ }
+ break;
+
+ // open
+ case 6: if (IsDirectory(item))
+ {
+ ri = (cMenuRecordingSelectItem *)item;
+ const char *t = ri->Name();
+ char *buffer = NULL;
+ if (base)
+ {
+ asprintf(&buffer, "%s~%s", base, t);
+ t = buffer;
+ }
+ state = AddSubMenu(new cMenuRecordingSelect(t, level + 1));
+ freenull(buffer);
+ }
+ break;
+
+ // summary
+ case 7: recording = GetRecording(item);
#if VDRVERSNUM >= 10325
- return AddSubMenu(new cMenuItemText(tr("Summary"), recording->Info()->Title()));
-#else
- return AddSubMenu(new cMenuItemText(tr("Summary"), recording->Summary()));
-#endif
-#endif
+ if (recording && recording->Info() && recording->Info()->Description() && *recording->Info()->Description())
+ state = AddSubMenu(new cMenuText(tr("Summary"), recording->Info()->Description()));
+#else
+ if (recording && recording->Summary() && *recording->Summary())
+ state = AddSubMenu(new cMenuText(tr("Summary"), recording->Summary()));
+#endif
+ break;
+
+ // switch hotkeys to 1
+ case 8: if (functionkey[8].u == functionkey[9].u && KeyState == 1)
+ KeyState = 2;
+ else
+ KeyState = 1;
+ cRemote::Put((eKeys)kHelpKeys);
+ state = osContinue;
+ break;
+
+ // switch hotkeys to 2
+ case 9: KeyState = 2;
+ cRemote::Put((eKeys)kHelpKeys);
+ state = osContinue;
+ break;
+
+ // Choise$Display keys
+ case 10: state = AddSubMenu(new cMenuDispKey());
+ break;
}
- return osContinue;
+ d2syslog("cMenuRecordingSelect::FunctionCall", "FunctionNumber=%d returned OSState=%s WorkFilename=%s KeyState=%d", FunctionNumber, OSStateName(state), WorkFilename ? WorkFilename : "(NULL)", KeyState);
+ return state;
}
eOSState cMenuRecordingSelect::ProcessKey(eKeys Key)
{
-#ifdef UND_Debug3
- bool noneKey = Key == kNone;
- if (!noneKey)
- dsyslog("%s: cMenuRecordingSelect::ProcessKey Key=%s", plugin_name, KeyName(Key));
-#endif
bool hSubMenu = HasSubMenu();
+ cOsdItem *item = NULL;
+ int keynumber;
+ d3ProcessKey1("cMenuRecordingSelect::ProcessKey");
eOSState state = cOsdMenu::ProcessKey(Key);
-#ifdef UND_Debug3
- if (!noneKey || (state != osUnknown && state != osContinue))
- {
- dsyslog("%s: cMenuRecordingSelect::ProcessKey OSState=%s", plugin_name, OSStateName(state));
- noneKey = false;
- }
-#endif
-
+ d3ProcessKey2("cMenuRecordingSelect::ProcessKey");
if (hSubMenu && !HasSubMenu())
{
- if (Key == kYellow || Key == kGreen)
- {
- cOsdMenu::Del(Current());
- if (!Count())
- state = osBack;
- }
if (state == osContinue)
{
- for (cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)First(); ri; ri = (cMenuRecordingSelectItem *)Next(ri))
- ri->RefreshCounter();
+ for (item = First(); item; item = Next(item))
+ if (IsDirectory(item))
+ ((cMenuRecordingSelectItem *)item)->RefreshCounter();
Display();
}
}
switch (state)
{
- case osUnknown: switch (Key)
- {
- case kBack: state = osBack;
- case kOk:
- case kRed: state = Open();
- break;
- case kGreen: state = UnDelete();
- break;
- case kYellow: state = Delete();
- break;
- case kBlue: state = Summary();
- break;
- default: break;
- }
- break;
- default: break;
+ case osUnknown: keynumber = KeyState - 2; // KeyState is 1 or 2
+ switch (Key)
+ {
+ case kBlue: keynumber += 2; // no break!
+ case kYellow: keynumber += 2; // no break!
+ case kGreen: keynumber += 2; // no break!
+ case kRed: keynumber += 2; // keynumber red=1/2 green=3/4 yellow=5/6 blue=7/8
+ break;
+ case k0...k9: keynumber = Key - k0 + 9;
+ break;
+ case kUser1...kUser9: keynumber = Key - kUser1 + 19;
+ break;
+ case kOk: state = FunctionCall(okkey.u);
+ break;
+ case kDelLine:
+ if (Count())
+ Del(Current());
+ item = Get(Current());
+ if (item && !IsMenuRecordingSelectItem(item))
+ {
+ item = Prev(item);
+ if (!IsMenuRecordingSelectItem(item))
+ item = NULL;
+ }
+ DelFunctionLines();
+ AddFunctionLines();
+ if (item)
+ SetCurrent(item);
+ if (Count())
+ {
+ Display();
+ state = osContinue;
+ cRemote::Put((eKeys)kHelpKeys);
+ } else
+ {
+ state = osBack;
+ cRemote::Put((eKeys)kDelLine);
+ }
+ break;
+ default: break;
+ }
+ if (keynumber > 0)
+ for (int i = 0; i < MaxFunctionName && state == osUnknown; i++)
+ if (functionkey[i].u == keynumber)
+ state = FunctionCall(i);
+ if (state == osUnknown && Key >= k0 && Key <= k9)
+ {
+ item = Get((Key == k0 ? 10 : Key - k0) + (top_line[0] ? 1 : 0) + (top_line[1] ? 1 : 0) - 1);
+ if (IsMenuRecordingSelectItem(item))
+ {
+ SetCurrent(item);
+ Display();
+ state = FunctionCall(numkey.u);
+ }
+ }
+ break;
+ case osUser2: state = FunctionCall(4);
+ break;
+ case osUser3: state = FunctionCall(5);
+ break;
+ default: break;
}
if (!HasSubMenu() && Key != kNone && !WorkFilename)
{
SetHelpKeys();
- cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
- if (ri)
+ item = Get(Current());
+ if (IsDirectory(item))
{
- ri->RefreshCounter();
+ ((cMenuRecordingSelectItem *)item)->RefreshCounter();
RefreshCurrent();
}
}
-#ifdef UND_Debug3
- if (!noneKey || (state != osUnknown && state != osContinue))
- dsyslog("%s: cMenuRecordingSelect::ProcessKey returned OSState=%s", plugin_name, OSStateName(state));
+#ifdef UND_Debug1
+ if (state != osUnknown && !HasSubMenu())
+ {
+ d1syslog("cMenuRecordingSelect::ProcessKey", "base=%s", base ? base : "(NULL)");
+ d1listlog("cMenuRecordingSelect::ProcessKey");
+ }
#endif
+ d3ProcessKey3("cMenuRecordingSelect::ProcessKey");
return state;
}
@@ -393,50 +564,22 @@ eOSState cMenuRecordingSelect::ProcessKey(eKeys Key)
cMenuUndelete::cMenuUndelete(void)
:cOsdMenu(tr("Deleted Recordings"), 6, 6)
{
-#ifdef UND_Debug2
- dsyslog("%s: cMenuUndelete::cMenuUndelete", plugin_name);
-#endif
-#if VDRVERSNUM < 10307
-#ifdef HAVE_ELCHI
- Interface->Status(tr("Display$prepare recording display..."), Setup.Theme == themeVanilla ? clrBlack : (eDvbColor)fginfofont, Setup.Theme == themeVanilla ? clrCyan : clrInfoLine);
-#else
- Interface->Status(tr("Display$prepare recording display..."));
-#endif
- Interface->Flush();
-#else
- STATUS(tr("Display$prepare recording display..."));
-#endif
-#if VDRVERSNUM >= 10311
- DeletedRecordings.Load();
-#else
- DeletedRecordings.Load(true);
+#ifdef UND_Debug
+ objID = ++cMenuUndelete_nextID;
#endif
- AddSubMenu(new cMenuRecordingSelect);
+ d2syslog("cMenuUndelete::cMenuUndelete", "%s", "");
+ MenuIsOpen = true;
PurgeRecording = false;
SalvageRecording = false;
+ FillMenu();
}
cMenuUndelete::~cMenuUndelete()
{
-#ifdef UND_Debug2
- dsyslog("%s: cMenuUndelete::~cMenuUndelete", plugin_name);
-#endif
- if (PurgeRecording)
- {
-#if VDRVERSNUM < 10307
-#ifdef HAVE_ELCHI
- Interface->Status(tr("Display$remove empty directories..."), Setup.Theme == themeVanilla ? clrBlack : (eDvbColor)fginfofont, Setup.Theme == themeVanilla ? clrCyan : clrInfoLine);
-#else
- Interface->Status(tr("Display$remove empty directories..."));
-#endif
- Interface->Flush();
-#else
- STATUS(tr("Display$remove empty directories..."));
-#endif
- RemoveEmptyVideoDirectories();
- }
+ d2syslog("cMenuUndelete::~cMenuUndelete", "%s", "");
+ if (PurgeRecording && !oRemoveThread.ActiveWithCancel())
+ oRemoveThread.Start();
DeletedRecordings.Clear();
-
#if VDRVERSNUM >= 10311
if (SalvageRecording)
#if VDRVERSNUM >= 10333
@@ -445,121 +588,120 @@ cMenuUndelete::~cMenuUndelete()
Recordings.TriggerUpdate();
#endif
#endif
+ MenuIsOpen = false;
}
-eOSState cMenuUndelete::ProcessKey(eKeys Key)
+void cMenuUndelete::FillMenu(void)
{
-#ifdef UND_Debug3
- bool noneKey = Key == kNone;
- if (!noneKey)
- dsyslog("%s: cMenuUndelete::ProcessKey Key=%s", plugin_name, KeyName(Key));
+ STATUS(tr("Display$prepare recording display..."));
+ DeletedRecordings.Clear();
+#if VDRVERSNUM >= 10311
+ DeletedRecordings.Load();
+#else
+ DeletedRecordings.Load(true);
#endif
+ DeletedRecordings.Sort();
+ KeyState = 1;
+ AddSubMenu(new cMenuRecordingSelect);
+}
+eOSState cMenuUndelete::ProcessKey(eKeys Key)
+{
+ d3ProcessKey1("cMenuUndelete::ProcessKey");
eOSState state = cOsdMenu::ProcessKey(Key);
+ d3ProcessKey2("cMenuUndelete::ProcessKey");
#ifdef UND_Debug3
- if (!noneKey || (state != osUnknown && state != osContinue))
- {
- dsyslog("%s: cMenuUndelete::ProcessKey OSState=%s", plugin_name, OSStateName(state));
- noneKey = false;
- }
+ if (!noneKey || state != osUnknown)
+ d3syslog("cMenuUndelete::ProcessKey", "WorkFilename=%s", WorkFilename ? WorkFilename : "(NULL)");
#endif
if (state == osUnknown)
{
cRecording *recording = NULL;
+ bool processerror = false;
bool processrecording = false;
- if (WorkFilename && (Key == kDelRec || Key == kUnDelRec))
- {
-#if VDRVERSNUM < 10307
-#ifdef HAVE_ELCHI
- Interface->Status(tr("Display$please wait ..."), Setup.Theme == themeVanilla ? clrBlack : (eDvbColor)fginfofont, Setup.Theme == themeVanilla ? clrCyan : clrInfoLine);
-#else
- Interface->Status(tr("Display$please wait ..."));
-#endif
- Interface->Flush();
-#else
+ if (WorkFilename && (Key == kPurgeRec || Key == kSalvageRec))
STATUS(tr("Display$please wait ..."));
-#endif
- }
switch (Key)
{
- case kUnDelRec: state = osContinue;
- if (WorkFilename)
- {
- for (recording = DeletedRecordings.First(); recording; recording = DeletedRecordings.Next(recording))
- if (strncmp(recording->FileName(), WorkFilename, strlen(WorkFilename)) == 0)
- {
- if (verbose.u)
- isyslog("%s: undelete recording=%s", plugin_name, recording->FileName());
- char *NewName = strdup(recording->FileName());
- char *ext = strrchr(NewName, '.');
- if (strcmp(ext, DELEXT) == 0)
+ case kPurgeRec: state = osContinue;
+ if (WorkFilename)
+ {
+ for (recording = DeletedRecordings.First(); recording; recording = DeletedRecordings.Next(recording))
+ if (!strncmp(recording->FileName(), WorkFilename, strlen(WorkFilename)) && (*(WorkFilename + strlen(WorkFilename) - 1) != '/' || strchr(recording->FileName() + strlen(WorkFilename), '/')))
{
- strncpy(ext, RECEXT, strlen(ext));
- if (access(NewName, F_OK) == 0)
+ if (verbose.u)
+ isyslog("%s: purge deleted recording (%s)", plugin_name, recording->FileName());
+ if (!RemoveVideoFile(recording->FileName()))
{
- ERROR(tr("Error$Recording with the same name exists!"));
- if (verbose.u)
- isyslog("%s: Recording with the same name exists!", plugin_name);
- } else
+ esyslog("%s: Error while remove deleted recording (%s)", plugin_name, recording->FileName());
+ processerror = true;
+ }
+ PurgeRecording = true;
+ cRemote::Put(Key);
+ DeletedRecordings.Del(recording);
+ processrecording = true;
+ break;
+ }
+ }
+ break;
+ case kSalvageRec: state = osContinue;
+ if (WorkFilename)
+ {
+ for (recording = DeletedRecordings.First(); recording; recording = DeletedRecordings.Next(recording))
+ if (!strncmp(recording->FileName(), WorkFilename, strlen(WorkFilename)) && (*(WorkFilename + strlen(WorkFilename) - 1) != '/' || strchr(recording->FileName() + strlen(WorkFilename), '/')))
+ {
+ if (verbose.u)
+ isyslog("%s: undelete recording (%s)", plugin_name, recording->FileName());
+ char *NewName = strdup(recording->FileName());
+ char *ext = strrchr(NewName, '.');
+ if (!strcmp(ext, DELEXT))
{
- if (!RenameVideoFile(recording->FileName(), NewName))
- esyslog("%s: Error while rename deleted recording (%s) to (%s)", plugin_name, recording->FileName(), NewName);
- SalvageRecording = true;
+ strncpy(ext, RECEXT, strlen(ext));
+ if (!access(NewName, F_OK))
+ {
+ if (verbose.u)
+ isyslog("%s: Recording with the same name exists (%s)", plugin_name, NewName);
+ ERROR(tr("Error$Recording with the same name exists!"));
+ processerror = true;
+ } else
+ {
+ if (!RenameVideoFile(recording->FileName(), NewName))
+ {
+ esyslog("%s: Error while rename deleted recording (%s) to (%s)", plugin_name, recording->FileName(), NewName);
+ processerror = true;
+ }
+ SalvageRecording = true;
+ }
}
+ free(NewName);
+ cRemote::Put(Key);
+ DeletedRecordings.Del(recording);
+ processrecording = true;
+ break;
}
- free(NewName);
- cRemote::Put((eKeys)kUnDelRec);
- DeletedRecordings.Del(recording);
- processrecording = true;
- break;
- }
- }
- break;
- case kDelRec: state = osContinue;
- if (WorkFilename)
- {
- for (recording = DeletedRecordings.First(); recording; recording = DeletedRecordings.Next(recording))
- if (strncmp(recording->FileName(), WorkFilename, strlen(WorkFilename)) == 0)
- {
- if (verbose.u)
- isyslog("%s: purge deleted recording=%s", plugin_name, recording->FileName());
- if (!RemoveVideoFile(recording->FileName()))
- esyslog("%s: Error while remove deleted recording (%s)", plugin_name, recording->FileName());
- PurgeRecording = true;
- cRemote::Put((eKeys)kDelRec);
- DeletedRecordings.Del(recording);
- processrecording = true;
- break;
- }
- }
- break;
- case kHelpKeys: if (!HasSubMenu())
- state = osBack;
- default: break;
+ }
+ break;
+ case kHelpKeys: if (!HasSubMenu())
+ state = osBack;
+ default: break;
}
- if (WorkFilename && !processrecording)
+ if (WorkFilename && (!processrecording || processerror))
{
- FREENULL(WorkFilename); // restore Helpkeys in cMenuRecordingSelect::ProcessKey
-#if VDRVERSNUM < 10307
-#ifdef HAVE_ELCHI
- Interface->Status(NULL, Setup.Theme == themeVanilla ? clrBlack : (eDvbColor)fginfofont, Setup.Theme == themeVanilla ? clrCyan : clrInfoLine);
-#else
- Interface->Status(NULL);
-#endif
- Interface->Flush();
-#else
+ freenull(WorkFilename);
+ if (processerror)
+ {
+ CloseSubMenu();
+ Clear();
+ FillMenu();
+ } else
+ cRemote::Put((eKeys)kDelLine);
STATUS(NULL);
-#endif
- cRemote::Put((eKeys)kHelpKeys);
}
}
if (!WorkFilename && !HasSubMenu())
state = osBack;
-#ifdef UND_Debug3
- if (!noneKey || (state != osUnknown && state != osContinue))
- dsyslog("%s: cMenuUndelete::ProcessKey returned OSState=%s", plugin_name, OSStateName(state));
-#endif
+ d3ProcessKey3("cMenuUndelete::ProcessKey");
return state;
}