Made several functions threadsafe (cont'd)

This commit is contained in:
Klaus Schmidinger 2004-12-26 12:45:22 +01:00
parent f97b1069c6
commit 286af66cfb
26 changed files with 295 additions and 322 deletions

39
HISTORY
View File

@ -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).

View File

@ -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();
}

View File

@ -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;
}

View File

@ -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());

View File

@ -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

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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);
}

View File

@ -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;

View File

@ -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.

View File

@ -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();
}

View File

@ -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:

View File

@ -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();
}

View File

@ -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;

View File

@ -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
View File

@ -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);

View File

@ -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 *));

View File

@ -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);

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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);

View File

@ -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;
}

View File

@ -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