]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
settings: merge mux config / service config into one file
authorJaroslav Kysela <perex@perex.cz>
Thu, 11 Feb 2016 12:52:57 +0000 (13:52 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 11 Feb 2016 12:52:57 +0000 (13:52 +0100)
src/input/mpegts/iptv/iptv_mux.c
src/input/mpegts/iptv/iptv_service.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_mux_dvb.c
src/input/mpegts/mpegts_service.c
src/settings.c

index 94ab7315e3a4adeb1d1054af5d542f92db0a98c2..368f5cf579cdfdf70e86e278557cc0a664e4abbc 100644 (file)
@@ -268,7 +268,7 @@ iptv_mux_config_save ( mpegts_mux_t *mm, char *filename, size_t fsize )
   char ubuf2[UUID_HEX_SIZE];
   htsmsg_t *c = htsmsg_create_map();
   mpegts_mux_save(mm, c);
-  snprintf(filename, fsize, "input/iptv/networks/%s/muxes/%s/config",
+  snprintf(filename, fsize, "input/iptv/networks/%s/muxes/%s",
            idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf1),
            idnode_uuid_as_str(&mm->mm_id, ubuf2));
   return c;
@@ -282,7 +282,7 @@ iptv_mux_delete ( mpegts_mux_t *mm, int delconf )
   char ubuf2[UUID_HEX_SIZE];
 
   if (delconf)
-    hts_settings_remove("input/iptv/networks/%s/muxes/%s/config",
+    hts_settings_remove("input/iptv/networks/%s/muxes/%s",
                         idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf1),
                         idnode_uuid_as_str(&mm->mm_id, ubuf2));
 
@@ -321,7 +321,7 @@ iptv_mux_display_name ( mpegts_mux_t *mm, char *buf, size_t len )
 iptv_mux_t *
 iptv_mux_create0 ( iptv_network_t *in, const char *uuid, htsmsg_t *conf )
 {
-  htsmsg_t *c, *e;
+  htsmsg_t *c, *c2, *e;
   htsmsg_field_t *f;
   iptv_service_t *ms;
   char ubuf1[UUID_HEX_SIZE];
@@ -348,9 +348,12 @@ iptv_mux_create0 ( iptv_network_t *in, const char *uuid, htsmsg_t *conf )
                                    (mpegts_mux_t*)im);
 
   /* Services */
-  c = hts_settings_load_r(1, "input/iptv/networks/%s/muxes/%s/services",
-                          idnode_uuid_as_str(&in->mn_id, ubuf1),
-                          idnode_uuid_as_str(&im->mm_id, ubuf2));
+  c2 = NULL;
+  c = htsmsg_get_map(conf, "services");
+  if (c == NULL)
+    c = c2 = hts_settings_load_r(1, "input/iptv/networks/%s/muxes/%s/services",
+                                 idnode_uuid_as_str(&in->mn_id, ubuf1),
+                                 idnode_uuid_as_str(&im->mm_id, ubuf2));
   if (c) {
     HTSMSG_FOREACH(f, c) {
       if (!(e = htsmsg_field_get_map(f))) continue;
@@ -365,7 +368,7 @@ iptv_mux_create0 ( iptv_network_t *in, const char *uuid, htsmsg_t *conf )
     if (ms)
       iptv_bouquet_trigger(in, 0);
   }
-  htsmsg_destroy(c);
+  htsmsg_destroy(c2);
 
   return im;
 }
index 5b5cc40b02082f9dea2dc8b4122d737922999051..554e35b71186682bdd307c59a3aa2da0febff36d 100644 (file)
@@ -25,36 +25,16 @@ extern const idclass_t mpegts_service_class;
 static htsmsg_t *
 iptv_service_config_save ( service_t *s, char *filename, size_t fsize )
 {
-  mpegts_mux_t     *mm = ((mpegts_service_t *)s)->s_dvb_mux;
-  htsmsg_t         *c  = htsmsg_create_map();
-  char ubuf0[UUID_HEX_SIZE];
-  char ubuf1[UUID_HEX_SIZE];
-  char ubuf2[UUID_HEX_SIZE];
-
-  service_save(s, c);
-  snprintf(filename, fsize, "input/iptv/networks/%s/muxes/%s/services/%s",
-           idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf0),
-           idnode_uuid_as_str(&mm->mm_id, ubuf1),
-           idnode_uuid_as_str(&s->s_id, ubuf2));
-  return c;
+  mpegts_mux_t *mm = ((mpegts_service_t *)s)->s_dvb_mux;
+  idnode_changed(&mm->mm_id);
+  return NULL;
 }
 
 static void
 iptv_service_delete ( service_t *s, int delconf )
 {
-  iptv_service_t   *is = (iptv_service_t *)s;
-  mpegts_mux_t     *mm = is->s_dvb_mux;
-  char ubuf0[UUID_HEX_SIZE];
-  char ubuf1[UUID_HEX_SIZE];
-  char ubuf2[UUID_HEX_SIZE];
-
-  /* Remove config */
-  if (delconf && s->s_type == STYPE_STD)
-    hts_settings_remove("input/iptv/networks/%s/muxes/%s/services/%s",
-                        idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf0),
-                        idnode_uuid_as_str(&mm->mm_id, ubuf1),
-                        idnode_uuid_as_str(&s->s_id, ubuf2));
-
+  mpegts_mux_t *mm = ((mpegts_service_t *)s)->s_dvb_mux;
+  idnode_changed(&mm->mm_id);
   /* Note - do no pass the delconf flag - another file location */
   mpegts_service_delete(s, 0);
 }
index bb44d7e9add6e621ba41ff221a7b4232e7786523..83471824399f3f50d8bb19ec320777f1bbae6540 100644 (file)
@@ -694,6 +694,7 @@ mpegts_mux_delete ( mpegts_mux_t *mm, int delconf )
   gtimer_disarm(&mm->mm_update_pids_timer);
 
   /* Free memory */
+  idnode_save_check(&mm->mm_id, 1);
   idnode_unlink(&mm->mm_id);
   free(mm->mm_provider_network_name);
   free(mm->mm_crid_authority);
@@ -1174,7 +1175,20 @@ mpegts_mux_create0
 void
 mpegts_mux_save ( mpegts_mux_t *mm, htsmsg_t *c )
 {
-  idnode_save(&mm->mm_id, c);
+  mpegts_service_t *ms;
+  htsmsg_t *root = htsmsg_create_map();
+  htsmsg_t *services = htsmsg_create_map();
+  htsmsg_t *e;
+  char ubuf[UUID_HEX_SIZE];
+
+  idnode_save(&mm->mm_id, root);
+  LIST_FOREACH(ms, &mm->mm_services, s_dvb_mux_link) {
+    e = htsmsg_create_map();
+    service_save((service_t *)ms, e);
+    htsmsg_add_msg(services, idnode_uuid_as_str(&ms->s_id, ubuf), e);
+  }
+  htsmsg_add_msg(root, "services", services);
+  htsmsg_add_msg(c, "config", root);
 }
 
 int
index 88c1ef325bd8c490f59140284b924b04cb3d2301..2c3d86053c778afa35600d6f9b1bd15cfbe8725c 100644 (file)
@@ -903,7 +903,7 @@ dvb_mux_config_save ( mpegts_mux_t *mm, char *filename, size_t fsize )
   char ubuf2[UUID_HEX_SIZE];
   htsmsg_t *c = htsmsg_create_map();
   mpegts_mux_save(mm, c);
-  snprintf(filename, fsize, "input/dvb/networks/%s/muxes/%s/config",
+  snprintf(filename, fsize, "input/dvb/networks/%s/muxes/%s",
            idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf1),
            idnode_uuid_as_str(&mm->mm_id, ubuf2));
   return c;
@@ -978,7 +978,7 @@ dvb_mux_create0
   const idclass_t *idc;
   mpegts_mux_t *mm;
   dvb_mux_t *lm;
-  htsmsg_t *c, *e;
+  htsmsg_t *c, *c2, *e;
   htsmsg_field_t *f;
   dvb_fe_delivery_system_t delsys;
   char ubuf1[UUID_HEX_SIZE];
@@ -1046,15 +1046,19 @@ dvb_mux_create0
   if (!conf) return lm;
 
   /* Services */
-  c = hts_settings_load_r(1, "input/dvb/networks/%s/muxes/%s/services",
-                         idnode_uuid_as_str(&ln->mn_id, ubuf1),
-                         idnode_uuid_as_str(&mm->mm_id, ubuf2));
+  c2 = NULL;
+  c = htsmsg_get_map(conf, "services");
+  if (c == NULL)
+    c = c2 = hts_settings_load_r(1, "input/dvb/networks/%s/muxes/%s/services",
+                                 idnode_uuid_as_str(&ln->mn_id, ubuf1),
+                                 idnode_uuid_as_str(&mm->mm_id, ubuf2));
+
   if (c) {
     HTSMSG_FOREACH(f, c) {
       if (!(e = htsmsg_get_map_by_field(f))) continue;
       mpegts_service_create1(f->hmf_name, (mpegts_mux_t *)lm, 0, 0, e);
     }
-    htsmsg_destroy(c);
+    htsmsg_destroy(c2);
   }
 
   if (ln->ln_type == DVB_TYPE_S) {
index 76ff2b6b7874223109e84ba26e7709a33cf34466..2fc68f359119f9bdb864dc8b42ef7aa4d2691b74 100644 (file)
@@ -272,17 +272,9 @@ mpegts_service_is_enabled(service_t *t, int flags)
 static htsmsg_t *
 mpegts_service_config_save ( service_t *t, char *filename, size_t fsize )
 {
-  htsmsg_t *c = htsmsg_create_map();
   mpegts_service_t *s = (mpegts_service_t*)t;
-  char ubuf0[UUID_HEX_SIZE];
-  char ubuf1[UUID_HEX_SIZE];
-  char ubuf2[UUID_HEX_SIZE];
-  service_save(t, c);
-  snprintf(filename, fsize, "input/dvb/networks/%s/muxes/%s/services/%s",
-           idnode_uuid_as_str(&s->s_dvb_mux->mm_network->mn_id, ubuf0),
-           idnode_uuid_as_str(&s->s_dvb_mux->mm_id, ubuf1),
-           idnode_uuid_as_str(&s->s_id, ubuf2));
-  return c;
+  idnode_changed(&s->s_dvb_mux->mm_id);
+  return NULL;
 }
 
 /*
@@ -672,16 +664,8 @@ mpegts_service_delete ( service_t *t, int delconf )
 {
   mpegts_service_t *ms = (mpegts_service_t*)t, *mms;
   mpegts_mux_t     *mm = ms->s_dvb_mux;
-  char ubuf0[UUID_HEX_SIZE];
-  char ubuf1[UUID_HEX_SIZE];
-  char ubuf2[UUID_HEX_SIZE];
-
-  /* Remove config */
-  if (delconf && t->s_type == STYPE_STD)
-    hts_settings_remove("input/dvb/networks/%s/muxes/%s/services/%s",
-                      idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf0),
-                      idnode_uuid_as_str(&mm->mm_id, ubuf1),
-                      idnode_uuid_as_str(&t->s_id, ubuf2));
+
+  idnode_changed(&mm->mm_id);
 
   /* Free memory */
   if (t->s_type == STYPE_STD)
index 0b00e684ad00c6ea46063ba1268995934e16c2f0..e3e508d0305830a8dd65cd5d9ba1acb6040a3288 100644 (file)
@@ -133,7 +133,7 @@ hts_settings_save(htsmsg_t *record, const char *pathfmt, ...)
   va_list ap;
   htsbuf_queue_t hq;
   htsbuf_data_t *hd;
-  int ok;
+  int ok, r;
 
   if(settingspath == NULL)
     return;
@@ -172,7 +172,14 @@ hts_settings_save(htsmsg_t *record, const char *pathfmt, ...)
 
   /* Move */
   if(ok) {
-    rename(tmppath, path);
+    r = rename(tmppath, path);
+    if (r && errno == EISDIR) {
+      rmtree(path);
+      r = rename(tmppath, path);
+    }
+    if (r)
+      tvhlog(LOG_ALERT, "settings", "Unable to rename file \"%s\" to \"%s\" - %s",
+            tmppath, path, strerror(errno));
   
   /* Delete tmp */
   } else