]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
epggrab: module - fix the save/load procedure
authorJaroslav Kysela <perex@perex.cz>
Sun, 25 Oct 2015 18:49:12 +0000 (19:49 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 25 Oct 2015 18:49:12 +0000 (19:49 +0100)
src/epggrab.c
src/epggrab.h
src/epggrab/channel.c
src/epggrab/module.c
src/epggrab/module/eit.c
src/epggrab/module/opentv.c
src/epggrab/module/psip.c
src/epggrab/module/pyepg.c
src/epggrab/module/xmltv.c
src/epggrab/private.h

index c474ea184de96693909541d7e32cc6803d2b8057..4eafcff971b6cb3e551ca4e1d25f2a377c6a5a4e 100644 (file)
@@ -401,6 +401,7 @@ void epggrab_done ( void )
     pthread_mutex_lock(&global_lock);
     epggrab_channel_flush(mod, 0);
     free((void *)mod->id);
+    free((void *)mod->saveid);
     free((void *)mod->name);
     free(mod);
   }
index 21c6194b64d97eefdf600a83d1192e67a0acd21a..b8327f2df79007b3441b6d5e9ad8c90780842cbd 100644 (file)
@@ -142,6 +142,7 @@ struct epggrab_module
     EPGGRAB_EXT,
   }                            type;      ///< Grabber type
   const char                   *id;       ///< Module identifier
+  const char                   *saveid;   ///< Module save identifier
   const char                   *name;     ///< Module name (for display)
   int                          enabled;   ///< Whether the module is enabled
   int                          active;    ///< Whether the module is active
index b4232525282516213963fc41a16f5e8878a8e8e8..3c5feffbe171add177cf1ef6d1d94727fc223842 100644 (file)
@@ -286,7 +286,7 @@ void epggrab_channel_save( epggrab_channel_t *ec )
   htsmsg_t *m = htsmsg_create_map();
   idnode_save(&ec->idnode, m);
   hts_settings_save(m, "epggrab/%s/channels/%s",
-                    ec->mod->id, idnode_uuid_as_sstr(&ec->idnode));
+                    ec->mod->saveid, idnode_uuid_as_sstr(&ec->idnode));
   htsmsg_destroy(m);
 }
 
@@ -302,7 +302,7 @@ void epggrab_channel_destroy( epggrab_channel_t *ec, int delconf )
 
   if (delconf)
     hts_settings_remove("epggrab/%s/channels/%s",
-                        ec->mod->id, idnode_uuid_as_sstr(&ec->idnode));
+                        ec->mod->saveid, idnode_uuid_as_sstr(&ec->idnode));
 
   free(ec->comment);
   free(ec->name);
@@ -386,7 +386,7 @@ epggrab_channel_class_get_title(idnode_t *self, const char *lang)
   epggrab_channel_t *ec = (epggrab_channel_t*)self;
 
   snprintf(prop_sbuf, PROP_SBUF_LEN, "%s: %s (%s)",
-           ec->mod->name, ec->name ?: ec->id, ec->id);
+           ec->name ?: ec->id, ec->id, ec->mod->name);
   return prop_sbuf;
 }
 
@@ -402,6 +402,20 @@ epggrab_channel_class_delete(idnode_t *self)
   epggrab_channel_destroy((epggrab_channel_t *)self, 1);
 }
 
+static const void *
+epggrab_channel_class_modid_get ( void *obj )
+{
+  epggrab_channel_t *ec = obj;
+  snprintf(prop_sbuf, PROP_SBUF_LEN, "%s", ec->mod->id ?: "");
+  return &prop_sbuf_ptr;
+}
+
+static int
+epggrab_channel_class_modid_set ( void *obj, const void *p )
+{
+  return 0;
+}
+
 static const void *
 epggrab_channel_class_module_get ( void *obj )
 {
@@ -460,6 +474,14 @@ const idclass_t epggrab_channel_class = {
       .name     = N_("Enabled"),
       .off      = offsetof(epggrab_channel_t, enabled),
     },
+    {
+      .type     = PT_STR,
+      .id       = "modid",
+      .name     = N_("Module ID"),
+      .get      = epggrab_channel_class_modid_get,
+      .set      = epggrab_channel_class_modid_set,
+      .opts     = PO_RDONLY | PO_HIDDEN,
+    },
     {
       .type     = PT_STR,
       .id       = "module",
index 1f66b8dbbdfeb3949cd825953ce50aafef954139..0887af8bc2ed899a41e1c552cd69453b1755ee3f 100644 (file)
@@ -202,12 +202,14 @@ const idclass_t epggrab_class_mod_ota = {
 
 epggrab_module_t *epggrab_module_create
   ( epggrab_module_t *skel, const idclass_t *cls,
-    const char *id, const char *name, int priority )
+    const char *id, const char *saveid,
+    const char *name, int priority )
 {
   assert(skel);
 
   /* Setup */
   skel->id       = strdup(id);
+  skel->saveid   = strdup(saveid ?: id);
   skel->name     = strdup(name);
   skel->priority = priority;
   RB_INIT(&skel->channels);
@@ -262,15 +264,22 @@ void epggrab_module_parse( void *m, htsmsg_t *data )
  * Module channel routines
  * *************************************************************************/
 
-void epggrab_module_channels_load ( epggrab_module_t *mod )
+void epggrab_module_channels_load ( const char *modid )
 {
+  epggrab_module_t *mod = NULL;
   htsmsg_t *m, *e;
   htsmsg_field_t *f;
-  if (!mod) return;
-  if ((m = hts_settings_load_r(1, "epggrab/%s/channels", mod->id))) {
+  const char *id;
+  if (!modid) return;
+  if ((m = hts_settings_load_r(1, "epggrab/%s/channels", modid))) {
     HTSMSG_FOREACH(f, m) {
-      if ((e = htsmsg_get_map_by_field(f)))
-        epggrab_channel_create(mod, e, f->hmf_name);
+      if ((e = htsmsg_get_map_by_field(f))) {
+        id = htsmsg_get_str(e, "modid") ?: modid;
+        if (mod == NULL ||  strcmp(mod->id, id))
+          mod = epggrab_module_find_by_id(id);
+        if (mod)
+          epggrab_channel_create(mod, e, f->hmf_name);
+      }
     }
     htsmsg_destroy(m);
   }
@@ -291,7 +300,8 @@ epggrab_module_int_done( void *m )
 
 epggrab_module_int_t *epggrab_module_int_create
   ( epggrab_module_int_t *skel, const idclass_t *cls,
-    const char *id, const char *name, int priority,
+    const char *id, const char *saveid,
+    const char *name, int priority,
     const char *path,
     char* (*grab) (void*m),
     int (*parse) (void *m, htsmsg_t *data, epggrab_stats_t *sta),
@@ -303,7 +313,7 @@ epggrab_module_int_t *epggrab_module_int_create
   /* Pass through */
   epggrab_module_create((epggrab_module_t*)skel,
                         cls ?: &epggrab_class_mod_int,
-                        id, name, priority);
+                        id, saveid, name, priority);
 
   /* Int data */
   skel->type     = EPGGRAB_INT;
@@ -508,7 +518,8 @@ epggrab_module_activate_socket ( void *m, int a )
  */
 epggrab_module_ext_t *epggrab_module_ext_create
   ( epggrab_module_ext_t *skel,
-    const char *id, const char *name, int priority, const char *sockid,
+    const char *id, const char *saveid,
+    const char *name, int priority, const char *sockid,
     int (*parse) (void *m, htsmsg_t *data, epggrab_stats_t *sta),
     htsmsg_t* (*trans) (void *mod, char *data) )
 {
@@ -521,7 +532,7 @@ epggrab_module_ext_t *epggrab_module_ext_create
   hts_settings_buildpath(path, sizeof(path), "epggrab/%s.sock", sockid);
   epggrab_module_int_create((epggrab_module_int_t*)skel,
                             &epggrab_class_mod_ext,
-                            id, name, priority, path,
+                            id, saveid, name, priority, path,
                             NULL, parse, trans);
 
   /* Local */
@@ -538,7 +549,8 @@ epggrab_module_ext_t *epggrab_module_ext_create
 
 epggrab_module_ota_t *epggrab_module_ota_create
   ( epggrab_module_ota_t *skel,
-    const char *id, const char *name, int priority,
+    const char *id, const char *saveid,
+    const char *name, int priority,
     epggrab_ota_module_ops_t *ops )
 {
   if (!skel) skel = calloc(1, sizeof(epggrab_module_ota_t));
@@ -546,7 +558,7 @@ epggrab_module_ota_t *epggrab_module_ota_create
   /* Pass through */
   epggrab_module_create((epggrab_module_t*)skel,
                         &epggrab_class_mod_ota,
-                        id, name, priority);
+                        id, saveid, name, priority);
 
   /* Setup */
   skel->type     = EPGGRAB_OTA;
index 003418573a7fc85043d0dcd5e86417b001517079..51dcbd3e928506bef378fc4ac6ce688984907cb5 100644 (file)
@@ -789,11 +789,11 @@ void eit_init ( void )
     .tune  = _eit_tune,
   };
 
-  epggrab_module_ota_create(NULL, "eit", "EIT: DVB Grabber", 1, &ops);
-  epggrab_module_ota_create(NULL, "uk_freesat", "UK: Freesat", 5, &ops);
-  epggrab_module_ota_create(NULL, "uk_freeview", "UK: Freeview", 5, &ops);
-  epggrab_module_ota_create(NULL, "viasat_baltic", "VIASAT: Baltic", 5, &ops);
-  epggrab_module_ota_create(NULL, "Bulsatcom_39E", "Bulsatcom: Bula 39E", 5, &ops);
+  epggrab_module_ota_create(NULL, "eit", NULL, "EIT: DVB Grabber", 1, &ops);
+  epggrab_module_ota_create(NULL, "uk_freesat", NULL, "UK: Freesat", 5, &ops);
+  epggrab_module_ota_create(NULL, "uk_freeview", NULL, "UK: Freeview", 5, &ops);
+  epggrab_module_ota_create(NULL, "viasat_baltic", NULL, "VIASAT: Baltic", 5, &ops);
+  epggrab_module_ota_create(NULL, "Bulsatcom_39E", NULL, "Bulsatcom: Bula 39E", 5, &ops);
 }
 
 void eit_done ( void )
index af36c68da779d0e2f799b275f1206d666011a0b2..30bb6712bd3ba2657ab8788c125abd7ed028f6a4 100644 (file)
@@ -944,7 +944,7 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m )
   sprintf(nbuf, "OpenTV: %s", name);
   mod = (opentv_module_t *)
     epggrab_module_ota_create(calloc(1, sizeof(opentv_module_t)),
-                              ibuf, nbuf, 2, &ops);
+                              ibuf, NULL, nbuf, 2, &ops);
 
   /* Add provider details */
   mod->dict     = dict;
index 81df689b64d06afe053d4325bfc7606ec7c6b3ea..4064111744b7055bbdee542e6003615c690800ea 100644 (file)
@@ -405,7 +405,7 @@ void psip_init ( void )
     .tune  = _psip_tune,
   };
 
-  epggrab_module_ota_create(NULL, "psip", "PSIP: ATSC Grabber", 1, &ops);
+  epggrab_module_ota_create(NULL, "psip", NULL, "PSIP: ATSC Grabber", 1, &ops);
 }
 
 void psip_done ( void )
index 20cd69fcff73e5a5d45491185f8fa1428c4d7a26..3f5d5cb966f646dc99291caeb58e8a1a3c9c38bd 100644 (file)
@@ -431,11 +431,11 @@ void pyepg_init ( void )
   /* Internal module */
   if (find_exec("pyepg", buf, sizeof(buf)-1))
     epggrab_module_int_create(NULL, NULL,
-                              "pyepg-internal", "PyEPG", 4, buf,
+                              "pyepg-internal", "pyepg", "PyEPG", 4, buf,
                               NULL, _pyepg_parse, NULL);
 
   /* External module */
-  epggrab_module_ext_create(NULL, "pyepg", "PyEPG", 4, "pyepg",
+  epggrab_module_ext_create(NULL, "pyepg", "pyepg", "PyEPG", 4, "pyepg",
                             _pyepg_parse, NULL);
 }
 
@@ -445,5 +445,5 @@ void pyepg_done ( void )
 
 void pyepg_load ( void )
 {
-  epggrab_module_channels_load(epggrab_module_find_by_id("pyepg"));
+  epggrab_module_channels_load("pyepg");
 }
index e25d8f3677ea83f8d08d0cf30a10def27b77ef13..04f28de10e122a41df21d1c4480c1df9a4dbf8d4 100644 (file)
@@ -707,7 +707,8 @@ static void _xmltv_load_grabbers ( void )
       if ( outbuf[i] == '\n' || outbuf[i] == '\0' ) {
         outbuf[i] = '\0';
         sprintf(name, "XMLTV: %s", &outbuf[n]);
-        epggrab_module_int_create(NULL, NULL, &outbuf[p], name, 3, &outbuf[p],
+        epggrab_module_int_create(NULL, NULL, &outbuf[p], "xmltv",
+                                  name, 3, &outbuf[p],
                                   NULL, _xmltv_parse, NULL);
         p = n = i + 1;
       } else if ( outbuf[i] == '\\') {
@@ -753,7 +754,7 @@ static void _xmltv_load_grabbers ( void )
             close(rd);
             if (outbuf[outlen-1] == '\n') outbuf[outlen-1] = '\0';
             snprintf(name, sizeof(name), "XMLTV: %s", outbuf);
-            epggrab_module_int_create(NULL, NULL, bin, name, 3, bin,
+            epggrab_module_int_create(NULL, NULL, bin, "xmltv", name, 3, bin,
                                       NULL, _xmltv_parse, NULL);
             free(outbuf);
           } else {
@@ -772,7 +773,8 @@ static void _xmltv_load_grabbers ( void )
 void xmltv_init ( void )
 {
   /* External module */
-  epggrab_module_ext_create(NULL, "xmltv", "XMLTV", 3, "xmltv",
+  epggrab_module_ext_create(NULL, "xmltv", "xmltv",
+                            "XMLTV", 3, "xmltv",
                             _xmltv_parse, NULL);
 
   /* Standard modules */
@@ -785,5 +787,5 @@ void xmltv_done ( void )
 
 void xmltv_load ( void )
 {
-  epggrab_module_channels_load(epggrab_module_find_by_id("xmltv"));
+  epggrab_module_channels_load("xmltv");
 }
index edddb8cf1f32efd6801e1ace0bebdf5f359b22d9..970043b85ae356afa5651d34af8003103e3957d4 100644 (file)
@@ -27,7 +27,8 @@ struct mpegts_mux;
 
 epggrab_module_t *epggrab_module_create
   ( epggrab_module_t *skel, const idclass_t *cls,
-    const char *id, const char *name, int priority );
+    const char *id, const char *saveid,
+    const char *name, int priority );
 
 char     *epggrab_module_grab_spawn ( void *m );
 htsmsg_t *epggrab_module_trans_xml  ( void *m, char *data );
@@ -39,7 +40,7 @@ void      epggrab_module_ch_save ( void *m, epggrab_channel_t *ec );
 
 void      epggrab_module_parse ( void *m, htsmsg_t *data );
 
-void      epggrab_module_channels_load ( epggrab_module_t *m );
+void      epggrab_module_channels_load ( const char *modid );
 
 /* **************************************************************************
  * Channel processing
@@ -70,7 +71,8 @@ void epggrab_channel_done(void);
 
 epggrab_module_int_t *epggrab_module_int_create
   ( epggrab_module_int_t *skel, const idclass_t *cls,
-    const char *id, const char *name, int priority,
+    const char *id, const char *saveid,
+    const char *name, int priority,
     const char *path,
     char* (*grab) (void*m),
     int (*parse) (void *m, htsmsg_t *data, epggrab_stats_t *sta),
@@ -82,7 +84,8 @@ epggrab_module_int_t *epggrab_module_int_create
 
 epggrab_module_ext_t *epggrab_module_ext_create
   ( epggrab_module_ext_t *skel,
-    const char *id, const char *name, int priority,
+    const char *id, const char *saveid,
+    const char *name, int priority,
     const char *sockid,
     int (*parse) (void *m, htsmsg_t *data, epggrab_stats_t *sta),
     htsmsg_t* (*trans) (void *mod, char *data) );
@@ -101,7 +104,8 @@ typedef struct epggrab_ota_module_ops {
 
 epggrab_module_ota_t *epggrab_module_ota_create
   ( epggrab_module_ota_t *skel,
-    const char *id, const char *name, int priority,
+    const char *id, const char *saveid,
+    const char *name, int priority,
     epggrab_ota_module_ops_t *ops );
 
 /* **************************************************************************