1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

New SVDRP command PUTE

This commit is contained in:
Klaus Schmidinger 2002-02-24 11:13:21 +01:00
parent 430284a8a7
commit 46095d6151
3 changed files with 92 additions and 3 deletions

View File

@ -997,7 +997,7 @@ Video Disk Recorder Revision History
- If a recording has no episode title, the trailing '~' is no longer shown in - If a recording has no episode title, the trailing '~' is no longer shown in
the progress display. the progress display.
2002-02-23: Version 1.0.0pre1 2002-02-24: Version 1.0.0pre1
- Added scanning for EPG data for another 4 days on channels that support this - Added scanning for EPG data for another 4 days on channels that support this
(thanks to Oleg Assovski). (thanks to Oleg Assovski).
@ -1023,3 +1023,5 @@ Video Disk Recorder Revision History
- At startup the data written into 'epg.data' is now read into the EPG data - At startup the data written into 'epg.data' is now read into the EPG data
structures. In order for this to work, the 'E' record has been extended to structures. In order for this to work, the 'E' record has been extended to
(optionally) contain the 'table ID' (see FORMATS for details). (optionally) contain the 'table ID' (see FORMATS for details).
- The new SVDRP command PUTE can be used to put EPG data into the EPG list.
See FORMATS for details about the required data format.

74
svdrp.c
View File

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured * and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection. * graphical interface that sits on top of an SVDRP connection.
* *
* $Id: svdrp.c 1.31 2002/02/23 13:55:57 kls Exp $ * $Id: svdrp.c 1.32 2002/02/24 11:05:38 kls Exp $
*/ */
#include "svdrp.h" #include "svdrp.h"
@ -118,6 +118,52 @@ int cSocket::Accept(void)
return -1; return -1;
} }
// --- cPUTEhandler ----------------------------------------------------------
cPUTEhandler::cPUTEhandler(void)
{
if ((f = tmpfile()) != NULL) {
status = 354;
message = "Enter EPG data, end with \".\" on a line by itself";
}
else {
LOG_ERROR;
status = 554;
message = "Error while opening temporary file";
}
}
cPUTEhandler::~cPUTEhandler()
{
if (f)
fclose(f);
}
bool cPUTEhandler::Process(const char *s)
{
if (f) {
if (strcmp(s, ".") != 0) {
fputs(s, f);
fputc('\n', f);
return true;
}
else {
rewind(f);
if (cSchedules::Read(f)) {
status = 250;
message = "EPG data processed";
}
else {
status = 451;
message = "Error while processing EPG data";
}
fclose(f);
f = NULL;
}
}
return false;
}
// --- cSVDRP ---------------------------------------------------------------- // --- cSVDRP ----------------------------------------------------------------
#define MAXHELPTOPIC 10 #define MAXHELPTOPIC 10
@ -192,6 +238,11 @@ const char *HelpPages[] = {
" zero, this means that the timer is currently recording and has started\n" " zero, this means that the timer is currently recording and has started\n"
" at the given time. The first value in the resulting line is the number\n" " at the given time. The first value in the resulting line is the number\n"
" of the timer.", " of the timer.",
"PUTE\n"
" Put data into the EPG list. The data entered has to strictly follow the\n"
" format defined in VDR/FORMATS for the 'epg.data' file. A '.' on a line\n"
" by itself terminates the input and starts processing of the data (all\n"
" entered data is buffered until the terminating '.' is seen).",
"UPDT <settings>\n" "UPDT <settings>\n"
" Updates a timer. Settings must be in the same format as returned\n" " Updates a timer. Settings must be in the same format as returned\n"
" by the LSTT command. If a timer with the same channel, day, start\n" " by the LSTT command. If a timer with the same channel, day, start\n"
@ -209,6 +260,7 @@ const char *HelpPages[] = {
220 VDR service ready 220 VDR service ready
221 VDR service closing transmission channel 221 VDR service closing transmission channel
250 Requested VDR action okay, completed 250 Requested VDR action okay, completed
354 Start sending EPG data
451 Requested action aborted: local error in processing 451 Requested action aborted: local error in processing
500 Syntax error, command unrecognized 500 Syntax error, command unrecognized
501 Syntax error in parameters or arguments 501 Syntax error in parameters or arguments
@ -252,6 +304,7 @@ const char *GetHelpPage(const char *Cmd)
cSVDRP::cSVDRP(int Port) cSVDRP::cSVDRP(int Port)
:socket(Port) :socket(Port)
{ {
PUTEhandler = NULL;
numChars = 0; numChars = 0;
message = NULL; message = NULL;
lastActivity = 0; lastActivity = 0;
@ -273,6 +326,7 @@ void cSVDRP::Close(bool Timeout)
Reply(221, "%s closing connection%s", buffer, Timeout ? " (timeout)" : ""); Reply(221, "%s closing connection%s", buffer, Timeout ? " (timeout)" : "");
isyslog(LOG_INFO, "closing SVDRP connection"); //TODO store IP#??? isyslog(LOG_INFO, "closing SVDRP connection"); //TODO store IP#???
file.Close(); file.Close();
DELETENULL(PUTEhandler);
} }
} }
@ -827,6 +881,15 @@ void cSVDRP::CmdNEXT(const char *Option)
Reply(550, "No active timers"); Reply(550, "No active timers");
} }
void cSVDRP::CmdPUTE(const char *Option)
{
delete PUTEhandler;
PUTEhandler = new cPUTEhandler;
Reply(PUTEhandler->Status(), PUTEhandler->Message());
if (PUTEhandler->Status() != 354)
DELETENULL(PUTEhandler);
}
void cSVDRP::CmdUPDT(const char *Option) void cSVDRP::CmdUPDT(const char *Option)
{ {
if (*Option) { if (*Option) {
@ -859,6 +922,14 @@ void cSVDRP::CmdUPDT(const char *Option)
void cSVDRP::Execute(char *Cmd) void cSVDRP::Execute(char *Cmd)
{ {
// handle PUTE data:
if (PUTEhandler) {
if (!PUTEhandler->Process(Cmd)) {
Reply(PUTEhandler->Status(), PUTEhandler->Message());
DELETENULL(PUTEhandler);
}
return;
}
// skip leading whitespace: // skip leading whitespace:
Cmd = skipspace(Cmd); Cmd = skipspace(Cmd);
// find the end of the command word: // find the end of the command word:
@ -888,6 +959,7 @@ void cSVDRP::Execute(char *Cmd)
else if (CMD("NEWT")) CmdNEWT(s); else if (CMD("NEWT")) CmdNEWT(s);
else if (CMD("NEXT")) CmdNEXT(s); else if (CMD("NEXT")) CmdNEXT(s);
else if (CMD("UPDT")) CmdUPDT(s); else if (CMD("UPDT")) CmdUPDT(s);
else if (CMD("PUTE")) CmdPUTE(s);
else if (CMD("QUIT")) Close(); else if (CMD("QUIT")) Close();
else Reply(500, "Command unrecognized: \"%s\"", Cmd); else Reply(500, "Command unrecognized: \"%s\"", Cmd);
} }

17
svdrp.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: svdrp.h 1.13 2001/11/04 11:20:46 kls Exp $ * $Id: svdrp.h 1.14 2002/02/24 10:48:21 kls Exp $
*/ */
#ifndef __SVDRP_H #ifndef __SVDRP_H
@ -26,11 +26,25 @@ public:
int Accept(void); int Accept(void);
}; };
class cPUTEhandler {
private:
FILE *f;
int status;
const char *message;
public:
cPUTEhandler(void);
~cPUTEhandler();
bool Process(const char *s);
int Status(void) { return status; }
const char *Message(void) { return message; }
};
class cSVDRP { class cSVDRP {
private: private:
cSocket socket; cSocket socket;
cFile file; cFile file;
cRecordings Recordings; cRecordings Recordings;
cPUTEhandler *PUTEhandler;
uint numChars; uint numChars;
char cmdLine[MAXPARSEBUFFER]; char cmdLine[MAXPARSEBUFFER];
char *message; char *message;
@ -57,6 +71,7 @@ private:
void CmdNEWC(const char *Option); void CmdNEWC(const char *Option);
void CmdNEWT(const char *Option); void CmdNEWT(const char *Option);
void CmdNEXT(const char *Option); void CmdNEXT(const char *Option);
void CmdPUTE(const char *Option);
void CmdUPDT(const char *Option); void CmdUPDT(const char *Option);
void Execute(char *Cmd); void Execute(char *Cmd);
public: public: