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:
parent
430284a8a7
commit
46095d6151
4
HISTORY
4
HISTORY
@ -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
74
svdrp.c
@ -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
17
svdrp.h
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user