]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
api: more raw idnode extensions
authorJaroslav Kysela <perex@perex.cz>
Thu, 31 Aug 2017 13:20:54 +0000 (15:20 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 31 Aug 2017 13:20:54 +0000 (15:20 +0200)
33 files changed:
src/access.c
src/api/api_raw.c
src/bouquet.c
src/channels.c
src/config.c
src/descrambler/caclient.c
src/dvr/dvr_autorec.c
src/dvr/dvr_config.c
src/dvr/dvr_db.c
src/dvr/dvr_timerec.c
src/epggrab.c
src/epggrab/channel.c
src/esfilter.c
src/idnode.c
src/idnode.h
src/imagecache.c
src/input/mpegts.h
src/input/mpegts/iptv/iptv.c
src/input/mpegts/iptv/iptv_mux.c
src/input/mpegts/iptv/iptv_service.c
src/input/mpegts/linuxdvb/linuxdvb_adapter.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_mux_dvb.c
src/input/mpegts/mpegts_mux_sched.c
src/input/mpegts/mpegts_network_dvb.c
src/input/mpegts/mpegts_service.c
src/input/mpegts/satip/satip.c
src/input/mpegts/tvhdhomerun/tvhdhomerun.c
src/profile.c
src/service.c
src/service_mapper.c
src/timeshift.c
src/transcoding/codec/profile_class.c

index 28a8ba42378efe1ad5bf4f3e341fb1ba98643941..cedd27a8e0bfbb8cb6a18780b66efc85861e1e68 100644 (file)
@@ -1177,7 +1177,8 @@ access_entry_class_save(idnode_t *self, char *filename, size_t fsize)
   htsmsg_t *c = htsmsg_create_map();
   access_entry_update_rights((access_entry_t *)self);
   idnode_save(&ae->ae_id, c);
-  snprintf(filename, fsize, "accesscontrol/%s", idnode_uuid_as_str(&ae->ae_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "accesscontrol/%s", idnode_uuid_as_str(&ae->ae_id, ubuf));
   return c;
 }
 
@@ -1954,7 +1955,8 @@ passwd_entry_class_save(idnode_t *self, char *filename, size_t fsize)
   char ubuf[UUID_HEX_SIZE];
   htsmsg_t *c = htsmsg_create_map();
   idnode_save(&pw->pw_id, c);
-  snprintf(filename, fsize, "passwd/%s", idnode_uuid_as_str(&pw->pw_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "passwd/%s", idnode_uuid_as_str(&pw->pw_id, ubuf));
   return c;
 }
 
@@ -2130,7 +2132,8 @@ ipblock_entry_class_save(idnode_t *self, char *filename, size_t fsize)
   htsmsg_t *c = htsmsg_create_map();
   char ubuf[UUID_HEX_SIZE];
   idnode_save(&ib->ib_id, c);
-  snprintf(filename, fsize, "ipblock/%s", idnode_uuid_as_str(&ib->ib_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "ipblock/%s", idnode_uuid_as_str(&ib->ib_id, ubuf));
   return c;
 }
 
index ca6e9858c11501ee941f0d6d3f58eeff54c89914..96a16c3f92ac5ab736283906187f371c00c87365 100644 (file)
 #include "htsmsg.h"
 #include "api.h"
 
+static int
+api_idnode_classes
+  ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp )
+{
+  idclass_t const **all, **all2;
+  const idclass_t *ic;
+
+  *resp = htsmsg_create_map();
+  pthread_mutex_lock(&global_lock);
+  all = idclass_find_all();
+  if (all == NULL) {
+    pthread_mutex_unlock(&global_lock);
+    return EINVAL;
+  }
+  for (all2 = all; *all2; all2++) {
+    ic = *all2;
+    htsmsg_add_str(*resp, ic->ic_class, ic->ic_caption ?: "");
+  }
+  pthread_mutex_unlock(&global_lock);
+
+  free(all);
+  return 0;
+}
+
+
+
 static int
 api_idnode_raw_export_by_class0
   ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp )
@@ -32,7 +58,7 @@ api_idnode_raw_export_by_class0
   idnode_set_t    *is;
   idnode_t        *in;
   htsmsg_t        *l, *e;
-  char filename[PATH_MAX];
+  char ubuf[UUID_HEX_SIZE];
 
   /* Find class */
   idc = opaque;
@@ -46,10 +72,12 @@ api_idnode_raw_export_by_class0
       if (idnode_perm(in, perm, NULL))
         continue;
 
-      e = idnode_savefn(in, filename, sizeof(filename));
+      e = idnode_savefn(in, NULL, 0);
 
-      if (e)
+      if (e) {
+        htsmsg_set_str(e, "uuid", idnode_uuid_as_str(in, ubuf));
         htsmsg_add_msg(l, NULL, e);
+      }
 
       idnode_perm_unset(in);
     }
@@ -57,8 +85,7 @@ api_idnode_raw_export_by_class0
     free(is);
   }
 
-  *resp = htsmsg_create_map();
-  htsmsg_add_msg(*resp, "entries", l);
+  *resp = l;
 
   return 0;
 }
@@ -72,7 +99,7 @@ api_idnode_raw_export
   htsmsg_t *uuids, *l = NULL, *m;
   htsmsg_field_t *f;
   const char *uuid = NULL, *class;
-  char filename[PATH_MAX];
+  char ubuf[UUID_HEX_SIZE];
 
   /* Class based */
   if ((class = htsmsg_get_str(args, "class"))) {
@@ -95,11 +122,11 @@ api_idnode_raw_export
       return EINVAL;
 
   pthread_mutex_lock(&global_lock);
+  l = htsmsg_create_list();
 
   /* Multiple */
   if (uuids) {
     const idnodes_rb_t *domain = NULL;
-    l = htsmsg_create_list();
     HTSMSG_FOREACH(f, uuids) {
       if (!(uuid = htsmsg_field_get_str(f))) continue;
       if (!(in   = idnode_find(uuid, NULL, domain))) continue;
@@ -108,9 +135,11 @@ api_idnode_raw_export
         err = EPERM;
         continue;
       }
-      m = idnode_savefn(in, filename, sizeof(filename));
-      if (m)
+      m = idnode_savefn(in, NULL, 0);
+      if (m) {
+        htsmsg_set_str(m, "uuid", idnode_uuid_as_str(in, ubuf));
         htsmsg_add_msg(l, NULL, m);
+      }
       count++;
       idnode_perm_unset(in);
     }
@@ -120,22 +149,22 @@ api_idnode_raw_export
 
   /* Single */
   } else {
-    l = htsmsg_create_list();
     if ((in = idnode_find(uuid, NULL, NULL)) != NULL) {
       if (idnode_perm(in, perm, NULL)) {
         err = EPERM;
       } else {
-        m = idnode_savefn(in, filename, sizeof(filename));
-        if (m)
+        m = idnode_savefn(in, NULL, 0);
+        if (m) {
+          htsmsg_set_str(m, "uuid", idnode_uuid_as_str(in, ubuf));
           htsmsg_add_msg(l, NULL, m);
+        }
         idnode_perm_unset(in);
       }
     }
   }
 
   if (l && err == 0) {
-    *resp = htsmsg_create_map();
-    htsmsg_add_msg(*resp, "entries", l);
+    *resp = l;
   } else {
     htsmsg_destroy(l);
   }
@@ -157,11 +186,13 @@ api_idnode_raw_import
   int count = 0;
   const idnodes_rb_t *domain = NULL;
 
+  htsmsg_print(args);
   if (!(f = htsmsg_field_find(args, "node")))
     return EINVAL;
   if (!(msg = htsmsg_field_get_list(f)))
     if (!(msg = htsmsg_field_get_map(f)))
       return EINVAL;
+  htsmsg_print(msg);
 
   pthread_mutex_lock(&global_lock);
 
@@ -185,7 +216,7 @@ api_idnode_raw_import
           continue;
         }
         count++;
-        idnode_update(in, msg);
+        idnode_loadfn(in, msg);
         idnode_perm_unset(in);
       }
       if (count)
@@ -199,7 +230,7 @@ api_idnode_raw_import
         err = EPERM;
         goto exit;
       }
-      idnode_update(in, msg);
+      idnode_loadfn(in, msg);
       idnode_perm_unset(in);
       err = 0;
 
@@ -221,7 +252,7 @@ api_idnode_raw_import
         continue;
       }
       count++;
-      idnode_update(in, conf);
+      idnode_load(in, conf);
       idnode_perm_unset(in);
     }
     if (count)
@@ -243,6 +274,7 @@ void api_idnode_raw_init ( void )
    * note: permissions are verified using idnode_perm() calls
    */
   static api_hook_t ah[] = {
+    { "classes",        ACCESS_ANONYMOUS, api_idnode_classes,        NULL },
     { "raw/export",     ACCESS_ANONYMOUS, api_idnode_raw_export,     NULL },
     { "raw/import",     ACCESS_ANONYMOUS, api_idnode_raw_import,     NULL },
     { NULL },
index 60bb84abe28b84297c676d8f81b16693e2140e36..75e70f0965d073361392de156a7219a9845ab11f 100644 (file)
@@ -663,7 +663,8 @@ bouquet_class_save(idnode_t *self, char *filename, size_t fsize)
   htsmsg_t *c = htsmsg_create_map();
   char ubuf[UUID_HEX_SIZE];
   idnode_save(&bq->bq_id, c);
-  snprintf(filename, fsize, "bouquet/%s", idnode_uuid_as_str(&bq->bq_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "bouquet/%s", idnode_uuid_as_str(&bq->bq_id, ubuf));
   if (bq->bq_shield)
     htsmsg_add_bool(c, "shield", 1);
   bq->bq_saveflag = 0;
index 24127c3b8014c72224a7cd957da2e179dad88eb2..a8b3a00f02877b61fd74d2f72c2c9511d6a00657 100644 (file)
@@ -100,7 +100,8 @@ channel_class_save ( idnode_t *self, char *filename, size_t fsize )
     tvhdebug(LS_CHANNEL, "channel '%s' save", channel_get_name(ch, channel_blank_name));
     c = htsmsg_create_map();
     idnode_save(&ch->ch_id, c);
-    snprintf(filename, fsize, "channel/config/%s", idnode_uuid_as_str(&ch->ch_id, ubuf));
+    if (filename)
+      snprintf(filename, fsize, "channel/config/%s", idnode_uuid_as_str(&ch->ch_id, ubuf));
   }
   return c;
 }
@@ -1406,7 +1407,8 @@ channel_tag_class_save(idnode_t *self, char *filename, size_t fsize)
   htsmsg_t *c = htsmsg_create_map();
   char ubuf[UUID_HEX_SIZE];
   idnode_save(&ct->ct_id, c);
-  snprintf(filename, fsize, "channel/tag/%s", idnode_uuid_as_str(&ct->ct_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "channel/tag/%s", idnode_uuid_as_str(&ct->ct_id, ubuf));
   return c;
 }
 
index 7bc9c11f5e6f2a032deed99ee804ba3af7f592ad..18960ab51c32d8bf332b3fcf836ff2c0de63eaf8 100644 (file)
@@ -1821,7 +1821,8 @@ config_class_save(idnode_t *self, char *filename, size_t fsize)
 #if ENABLE_SATIP_SERVER
   idnode_save(&satip_server_conf.idnode, c);
 #endif
-  snprintf(filename, fsize, "config");
+  if (filename)
+    snprintf(filename, fsize, "config");
   return c;
 }
 
index 79042b4a6e57d2ab15842a6b8de740e64da418c0..97bb73b77c2c908ba9216348e2fe717f8981fe88 100644 (file)
@@ -175,7 +175,8 @@ caclient_class_save ( idnode_t *in, char *filename, size_t fsize )
   char ubuf[UUID_HEX_SIZE];
   htsmsg_t *c = htsmsg_create_map();
   idnode_save(in, c);
-  snprintf(filename, fsize, "caclient/%s", idnode_uuid_as_str(in, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "caclient/%s", idnode_uuid_as_str(in, ubuf));
   return c;
 }
 
index e3667a9507fac546b664fe5267f1800355a586a5..723d70de657de99d9a71d50f75de343ae94da84c 100644 (file)
@@ -452,7 +452,8 @@ dvr_autorec_entry_class_save(idnode_t *self, char *filename, size_t fsize)
   htsmsg_t *m = htsmsg_create_map();
   char ubuf[UUID_HEX_SIZE];
   idnode_save(&dae->dae_id, m);
-  snprintf(filename, fsize, "dvr/autorec/%s", idnode_uuid_as_str(&dae->dae_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "dvr/autorec/%s", idnode_uuid_as_str(&dae->dae_id, ubuf));
   return m;
 }
 
index 1b5c98b3cbb523dd843fc55fc966004cc0fe0870..4847649ddd295f76d3aa7f76e0423cf7c0e914dd 100644 (file)
@@ -558,7 +558,8 @@ dvr_config_class_save(idnode_t *self, char *filename, size_t fsize)
   htsmsg_t *m = htsmsg_create_map();
   char ubuf[UUID_HEX_SIZE];
   idnode_save(&cfg->dvr_id, m);
-  snprintf(filename, fsize, "dvr/config/%s", idnode_uuid_as_str(&cfg->dvr_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "dvr/config/%s", idnode_uuid_as_str(&cfg->dvr_id, ubuf));
   return m;
 }
 
index 38984e1e80108346430ed0547ab0cd7549debd0e..a39b669e421f0bd877b2bff71822cf8ca68f4178 100644 (file)
@@ -2283,7 +2283,8 @@ dvr_entry_class_save(idnode_t *self, char *filename, size_t fsize)
       }
     htsmsg_add_msg(m, "files", l);
   }
-  snprintf(filename, fsize, "dvr/log/%s", idnode_uuid_as_str(&de->de_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "dvr/log/%s", idnode_uuid_as_str(&de->de_id, ubuf));
   return m;
 }
 
index 70d23969816402bffecfb9e21c18036d5fb8d061..b3019ce6e240c573c81071d32d539b434b0f21c2 100644 (file)
@@ -279,7 +279,8 @@ dvr_timerec_entry_class_save(idnode_t *self, char *filename, size_t fsize)
   htsmsg_t *m = htsmsg_create_map();
   char ubuf[UUID_HEX_SIZE];
   idnode_save(&dte->dte_id, m);
-  snprintf(filename, fsize, "dvr/timerec/%s", idnode_uuid_as_str(&dte->dte_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "dvr/timerec/%s", idnode_uuid_as_str(&dte->dte_id, ubuf));
   return m;
 }
 
index 50e80c9c3f3b8f7aeb776b3e33806c312764cf8f..a1170f0f04f97500b7852c52e70b138308baf1ba 100644 (file)
@@ -222,7 +222,8 @@ epggrab_class_save(idnode_t *self, char *filename, size_t fsize)
     htsmsg_add_msg(a, mod->id, m);
   }
   htsmsg_add_msg(m, "modules", a);
-  snprintf(filename, fsize, "epggrab/config");
+  if (filename)
+    snprintf(filename, fsize, "epggrab/config");
   return m;
 }
 
index 2a50a2c9a5e624e722eb36e019301cbf0cc91af1..fb25a434959cdd87f2eb8fe08a9a4fc0ee840c4b 100644 (file)
@@ -551,8 +551,9 @@ epggrab_channel_class_save(idnode_t *self, char *filename, size_t fsize)
   htsmsg_t *m = htsmsg_create_map();
   char ubuf[UUID_HEX_SIZE];
   idnode_save(&ec->idnode, m);
-  snprintf(filename, fsize, "epggrab/%s/channels/%s",
-           ec->mod->saveid, idnode_uuid_as_str(&ec->idnode, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "epggrab/%s/channels/%s",
+             ec->mod->saveid, idnode_uuid_as_str(&ec->idnode, ubuf));
   return m;
 }
 
index 9071bd7fddb7d2ca05314d8887cd60716073a0ae..11949610b0cf7687c1ff1026d08998760f009dd7 100644 (file)
@@ -210,7 +210,8 @@ esfilter_class_save(idnode_t *self, char *filename, size_t fsize)
   htsmsg_t *c = htsmsg_create_map();
   char ubuf[UUID_HEX_SIZE];
   idnode_save(self, c);
-  snprintf(filename, fsize, "esfilter/%s", idnode_uuid_as_str(self, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "esfilter/%s", idnode_uuid_as_str(self, ubuf));
   return c;
 }
 
index 19b9dd9eae54a3a8d7ad044820eb198355431a4b..3fe3d953fb8e8be37a4b732cd6016cb80dc4c689 100644 (file)
@@ -1133,6 +1133,20 @@ idnode_savefn ( idnode_t *self, char *filename, size_t fsize )
   return NULL;
 }
 
+void
+idnode_loadfn ( idnode_t *self, htsmsg_t *conf )
+{
+  const idclass_t *idc = self->in_class;
+  while (idc) {
+    if (idc->ic_load) {
+      idc->ic_load(self, conf);
+      return;
+    }
+    idc = idc->ic_super;
+  }
+  idnode_load(self, conf);
+}
+
 static void
 idnode_save_trigger_thread_cb( void *aux )
 {
index aaa01d8cd667176ae53c7c2f086c9245437333f4..f6e5ccd12aa93ba54981fdd9c9da526cfa1aaff5 100644 (file)
@@ -82,6 +82,7 @@ struct idclass {
   const char     *(*ic_get_title)  (idnode_t *self, const char *lang);
   void            (*ic_changed)    (idnode_t *self);
   htsmsg_t       *(*ic_save)       (idnode_t *self, char *filename, size_t fsize);
+  void            (*ic_load)       (idnode_t *self, htsmsg_t *conf);
   void            (*ic_delete)     (idnode_t *self);
   void            (*ic_moveup)     (idnode_t *self);
   void            (*ic_movedown)   (idnode_t *self);
@@ -235,6 +236,7 @@ void      idnode_read0  (idnode_t *self, htsmsg_t *m, htsmsg_t *list, int optmas
 int       idnode_write0 (idnode_t *self, htsmsg_t *m, int optmask, int dosave);
 void      idnode_save_check (idnode_t *self, int weak);
 htsmsg_t *idnode_savefn (idnode_t *self, char *filename, size_t fsize);
+void      idnode_loadfn (idnode_t *self, htsmsg_t *conf);
 
 #define idclass_serialize(idc, lang)    idclass_serialize0(idc, NULL, 0, lang)
 #define idclass_serializedoc(idc, lang) idclass_serialize0(idc, NULL, PO_DOC, lang)
index 6d4af571773d428f50434c63f63f9853fae8944f..fe8a8b2adf6715d3f3bc033d9fc8561eb5765255 100644 (file)
@@ -518,7 +518,8 @@ imagecache_save ( idnode_t *self, char *filename, size_t fsize )
 {
   htsmsg_t *c = htsmsg_create_map();
   idnode_save(&imagecache_conf.idnode, c);
-  snprintf(filename, fsize, "imagecache/config");
+  if (filename)
+    snprintf(filename, fsize, "imagecache/config");
   tvh_cond_signal(&imagecache_cond, 1);
   return c;
 }
index 13f9e08a2ff961283f5aead3cc1657b6341b7c7a..7449d65789b5a9a2f212cd2dbf03678c67f1a534 100644 (file)
@@ -917,7 +917,7 @@ static inline int mpegts_mux_release ( mpegts_mux_t *mm )
   return 0;
 }
 
-void mpegts_mux_save ( mpegts_mux_t *mm, htsmsg_t *c );
+void mpegts_mux_save ( mpegts_mux_t *mm, htsmsg_t *c, int refs );
 
 void mpegts_mux_tuning_error( const char *mux_uuid, mpegts_mux_instance_t *mmi_match );
 
index a974a359f8ef95902fb896ce3994a95182b9d147..347c4a43a187cf32246994711834b1849b97f2d5 100644 (file)
@@ -946,8 +946,9 @@ iptv_network_config_save ( mpegts_network_t *mn, char *filename, size_t fsize )
   htsmsg_t *c = htsmsg_create_map();
   char ubuf[UUID_HEX_SIZE];
   idnode_save(&mn->mn_id, c);
-  snprintf(filename, fsize, "input/iptv/networks/%s/config",
-           idnode_uuid_as_str(&mn->mn_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "input/iptv/networks/%s/config",
+             idnode_uuid_as_str(&mn->mn_id, ubuf));
   return c;
 }
 
index 9b4dfc3c214c46748e9a434184804cd2b0fa0fd2..fba69fee5df0ea2cdd6cdc6dcfc06eebf9f46fc6 100644 (file)
@@ -278,10 +278,14 @@ iptv_mux_config_save ( mpegts_mux_t *mm, char *filename, size_t fsize )
   char ubuf1[UUID_HEX_SIZE];
   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",
-           idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf1),
-           idnode_uuid_as_str(&mm->mm_id, ubuf2));
+  if (filename == NULL) {
+    mpegts_mux_save(mm, c, 1);
+  } else {
+    mpegts_mux_save(mm, c, 0);
+    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;
 }
 
index 8cf9e43898dd3d29e947a6a7d68435924cfd9c68..bd90c9375a9f5199c406bc32f5d725a1511f3072 100644 (file)
@@ -25,8 +25,12 @@ 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;
-  idnode_changed(&mm->mm_id);
+  if (filename == NULL) {
+    htsmsg_t *e = htsmsg_create_map();
+    service_save(s, e);
+    return e;
+  }
+  idnode_changed(&((mpegts_service_t *)s)->s_dvb_mux->mm_id);
   return NULL;
 }
 
index deb4ac73eaf2c1536042e7acd29f87c845561ce6..81f40ea425a3d31726850d738ba0bb2762a8ac9e 100644 (file)
@@ -59,23 +59,25 @@ linuxdvb_adapter_class_save ( idnode_t *in, char *filename, size_t fsize )
   m = htsmsg_create_map();
   idnode_save(&la->th_id, m);
 
-  /* Frontends */
-  l = htsmsg_create_map();
-  LIST_FOREACH(lfe, &la->la_frontends, lfe_link)
-    linuxdvb_frontend_save(lfe, l);
-  htsmsg_add_msg(m, "frontends", l);
-
-  /* CAs */
-#if ENABLE_LINUXDVB_CA
-  l = htsmsg_create_map();
-  LIST_FOREACH(lca, &la->la_ca_devices, lca_link)
-    linuxdvb_ca_save(lca, l);
-  htsmsg_add_msg(m, "ca_devices", l);
-#endif
+  if (filename) {
+    /* Frontends */
+    l = htsmsg_create_map();
+    LIST_FOREACH(lfe, &la->la_frontends, lfe_link)
+      linuxdvb_frontend_save(lfe, l);
+    htsmsg_add_msg(m, "frontends", l);
+
+    /* CAs */
+  #if ENABLE_LINUXDVB_CA
+    l = htsmsg_create_map();
+    LIST_FOREACH(lca, &la->la_ca_devices, lca_link)
+      linuxdvb_ca_save(lca, l);
+    htsmsg_add_msg(m, "ca_devices", l);
+  #endif
 
-  /* Save */
-  snprintf(filename, fsize, "input/linuxdvb/adapters/%s",
-           idnode_uuid_as_str(&la->th_id, ubuf));
+    /* Filename */
+    snprintf(filename, fsize, "input/linuxdvb/adapters/%s",
+             idnode_uuid_as_str(&la->th_id, ubuf));
+  }
   return m;
 }
 
index b085c94b6acce233740b8d749570e0e1497db555..74d7cef50c768fdb0c029a6ed326af47d5a40a9a 100644 (file)
@@ -1271,22 +1271,27 @@ mpegts_mux_create0
 }
 
 void
-mpegts_mux_save ( mpegts_mux_t *mm, htsmsg_t *c )
+mpegts_mux_save ( mpegts_mux_t *mm, htsmsg_t *c, int refs )
 {
   mpegts_service_t *ms;
-  htsmsg_t *root = htsmsg_create_map();
-  htsmsg_t *services = htsmsg_create_map();
+  htsmsg_t *root = !refs ? htsmsg_create_map() : c;
+  htsmsg_t *services = !refs ? htsmsg_create_map() : htsmsg_create_list();
   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);
+    if (refs) {
+      htsmsg_add_str(services, NULL, idnode_uuid_as_str(&ms->s_id, ubuf));
+    } else {
+      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);
+  if (!refs)
+    htsmsg_add_msg(c, "config", root);
 }
 
 int
index 35bc57a1778dddb0a55bc6bfa07778ba7269c1c8..4e3fc8e1599d9f528ed669ec3b094ce51c9b282b 100644 (file)
@@ -901,10 +901,14 @@ dvb_mux_config_save ( mpegts_mux_t *mm, char *filename, size_t fsize )
   char ubuf1[UUID_HEX_SIZE];
   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",
-           idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf1),
-           idnode_uuid_as_str(&mm->mm_id, ubuf2));
+  if (filename == NULL) {
+    mpegts_mux_save(mm, c, 1);
+  } else {
+    mpegts_mux_save(mm, c, 0);
+    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;
 }
 
index 7b7a95820f560a22fa16629b353ea0138a410cbb..fb002a4fb76cfcf1d49b724717033b2d2fc84b66 100644 (file)
@@ -73,7 +73,8 @@ mpegts_mux_sched_class_save ( idnode_t *in, char *filename, size_t fsize )
   htsmsg_t *c = htsmsg_create_map();
   char ubuf[UUID_HEX_SIZE];
   idnode_save(in, c);
-  snprintf(filename, fsize, "muxsched/%s", idnode_uuid_as_str(in, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "muxsched/%s", idnode_uuid_as_str(in, ubuf));
   return c;
 }
 
index 028a6200e876b97fca494243b1fd31daa05c886a..5493318887cb279af1008718c19a40fdfd0d9ec6 100644 (file)
@@ -586,8 +586,9 @@ dvb_network_config_save ( mpegts_network_t *mn, char *filename, size_t fsize )
   char ubuf[UUID_HEX_SIZE];
   idnode_save(&mn->mn_id, c);
   htsmsg_add_str(c, "class", mn->mn_id.in_class->ic_class);
-  snprintf(filename, fsize, "input/dvb/networks/%s/config",
-           idnode_uuid_as_str(&mn->mn_id, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "input/dvb/networks/%s/config",
+             idnode_uuid_as_str(&mn->mn_id, ubuf));
   return c;
 }
 
index 009db978e5a1f8369ced2dce9f798b170b8d8927..440c1a42c3b2142ed6b234b59f732ae6be684dfe 100644 (file)
@@ -284,8 +284,12 @@ mpegts_service_is_enabled(service_t *t, int flags)
 static htsmsg_t *
 mpegts_service_config_save ( service_t *t, char *filename, size_t fsize )
 {
-  mpegts_service_t *s = (mpegts_service_t*)t;
-  idnode_changed(&s->s_dvb_mux->mm_id);
+  if (filename == NULL) {
+    htsmsg_t *e = htsmsg_create_map();
+    service_save(t, e);
+    return e;
+  }
+  idnode_changed(&((mpegts_service_t *)t)->s_dvb_mux->mm_id);
   return NULL;
 }
 
index 62234dabe2dc82c2568f99e1089ecb062d4dcede..c3262338c794b1c3a4fc87475bf3a4f81cf9bf81 100644 (file)
@@ -131,13 +131,16 @@ satip_device_class_save ( idnode_t *in, char *filename, size_t fsize )
   m = htsmsg_create_map();
   idnode_save(&sd->th_id, m);
 
-  l = htsmsg_create_map();
-  TAILQ_FOREACH(lfe, &sd->sd_frontends, sf_link)
-    satip_frontend_save(lfe, l);
-  htsmsg_add_msg(m, "frontends", l);
+  if (filename) {
+    l = htsmsg_create_map();
+    TAILQ_FOREACH(lfe, &sd->sd_frontends, sf_link)
+      satip_frontend_save(lfe, l);
+    htsmsg_add_msg(m, "frontends", l);
+
+    snprintf(filename, fsize, "input/satip/adapters/%s",
+             idnode_uuid_as_str(&sd->th_id, ubuf));
+  }
 
-  snprintf(filename, fsize, "input/satip/adapters/%s",
-           idnode_uuid_as_str(&sd->th_id, ubuf));
   return m;
 }
 
index 47740a4a0d4ffabf009be6b6ce6e721ce73b2719..38372e02430d1e762c891c23bbeb641572699db6 100644 (file)
@@ -44,15 +44,17 @@ tvhdhomerun_device_class_save ( idnode_t *in, char *filename, size_t fsize )
   m = htsmsg_create_map();
   idnode_save(&hd->th_id, m);
 
-  l = htsmsg_create_map();
-  TAILQ_FOREACH(lfe, &hd->hd_frontends, hf_link)
-    tvhdhomerun_frontend_save(lfe, l);
-  htsmsg_add_msg(m, "frontends", l);
+  if (filename) {
+    l = htsmsg_create_map();
+    TAILQ_FOREACH(lfe, &hd->hd_frontends, hf_link)
+      tvhdhomerun_frontend_save(lfe, l);
+    htsmsg_add_msg(m, "frontends", l);
+
+    snprintf(filename, fsize, "input/tvhdhomerun/adapters/%s",
+             idnode_uuid_as_str(&hd->th_id, ubuf));
+  }
 
   htsmsg_add_str(m, "fe_override", hd->hd_override_type);
-
-  snprintf(filename, fsize, "input/tvhdhomerun/adapters/%s",
-           idnode_uuid_as_str(&hd->th_id, ubuf));
   return m;
 }
 
index e06aee1100dda0ee7366018a26f36212f043c044..0f7e531209af8b1dae6b2d1aefa0a797822b2e4c 100644 (file)
@@ -159,7 +159,8 @@ profile_class_save ( idnode_t *in, char *filename, size_t fsize )
   idnode_save(in, c);
   if (pro->pro_shield)
     htsmsg_add_bool(c, "shield", 1);
-  snprintf(filename, fsize, "profile/%s", idnode_uuid_as_str(in, ubuf));
+  if (filename)
+    snprintf(filename, fsize, "profile/%s", idnode_uuid_as_str(in, ubuf));
   if (pro->pro_conf_changed)
     pro->pro_conf_changed(pro);
   return c;
index 22b1171e535772281bbb7f6c35189652fc57e31b..f1690bba5149d3f16c34e15fe60993e98583e7d7 100644 (file)
@@ -54,6 +54,7 @@
 static void service_data_timeout(void *aux);
 static void service_class_delete(struct idnode *self);
 static htsmsg_t *service_class_save(struct idnode *self, char *filename, size_t fsize);
+static void service_class_load(struct idnode *self, htsmsg_t *conf);
 static int service_make_nicename0(service_t *t, char *buf, size_t len, int adapter);
 
 struct service_queue service_all;
@@ -172,6 +173,7 @@ const idclass_t service_class = {
   .ic_perm_def   = ACCESS_ADMIN,
   .ic_delete     = service_class_delete,
   .ic_save       = service_class_save,
+  .ic_load       = service_class_load,
   .ic_get_title  = service_class_get_title,
   .ic_properties = (const property_t[]){
     {
@@ -1610,6 +1612,15 @@ service_class_save(struct idnode *self, char *filename, size_t fsize)
   return NULL;
 }
 
+/**
+ *
+ */
+static void
+service_class_load(struct idnode *self, htsmsg_t *c)
+{
+  service_load((service_t *)self, c);
+}
+
 /**
  *
  */
index db3667f7807443e2adc0c78beae965b9d7a84ab7..def02c8c0177f53bbb74655698b3184172497734 100644 (file)
@@ -431,7 +431,8 @@ service_mapper_conf_class_save ( idnode_t *self, char *filename, size_t fsize )
 
   m = htsmsg_create_map();
   idnode_save(&service_mapper_conf.idnode, m);
-  snprintf(filename, fsize, "service_mapper/config");
+  if (filename)
+    snprintf(filename, fsize, "service_mapper/config");
 
   if (!htsmsg_is_empty(service_mapper_conf.services))
     service_mapper_start(&service_mapper_conf.d, service_mapper_conf.services);
index 6719869951d359f4faa7b2584c5fbfdd452b7074..e2a0e1a01bd3255892faf0f6ff91db8cb7ff74b6 100644 (file)
@@ -129,7 +129,8 @@ timeshift_conf_class_save ( idnode_t *self, char *filename, size_t fsize )
 {
   htsmsg_t *m = htsmsg_create_map();
   idnode_save(&timeshift_conf.idnode, m);
-  snprintf(filename, fsize, "timeshift/config");
+  if (filename)
+    snprintf(filename, fsize, "timeshift/config");
   return m;
 }
 
index 8326c0cf58183037f014a054ec6f67ea1b75f9ac..1ee6d0c5c0cf9c5fde68f6412c1b43fa65c1729a 100644 (file)
@@ -92,14 +92,11 @@ tvh_codec_profile_base_open(TVHCodecProfile *self, AVDictionary **opts)
 static htsmsg_t *
 codec_profile_class_save(idnode_t *idnode, char *filename, size_t fsize)
 {
-    htsmsg_t *map = NULL;
+    htsmsg_t *map = htsmsg_create_map();
     static char uuid[UUID_HEX_SIZE];
-
-    memset(uuid, 0, sizeof(uuid));
-    if (!str_snprintf(filename, fsize, "codec/%s", idnode_uuid_as_str(idnode, uuid)) &&
-        (map = htsmsg_create_map())) {
-        idnode_save(idnode, map);
-    }
+    idnode_save(idnode, map);
+    if (filename)
+      snprintf(filename, fsize, "codec/%s", idnode_uuid_as_str(idnode, uuid));
     return map;
 }