#include "teletext.h"
#include "dispatch.h"
#include "dvb.h"
+#include "strtab.h"
struct client_list all_clients;
}
-
-
-/*
- *
- */
-
-static int
-cr_channel_reftag(client_t *c, char **argv, int argc)
-{
- th_channel_t *ch;
-
- if(argc != 1 || (ch = channel_by_index(atoi(argv[0]))) == NULL)
- return 1;
-
- cprintf(c, "%u\n", ch->ch_tag);
- return 0;
-}
-
/*
*
*/
return 0;
}
+
+/*
+ *
+ */
+
+int
+cr_channels_list(client_t *c, char **argv, int argc)
+{
+ th_channel_t *ch;
+
+ TAILQ_FOREACH(ch, &channels, ch_global_link)
+ cprintf(c, "channel = %d\n", ch->ch_index);
+
+ return 0;
+}
+
+
/*
*
*/
static int
cr_event_info(client_t *c, char **argv, int argc)
{
- event_t *e, *x;
+ event_t *e = NULL, *x;
uint32_t tag, prev, next;
+ th_channel_t *ch;
- if(argc < 1)
+ if(argc < 2)
return 1;
epg_lock();
- e = epg_event_find_by_tag(atoi(argv[0]));
+ if(!strcasecmp(argv[0], "tag"))
+ e = epg_event_find_by_tag(atoi(argv[1]));
+ if(!strcasecmp(argv[0], "now"))
+ if((ch = channel_by_index(atoi(argv[1]))) != NULL)
+ e = epg_event_get_current(ch);
+ if(!strcasecmp(argv[0], "at") && argc == 3)
+ if((ch = channel_by_index(atoi(argv[1]))) != NULL)
+ e = epg_event_find_by_time(ch, atoi(argv[2]));
if(e == NULL) {
epg_unlock();
*
*/
+static struct strtab recoptab[] = {
+ { "once", RECOP_ONCE },
+ { "daily", RECOP_DAILY },
+ { "weekly", RECOP_WEEKLY },
+ { "cancel", RECOP_CANCEL },
+ { "toggle", RECOP_TOGGLE }
+};
+
static int
-cr_event_bytime(client_t *c, char **argv, int argc)
+cr_event_record(client_t *c, char **argv, int argc)
{
- th_channel_t *ch;
event_t *e;
+ recop_t op;
if(argc < 2)
return 1;
- if((ch = channel_by_index(atoi(argv[0]))) == NULL)
- return 1;
-
- epg_lock();
-
- e = epg_event_find_by_time(ch, atoi(argv[1]));
-
- if(e == NULL) {
- epg_unlock();
- return 1;
- }
-
- cprintf(c, "%u\n", e->e_tag);
- epg_unlock();
- return 0;
-}
-
-/*
- *
- */
-
-static int
-cr_event_record(client_t *c, char **argv, int argc)
-{
- event_t *e;
-
- if(argc < 1)
+ op = str2val(argv[1], recoptab);
+ printf("op = %d\n", op);
+ if(op == -1)
return 1;
epg_lock();
e = epg_event_find_by_tag(atoi(argv[0]));
+ printf("e[%d] = %p\n", atoi(argv[0]), e);
if(e == NULL) {
epg_unlock();
return 1;
}
- pvr_add_recording_by_event(e->e_ch, e);
+ pvr_event_record_op(e->e_ch, e, op);
epg_unlock();
return 0;
} cr_cmds[] = {
{ "show", cr_show },
{ "streamport", cr_streamport },
- { "channel.reftag", cr_channel_reftag },
+ { "channels.list", cr_channels_list },
{ "channel.info", cr_channel_info },
{ "channel.subscribe", cr_channel_subscribe },
{ "channel.unsubscribe", cr_channel_unsubscribe },
{ "event.info", cr_event_info },
- { "event.bytime", cr_event_bytime },
{ "event.record", cr_event_record },
{ "pvr.getlog", cr_pvr_getlog },
{ "pvr.gettag", cr_pvr_gettag },
val = 5;
setsockopt(newfd, SOL_TCP, TCP_KEEPCNT, &val, sizeof(val));
+ val = 1;
+ setsockopt(newfd, SOL_TCP, TCP_NODELAY, &val, sizeof(val));
+
c = calloc(1, sizeof(client_t));
c->c_fd = newfd;
c->c_pkt_maxsiz = 188 * 7;
void
-pvr_add_recording_by_event(th_channel_t *ch, event_t *e)
+pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op)
{
time_t start = e->e_start;
time_t stop = e->e_start + e->e_duration;
time_t now;
pvr_rec_t *pvrr;
+ char buf[100];
time(&now);
+ event_time_txt(start, e->e_duration, buf, sizeof(buf));
+
+ syslog(LOG_NOTICE, "Got recording command %d for %s", op, buf);
+
+
if(stop < now)
return;
LIST_FOREACH(pvrr, &pvrr_global_list, pvrr_global_link) {
if(pvrr->pvrr_channel == ch && pvrr->pvrr_start == start &&
- pvrr->pvrr_stop == stop) {
+ pvrr->pvrr_stop == stop)
+ break;
+ }
+
+ switch(op) {
+ case RECOP_TOGGLE:
+ if(pvrr != NULL) {
pvr_unrecord(pvrr);
return;
}
+ break;
+
+ case RECOP_CANCEL:
+ if(pvrr != NULL)
+ pvr_unrecord(pvrr);
+ return;
+
+ case RECOP_ONCE:
+ if(pvrr != NULL)
+ return;
+ break;
+
+ case RECOP_DAILY:
+ case RECOP_WEEKLY:
+ syslog(LOG_ERR,"Recording type not supported yet");
+ return;
}
pvrr = calloc(1, sizeof(pvr_rec_t));