mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Made several functions threadsafe (cont'd)
This commit is contained in:
parent
f97b1069c6
commit
286af66cfb
39
HISTORY
39
HISTORY
@ -3160,7 +3160,7 @@ Video Disk Recorder Revision History
|
||||
right day of week for timers in the future.
|
||||
- Some improvements to cPoller (thanks to Marco Schlüßler).
|
||||
|
||||
2004-12-24: Version 1.3.18
|
||||
2004-12-26: Version 1.3.18
|
||||
|
||||
- Removed an unused variable from cTimer::GetWDayFromMDay() (thanks to Wayne Keer
|
||||
for reporting this one).
|
||||
@ -3215,12 +3215,37 @@ Video Disk Recorder Revision History
|
||||
the actual buffering. In particular these are:
|
||||
readdir() -> cReadDir
|
||||
readline() -> cReadLine
|
||||
strescape() -> cStrEscape
|
||||
AddDirectory() -> cAddDirectory
|
||||
ctime() -> cCtime
|
||||
itoa() -> cItoa
|
||||
WeekDayName() -> cWeekDayName
|
||||
DayDateTime() -> cDayDateTime
|
||||
- Several formerly non-threadsafe functions now have a return type of cString:
|
||||
cChannel::ToText()
|
||||
tChannelID::ToString()
|
||||
cEvent::GetDateString()
|
||||
cEvent::GetTimeString()
|
||||
cEvent::GetEndTimeString()
|
||||
cEvent::GetVpsString()
|
||||
cMark::ToText()
|
||||
cTimer::ToText()
|
||||
cSource::ToString()
|
||||
cTimer::PrintDay()
|
||||
cTimer::PrintFirstDay()
|
||||
PrefixVideoFileName()
|
||||
IndexToHMSF()
|
||||
ChannelString()
|
||||
strescape()
|
||||
AddDirectory()
|
||||
itoa()
|
||||
WeekDayName()
|
||||
DayDateTime()
|
||||
When using these functions in a 'const char *' context there is nothing special
|
||||
to consider, except that you can no longer have a pointer to the return value,
|
||||
as in
|
||||
const char *date = DayDateTime();
|
||||
Although this will compile without error message, the resulting 'date' will not
|
||||
be valid after this line. Use this instead:
|
||||
cString date = DayDateTime();
|
||||
In a 'const void *' context (as in printf() etc.) the result needs to be
|
||||
dereferenced with a '*', as in
|
||||
printf("%s", *DayDateTime());
|
||||
to make it a 'const char *'.
|
||||
- Removed delay_ms(), using cCondWait::SleepMs() instead.
|
||||
- Replaced time_ms() with a threadsafe and non-overflowing cTimeMs (thanks to Rainer
|
||||
Zocholl for pointing out this problem).
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: skincurses.c 1.2 2004/05/31 14:57:40 kls Exp $
|
||||
* $Id: skincurses.c 1.3 2004/12/26 11:36:35 kls Exp $
|
||||
*/
|
||||
|
||||
#include <ncurses.h>
|
||||
@ -11,7 +11,7 @@
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/skins.h>
|
||||
|
||||
static const char *VERSION = "0.0.2";
|
||||
static const char *VERSION = "0.0.3";
|
||||
static const char *DESCRIPTION = "A text only skin";
|
||||
static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
@ -252,7 +252,7 @@ void cSkinCursesDisplayChannel::SetMessage(eMessageType Type, const char *Text)
|
||||
void cSkinCursesDisplayChannel::Flush(void)
|
||||
{
|
||||
if (!message) {
|
||||
const char *date = DayDateTime();
|
||||
cString date = DayDateTime();
|
||||
osd->DrawText(OsdWidth - strlen(date), 0, date, clrWhite, clrBackground, &Font);
|
||||
}
|
||||
osd->Flush();
|
||||
@ -382,11 +382,11 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
||||
int y = 2;
|
||||
cTextScroller ts;
|
||||
char t[32];
|
||||
snprintf(t, sizeof(t), "%s %s - %s", Event->GetDateString(), Event->GetTimeString(), Event->GetEndTimeString());
|
||||
snprintf(t, sizeof(t), "%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
||||
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
|
||||
char *buffer;
|
||||
asprintf(&buffer, " VPS: %s", Event->GetVpsString());
|
||||
asprintf(&buffer, " VPS: %s", *Event->GetVpsString());
|
||||
osd->DrawText(OsdWidth - strlen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
||||
free(buffer);
|
||||
}
|
||||
@ -418,7 +418,7 @@ void cSkinCursesDisplayMenu::SetText(const char *Text, bool FixedFont)
|
||||
|
||||
void cSkinCursesDisplayMenu::Flush(void)
|
||||
{
|
||||
const char *date = DayDateTime();
|
||||
cString date = DayDateTime();
|
||||
osd->DrawText(OsdWidth - strlen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
|
||||
osd->Flush();
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: sky.c 1.10 2004/12/19 17:21:52 kls Exp $
|
||||
* $Id: sky.c 1.11 2004/12/26 12:45:22 kls Exp $
|
||||
*/
|
||||
|
||||
#include <sys/socket.h>
|
||||
@ -273,7 +273,7 @@ bool cPluginSky::Initialize(void)
|
||||
// Initialize any background activities the plugin shall perform.
|
||||
const char *ConfigDir = ConfigDirectory(Name());
|
||||
if (ConfigDir) {
|
||||
if (SkyChannels.Load(*cAddDirectory(ConfigDir, "channels.conf.sky"), true)) {
|
||||
if (SkyChannels.Load(AddDirectory(ConfigDir, "channels.conf.sky"), true)) {
|
||||
new cDigiboxDevice;
|
||||
return true;
|
||||
}
|
||||
|
38
channels.c
38
channels.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: channels.c 1.32 2004/12/19 11:24:51 kls Exp $
|
||||
* $Id: channels.c 1.33 2004/12/26 12:34:52 kls Exp $
|
||||
*/
|
||||
|
||||
#include "channels.h"
|
||||
@ -146,10 +146,10 @@ tChannelID tChannelID::FromString(const char *s)
|
||||
return tChannelID::InvalidID;
|
||||
}
|
||||
|
||||
const char *tChannelID::ToString(void)
|
||||
cString tChannelID::ToString(void)
|
||||
{
|
||||
static char buffer[256];
|
||||
snprintf(buffer, sizeof(buffer), rid ? "%s-%d-%d-%d-%d" : "%s-%d-%d-%d", cSource::ToString(source), nid, tid, sid, rid);
|
||||
char buffer[256];
|
||||
snprintf(buffer, sizeof(buffer), rid ? "%s-%d-%d-%d-%d" : "%s-%d-%d-%d", *cSource::ToString(source), nid, tid, sid, rid);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
@ -162,8 +162,6 @@ tChannelID &tChannelID::ClrPolarization(void)
|
||||
|
||||
// -- cChannel ---------------------------------------------------------------
|
||||
|
||||
char *cChannel::buffer = NULL;
|
||||
|
||||
cChannel::cChannel(void)
|
||||
{
|
||||
name = strdup("");
|
||||
@ -289,7 +287,7 @@ bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarizatio
|
||||
|
||||
if (source != Source || frequency != Frequency || polarization != Polarization || srate != Srate || coderateH != CoderateH) {
|
||||
if (Number()) {
|
||||
dsyslog("changing transponder data of channel %d from %s:%d:%c:%d:%d to %s:%d:%c:%d:%d", Number(), cSource::ToString(source), frequency, polarization, srate, coderateH, cSource::ToString(Source), Frequency, Polarization, Srate, CoderateH);
|
||||
dsyslog("changing transponder data of channel %d from %s:%d:%c:%d:%d to %s:%d:%c:%d:%d", Number(), *cSource::ToString(source), frequency, polarization, srate, coderateH, *cSource::ToString(Source), Frequency, Polarization, Srate, CoderateH);
|
||||
modification |= CHANNELMOD_TRANSP;
|
||||
Channels.SetModified();
|
||||
}
|
||||
@ -307,7 +305,7 @@ bool cChannel::SetCableTransponderData(int Source, int Frequency, int Modulation
|
||||
{
|
||||
if (source != Source || frequency != Frequency || modulation != Modulation || srate != Srate || coderateH != CoderateH) {
|
||||
if (Number()) {
|
||||
dsyslog("changing transponder data of channel %d from %s:%d:%d:%d:%d to %s:%d:%d:%d:%d", Number(), cSource::ToString(source), frequency, modulation, srate, coderateH, cSource::ToString(Source), Frequency, Modulation, Srate, CoderateH);
|
||||
dsyslog("changing transponder data of channel %d from %s:%d:%d:%d:%d to %s:%d:%d:%d:%d", Number(), *cSource::ToString(source), frequency, modulation, srate, coderateH, *cSource::ToString(Source), Frequency, Modulation, Srate, CoderateH);
|
||||
modification |= CHANNELMOD_TRANSP;
|
||||
Channels.SetModified();
|
||||
}
|
||||
@ -324,7 +322,7 @@ bool cChannel::SetTerrTransponderData(int Source, int Frequency, int Bandwidth,
|
||||
{
|
||||
if (source != Source || frequency != Frequency || bandwidth != Bandwidth || modulation != Modulation || hierarchy != Hierarchy || coderateH != CoderateH || coderateL != CoderateL || guard != Guard || transmission != Transmission) {
|
||||
if (Number()) {
|
||||
dsyslog("changing transponder data of channel %d from %s:%d:%d:%d:%d:%d:%d:%d:%d to %s:%d:%d:%d:%d:%d:%d:%d:%d", Number(), cSource::ToString(source), frequency, bandwidth, modulation, hierarchy, coderateH, coderateL, guard, transmission, cSource::ToString(Source), Frequency, Bandwidth, Modulation, Hierarchy, CoderateH, CoderateL, Guard, Transmission);
|
||||
dsyslog("changing transponder data of channel %d from %s:%d:%d:%d:%d:%d:%d:%d:%d to %s:%d:%d:%d:%d:%d:%d:%d:%d", Number(), *cSource::ToString(source), frequency, bandwidth, modulation, hierarchy, coderateH, coderateL, guard, transmission, *cSource::ToString(Source), Frequency, Bandwidth, Modulation, Hierarchy, CoderateH, CoderateL, Guard, Transmission);
|
||||
modification |= CHANNELMOD_TRANSP;
|
||||
Channels.SetModified();
|
||||
}
|
||||
@ -540,13 +538,13 @@ static int PrintParameter(char *p, char Name, int Value)
|
||||
return Value >= 0 && Value != 999 ? sprintf(p, "%c%d", Name, Value) : 0;
|
||||
}
|
||||
|
||||
const char *cChannel::ParametersToString(void) const
|
||||
cString cChannel::ParametersToString(void) const
|
||||
{
|
||||
char type = *cSource::ToString(source);
|
||||
char type = **cSource::ToString(source);
|
||||
if (isdigit(type))
|
||||
type = 'S';
|
||||
#define ST(s) if (strchr(s, type))
|
||||
static char buffer[64];
|
||||
char buffer[64];
|
||||
char *q = buffer;
|
||||
*q = 0;
|
||||
ST(" S ") q += sprintf(q, "%c", polarization);
|
||||
@ -600,7 +598,7 @@ bool cChannel::StringToParameters(const char *s)
|
||||
return true;
|
||||
}
|
||||
|
||||
const char *cChannel::ToText(const cChannel *Channel)
|
||||
cString cChannel::ToText(const cChannel *Channel)
|
||||
{
|
||||
char FullName[strlen(Channel->name) + 1 + strlen(Channel->shortName) + 1 + strlen(Channel->provider) + 1 + 10]; // +10: paranoia
|
||||
char *q = FullName;
|
||||
@ -611,7 +609,7 @@ const char *cChannel::ToText(const cChannel *Channel)
|
||||
q += sprintf(q, ";%s", Channel->provider);
|
||||
*q = 0;
|
||||
strreplace(FullName, ':', '|');
|
||||
free(buffer);
|
||||
char *buffer;
|
||||
if (Channel->groupSep) {
|
||||
if (Channel->number)
|
||||
asprintf(&buffer, ":@%d %s\n", Channel->number, FullName);
|
||||
@ -637,12 +635,12 @@ const char *cChannel::ToText(const cChannel *Channel)
|
||||
q = caidbuf;
|
||||
q += IntArrayToString(q, Channel->caids, 16);
|
||||
*q = 0;
|
||||
asprintf(&buffer, "%s:%d:%s:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d\n", FullName, Channel->frequency, Channel->ParametersToString(), cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, Channel->tpid, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid);
|
||||
asprintf(&buffer, "%s:%d:%s:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d\n", FullName, Channel->frequency, *Channel->ParametersToString(), *cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, Channel->tpid, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid);
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
const char *cChannel::ToText(void) const
|
||||
cString cChannel::ToText(void) const
|
||||
{
|
||||
return ToText(this);
|
||||
}
|
||||
@ -800,7 +798,7 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
|
||||
|
||||
bool cChannel::Save(FILE *f)
|
||||
{
|
||||
return fprintf(f, ToText()) > 0;
|
||||
return fprintf(f, "%s", *ToText()) > 0;
|
||||
}
|
||||
|
||||
// -- cChannels --------------------------------------------------------------
|
||||
@ -939,7 +937,7 @@ int cChannels::Modified(void)
|
||||
cChannel *cChannels::NewChannel(const cChannel *Transponder, const char *Name, const char *ShortName, const char *Provider, int Nid, int Tid, int Sid, int Rid)
|
||||
{
|
||||
if (Transponder) {
|
||||
dsyslog("creating new channel '%s,%s;%s' on %s transponder %d with id %d-%d-%d-%d", Name, ShortName, Provider, cSource::ToString(Transponder->Source()), Transponder->Transponder(), Nid, Tid, Sid, Rid);
|
||||
dsyslog("creating new channel '%s,%s;%s' on %s transponder %d with id %d-%d-%d-%d", Name, ShortName, Provider, *cSource::ToString(Transponder->Source()), Transponder->Transponder(), Nid, Tid, Sid, Rid);
|
||||
cChannel *NewChannel = new cChannel(*Transponder);
|
||||
NewChannel->SetId(Nid, Tid, Sid, Rid);
|
||||
NewChannel->SetName(Name, ShortName, Provider);
|
||||
@ -950,9 +948,9 @@ cChannel *cChannels::NewChannel(const cChannel *Transponder, const char *Name, c
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *ChannelString(const cChannel *Channel, int Number)
|
||||
cString ChannelString(const cChannel *Channel, int Number)
|
||||
{
|
||||
static char buffer[256];
|
||||
char buffer[256];
|
||||
if (Channel) {
|
||||
if (Channel->GroupSep())
|
||||
snprintf(buffer, sizeof(buffer), "%s", Channel->Name());
|
||||
|
13
channels.h
13
channels.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: channels.h 1.23 2004/12/05 13:49:04 kls Exp $
|
||||
* $Id: channels.h 1.24 2004/12/26 12:15:52 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CHANNELS_H
|
||||
@ -67,7 +67,7 @@ public:
|
||||
tChannelID &ClrRid(void) { rid = 0; return *this; }
|
||||
tChannelID &ClrPolarization(void);
|
||||
static tChannelID FromString(const char *s);
|
||||
const char *ToString(void);
|
||||
cString ToString(void);
|
||||
static const tChannelID InvalidID;
|
||||
};
|
||||
|
||||
@ -87,8 +87,7 @@ class cLinkChannels : public cList<cLinkChannel> {
|
||||
class cChannel : public cListObject {
|
||||
friend class cMenuEditChannel;
|
||||
private:
|
||||
static char *buffer;
|
||||
static const char *ToText(const cChannel *Channel);
|
||||
static cString ToText(const cChannel *Channel);
|
||||
char *name;
|
||||
char *shortName;
|
||||
char *provider;
|
||||
@ -124,14 +123,14 @@ private:
|
||||
int modification;
|
||||
cLinkChannels *linkChannels;
|
||||
cChannel *refChannel;
|
||||
const char *ParametersToString(void) const;
|
||||
cString ParametersToString(void) const;
|
||||
bool StringToParameters(const char *s);
|
||||
public:
|
||||
cChannel(void);
|
||||
cChannel(const cChannel &Channel);
|
||||
~cChannel();
|
||||
cChannel& operator= (const cChannel &Channel);
|
||||
const char *ToText(void) const;
|
||||
cString ToText(void) const;
|
||||
bool Parse(const char *s, bool AllowNonUniqueID = false);
|
||||
bool Save(FILE *f);
|
||||
const char *Name(void) const { return name; }
|
||||
@ -216,6 +215,6 @@ public:
|
||||
|
||||
extern cChannels Channels;
|
||||
|
||||
const char *ChannelString(const cChannel *Channel, int Number);
|
||||
cString ChannelString(const cChannel *Channel, int Number);
|
||||
|
||||
#endif //__CHANNELS_H
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: dvbplayer.c 1.28 2004/12/11 17:02:40 kls Exp $
|
||||
* $Id: dvbplayer.c 1.29 2004/12/26 11:45:34 kls Exp $
|
||||
*/
|
||||
|
||||
#include "dvbplayer.h"
|
||||
@ -366,7 +366,7 @@ void cDvbPlayer::Action(void)
|
||||
|
||||
readIndex = Resume();
|
||||
if (readIndex >= 0)
|
||||
isyslog("resuming replay at index %d (%s)", readIndex, IndexToHMSF(readIndex, true));
|
||||
isyslog("resuming replay at index %d (%s)", readIndex, *IndexToHMSF(readIndex, true));
|
||||
|
||||
nonBlockingFileReader = new cNonBlockingFileReader;
|
||||
int Length = 0;
|
||||
|
6
eit.c
6
eit.c
@ -8,7 +8,7 @@
|
||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
|
||||
*
|
||||
* $Id: eit.c 1.100 2004/10/31 12:56:24 kls Exp $
|
||||
* $Id: eit.c 1.101 2004/12/26 10:38:46 kls Exp $
|
||||
*/
|
||||
|
||||
#include "eit.h"
|
||||
@ -245,8 +245,8 @@ cTDT::cTDT(const u_char *Data)
|
||||
|
||||
if (abs(sattim - loctim) > 2) {
|
||||
mutex.Lock();
|
||||
isyslog("System Time = %s (%ld)\n", ctime(&loctim), loctim);
|
||||
isyslog("Local Time = %s (%ld)\n", ctime(&sattim), sattim);
|
||||
isyslog("System Time = %s (%ld)\n", *TimeToString(loctim), loctim);
|
||||
isyslog("Local Time = %s (%ld)\n", *TimeToString(sattim), sattim);
|
||||
if (stime(&sattim) < 0)
|
||||
esyslog("ERROR while setting system time: %m");
|
||||
mutex.Unlock();
|
||||
|
31
epg.c
31
epg.c
@ -7,7 +7,7 @@
|
||||
* Original version (as used in VDR before 1.3.0) written by
|
||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||
*
|
||||
* $Id: epg.c 1.22 2004/11/07 10:43:30 kls Exp $
|
||||
* $Id: epg.c 1.23 2004/12/26 11:32:01 kls Exp $
|
||||
*/
|
||||
|
||||
#include "epg.h"
|
||||
@ -66,7 +66,7 @@ void cEvent::SetRunningStatus(int RunningStatus, cChannel *Channel)
|
||||
{
|
||||
if (Channel && runningStatus != RunningStatus && (RunningStatus > SI::RunningStatusNotRunning || runningStatus > SI::RunningStatusUndefined))
|
||||
if (Channel->Number() <= 30)//XXX maybe log only those that have timers???
|
||||
isyslog("channel %d (%s) event %s '%s' status %d", Channel->Number(), Channel->Name(), GetTimeString(), Title(), RunningStatus);
|
||||
isyslog("channel %d (%s) event %s '%s' status %d", Channel->Number(), Channel->Name(), *GetTimeString(), Title(), RunningStatus);
|
||||
runningStatus = RunningStatus;
|
||||
}
|
||||
|
||||
@ -119,9 +119,9 @@ bool cEvent::IsRunning(bool OrAboutToStart) const
|
||||
return runningStatus >= (OrAboutToStart ? SI::RunningStatusStartsInAFewSeconds : SI::RunningStatusPausing);
|
||||
}
|
||||
|
||||
const char *cEvent::GetDateString(void) const
|
||||
cString cEvent::GetDateString(void) const
|
||||
{
|
||||
static char buf[32];
|
||||
char buf[32];
|
||||
struct tm tm_r;
|
||||
tm *tm = localtime_r(&startTime, &tm_r);
|
||||
char *p = stpcpy(buf, WeekDayName(tm->tm_wday));
|
||||
@ -130,26 +130,26 @@ const char *cEvent::GetDateString(void) const
|
||||
return buf;
|
||||
}
|
||||
|
||||
const char *cEvent::GetTimeString(void) const
|
||||
cString cEvent::GetTimeString(void) const
|
||||
{
|
||||
static char buf[25];
|
||||
char buf[25];
|
||||
struct tm tm_r;
|
||||
strftime(buf, sizeof(buf), "%R", localtime_r(&startTime, &tm_r));
|
||||
return buf;
|
||||
}
|
||||
|
||||
const char *cEvent::GetEndTimeString(void) const
|
||||
cString cEvent::GetEndTimeString(void) const
|
||||
{
|
||||
static char buf[25];
|
||||
char buf[25];
|
||||
time_t EndTime = startTime + duration;
|
||||
struct tm tm_r;
|
||||
strftime(buf, sizeof(buf), "%R", localtime_r(&EndTime, &tm_r));
|
||||
return buf;
|
||||
}
|
||||
|
||||
const char *cEvent::GetVpsString(void) const
|
||||
cString cEvent::GetVpsString(void) const
|
||||
{
|
||||
static char buf[25];
|
||||
char buf[25];
|
||||
struct tm tm_r;
|
||||
strftime(buf, sizeof(buf), "%d.%m %R", localtime_r(&vps, &tm_r));
|
||||
return buf;
|
||||
@ -179,7 +179,8 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
|
||||
if (Schedule) {
|
||||
cEvent *Event = NULL;
|
||||
char *s;
|
||||
while ((s = readline(f)) != NULL) {
|
||||
cReadLine ReadLine;
|
||||
while ((s = ReadLine.Read(f)) != NULL) {
|
||||
char *t = skipspace(s + 1);
|
||||
switch (*s) {
|
||||
case 'E': if (!Event) {
|
||||
@ -604,7 +605,7 @@ void cSchedule::Dump(FILE *f, const char *Prefix, eDumpMode DumpMode, time_t AtT
|
||||
{
|
||||
cChannel *channel = Channels.GetByChannelID(channelID, true);
|
||||
if (channel) {
|
||||
fprintf(f, "%sC %s %s\n", Prefix, channel->GetChannelID().ToString(), channel->Name());
|
||||
fprintf(f, "%sC %s %s\n", Prefix, *channel->GetChannelID().ToString(), channel->Name());
|
||||
const cEvent *p;
|
||||
switch (DumpMode) {
|
||||
case dmAll: {
|
||||
@ -635,8 +636,9 @@ void cSchedule::Dump(FILE *f, const char *Prefix, eDumpMode DumpMode, time_t AtT
|
||||
bool cSchedule::Read(FILE *f, cSchedules *Schedules)
|
||||
{
|
||||
if (Schedules) {
|
||||
cReadLine ReadLine;
|
||||
char *s;
|
||||
while ((s = readline(f)) != NULL) {
|
||||
while ((s = ReadLine.Read(f)) != NULL) {
|
||||
if (*s == 'C') {
|
||||
s = skipspace(s + 1);
|
||||
char *p = strchr(s, ' ');
|
||||
@ -698,8 +700,7 @@ const cSchedules *cSchedules::Schedules(cSchedulesLock &SchedulesLock)
|
||||
void cSchedules::SetEpgDataFileName(const char *FileName)
|
||||
{
|
||||
delete epgDataFileName;
|
||||
if (FileName)
|
||||
epgDataFileName = strdup(FileName);
|
||||
epgDataFileName = FileName ? strdup(FileName) : NULL;
|
||||
}
|
||||
|
||||
void cSchedules::SetModified(cSchedule *Schedule)
|
||||
|
10
epg.h
10
epg.h
@ -7,7 +7,7 @@
|
||||
* Original version (as used in VDR before 1.3.0) written by
|
||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||
*
|
||||
* $Id: epg.h 1.17 2004/10/31 16:17:10 kls Exp $
|
||||
* $Id: epg.h 1.18 2004/12/26 11:31:27 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __EPG_H
|
||||
@ -56,10 +56,10 @@ public:
|
||||
time_t Seen(void) const { return seen; }
|
||||
bool HasTimer(void) const;
|
||||
bool IsRunning(bool OrAboutToStart = false) const;
|
||||
const char *GetDateString(void) const;
|
||||
const char *GetTimeString(void) const;
|
||||
const char *GetEndTimeString(void) const;
|
||||
const char *GetVpsString(void) const;
|
||||
cString GetDateString(void) const;
|
||||
cString GetTimeString(void) const;
|
||||
cString GetEndTimeString(void) const;
|
||||
cString GetVpsString(void) const;
|
||||
void SetEventID(u_int16_t EventID);
|
||||
void SetTableID(uchar TableID);
|
||||
void SetVersion(uchar Version);
|
||||
|
20
menu.c
20
menu.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.c 1.322 2004/12/19 17:59:47 kls Exp $
|
||||
* $Id: menu.c 1.323 2004/12/26 12:18:29 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
@ -116,7 +116,7 @@ void cMenuEditSrcItem::Set(void)
|
||||
{
|
||||
if (source) {
|
||||
char *buffer = NULL;
|
||||
asprintf(&buffer, "%s - %s", cSource::ToString(source->Code()), source->Description());
|
||||
asprintf(&buffer, "%s - %s", *cSource::ToString(source->Code()), source->Description());
|
||||
SetValue(buffer);
|
||||
free(buffer);
|
||||
}
|
||||
@ -249,7 +249,7 @@ cMenuEditChannel::cMenuEditChannel(cChannel *Channel, bool New)
|
||||
void cMenuEditChannel::Setup(void)
|
||||
{
|
||||
int current = Current();
|
||||
char type = *cSource::ToString(data.source);
|
||||
char type = **cSource::ToString(data.source);
|
||||
#define ST(s) if (strchr(s, type))
|
||||
|
||||
Clear();
|
||||
@ -300,7 +300,7 @@ eOSState cMenuEditChannel::ProcessKey(eKeys Key)
|
||||
data.name = strcpyrealloc(data.name, name);
|
||||
if (channel) {
|
||||
*channel = data;
|
||||
isyslog("edited channel %d %s", channel->Number(), data.ToText());
|
||||
isyslog("edited channel %d %s", channel->Number(), *data.ToText());
|
||||
state = osBack;
|
||||
}
|
||||
else {
|
||||
@ -308,7 +308,7 @@ eOSState cMenuEditChannel::ProcessKey(eKeys Key)
|
||||
*channel = data;
|
||||
Channels.Add(channel);
|
||||
Channels.ReNumber();
|
||||
isyslog("added channel %d %s", channel->Number(), data.ToText());
|
||||
isyslog("added channel %d %s", channel->Number(), *data.ToText());
|
||||
state = osUser1;
|
||||
}
|
||||
Channels.SetModified(true);
|
||||
@ -737,9 +737,9 @@ void cMenuTimerItem::Set(void)
|
||||
asprintf(&buffer, "%c\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s",
|
||||
!(timer->HasFlags(tfActive)) ? ' ' : timer->FirstDay() ? '!' : timer->Recording() ? '#' : '>',
|
||||
timer->Channel()->Number(),
|
||||
timer->IsSingleEvent() ? WeekDayName(timer->StartTime()) : "",
|
||||
timer->IsSingleEvent() ? *WeekDayName(timer->StartTime()) : "",
|
||||
timer->IsSingleEvent() ? " " : "",
|
||||
timer->PrintDay(timer->Day()),
|
||||
*timer->PrintDay(timer->Day()),
|
||||
timer->Start() / 100,
|
||||
timer->Start() % 100,
|
||||
timer->Stop() / 100,
|
||||
@ -795,7 +795,7 @@ eOSState cMenuTimers::OnOff(void)
|
||||
RefreshCurrent();
|
||||
DisplayCurrent(true);
|
||||
if (timer->FirstDay())
|
||||
isyslog("timer %d first day set to %s", timer->Index() + 1, timer->PrintFirstDay());
|
||||
isyslog("timer %d first day set to %s", timer->Index() + 1, *timer->PrintFirstDay());
|
||||
else
|
||||
isyslog("timer %d %sactivated", timer->Index() + 1, timer->HasFlags(tfActive) ? "" : "de");
|
||||
Timers.SetModified();
|
||||
@ -969,7 +969,7 @@ cMenuWhatsOnItem::cMenuWhatsOnItem(const cEvent *Event, cChannel *Channel)
|
||||
char t = Timers.GetMatch(Event, &TimerMatch) ? (TimerMatch == tmFull) ? 'T' : 't' : ' ';
|
||||
char v = event->Vps() && (event->Vps() - event->StartTime()) ? 'V' : ' ';
|
||||
char r = event->IsRunning() ? '*' : ' ';
|
||||
asprintf(&buffer, "%d\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), 6, channel->ShortName(true), event->GetTimeString(), t, v, r, event->Title());
|
||||
asprintf(&buffer, "%d\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), 6, channel->ShortName(true), *event->GetTimeString(), t, v, r, event->Title());
|
||||
SetText(buffer, false);
|
||||
}
|
||||
|
||||
@ -1087,7 +1087,7 @@ cMenuScheduleItem::cMenuScheduleItem(const cEvent *Event)
|
||||
char t = Timers.GetMatch(Event, &TimerMatch) ? (TimerMatch == tmFull) ? 'T' : 't' : ' ';
|
||||
char v = event->Vps() && (event->Vps() - event->StartTime()) ? 'V' : ' ';
|
||||
char r = event->IsRunning() ? '*' : ' ';
|
||||
asprintf(&buffer, "%.*s\t%s\t%c%c%c\t%s", 6, event->GetDateString(), event->GetTimeString(), t, v, r, event->Title());
|
||||
asprintf(&buffer, "%.*s\t%s\t%c%c%c\t%s", 6, *event->GetDateString(), *event->GetTimeString(), t, v, r, event->Title());
|
||||
SetText(buffer, false);
|
||||
}
|
||||
|
||||
|
26
recording.c
26
recording.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recording.c 1.93 2004/12/19 15:44:42 kls Exp $
|
||||
* $Id: recording.c 1.94 2004/12/26 11:55:24 kls Exp $
|
||||
*/
|
||||
|
||||
#include "recording.h"
|
||||
@ -157,7 +157,7 @@ cResumeFile::cResumeFile(const char *FileName)
|
||||
fileName = MALLOC(char, strlen(FileName) + strlen(RESUMEFILESUFFIX) + 1);
|
||||
if (fileName) {
|
||||
strcpy(fileName, FileName);
|
||||
sprintf(fileName + strlen(fileName), RESUMEFILESUFFIX, Setup.ResumeID ? "." : "", Setup.ResumeID ? *cItoa(Setup.ResumeID) : "");
|
||||
sprintf(fileName + strlen(fileName), RESUMEFILESUFFIX, Setup.ResumeID ? "." : "", Setup.ResumeID ? *itoa(Setup.ResumeID) : "");
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: can't allocate memory for resume file name");
|
||||
@ -541,8 +541,8 @@ const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level) cons
|
||||
|
||||
const char *cRecording::PrefixFileName(char Prefix)
|
||||
{
|
||||
const char *p = PrefixVideoFileName(FileName(), Prefix);
|
||||
if (p) {
|
||||
cString p = PrefixVideoFileName(FileName(), Prefix);
|
||||
if (*p) {
|
||||
free(fileName);
|
||||
fileName = strdup(p);
|
||||
return fileName;
|
||||
@ -665,7 +665,7 @@ void cRecordings::ScanVideoDir(const char *DirName)
|
||||
|
||||
bool cRecordings::NeedsUpdate(void)
|
||||
{
|
||||
return lastUpdate <= LastModifiedTime(*cAddDirectory(VideoDirectory, ".update"));
|
||||
return lastUpdate <= LastModifiedTime(AddDirectory(VideoDirectory, ".update"));
|
||||
}
|
||||
|
||||
bool cRecordings::Load(void)
|
||||
@ -704,8 +704,6 @@ void cRecordings::DelByName(const char *FileName)
|
||||
|
||||
// --- cMark -----------------------------------------------------------------
|
||||
|
||||
char *cMark::buffer = NULL;
|
||||
|
||||
cMark::cMark(int Position, const char *Comment)
|
||||
{
|
||||
position = Position;
|
||||
@ -717,10 +715,10 @@ cMark::~cMark()
|
||||
free(comment);
|
||||
}
|
||||
|
||||
const char *cMark::ToText(void)
|
||||
cString cMark::ToText(void)
|
||||
{
|
||||
free(buffer);
|
||||
asprintf(&buffer, "%s%s%s\n", IndexToHMSF(position, true), comment ? " " : "", comment ? comment : "");
|
||||
char *buffer;
|
||||
asprintf(&buffer, "%s%s%s\n", *IndexToHMSF(position, true), comment ? " " : "", comment ? comment : "");
|
||||
return buffer;
|
||||
}
|
||||
|
||||
@ -747,7 +745,7 @@ bool cMark::Save(FILE *f)
|
||||
|
||||
bool cMarks::Load(const char *RecordingFileName)
|
||||
{
|
||||
if (cConfig<cMark>::Load(*cAddDirectory(RecordingFileName, MARKSFILESUFFIX))) {
|
||||
if (cConfig<cMark>::Load(AddDirectory(RecordingFileName, MARKSFILESUFFIX))) {
|
||||
Sort();
|
||||
return true;
|
||||
}
|
||||
@ -811,7 +809,7 @@ void cRecordingUserCommand::InvokeCommand(const char *State, const char *Recordi
|
||||
{
|
||||
if (command) {
|
||||
char *cmd;
|
||||
asprintf(&cmd, "%s %s \"%s\"", command, State, *cStrEscape(RecordingFileName, "\"$"));
|
||||
asprintf(&cmd, "%s %s \"%s\"", command, State, *strescape(RecordingFileName, "\"$"));
|
||||
isyslog("executing '%s'", cmd);
|
||||
SystemExec(cmd);
|
||||
free(cmd);
|
||||
@ -1152,9 +1150,9 @@ int cFileName::NextFile(void)
|
||||
|
||||
// --- Index stuff -----------------------------------------------------------
|
||||
|
||||
const char *IndexToHMSF(int Index, bool WithFrame)
|
||||
cString IndexToHMSF(int Index, bool WithFrame)
|
||||
{
|
||||
static char buffer[16];
|
||||
char buffer[16];
|
||||
int f = (Index % FRAMESPERSEC) + 1;
|
||||
int s = (Index / FRAMESPERSEC);
|
||||
int m = s / 60 % 60;
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recording.h 1.32 2004/10/31 16:24:38 kls Exp $
|
||||
* $Id: recording.h 1.33 2004/12/26 11:47:35 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __RECORDING_H
|
||||
@ -86,14 +86,12 @@ public:
|
||||
extern cRecordings Recordings;
|
||||
|
||||
class cMark : public cListObject {
|
||||
private:
|
||||
static char *buffer;
|
||||
public:
|
||||
int position;
|
||||
char *comment;
|
||||
cMark(int Position = 0, const char *Comment = NULL);
|
||||
~cMark();
|
||||
const char *ToText(void);
|
||||
cString ToText(void);
|
||||
bool Parse(const char *s);
|
||||
bool Save(FILE *f);
|
||||
};
|
||||
@ -176,7 +174,7 @@ public:
|
||||
int NextFile(void);
|
||||
};
|
||||
|
||||
const char *IndexToHMSF(int Index, bool WithFrame = false);
|
||||
cString IndexToHMSF(int Index, bool WithFrame = false);
|
||||
// Converts the given index to a string, optionally containing the frame number.
|
||||
int HMSFToIndex(const char *HMSF);
|
||||
// Converts the given string (format: "hh:mm:ss.ff") to an index.
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: skinclassic.c 1.8 2004/12/19 15:46:09 kls Exp $
|
||||
* $Id: skinclassic.c 1.9 2004/12/26 11:33:53 kls Exp $
|
||||
*/
|
||||
|
||||
#include "skinclassic.h"
|
||||
@ -141,8 +141,8 @@ void cSkinClassicDisplayChannel::SetMessage(eMessageType Type, const char *Text)
|
||||
void cSkinClassicDisplayChannel::Flush(void)
|
||||
{
|
||||
if (!message) {
|
||||
cDayDateTime date;
|
||||
osd->DrawText(osd->Width() - cFont::GetFont(fontSml)->Width(*date) - 2, 0, *date, Theme.Color(clrChannelDate), Theme.Color(clrBackground), cFont::GetFont(fontSml));
|
||||
cString date = DayDateTime();
|
||||
osd->DrawText(osd->Width() - cFont::GetFont(fontSml)->Width(date) - 2, 0, date, Theme.Color(clrChannelDate), Theme.Color(clrBackground), cFont::GetFont(fontSml));
|
||||
}
|
||||
osd->Flush();
|
||||
}
|
||||
@ -299,11 +299,11 @@ void cSkinClassicDisplayMenu::SetEvent(const cEvent *Event)
|
||||
int y = y2;
|
||||
cTextScroller ts;
|
||||
char t[32];
|
||||
snprintf(t, sizeof(t), "%s %s - %s", Event->GetDateString(), Event->GetTimeString(), Event->GetEndTimeString());
|
||||
snprintf(t, sizeof(t), "%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
||||
ts.Set(osd, xl, y, x1 - xl, y3 - y, t, font, Theme.Color(clrMenuEventTime), Theme.Color(clrBackground));
|
||||
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
|
||||
char *buffer;
|
||||
asprintf(&buffer, " VPS: %s", Event->GetVpsString());
|
||||
asprintf(&buffer, " VPS: %s", *Event->GetVpsString());
|
||||
const cFont *font = cFont::GetFont(fontSml);
|
||||
osd->DrawText(x1 - font->Width(buffer), y, buffer, Theme.Color(clrMenuEventVpsFg), Theme.Color(clrMenuEventVpsBg), font);
|
||||
free(buffer);
|
||||
@ -338,9 +338,9 @@ void cSkinClassicDisplayMenu::SetText(const char *Text, bool FixedFont)
|
||||
|
||||
void cSkinClassicDisplayMenu::Flush(void)
|
||||
{
|
||||
cDayDateTime date;
|
||||
cString date = DayDateTime();
|
||||
const cFont *font = cFont::GetFont(fontOsd);
|
||||
osd->DrawText(x1 - font->Width(*date) - 2, y0, *date, Theme.Color(clrMenuDate), Theme.Color(clrMenuTitleBg), font);
|
||||
osd->DrawText(x1 - font->Width(date) - 2, y0, date, Theme.Color(clrMenuDate), Theme.Color(clrMenuTitleBg), font);
|
||||
osd->Flush();
|
||||
}
|
||||
|
||||
|
4
skins.h
4
skins.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: skins.h 1.3 2004/05/29 13:13:21 kls Exp $
|
||||
* $Id: skins.h 1.4 2004/12/26 11:57:54 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __SKINS_H
|
||||
@ -99,7 +99,7 @@ protected:
|
||||
///< Returns the offset of the given tab from the left border of the
|
||||
///< item display area. The value returned is in pixel.//XXX ncurses???
|
||||
const char *GetTabbedText(const char *s, int Tab);
|
||||
///< Returns the that part of the given string, that follows the given
|
||||
///< Returns the part of the given string that follows the given
|
||||
///< Tab (where 0 indicates the beginning of the string). If no such
|
||||
///< part can be found, NULL will be returned.
|
||||
public:
|
||||
|
18
skinsttng.c
18
skinsttng.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: skinsttng.c 1.8 2004/12/19 15:48:55 kls Exp $
|
||||
* $Id: skinsttng.c 1.9 2004/12/26 11:34:29 kls Exp $
|
||||
*/
|
||||
|
||||
// Star Trek: The Next Generation® is a registered trademark of Paramount Pictures
|
||||
@ -289,9 +289,9 @@ void cSkinSTTNGDisplayChannel::Flush(void)
|
||||
{
|
||||
if (withInfo) {
|
||||
if (!message) {
|
||||
cDayDateTime date;
|
||||
cString date = DayDateTime();
|
||||
const cFont *font = cFont::GetFont(fontSml);
|
||||
osd->DrawText(x4 - font->Width(*date) - 2, y7 - font->Height(*date), *date, Theme.Color(clrChannelDate), frameColor, font);
|
||||
osd->DrawText(x4 - font->Width(date) - 2, y7 - font->Height(date), date, Theme.Color(clrChannelDate), frameColor, font);
|
||||
}
|
||||
|
||||
int seen = 0;
|
||||
@ -456,11 +456,11 @@ void cSkinSTTNGDisplayMenu::SetTitle(const char *Title)
|
||||
|
||||
void cSkinSTTNGDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
||||
{
|
||||
cDayDateTime date;
|
||||
cString date = DayDateTime();
|
||||
const cFont *font = cFont::GetFont(fontSml);
|
||||
int d = 10;
|
||||
int d2 = d / 2;
|
||||
int t4 = x4 - font->Width(*date) - 2;
|
||||
int t4 = x4 - font->Width(date) - 2;
|
||||
int w = t4 - x3;
|
||||
int t0 = x3 + d2;
|
||||
int t1 = x3 + w / 4;
|
||||
@ -533,11 +533,11 @@ void cSkinSTTNGDisplayMenu::SetEvent(const cEvent *Event)
|
||||
int y = y3;
|
||||
cTextScroller ts;
|
||||
char t[32];
|
||||
snprintf(t, sizeof(t), "%s %s - %s", Event->GetDateString(), Event->GetTimeString(), Event->GetEndTimeString());
|
||||
snprintf(t, sizeof(t), "%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
||||
ts.Set(osd, xl, y, x4 - xl, y4 - y, t, font, Theme.Color(clrMenuEventTime), Theme.Color(clrBackground));
|
||||
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
|
||||
char *buffer;
|
||||
asprintf(&buffer, " VPS: %s", Event->GetVpsString());
|
||||
asprintf(&buffer, " VPS: %s", *Event->GetVpsString());
|
||||
const cFont *font = cFont::GetFont(fontSml);
|
||||
osd->DrawText(x4 - font->Width(buffer), y, buffer, Theme.Color(clrMenuEventVps), frameColor, font);
|
||||
int yb = y + font->Height();
|
||||
@ -583,9 +583,9 @@ void cSkinSTTNGDisplayMenu::SetText(const char *Text, bool FixedFont)
|
||||
void cSkinSTTNGDisplayMenu::Flush(void)
|
||||
{
|
||||
if (!message) {
|
||||
cDayDateTime date;
|
||||
cString date = DayDateTime();
|
||||
const cFont *font = cFont::GetFont(fontSml);
|
||||
osd->DrawText(x4 - font->Width(*date) - 2, y7 - font->Height(*date), *date, Theme.Color(clrMenuDate), frameColor, font);
|
||||
osd->DrawText(x4 - font->Width(date) - 2, y7 - font->Height(date), date, Theme.Color(clrMenuDate), frameColor, font);
|
||||
}
|
||||
osd->Flush();
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: sources.c 1.2 2004/01/11 10:36:57 kls Exp $
|
||||
* $Id: sources.c 1.3 2004/12/26 11:58:52 kls Exp $
|
||||
*/
|
||||
|
||||
#include "sources.h"
|
||||
@ -32,9 +32,9 @@ bool cSource::Parse(const char *s)
|
||||
return code != stNone && description && *description;
|
||||
}
|
||||
|
||||
const char *cSource::ToString(int Code)
|
||||
cString cSource::ToString(int Code)
|
||||
{
|
||||
static char buffer[16];
|
||||
char buffer[16];
|
||||
char *q = buffer;
|
||||
switch (Code & st_Mask) {
|
||||
case stCable: *q++ = 'C'; break;
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: sources.h 1.2 2004/01/11 10:35:36 kls Exp $
|
||||
* $Id: sources.h 1.3 2004/12/26 11:59:21 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __SOURCES_H
|
||||
@ -32,7 +32,7 @@ public:
|
||||
int Code(void) const { return code; }
|
||||
const char *Description(void) const { return description; }
|
||||
bool Parse(const char *s);
|
||||
static const char *ToString(int Code);
|
||||
static cString ToString(int Code);
|
||||
static int FromString(const char *s);
|
||||
static int FromData(eSourceType SourceType, int Position = 0, bool East = false);
|
||||
};
|
||||
|
34
svdrp.c
34
svdrp.c
@ -10,7 +10,7 @@
|
||||
* and interact with the Video Disk Recorder - or write a full featured
|
||||
* graphical interface that sits on top of an SVDRP connection.
|
||||
*
|
||||
* $Id: svdrp.c 1.66 2004/12/19 13:52:34 kls Exp $
|
||||
* $Id: svdrp.c 1.67 2004/12/26 12:23:55 kls Exp $
|
||||
*/
|
||||
|
||||
#include "svdrp.h"
|
||||
@ -673,7 +673,7 @@ void cSVDRP::CmdLSTC(const char *Option)
|
||||
if (isnumber(Option)) {
|
||||
cChannel *channel = Channels.GetByNumber(strtol(Option, NULL, 10));
|
||||
if (channel)
|
||||
Reply(250, "%d %s", channel->Number(), channel->ToText());
|
||||
Reply(250, "%d %s", channel->Number(), *channel->ToText());
|
||||
else
|
||||
Reply(501, "Channel \"%s\" not defined", Option);
|
||||
}
|
||||
@ -685,7 +685,7 @@ void cSVDRP::CmdLSTC(const char *Option)
|
||||
if (channel) {
|
||||
if (strcasestr(channel->Name(), Option)) {
|
||||
if (next)
|
||||
Reply(-250, "%d %s", next->Number(), next->ToText());
|
||||
Reply(-250, "%d %s", next->Number(), *next->ToText());
|
||||
next = channel;
|
||||
}
|
||||
}
|
||||
@ -696,7 +696,7 @@ void cSVDRP::CmdLSTC(const char *Option)
|
||||
i = channel->Number() + 1;
|
||||
}
|
||||
if (next)
|
||||
Reply(250, "%d %s", next->Number(), next->ToText());
|
||||
Reply(250, "%d %s", next->Number(), *next->ToText());
|
||||
else
|
||||
Reply(501, "Channel \"%s\" not defined", Option);
|
||||
}
|
||||
@ -706,7 +706,7 @@ void cSVDRP::CmdLSTC(const char *Option)
|
||||
while (i <= Channels.MaxNumber()) {
|
||||
cChannel *channel = Channels.GetByNumber(i, 1);
|
||||
if (channel)
|
||||
Reply(channel->Number() < Channels.MaxNumber() ? -250 : 250, "%d %s", channel->Number(), channel->ToText());
|
||||
Reply(channel->Number() < Channels.MaxNumber() ? -250 : 250, "%d %s", channel->Number(), *channel->ToText());
|
||||
else
|
||||
Reply(501, "Channel \"%d\" not found", i);
|
||||
i = channel->Number() + 1;
|
||||
@ -830,7 +830,7 @@ void cSVDRP::CmdLSTT(const char *Option)
|
||||
if (isnumber(Option)) {
|
||||
cTimer *timer = Timers.Get(strtol(Option, NULL, 10) - 1);
|
||||
if (timer)
|
||||
Reply(250, "%d %s", timer->Index() + 1, timer->ToText());
|
||||
Reply(250, "%d %s", timer->Index() + 1, *timer->ToText());
|
||||
else
|
||||
Reply(501, "Timer \"%s\" not defined", Option);
|
||||
}
|
||||
@ -841,7 +841,7 @@ void cSVDRP::CmdLSTT(const char *Option)
|
||||
for (int i = 0; i < Timers.Count(); i++) {
|
||||
cTimer *timer = Timers.Get(i);
|
||||
if (timer)
|
||||
Reply(i < Timers.Count() - 1 ? -250 : 250, "%d %s", timer->Index() + 1, timer->ToText());
|
||||
Reply(i < Timers.Count() - 1 ? -250 : 250, "%d %s", timer->Index() + 1, *timer->ToText());
|
||||
else
|
||||
Reply(501, "Timer \"%d\" not found", i + 1);
|
||||
}
|
||||
@ -879,8 +879,8 @@ void cSVDRP::CmdMODC(const char *Option)
|
||||
*channel = ch;
|
||||
Channels.ReNumber();
|
||||
Channels.SetModified(true);
|
||||
isyslog("modifed channel %d %s", channel->Number(), channel->ToText());
|
||||
Reply(250, "%d %s", channel->Number(), channel->ToText());
|
||||
isyslog("modifed channel %d %s", channel->Number(), *channel->ToText());
|
||||
Reply(250, "%d %s", channel->Number(), *channel->ToText());
|
||||
}
|
||||
else
|
||||
Reply(501, "Channel settings are not unique");
|
||||
@ -919,7 +919,7 @@ void cSVDRP::CmdMODT(const char *Option)
|
||||
*timer = t;
|
||||
Timers.SetModified();
|
||||
isyslog("timer %d modified (%s)", timer->Index() + 1, timer->HasFlags(tfActive) ? "active" : "inactive");
|
||||
Reply(250, "%d %s", timer->Index() + 1, timer->ToText());
|
||||
Reply(250, "%d %s", timer->Index() + 1, *timer->ToText());
|
||||
}
|
||||
else
|
||||
Reply(501, "Timer \"%d\" not defined", n);
|
||||
@ -954,8 +954,8 @@ void cSVDRP::CmdNEWC(const char *Option)
|
||||
Channels.Add(channel);
|
||||
Channels.ReNumber();
|
||||
Channels.SetModified(true);
|
||||
isyslog("new channel %d %s", channel->Number(), channel->ToText());
|
||||
Reply(250, "%d %s", channel->Number(), channel->ToText());
|
||||
isyslog("new channel %d %s", channel->Number(), *channel->ToText());
|
||||
Reply(250, "%d %s", channel->Number(), *channel->ToText());
|
||||
}
|
||||
else
|
||||
Reply(501, "Channel settings are not unique");
|
||||
@ -977,11 +977,11 @@ void cSVDRP::CmdNEWT(const char *Option)
|
||||
Timers.Add(timer);
|
||||
Timers.SetModified();
|
||||
isyslog("timer %d added", timer->Index() + 1);
|
||||
Reply(250, "%d %s", timer->Index() + 1, timer->ToText());
|
||||
Reply(250, "%d %s", timer->Index() + 1, *timer->ToText());
|
||||
return;
|
||||
}
|
||||
else
|
||||
Reply(550, "Timer already defined: %d %s", t->Index() + 1, t->ToText());
|
||||
Reply(550, "Timer already defined: %d %s", t->Index() + 1, *t->ToText());
|
||||
}
|
||||
else
|
||||
Reply(501, "Error in timer settings");
|
||||
@ -998,7 +998,7 @@ void cSVDRP::CmdNEXT(const char *Option)
|
||||
time_t Start = t->StartTime();
|
||||
int Number = t->Index() + 1;
|
||||
if (!*Option)
|
||||
Reply(250, "%d %s", Number, *cCtime(Start));
|
||||
Reply(250, "%d %s", Number, *TimeToString(Start));
|
||||
else if (strcasecmp(Option, "ABS") == 0)
|
||||
Reply(250, "%d %ld", Number, Start);
|
||||
else if (strcasecmp(Option, "REL") == 0)
|
||||
@ -1057,7 +1057,7 @@ void cSVDRP::CmdUPDT(const char *Option)
|
||||
isyslog("timer %d added", timer->Index() + 1);
|
||||
}
|
||||
Timers.SetModified();
|
||||
Reply(250, "%d %s", timer->Index() + 1, timer->ToText());
|
||||
Reply(250, "%d %s", timer->Index() + 1, *timer->ToText());
|
||||
return;
|
||||
}
|
||||
else
|
||||
@ -1151,7 +1151,7 @@ bool cSVDRP::Process(void)
|
||||
char buffer[BUFSIZ];
|
||||
gethostname(buffer, sizeof(buffer));
|
||||
time_t now = time(NULL);
|
||||
Reply(220, "%s SVDRP VideoDiskRecorder %s; %s", buffer, VDRVERSION, *cCtime(now));
|
||||
Reply(220, "%s SVDRP VideoDiskRecorder %s; %s", buffer, VDRVERSION, *TimeToString(now));
|
||||
}
|
||||
if (NewConnection)
|
||||
lastActivity = time(NULL);
|
||||
|
4
themes.c
4
themes.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: themes.c 1.4 2004/12/19 15:49:49 kls Exp $
|
||||
* $Id: themes.c 1.5 2004/12/24 17:00:41 kls Exp $
|
||||
*/
|
||||
|
||||
#include "themes.h"
|
||||
@ -248,7 +248,7 @@ bool cThemes::Load(const char *SkinName)
|
||||
while ((e = d.Next()) != NULL) {
|
||||
if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
|
||||
if (strstr(e->d_name, SkinName) == e->d_name && e->d_name[strlen(SkinName)] == '-') {
|
||||
cAddDirectory FileName(themesDirectory, e->d_name);
|
||||
cString FileName = AddDirectory(themesDirectory, e->d_name);
|
||||
cTheme Theme;
|
||||
if (Theme.Load(*FileName, true)) {
|
||||
names = (char **)realloc(names, (numThemes + 1) * sizeof(char *));
|
||||
|
26
timers.c
26
timers.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: timers.c 1.20 2004/12/19 14:11:29 kls Exp $
|
||||
* $Id: timers.c 1.21 2004/12/26 12:35:33 kls Exp $
|
||||
*/
|
||||
|
||||
#include "timers.h"
|
||||
@ -19,8 +19,6 @@
|
||||
|
||||
// -- cTimer -----------------------------------------------------------------
|
||||
|
||||
char *cTimer::buffer = NULL;
|
||||
|
||||
cTimer::cTimer(bool Instant, bool Pause)
|
||||
{
|
||||
startTime = stopTime = 0;
|
||||
@ -106,12 +104,12 @@ int cTimer::Compare(const cListObject &ListObject) const
|
||||
return r;
|
||||
}
|
||||
|
||||
const char *cTimer::ToText(bool UseChannelID)
|
||||
cString cTimer::ToText(bool UseChannelID)
|
||||
{
|
||||
free(buffer);
|
||||
char *buffer;
|
||||
strreplace(file, ':', '|');
|
||||
strreplace(summary, '\n', '|');
|
||||
asprintf(&buffer, "%d:%s:%s:%04d:%04d:%d:%d:%s:%s\n", flags, UseChannelID ? Channel()->GetChannelID().ToString() : *cItoa(Channel()->Number()), PrintDay(day, firstday), start, stop, priority, lifetime, file, summary ? summary : "");
|
||||
asprintf(&buffer, "%d:%s:%s:%04d:%04d:%d:%d:%s:%s\n", flags, UseChannelID ? *Channel()->GetChannelID().ToString() : *itoa(Channel()->Number()), *PrintDay(day, firstday), start, stop, priority, lifetime, file, summary ? summary : "");
|
||||
strreplace(summary, '|', '\n');
|
||||
strreplace(file, '|', ':');
|
||||
return buffer;
|
||||
@ -162,10 +160,10 @@ int cTimer::ParseDay(const char *s, time_t *FirstDay)
|
||||
return d;
|
||||
}
|
||||
|
||||
const char *cTimer::PrintDay(int d, time_t FirstDay)
|
||||
cString cTimer::PrintDay(int d, time_t FirstDay)
|
||||
{
|
||||
#define DAYBUFFERSIZE 32
|
||||
static char buffer[DAYBUFFERSIZE];
|
||||
char buffer[DAYBUFFERSIZE];
|
||||
if ((d & 0x80000000) != 0) {
|
||||
char *b = buffer;
|
||||
const char *w = tr("MTWTFSS");
|
||||
@ -186,12 +184,12 @@ const char *cTimer::PrintDay(int d, time_t FirstDay)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
const char *cTimer::PrintFirstDay(void)
|
||||
cString cTimer::PrintFirstDay(void)
|
||||
{
|
||||
if (firstday) {
|
||||
const char *s = PrintDay(day, firstday);
|
||||
cString s = PrintDay(day, firstday);
|
||||
if (strlen(s) == 18)
|
||||
return s + 8;
|
||||
return *s + 8;
|
||||
}
|
||||
return ""; // not NULL, so the caller can always use the result
|
||||
}
|
||||
@ -248,7 +246,7 @@ bool cTimer::Parse(const char *s)
|
||||
|
||||
bool cTimer::Save(FILE *f)
|
||||
{
|
||||
return fprintf(f, ToText(true)) > 0;
|
||||
return fprintf(f, "%s", *ToText(true)) > 0;
|
||||
}
|
||||
|
||||
bool cTimer::IsSingleEvent(void) const
|
||||
@ -397,8 +395,8 @@ void cTimer::SetEvent(const cEvent *Event)
|
||||
if (Event) {
|
||||
char vpsbuf[64] = "";
|
||||
if (Event->Vps())
|
||||
sprintf(vpsbuf, "(VPS: %s) ", Event->GetVpsString());
|
||||
isyslog("timer %d (%d %04d-%04d '%s') set to event %s %s-%s %s'%s'", Index() + 1, Channel()->Number(), start, stop, file, Event->GetDateString(), Event->GetTimeString(), Event->GetEndTimeString(), vpsbuf, Event->Title());
|
||||
sprintf(vpsbuf, "(VPS: %s) ", *Event->GetVpsString());
|
||||
isyslog("timer %d (%d %04d-%04d '%s') set to event %s %s-%s %s'%s'", Index() + 1, Channel()->Number(), start, stop, file, *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString(), vpsbuf, Event->Title());
|
||||
}
|
||||
else
|
||||
isyslog("timer %d (%d %04d-%04d '%s') set to no event", Index() + 1, Channel()->Number(), start, stop, file);
|
||||
|
9
timers.h
9
timers.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: timers.h 1.12 2004/11/21 12:37:33 kls Exp $
|
||||
* $Id: timers.h 1.13 2004/12/26 12:21:29 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TIMERS_H
|
||||
@ -27,7 +27,6 @@ class cTimer : public cListObject {
|
||||
friend class cMenuEditTimer;
|
||||
private:
|
||||
mutable time_t startTime, stopTime;
|
||||
static char *buffer;
|
||||
bool recording, pending, inVpsMargin;
|
||||
int flags;
|
||||
cChannel *channel;
|
||||
@ -59,7 +58,7 @@ public:
|
||||
const char *File(void) { return file; }
|
||||
time_t FirstDay(void) { return firstday; }
|
||||
const char *Summary(void) { return summary; }
|
||||
const char *ToText(bool UseChannelID = false);
|
||||
cString ToText(bool UseChannelID = false);
|
||||
const cEvent *Event(void) { return event; }
|
||||
bool Parse(const char *s);
|
||||
bool Save(FILE *f);
|
||||
@ -85,10 +84,10 @@ public:
|
||||
bool HasFlags(int Flags) const;
|
||||
void Skip(void);
|
||||
void OnOff(void);
|
||||
const char *PrintFirstDay(void);
|
||||
cString PrintFirstDay(void);
|
||||
static int TimeToInt(int t);
|
||||
static int ParseDay(const char *s, time_t *FirstDay = NULL);
|
||||
static const char *PrintDay(int d, time_t FirstDay = 0);
|
||||
static cString PrintDay(int d, time_t FirstDay = 0);
|
||||
};
|
||||
|
||||
class cTimers : public cConfig<cTimer> {
|
||||
|
146
tools.c
146
tools.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: tools.c 1.85 2004/12/19 18:06:16 kls Exp $
|
||||
* $Id: tools.c 1.86 2004/12/26 11:23:35 kls Exp $
|
||||
*/
|
||||
|
||||
#include "tools.h"
|
||||
@ -155,6 +155,29 @@ char *compactspace(char *s)
|
||||
return s;
|
||||
}
|
||||
|
||||
cString strescape(const char *s, const char *chars)
|
||||
{
|
||||
char *buffer;
|
||||
const char *p = s;
|
||||
char *t = NULL;
|
||||
while (*p) {
|
||||
if (strchr(chars, *p)) {
|
||||
if (!t) {
|
||||
buffer = MALLOC(char, 2 * strlen(s) + 1);
|
||||
t = buffer + (p - s);
|
||||
s = strcpy(buffer, s);
|
||||
}
|
||||
*t++ = '\\';
|
||||
}
|
||||
if (t)
|
||||
*t++ = *p;
|
||||
p++;
|
||||
}
|
||||
if (t)
|
||||
*t = 0;
|
||||
return s;
|
||||
}
|
||||
|
||||
bool startswith(const char *s, const char *p)
|
||||
{
|
||||
while (*p) {
|
||||
@ -199,6 +222,20 @@ bool isnumber(const char *s)
|
||||
return true;
|
||||
}
|
||||
|
||||
cString AddDirectory(const char *DirName, const char *FileName)
|
||||
{
|
||||
char *buf;
|
||||
asprintf(&buf, "%s/%s", DirName && *DirName ? DirName : ".", FileName);
|
||||
return buf;
|
||||
}
|
||||
|
||||
cString itoa(int n)
|
||||
{
|
||||
char buf[16];
|
||||
snprintf(buf, sizeof(buf), "%d", n);
|
||||
return buf;
|
||||
}
|
||||
|
||||
int FreeDiskSpaceMB(const char *Directory, int *UsedMB)
|
||||
{
|
||||
if (UsedMB)
|
||||
@ -450,106 +487,63 @@ uint64 cTimeMs::Elapsed(void)
|
||||
return Now() - begin;
|
||||
}
|
||||
|
||||
// --- cBufferedStringFunction -----------------------------------------------
|
||||
// --- cString ---------------------------------------------------------------
|
||||
|
||||
cBufferedStringFunction::cBufferedStringFunction(void)
|
||||
cString::cString(const char *S)
|
||||
{
|
||||
buffer = NULL;
|
||||
result = ""; // makes sure dereferencing it doesn't hurt
|
||||
s = S ? strdup(S) : NULL;
|
||||
}
|
||||
|
||||
cBufferedStringFunction::~cBufferedStringFunction()
|
||||
cString::~cString()
|
||||
{
|
||||
free(buffer);
|
||||
free(s);
|
||||
}
|
||||
|
||||
// --- cAddDirectory ---------------------------------------------------------
|
||||
|
||||
cAddDirectory::cAddDirectory(const char *DirName, const char *FileName)
|
||||
cString &cString::operator=(const cString &String)
|
||||
{
|
||||
asprintf(&buffer, "%s/%s", DirName && *DirName ? DirName : ".", FileName);
|
||||
result = buffer;
|
||||
s = String.s ? strdup(String.s) : NULL;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// --- cStrEscape ------------------------------------------------------------
|
||||
|
||||
cStrEscape::cStrEscape(const char *s, const char *chars)
|
||||
{
|
||||
buffer = NULL;
|
||||
const char *p = s;
|
||||
char *t = NULL;
|
||||
while (*p) {
|
||||
if (strchr(chars, *p)) {
|
||||
if (!t) {
|
||||
buffer = (char *)realloc(buffer, 2 * strlen(s) + 1);
|
||||
t = buffer + (p - s);
|
||||
s = strcpy(buffer, s);
|
||||
}
|
||||
*t++ = '\\';
|
||||
}
|
||||
if (t)
|
||||
*t++ = *p;
|
||||
p++;
|
||||
}
|
||||
if (t)
|
||||
*t = 0;
|
||||
result = s;
|
||||
}
|
||||
|
||||
// --- cCtime ----------------------------------------------------------------
|
||||
|
||||
cCtime::cCtime(time_t Time)
|
||||
{
|
||||
if (ctime_r(&Time, buffer)) {
|
||||
buffer[strlen(buffer) - 1] = 0; // strip trailing newline
|
||||
result = buffer;
|
||||
}
|
||||
}
|
||||
|
||||
// --- cItoa -----------------------------------------------------------------
|
||||
|
||||
cItoa::cItoa(int n)
|
||||
{
|
||||
snprintf(buffer, sizeof(buffer), "%d", n);
|
||||
result = buffer;
|
||||
}
|
||||
|
||||
// --- cWeekDayName ----------------------------------------------------------
|
||||
|
||||
cWeekDayName::cWeekDayName(int WeekDay)
|
||||
{
|
||||
WeekDayName(WeekDay);
|
||||
}
|
||||
|
||||
cWeekDayName::cWeekDayName(time_t t)
|
||||
{
|
||||
struct tm tm_r;
|
||||
WeekDayName(localtime_r(&t, &tm_r)->tm_wday);
|
||||
}
|
||||
|
||||
void cWeekDayName::WeekDayName(int WeekDay)
|
||||
cString WeekDayName(int WeekDay)
|
||||
{
|
||||
char buffer[4];
|
||||
WeekDay = WeekDay == 0 ? 6 : WeekDay - 1; // we start with monday==0!
|
||||
if (0 <= WeekDay && WeekDay <= 6) {
|
||||
const char *day = tr("MonTueWedThuFriSatSun");
|
||||
day += WeekDay * 3;
|
||||
strn0cpy(buffer, day, sizeof(buffer));
|
||||
result = buffer;
|
||||
return buffer;
|
||||
}
|
||||
else
|
||||
result = "???";
|
||||
return "???";
|
||||
}
|
||||
|
||||
// --- cDayDateTime ----------------------------------------------------------
|
||||
|
||||
cDayDateTime::cDayDateTime(time_t t)
|
||||
cString WeekDayName(time_t t)
|
||||
{
|
||||
struct tm tm_r;
|
||||
return WeekDayName(localtime_r(&t, &tm_r)->tm_wday);
|
||||
}
|
||||
|
||||
cString DayDateTime(time_t t)
|
||||
{
|
||||
char buffer[32];
|
||||
if (t == 0)
|
||||
time(&t);
|
||||
struct tm tm_r;
|
||||
tm *tm = localtime_r(&t, &tm_r);
|
||||
snprintf(buffer, sizeof(buffer), "%s %2d.%02d %02d:%02d", *cWeekDayName(tm->tm_wday), tm->tm_mday, tm->tm_mon + 1, tm->tm_hour, tm->tm_min);
|
||||
result = buffer;
|
||||
snprintf(buffer, sizeof(buffer), "%s %2d.%02d %02d:%02d", *WeekDayName(tm->tm_wday), tm->tm_mday, tm->tm_mon + 1, tm->tm_hour, tm->tm_min);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
cString TimeToString(time_t t)
|
||||
{
|
||||
char buffer[32];
|
||||
if (ctime_r(&t, buffer)) {
|
||||
buffer[strlen(buffer) - 1] = 0; // strip trailing newline
|
||||
return buffer;
|
||||
}
|
||||
return "???";
|
||||
}
|
||||
|
||||
// --- cReadLine -------------------------------------------------------------
|
||||
|
72
tools.h
72
tools.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: tools.h 1.61 2004/12/19 18:06:10 kls Exp $
|
||||
* $Id: tools.h 1.62 2004/12/26 10:26:09 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TOOLS_H
|
||||
@ -57,6 +57,17 @@ template<class T> inline void swap(T &a, T &b) { T t = a; a = b; b = t; }
|
||||
#define BCDCHARTOINT(x) (10 * ((x & 0xF0) >> 4) + (x & 0xF))
|
||||
int BCD2INT(int x);
|
||||
|
||||
class cString {
|
||||
private:
|
||||
char *s;
|
||||
public:
|
||||
cString(const char *S = NULL);
|
||||
virtual ~cString();
|
||||
operator const char * () const { return s; } // for use in (const char *) context
|
||||
const char * operator*() const { return s; } // for use in (const void *) context (printf() etc.)
|
||||
cString &operator=(const cString &String);
|
||||
};
|
||||
|
||||
ssize_t safe_read(int filedes, void *buffer, size_t size);
|
||||
ssize_t safe_write(int filedes, const void *buffer, size_t size);
|
||||
void writechar(int filedes, char c);
|
||||
@ -67,11 +78,14 @@ char *strreplace(char *s, const char *s1, const char *s2); ///< re-allocates 's'
|
||||
char *skipspace(const char *s);
|
||||
char *stripspace(char *s);
|
||||
char *compactspace(char *s);
|
||||
cString strescape(const char *s, const char *chars);
|
||||
bool startswith(const char *s, const char *p);
|
||||
bool endswith(const char *s, const char *p);
|
||||
bool isempty(const char *s);
|
||||
int numdigits(int n);
|
||||
bool isnumber(const char *s);
|
||||
cString itoa(int n);
|
||||
cString AddDirectory(const char *DirName, const char *FileName);
|
||||
int FreeDiskSpaceMB(const char *Directory, int *UsedMB = NULL);
|
||||
bool DirectoryOk(const char *DirName, bool LogErrors = false);
|
||||
bool MakeDirs(const char *FileName, bool IsDirectory = false);
|
||||
@ -80,6 +94,10 @@ bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis = false);
|
||||
char *ReadLink(const char *FileName);
|
||||
bool SpinUpDisk(const char *FileName);
|
||||
time_t LastModifiedTime(const char *FileName);
|
||||
cString WeekDayName(int WeekDay);
|
||||
cString WeekDayName(time_t t);
|
||||
cString DayDateTime(time_t t = 0);
|
||||
cString TimeToString(time_t t);
|
||||
|
||||
class cTimeMs {
|
||||
private:
|
||||
@ -92,58 +110,6 @@ public:
|
||||
uint64 Elapsed(void);
|
||||
};
|
||||
|
||||
class cBufferedStringFunction {
|
||||
protected:
|
||||
char *buffer;
|
||||
const char *result;
|
||||
public:
|
||||
cBufferedStringFunction(void);
|
||||
virtual ~cBufferedStringFunction();
|
||||
const char * operator * () { return result; }
|
||||
};
|
||||
|
||||
template<int size> class cBufferedStringFunctionFix : public cBufferedStringFunction {
|
||||
protected:
|
||||
char buffer[size];
|
||||
const char *result;
|
||||
public:
|
||||
cBufferedStringFunctionFix(void) { result = ""; } // makes sure dereferencing it doesn't hurt
|
||||
const char * operator * () { return result; }
|
||||
};
|
||||
|
||||
class cAddDirectory : public cBufferedStringFunction {
|
||||
public:
|
||||
cAddDirectory(const char *DirName, const char *FileName);
|
||||
};
|
||||
|
||||
class cStrEscape : public cBufferedStringFunction {
|
||||
public:
|
||||
cStrEscape(const char *s, const char *chars);
|
||||
};
|
||||
|
||||
class cCtime : public cBufferedStringFunctionFix<32> {
|
||||
public:
|
||||
cCtime(time_t Time);
|
||||
};
|
||||
|
||||
class cItoa : public cBufferedStringFunctionFix<16> {
|
||||
public:
|
||||
cItoa(int n);
|
||||
};
|
||||
|
||||
class cWeekDayName : public cBufferedStringFunctionFix<4> {
|
||||
private:
|
||||
void WeekDayName(int WeekDay);
|
||||
public:
|
||||
cWeekDayName(int WeekDay);
|
||||
cWeekDayName(time_t t);
|
||||
};
|
||||
|
||||
class cDayDateTime : public cBufferedStringFunctionFix<32> {
|
||||
public:
|
||||
cDayDateTime(time_t t = 0);
|
||||
};
|
||||
|
||||
class cReadLine {
|
||||
private:
|
||||
char buffer[MAXPARSEBUFFER];
|
||||
|
32
vdr.c
32
vdr.c
@ -22,7 +22,7 @@
|
||||
*
|
||||
* The project's page is at http://www.cadsoft.de/vdr
|
||||
*
|
||||
* $Id: vdr.c 1.195 2004/12/19 15:28:34 kls Exp $
|
||||
* $Id: vdr.c 1.196 2004/12/26 10:30:30 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
@ -384,19 +384,19 @@ int main(int argc, char *argv[])
|
||||
ConfigDirectory = VideoDirectory;
|
||||
|
||||
cPlugin::SetConfigDirectory(ConfigDirectory);
|
||||
cThemes::SetThemesDirectory(*cAddDirectory(ConfigDirectory, "themes"));
|
||||
cThemes::SetThemesDirectory(AddDirectory(ConfigDirectory, "themes"));
|
||||
|
||||
Setup.Load(*cAddDirectory(ConfigDirectory, "setup.conf"));
|
||||
if (!(Sources.Load(*cAddDirectory(ConfigDirectory, "sources.conf"), true, true) &&
|
||||
Diseqcs.Load(*cAddDirectory(ConfigDirectory, "diseqc.conf"), true, Setup.DiSEqC) &&
|
||||
Channels.Load(*cAddDirectory(ConfigDirectory, "channels.conf"), false, true) &&
|
||||
Timers.Load(*cAddDirectory(ConfigDirectory, "timers.conf")) &&
|
||||
Commands.Load(*cAddDirectory(ConfigDirectory, "commands.conf"), true) &&
|
||||
RecordingCommands.Load(*cAddDirectory(ConfigDirectory, "reccmds.conf"), true) &&
|
||||
SVDRPhosts.Load(*cAddDirectory(ConfigDirectory, "svdrphosts.conf"), true) &&
|
||||
CaDefinitions.Load(*cAddDirectory(ConfigDirectory, "ca.conf"), true) &&
|
||||
Keys.Load(*cAddDirectory(ConfigDirectory, "remote.conf")) &&
|
||||
KeyMacros.Load(*cAddDirectory(ConfigDirectory, "keymacros.conf"), true)
|
||||
Setup.Load(AddDirectory(ConfigDirectory, "setup.conf"));
|
||||
if (!(Sources.Load(AddDirectory(ConfigDirectory, "sources.conf"), true, true) &&
|
||||
Diseqcs.Load(AddDirectory(ConfigDirectory, "diseqc.conf"), true, Setup.DiSEqC) &&
|
||||
Channels.Load(AddDirectory(ConfigDirectory, "channels.conf"), false, true) &&
|
||||
Timers.Load(AddDirectory(ConfigDirectory, "timers.conf")) &&
|
||||
Commands.Load(AddDirectory(ConfigDirectory, "commands.conf"), true) &&
|
||||
RecordingCommands.Load(AddDirectory(ConfigDirectory, "reccmds.conf"), true) &&
|
||||
SVDRPhosts.Load(AddDirectory(ConfigDirectory, "svdrphosts.conf"), true) &&
|
||||
CaDefinitions.Load(AddDirectory(ConfigDirectory, "ca.conf"), true) &&
|
||||
Keys.Load(AddDirectory(ConfigDirectory, "remote.conf")) &&
|
||||
KeyMacros.Load(AddDirectory(ConfigDirectory, "keymacros.conf"), true)
|
||||
))
|
||||
EXIT(2);
|
||||
|
||||
@ -412,7 +412,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
else if (*EpgDataFileName != '/' && *EpgDataFileName != '.')
|
||||
EpgDirectory = VideoDirectory;
|
||||
cSchedules::SetEpgDataFileName(*cAddDirectory(EpgDirectory, EpgDataFileName));
|
||||
cSchedules::SetEpgDataFileName(AddDirectory(EpgDirectory, EpgDataFileName));
|
||||
cSchedules::Read();
|
||||
}
|
||||
|
||||
@ -870,7 +870,7 @@ int main(int argc, char *argv[])
|
||||
if (!Next || Delta > Setup.MinEventTimeout * 60 || ForceShutdown) {
|
||||
ForceShutdown = false;
|
||||
if (timer)
|
||||
dsyslog("next timer event at %s", *cCtime(Next));
|
||||
dsyslog("next timer event at %s", *TimeToString(Next));
|
||||
if (WatchdogTimeout > 0)
|
||||
signal(SIGALRM, SIG_IGN);
|
||||
if (Interface->Confirm(tr("Press any key to cancel shutdown"), UserShutdown ? 5 : SHUTDOWNWAIT, true)) {
|
||||
@ -878,7 +878,7 @@ int main(int argc, char *argv[])
|
||||
const char *File = timer ? timer->File() : "";
|
||||
Delta = Next - time(NULL); // compensates for Confirm() timeout
|
||||
char *cmd;
|
||||
asprintf(&cmd, "%s %ld %ld %d \"%s\" %d", Shutdown, Next, Delta, Channel, *cStrEscape(File, "\"$"), UserShutdown);
|
||||
asprintf(&cmd, "%s %ld %ld %d \"%s\" %d", Shutdown, Next, Delta, Channel, *strescape(File, "\"$"), UserShutdown);
|
||||
isyslog("executing '%s'", cmd);
|
||||
SystemExec(cmd);
|
||||
free(cmd);
|
||||
|
32
videodir.c
32
videodir.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: videodir.c 1.10 2003/08/02 13:43:28 kls Exp $
|
||||
* $Id: videodir.c 1.11 2004/12/26 11:52:12 kls Exp $
|
||||
*/
|
||||
|
||||
#include "videodir.h"
|
||||
@ -197,27 +197,23 @@ int VideoDiskSpace(int *FreeMB, int *UsedMB)
|
||||
return (free + used) ? used * 100 / (free + used) : 0;
|
||||
}
|
||||
|
||||
const char *PrefixVideoFileName(const char *FileName, char Prefix)
|
||||
cString PrefixVideoFileName(const char *FileName, char Prefix)
|
||||
{
|
||||
static char *PrefixedName = NULL;
|
||||
char PrefixedName[strlen(FileName) + 2];
|
||||
|
||||
if (!PrefixedName || strlen(PrefixedName) <= strlen(FileName))
|
||||
PrefixedName = (char *)realloc(PrefixedName, strlen(FileName) + 2);
|
||||
if (PrefixedName) {
|
||||
const char *p = FileName + strlen(FileName); // p points at the terminating 0
|
||||
int n = 2;
|
||||
while (p-- > FileName && n > 0) {
|
||||
if (*p == '/') {
|
||||
if (--n == 0) {
|
||||
int l = p - FileName + 1;
|
||||
strncpy(PrefixedName, FileName, l);
|
||||
PrefixedName[l] = Prefix;
|
||||
strcpy(PrefixedName + l + 1, p + 1);
|
||||
return PrefixedName;
|
||||
}
|
||||
const char *p = FileName + strlen(FileName); // p points at the terminating 0
|
||||
int n = 2;
|
||||
while (p-- > FileName && n > 0) {
|
||||
if (*p == '/') {
|
||||
if (--n == 0) {
|
||||
int l = p - FileName + 1;
|
||||
strncpy(PrefixedName, FileName, l);
|
||||
PrefixedName[l] = Prefix;
|
||||
strcpy(PrefixedName + l + 1, p + 1);
|
||||
return PrefixedName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -4,13 +4,14 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: videodir.h 1.4 2002/01/27 12:37:20 kls Exp $
|
||||
* $Id: videodir.h 1.5 2004/12/26 11:52:56 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __VIDEODIR_H
|
||||
#define __VIDEODIR_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "tools.h"
|
||||
|
||||
extern const char *VideoDirectory;
|
||||
|
||||
@ -20,7 +21,7 @@ bool RenameVideoFile(const char *OldName, const char *NewName);
|
||||
bool RemoveVideoFile(const char *FileName);
|
||||
bool VideoFileSpaceAvailable(int SizeMB);
|
||||
int VideoDiskSpace(int *FreeMB = NULL, int *UsedMB = NULL); // returns the used disk space in percent
|
||||
const char *PrefixVideoFileName(const char *FileName, char Prefix);
|
||||
cString PrefixVideoFileName(const char *FileName, char Prefix);
|
||||
void RemoveEmptyVideoDirectories(void);
|
||||
|
||||
#endif //__VIDEODIR_H
|
||||
|
Loading…
Reference in New Issue
Block a user