]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Do more processing of XMLTV in main thread
authorAndreas Öman <andreas@lonelycoder.com>
Sun, 27 Apr 2008 13:31:41 +0000 (13:31 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Sun, 27 Apr 2008 13:31:41 +0000 (13:31 +0000)
ajaxui/ajaxui_config_xmltv.c
ajaxui/ajaxui_mailbox.c
ajaxui/ajaxui_mailbox.h
epg_xmltv.c
epg_xmltv.h
notify.c
notify.h

index 952270da422eb227730966dc2ba49e2ef5a8a5c5..c35099e5b3b16569310c65200a44cd30cd58f667 100644 (file)
@@ -50,7 +50,7 @@ ajax_config_xmltv_tab(http_connection_t *hc, http_reply_t *hr)
 
   tcp_qprintf(tq, "<div style=\"overflow: auto; width: 100%\">");
 
-  switch(xmltv_status) {
+  switch(xmltv_globalstatus) {
   default:
     tcp_qprintf(tq, "<p style=\"text-align: center; font-weight: bold\">"
                "XMLTV subsystem is not yet fully initialized, please retry "
@@ -197,29 +197,18 @@ ajax_xmltvgrabber(http_connection_t *hc, http_reply_t *hr,
   
   tcp_qprintf(tq,"<div id=\"details_%s\">", xg->xg_identifier);
 
-  switch(xg->xg_status) {
-  case XMLTV_GRABBER_DISABLED:
+  if(xg->xg_enabled == 0) {
     tcp_qprintf(tq,
                "<p>This grabber is currently not enabled, click "
                "<a href=\"javascript:void(0);\" "
                "onClick=\"new Ajax.Request('/ajax/xmltvgrabbermode/%s', "
                "{parameters: {'mode': 'enable'}})\">here</a> "
                "to enable it</p>");
-    break;
-
-
-  case XMLTV_GRABBER_ENQUEUED:
-  case XMLTV_GRABBER_GRABBING:
-  case XMLTV_GRABBER_UNCONFIGURED:
-  case XMLTV_GRABBER_DYSFUNCTIONAL:
-    tcp_qprintf(tq, "<p>%s</p>", xmltv_grabber_status_long(xg, xg->xg_status));
-    break;
-
-  case XMLTV_GRABBER_IDLE:
+  } else if(xg->xg_status == XMLTV_GRAB_OK) {
     xmltv_grabber_chlist(tq, xg);
-    break;
+  } else {
+    tcp_qprintf(tq, "<p>%s</p>", xmltv_grabber_status_long(xg));
   }
-  
 
   tcp_qprintf(tq,"</div>");
 
index 8090d0b161ce08fe76fd162e19d79befe63e2a3b..2b7a0431c678a74a40bc3c77e4c2ccb4a17cc9d5 100644 (file)
@@ -462,7 +462,7 @@ ajax_mailbox_xmltv_grabber_status_change(xmltv_grabber_t *xg, int status)
                          xmltv_grabber_status(xg));
 
 
-  if(status == XMLTV_GRABBER_IDLE) {
+  if(xg->xg_status == XMLTV_GRAB_OK) {
     snprintf(buf, sizeof(buf), "/ajax/xmltvgrabberlist/%s", xg->xg_identifier);
     ajax_mailbox_reload_div("xmltvgrabbers",
                            "details", xg->xg_identifier,
@@ -470,7 +470,7 @@ ajax_mailbox_xmltv_grabber_status_change(xmltv_grabber_t *xg, int status)
   } else {
     ajax_mailbox_update_div(xg->xg_identifier,
                            "details", xg->xg_identifier,
-                           xmltv_grabber_status_long(xg, status));
+                           xmltv_grabber_status_long(xg));
   }
 }
 
index 86ba7699bdffa140a900e0a441cb0192cc57a91e..81654f8bfcdf2ac297c8e06a78cf6b8396aad8b2 100644 (file)
@@ -39,7 +39,6 @@ void ajax_mailbox_start(tcp_queue_t *tq);
 
 struct xmltv_grabber;
 
-void ajax_mailbox_xmltv_grabber_status_change(struct xmltv_grabber *xg,
-                                             int status);
+void ajax_mailbox_xmltv_grabber_status_change(struct xmltv_grabber *xg);
 
 #endif /* AJAXUI_MAILBOX_H_ */
index df6e14ab232cb0ba4c648f078ee5337c4b8ab91c..52142b3c974d0a67df3a42839653d5af51b26e1c 100644 (file)
@@ -16,6 +16,9 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#define _GNU_SOURCE
+#include <string.h>
+
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
@@ -24,7 +27,6 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
-#include <string.h>
 
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 #include "spawn.h"
 #include "intercom.h"
 #include "notify.h"
+#include "dispatch.h"
 
-int xmltv_status;
+int xmltv_globalstatus;
 struct xmltv_grabber_list xmltv_grabbers;
 struct xmltv_grabber_queue xmltv_grabber_workq;
-static pthread_mutex_t xmltv_save_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_mutex_t xmltv_work_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t xmltv_work_cond = PTHREAD_COND_INITIALIZER;
 static void xmltv_config_load(void);
@@ -295,9 +297,7 @@ xmltv_transfer_events(xmltv_grabber_t *xg)
       how = 0;
       ch = channel_find(xc->xc_displayname, 0, NULL);
       if(ch == NULL) {
-       epg_lock();
        ch = xmltv_resolve_by_events(xc);
-       epg_unlock();
       
        if(ch == NULL)
          continue;
@@ -344,47 +344,52 @@ xmltv_grab(xmltv_grabber_t *xg)
   outlen = spawn_and_store_stdout(prog, NULL, &outbuf);
   if(outlen < 1) {
     syslog(LOG_ERR, "xmltv: No output from \"%s\"", prog);
-    return XMLTV_GRABBER_UNCONFIGURED;
+    return XMLTV_GRAB_UNCONFIGURED;
   }
 
   doc = xmlParseMemory(outbuf, outlen);
   if(doc == NULL) {
     syslog(LOG_ERR, "xmltv: Error while parsing output from  \"%s\"", prog);
     free(outbuf);
-    return XMLTV_GRABBER_DYSFUNCTIONAL;
+    return XMLTV_GRAB_DYSFUNCTIONAL;
   }
 
+  pthread_mutex_lock(&xg->xg_mutex);
+
   xmltv_flush_events(xg);
 
   root_element = xmlDocGetRootElement(doc);
   xmltv_parse_root(xg, root_element);
 
+  pthread_mutex_unlock(&xg->xg_mutex);
+
   xmlFreeDoc(doc);
   xmlCleanupParser();
   syslog(LOG_INFO, "xmltv: EPG sucessfully loaded and parsed");
   free(outbuf);
-  return XMLTV_GRABBER_IDLE;
+  return XMLTV_GRAB_OK;
 }
 
 
 
-static struct strtab grabberstatustab[] = {
-  { "Disabled",              XMLTV_GRABBER_DISABLED      },
-  { "Missing configuration", XMLTV_GRABBER_UNCONFIGURED  },
-  { "Dysfunctional",         XMLTV_GRABBER_DYSFUNCTIONAL },
-  { "Waiting for execution", XMLTV_GRABBER_ENQUEUED      },
-  { "Grabbing",              XMLTV_GRABBER_GRABBING      },
-  { "Idle",                  XMLTV_GRABBER_IDLE          },
-};
-
 
-const char *
-xmltv_grabber_status(xmltv_grabber_t *xg)
+/**
+ *
+ */
+static void
+xmltv_thread_grabber_init_done(icom_t *ic, const char *payload)
 {
-  return val2str(xg->xg_status, grabberstatustab) ?: "Invalid";
+  htsmsg_t *m = htsmsg_create();
+
+  htsmsg_add_u32(m, "initialized", 1);
+  if(payload != NULL)
+    htsmsg_add_str(m, "payload", payload);
+  icom_send_msg_from_thread(ic, m);
+  htsmsg_destroy(m);
 }
 
 
+
 /**
  *
  */
@@ -397,23 +402,37 @@ grabbercmp(xmltv_grabber_t *a, xmltv_grabber_t *b)
 
 /**
  * Enlist all active grabbers (for user to choose among)
+ *
+ * We send all these in a message back to the main thread
  */
 static int
-xmltv_find_grabbers(const char *prog)
+xmltv_find_grabbers(icom_t *ic, const char *prog)
 {
   char *outbuf;
   int outlen;
+
+  outlen = spawn_and_store_stdout(prog, NULL, &outbuf);
+  if(outlen < 1)
+    return -1;
+
+  xmltv_thread_grabber_init_done(ic, outbuf);
+  free(outbuf);
+  return 0;
+}
+
+
+/**
+ * Parse list of all grabbers
+ */
+static void
+xmltv_parse_grabbers(char *list)
+{
   char *s, *a, *b;
   xmltv_grabber_t *xg;
   int n = 0;
   char buf[40];
 
-  outlen = spawn_and_store_stdout(prog, NULL, &outbuf);
-  if(outlen < 1) {
-    return -1;
-  }
-
-  s = outbuf;
+  s = list;
 
   while(1) {
     a = s;
@@ -448,8 +467,8 @@ xmltv_find_grabbers(const char *prog)
     pthread_mutex_init(&xg->xg_mutex, NULL);
 
     TAILQ_INIT(&xg->xg_channels);
-    xg->xg_path  = a;
-    xg->xg_title = b;
+    xg->xg_path  = strdup(a);
+    xg->xg_title = strdup(b);
 
     snprintf(buf, sizeof(buf), "xmlgrabber_%d", n++);
     xg->xg_identifier = strdup(buf);
@@ -457,26 +476,9 @@ xmltv_find_grabbers(const char *prog)
     LIST_INSERT_SORTED(&xmltv_grabbers, xg, xg_link, grabbercmp);
   }
   xmltv_config_load();
-
-  return 0;
 }
 
 
-/**
- *
- */
-static void
-xmltv_thread_set_status(icom_t *ic, xmltv_grabber_t *xg, int s)
-{
-  htsmsg_t *m = htsmsg_create();
-
-  xg->xg_status = s;
-  
-  htsmsg_add_u32(m, "status", s);
-  htsmsg_add_str(m, "identifier", xg->xg_identifier);
-  icom_send_msg_from_thread(ic, m);
-  htsmsg_destroy(m);
-}
 
 /*
  *
@@ -485,96 +487,82 @@ static void *
 xmltv_thread(void *aux)
 {
   icom_t *ic = aux;
-  struct timespec ts;
+  htsmsg_t *m;
   xmltv_grabber_t *xg;
   int r;
-  time_t n;
 
   /* Start by finding all available grabbers, we try with a few
      different locations */
  
-  if(xmltv_find_grabbers("/usr/bin/tv_find_grabbers") &&
-     xmltv_find_grabbers("/bin/tv_find_grabbers") &&
-     xmltv_find_grabbers("/usr/local/bin/tv_find_grabbers")) {
-    xmltv_status = XMLTVSTATUS_FIND_GRABBERS_NOT_FOUND;
+  if(xmltv_find_grabbers(ic, "/usr/bin/tv_find_grabbers") &&
+     xmltv_find_grabbers(ic, "/bin/tv_find_grabbers") &&
+     xmltv_find_grabbers(ic, "/usr/local/bin/tv_find_grabbers")) {
+    xmltv_thread_grabber_init_done(ic, NULL);
     return NULL;
   }
-
-  xmltv_status = XMLTVSTATUS_RUNNING;
   
   pthread_mutex_lock(&xmltv_work_lock);
 
   while(1) {
-    
-    xg = TAILQ_FIRST(&xmltv_grabber_workq);
-    if(xg != NULL) {
-      xmltv_thread_set_status(ic, xg, XMLTV_GRABBER_GRABBING);
-      TAILQ_REMOVE(&xmltv_grabber_workq, xg, xg_work_link);
-      pthread_mutex_unlock(&xmltv_work_lock);
-      r = xmltv_grab(xg);
-      pthread_mutex_lock(&xmltv_work_lock);
-
-      xmltv_thread_set_status(ic, xg, r);
-       
-      time(&n);
-      if(r == XMLTV_GRABBER_IDLE) {
-       /* Completed load */
-       xg->xg_nextgrab = n + 3600;
-      } else {
-       xg->xg_nextgrab = n + 60;
-      }
-      continue;
-    }
-    
-    LIST_FOREACH(xg, &xmltv_grabbers, xg_link)
-      xmltv_transfer_events(xg);
 
-    time(&n);
-    n = n + 60;
-    LIST_FOREACH(xg, &xmltv_grabbers, xg_link)
-      n = xg->xg_nextgrab ? MIN(n, xg->xg_nextgrab) : n;
-
-    ts.tv_sec = n;
-    ts.tv_nsec = 0;
+    while((xg = TAILQ_FIRST(&xmltv_grabber_workq)) == NULL)
+      pthread_cond_wait(&xmltv_work_cond, &xmltv_work_lock);
 
-    pthread_cond_timedwait(&xmltv_work_cond, &xmltv_work_lock, &ts);
-    
-    time(&n);
-    LIST_FOREACH(xg, &xmltv_grabbers, xg_link) {
-      switch(xg->xg_status) {
-      case XMLTV_GRABBER_GRABBING:
-       abort();
+    xg->xg_on_work_link = 0;
+    TAILQ_REMOVE(&xmltv_grabber_workq, xg, xg_work_link);
+    pthread_mutex_unlock(&xmltv_work_lock);
+    r = xmltv_grab(xg);
 
-      case XMLTV_GRABBER_DISABLED:
-      case XMLTV_GRABBER_ENQUEUED:
-       break;
+    m = htsmsg_create();
+    htsmsg_add_u32(m, "grab_completed", r);
+    htsmsg_add_str(m, "identifier", xg->xg_identifier);
+    icom_send_msg_from_thread(ic, m);
+    htsmsg_destroy(m);
 
-      case XMLTV_GRABBER_IDLE:
-      case XMLTV_GRABBER_UNCONFIGURED:
-      case XMLTV_GRABBER_DYSFUNCTIONAL:
-       if(xg->xg_nextgrab <= n + 1)
-         TAILQ_INSERT_TAIL(&xmltv_grabber_workq, xg, xg_work_link);
-       break;
-      }
-    }
+    pthread_mutex_lock(&xmltv_work_lock);
   }
   return NULL;
 }
 
+/**
+ *
+ */
 void
-xmltv_grabber_enable(xmltv_grabber_t *xg)
+xmltv_grabber_enqueue(xmltv_grabber_t *xg)
 {
   pthread_mutex_lock(&xmltv_work_lock);
 
-  if(xg->xg_status != XMLTV_GRABBER_ENQUEUED) {
-    xg->xg_status = XMLTV_GRABBER_ENQUEUED;
+  if(!xg->xg_on_work_link) {
+    xg->xg_on_work_link = 1;
     TAILQ_INSERT_TAIL(&xmltv_grabber_workq, xg, xg_work_link);
     pthread_cond_signal(&xmltv_work_cond);
   }
-
   pthread_mutex_unlock(&xmltv_work_lock);
-  xmltv_config_save();
+}
+
+
+/**
+ * Enqueue a new grabing
+ */
+static void
+regrab(void *aux, int64_t now)
+{
+  xmltv_grabber_t *xg = aux;
+
+  xmltv_grabber_enqueue(xg);
+}
+
+/**
+ *
+ */
+static void
+xmltv_xfer(void *aux, int64_t now)
+{
+  xmltv_grabber_t *xg = aux;
+
+  xmltv_transfer_events(xg);
+
+  dtimer_arm(&xg->xg_xfer_timer, xmltv_xfer, xg, 60);
 }
 
 /**
@@ -584,14 +572,32 @@ static void
 icom_cb(void *opaque, htsmsg_t *m)
 {
   const char *s;
-  uint32_t status;
+  char *t;
   xmltv_grabber_t *xg;
+  uint32_t v;
+
+  if(!htsmsg_get_u32(m, "initialized", &v)) {
+    /* Grabbers loaded */
 
-  if(!htsmsg_get_u32(m, "status", &status)) {
-    s = htsmsg_get_str(m, "identifier");
-    if(s != NULL && (xg = xmltv_grabber_find(s)) != NULL) {
-      notify_xmltv_grabber_status_change(xg, status);
+    if((s = htsmsg_get_str(m, "payload")) != NULL) {
+      t = strdupa(s);
+      xmltv_parse_grabbers(t);
+      xmltv_globalstatus = XMLTVSTATUS_RUNNING;
+      
+      LIST_FOREACH(xg, &xmltv_grabbers, xg_link)
+       if(xg->xg_enabled)
+         xmltv_grabber_enqueue(xg);
+
+    } else {
+      xmltv_globalstatus = XMLTVSTATUS_FIND_GRABBERS_NOT_FOUND;
     }
+  } else if(!htsmsg_get_u32(m, "grab_completed", &v) &&
+           (s = htsmsg_get_str(m, "identifier")) != NULL &&
+           (xg = xmltv_grabber_find(s)) != NULL) {
+
+    xg->xg_status = v;
+    dtimer_arm(&xg->xg_grab_timer, regrab, xg, v == XMLTV_GRAB_OK ? 3600 : 60);
+    dtimer_arm(&xg->xg_xfer_timer, xmltv_xfer, xg, 1);
   }
   htsmsg_destroy(m);
 }
@@ -629,32 +635,63 @@ xmltv_init(void)
  *
  */
 const char *
-xmltv_grabber_status_long(xmltv_grabber_t *xg, int status)
+xmltv_grabber_status_long(xmltv_grabber_t *xg)
 {
   static char buf[1000];
-  switch(status) {
-  case XMLTV_GRABBER_UNCONFIGURED:
+
+  if(xg->xg_enabled == 0) {
+    return "Disabled";
+  } else if(xg->xg_on_work_link) {
+    return "Enqueued for grabbing, please wait";
+  } else switch(xg->xg_status) {
+
+  case XMLTV_GRAB_WORKING:
+    return "Grabbing, please wait";
+
+  case XMLTV_GRAB_UNCONFIGURED:
     snprintf(buf, sizeof(buf),
-            "This grabber is not configured.</p><p> You need to configure it "
+            "This grabber is not configured.</p><p>You need to configure it "
             "manually by running '%s --configure' in a shell",
             xg->xg_path);
     return buf;
 
-  case XMLTV_GRABBER_DYSFUNCTIONAL:
+  case XMLTV_GRAB_DYSFUNCTIONAL:
     snprintf(buf, sizeof(buf),
             "This grabber does not produce valid XML, please check "
             "manually by running '%s' in a shell",
             xg->xg_path);
     return buf;
 
-  case XMLTV_GRABBER_ENQUEUED:
-  case XMLTV_GRABBER_GRABBING:
-    return "Grabbing, please wait";
+  case XMLTV_GRAB_OK:
+    return "Idle";
+  }
+
+  return "Unknown status";
+}
 
 
-  default:
-    return "Unknown status";
+/**
+ *
+ */
+const char *
+xmltv_grabber_status(xmltv_grabber_t *xg)
+{
+  if(xg->xg_enabled == 0) {
+    return "Disabled";
+  } else if(xg->xg_on_work_link) {
+    return "Grabbing";
+  } else switch(xg->xg_status) {
+  case XMLTV_GRAB_WORKING:
+    return "Grabbing";
+
+  case XMLTV_GRAB_UNCONFIGURED:
+    return  "Unconfigured";
+  case XMLTV_GRAB_DYSFUNCTIONAL:
+    return  "Dysfunctional";
+  case XMLTV_GRAB_OK:
+    return "Idle";
   }
+  return "Unknown";
 }
 
 
@@ -669,17 +706,15 @@ xmltv_config_save(void)
   xmltv_channel_t *xc;
   FILE *fp;
 
-  pthread_mutex_lock(&xmltv_save_lock);
-
   snprintf(buf, sizeof(buf), "%s/xmltv-settings.cfg", settings_dir);
 
   if((fp = settings_open_for_write(buf)) != NULL) {
     LIST_FOREACH(xg, &xmltv_grabbers, xg_link) {
-      if(xg->xg_status == XMLTV_GRABBER_DISABLED)
-       continue;
 
       fprintf(fp, "grabber {\n");
       fprintf(fp, "\ttitle = %s\n", xg->xg_title);
+      fprintf(fp, "\tenabled = %d\n", xg->xg_enabled);
+
     
       TAILQ_FOREACH(xc, &xg->xg_channels, xc_link) {
        fprintf(fp, "\tchannel {\n");
@@ -699,7 +734,6 @@ xmltv_config_save(void)
     }
     fclose(fp);
   }
-  pthread_mutex_unlock(&xmltv_save_lock);
 }
 
 /**
@@ -736,9 +770,8 @@ xmltv_config_load(void)
     if(xg == NULL)
       continue;
 
-    xg->xg_status = XMLTV_GRABBER_ENQUEUED;
-    TAILQ_INSERT_TAIL(&xmltv_grabber_workq, xg, xg_work_link);
-   
+    xg->xg_enabled = atoi(config_get_str_sub(&ce->ce_sub, "enabled", "0"));
+
     TAILQ_FOREACH(ce2, &ce->ce_sub, ce_link) {
       if(ce2->ce_type != CFG_SUB || strcasecmp("channel", ce2->ce_key))
        continue;
@@ -773,3 +806,11 @@ xmltv_config_load(void)
 
   config_free0(&cl);
 }
+
+void
+xmltv_grabber_enable(xmltv_grabber_t *xg)
+{
+  xg->xg_enabled = 1;
+  xmltv_grabber_enqueue(xg);
+  xmltv_config_save();
+}
index 04f8a1818aef85b231a792117383b67557764091..e9e59e3383d2bb7c1050e35536509bb03cdf6d4e 100644 (file)
 #ifndef XMLTV_H
 #define XMLTV_H
 
+#define XMLTV_GRAB_WORKING       0
+#define XMLTV_GRAB_UNCONFIGURED  1
+#define XMLTV_GRAB_DYSFUNCTIONAL 2
+#define XMLTV_GRAB_OK            3
+
+
 
 LIST_HEAD(xmltv_grabber_list,   xmltv_grabber);
 TAILQ_HEAD(xmltv_grabber_queue, xmltv_grabber);
@@ -31,18 +37,15 @@ typedef struct xmltv_grabber {
   char *xg_title;
   char *xg_identifier;
 
-  enum {
-    XMLTV_GRABBER_DISABLED,
-    XMLTV_GRABBER_UNCONFIGURED,
-    XMLTV_GRABBER_DYSFUNCTIONAL,
-    XMLTV_GRABBER_ENQUEUED,
-    XMLTV_GRABBER_GRABBING,
-    XMLTV_GRABBER_IDLE,
-  } xg_status;
-
   TAILQ_ENTRY(xmltv_grabber) xg_work_link;
+  int xg_on_work_link;
+
+  int xg_enabled;
+
+  int xg_status;
 
-  time_t xg_nextgrab;
+  dtimer_t xg_grab_timer;
+  dtimer_t xg_xfer_timer;
 
   struct xmltv_channel_queue xg_channels;
 
@@ -79,7 +82,7 @@ typedef struct xmltv_channel {
 #define XMLTVSTATUS_FIND_GRABBERS_NOT_FOUND 1
 #define XMLTVSTATUS_RUNNING                 2
 
-extern int xmltv_status;
+extern int xmltv_globalstatus;
 extern struct xmltv_grabber_list xmltv_grabbers;
 
 void xmltv_init(void);
@@ -90,7 +93,7 @@ void xmltv_grabber_enable(xmltv_grabber_t *xg);
 
 xmltv_grabber_t *xmltv_grabber_find(const char *id);
 
-const char *xmltv_grabber_status_long(xmltv_grabber_t *xg, int status);
+const char *xmltv_grabber_status_long(xmltv_grabber_t *xg);
 
 void xmltv_config_save(void);
 
index 09794b303fbc58f29c1368df7053e0518d5afff8..b6ffa373c3c245dc12a197110e65fe39095ed15a 100644 (file)
--- a/notify.c
+++ b/notify.c
@@ -69,7 +69,7 @@ notify_tda_change(th_dvb_adapter_t *tda)
 }
 
 void
-notify_xmltv_grabber_status_change(struct xmltv_grabber *xg, int status)
+notify_xmltv_grabber_status_change(struct xmltv_grabber *xg)
 {
-  ajax_mailbox_xmltv_grabber_status_change(xg, status);
+  ajax_mailbox_xmltv_grabber_status_change(xg);
 }
index 3f78c664409a681cf1c1dfbd9a6104c69ab261f5..f13fb37afda8dc0e5a42693b90ac596588a43c44 100644 (file)
--- a/notify.h
+++ b/notify.h
@@ -35,7 +35,6 @@ void notify_tdmi_services_change(struct th_dvb_mux_instance *tdmi);
 
 void notify_tda_change(struct th_dvb_adapter *tda);
 
-void notify_xmltv_grabber_status_change(struct xmltv_grabber *xg,
-                                       int status);
+void notify_xmltv_grabber_status_change(struct xmltv_grabber *xg);
 
 #endif /* NOTIFY_H_ */