]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Adjust htsclient interface slightly to match showtime updates
authorAndreas Öman <andreas@lonelycoder.com>
Sat, 18 Aug 2007 11:38:42 +0000 (11:38 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Sat, 18 Aug 2007 11:38:42 +0000 (11:38 +0000)
htsclient.c
pvr.c
pvr.h

index 5bdbda2b4bf09a2e17239f873e05fbbd5308a3d9..7ec127dac508710d23763444bca1f56e0d9de452 100644 (file)
@@ -36,6 +36,7 @@
 #include "teletext.h"
 #include "dispatch.h"
 #include "dvb.h"
+#include "strtab.h"
 
 struct client_list all_clients;
 
@@ -303,24 +304,6 @@ cr_show(client_t *c, char **argv, int argc)
 }
 
 
-
-
-/*
- *
- */
-
-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;
-}
-
 /*
  *
  */
@@ -412,6 +395,23 @@ cr_channel_subscribe(client_t *c, char **argv, int argc)
   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;
+}
+
+
 /*
  *
  */
@@ -441,15 +441,23 @@ cr_streamport(client_t *c, char **argv, int argc)
 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();
@@ -493,53 +501,38 @@ cr_event_info(client_t *c, char **argv, int argc)
  *
  */
 
+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;
@@ -626,12 +619,11 @@ const struct {
 } 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 },
@@ -809,6 +801,9 @@ client_connect_callback(int events, void *opaque, int fd)
   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;
diff --git a/pvr.c b/pvr.c
index acffde07baade14cceb1df97cbc5d3898dd1ad19..75c97ee08563b829d9ebd30dcf1bf5800d09bf11 100644 (file)
--- a/pvr.c
+++ b/pvr.c
@@ -258,15 +258,21 @@ pvr_link_pvrr(pvr_rec_t *pvrr)
 
 
 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;
 
@@ -274,10 +280,32 @@ pvr_add_recording_by_event(th_channel_t *ch, event_t *e)
 
   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));
diff --git a/pvr.h b/pvr.h
index 4ea7c8382d1cc881ca367bcde5142041166e3d69..161b4728c1b9702b3976fa13cd77ba9cb0dc4da1 100644 (file)
--- a/pvr.h
+++ b/pvr.h
@@ -24,9 +24,17 @@ extern pthread_mutex_t pvr_mutex;
 extern struct pvr_rec_list pvrr_work_list[PVRR_WORK_MAX];
 extern struct pvr_rec_list pvrr_global_list;
 
+typedef enum {
+  RECOP_TOGGLE,
+  RECOP_ONCE,
+  RECOP_DAILY,
+  RECOP_WEEKLY,
+  RECOP_CANCEL,
+} recop_t;
+
 void pvr_init(void);
 
-void pvr_add_recording_by_event(th_channel_t *ch, event_t *e);
+void pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op);
 
 char pvr_prog_status(event_t *e);