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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
|
/*
* undelete: A plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
* $Id: vdrtools.c 0.4 2005/11/16 18:39:18 hflor Exp $
*/
#include "vdrtools.h"
#include "undelete.h"
#include "i18n.h"
#include <vdr/menu.h>
#include <vdr/interface.h>
#if VDRVERSNUM < 10318
// --- cReadLine -------------------------------------------------------------
cReadLine::cReadLine(void)
{
size = 0;
buffer = NULL;
}
cReadLine::~cReadLine()
{
free(buffer);
}
char *cReadLine::Read(FILE *f)
{
int n = getline(&buffer, &size, f);
if (n > 0) {
n--;
if (buffer[n] == '\n')
buffer[n] = 0;
return buffer;
}
return NULL;
}
#endif
#ifdef HAVE_SVDRP
bool GetVDRSize(const char *dir, long long &llSize)
{
bool bRet = false;
struct stat fileinfo;
cPipe pipe;
if (pipe.Open((const char *)cString::sprintf("find '%s' -follow -type f", dir), "r"))
{
cReadLine ReadLine;
char *s;
while ((s = ReadLine.Read(pipe)) != NULL)
{
if (stat(s, &fileinfo) != -1)
{
llSize += (long long)fileinfo.st_size;
bRet = true;
}
}
pipe.Close();
}
return bRet;
}
#endif
char *SkipQuote(char *s)
{
char c = *s;
strcpy(s, s + 1);
while (*s && *s != c)
{
if (*s == '\\')
strcpy(s, s + 1);
if (*s)
s++;
}
if (*s)
{
strcpy(s, s + 1);
return s;
}
esyslog("ERROR: missing closing %c", c);
return NULL;
}
char *ExchangeChars(char *s, bool ToFileSystem)
{
// ToFileSystem is not use, only for comatibility with 'ExchangeChars' from 'recording.c'
char *p = s;
while (*p)
{
switch (*p)
{
// mapped characters:
case '_': *p = ' ';
break;
case '/': *p = '~';
break;
// encodes characters:
case '#': if (strlen(p) > 2)
{
char buf[3];
sprintf(buf, "%c%c", *(p + 1), *(p + 2));
unsigned char c = strtol(buf, NULL, 16);
*p = c;
memmove(p + 1, p + 3, strlen(p) - 2);
}
break;
// backwards compatibility:
case '\x01': *p = '\'';
break;
case '\x02': *p = '/';
break;
case '\x03': *p = ':';
break;
}
p++;
}
return s;
}
#ifdef UND_Debug
const char *KeyName(eKeys Key)
{
switch (RAWKEY(Key))
{
case kUp: return tr("Up"); break;
case kDown: return tr("Down"); break;
case kMenu: return tr("Menu"); break;
case kOk: return tr("Ok"); break;
case kBack: return tr("Back"); break;
case kLeft: return tr("Left"); break;
case kRight: return tr("Right"); break;
case kRed: return tr("Red"); break;
case kGreen: return tr("Green"); break;
case kYellow: return tr("Yellow"); break;
case kBlue: return tr("Blue"); break;
case k0: return "0"; break;
case k1: return "1"; break;
case k2: return "2"; break;
case k3: return "3"; break;
case k4: return "4"; break;
case k5: return "5"; break;
case k6: return "6"; break;
case k7: return "7"; break;
case k8: return "8"; break;
case k9: return "9"; break;
case kPlay: return tr("Play"); break;
case kPause: return tr("Pause"); break;
case kStop: return tr("Stop"); break;
case kRecord: return tr("Record"); break;
case kFastFwd: return tr("FastFwd"); break;
case kFastRew: return tr("FastRew"); break;
case kPower: return tr("Power"); break;
case kChanUp: return tr("ChanUp"); break;
case kChanDn: return tr("ChanDn"); break;
case kVolUp: return tr("VolUp"); break;
case kVolDn: return tr("VolDn"); break;
case kMute: return tr("Mute"); break;
case kSchedule: return tr("Schedule"); break;
case kChannels: return tr("Channels"); break;
case kTimers: return tr("Timers"); break;
case kRecordings: return tr("Recordings"); break;
case kSetup: return tr("Setup"); break;
case kCommands: return tr("Commands"); break;
case kUser1: return tr("User1"); break;
case kUser2: return tr("User2"); break;
case kUser3: return tr("User3"); break;
case kUser4: return tr("User4"); break;
case kUser5: return tr("User5"); break;
case kUser6: return tr("User6"); break;
case kUser7: return tr("User7"); break;
case kUser8: return tr("User8"); break;
case kUser9: return tr("User9"); break;
case kNone: return tr("none"); break;
case kKbd: return tr("Kbd"); break;
case kSalvageRec: return tr("Salvage"); break;
case kPurgeRec: return tr("Purge"); break;
case kDelLine: return tr("DeleteLine"); break;
case kHelpKeys: return tr("HelpKeys"); break;
default: return tr("unknow"); break;
}
}
const char *OSStateName(eOSState OSState)
{
switch (OSState)
{
case osUnknown: return "osUnknown";
case osContinue: return "osContinue";
case osSchedule: return "osSchedule";
case osChannels: return "osChannels";
case osTimers: return "osTimers";
case osRecordings: return "osRecordings";
case osPlugin: return "osPlugin";
case osSetup: return "osSetup";
case osCommands: return "osCommands";
case osPause: return "osPause";
case osRecord: return "osRecord";
case osReplay: return "osReplay";
case osStopRecord: return "osStopRecord";
case osStopReplay: return "osStopReplay";
case osCancelEdit: return "osCancelEdit";
case osSwitchDvb: return "osSwitchDvb";
case osBack: return "osBack";
case osEnd: return "osEnd";
case os_User: return "os_User";
case osUser1: return "osUser1";
case osUser2: return "osUser2";
case osUser3: return "osUser3";
case osUser4: return "osUser4";
case osUser5: return "osUser5";
case osUser6: return "osUser6";
case osUser7: return "osUser7";
case osUser8: return "osUser8";
case osUser9: return "osUser9";
case osUser10: return "osUser10";
default: return "unknow";
}
return "";
}
#endif
|