From: Jaroslav Kysela Date: Thu, 31 Aug 2017 13:20:54 +0000 (+0200) Subject: api: more raw idnode extensions X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8a9e463c528e4fe70d2d8a73caf60f5f21c320d0;p=thirdparty%2Ftvheadend.git api: more raw idnode extensions --- diff --git a/src/access.c b/src/access.c index 28a8ba423..cedd27a8e 100644 --- a/src/access.c +++ b/src/access.c @@ -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; } diff --git a/src/api/api_raw.c b/src/api/api_raw.c index ca6e9858c..96a16c3f9 100644 --- a/src/api/api_raw.c +++ b/src/api/api_raw.c @@ -23,6 +23,32 @@ #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 }, diff --git a/src/bouquet.c b/src/bouquet.c index 60bb84abe..75e70f096 100644 --- a/src/bouquet.c +++ b/src/bouquet.c @@ -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; diff --git a/src/channels.c b/src/channels.c index 24127c3b8..a8b3a00f0 100644 --- a/src/channels.c +++ b/src/channels.c @@ -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; } diff --git a/src/config.c b/src/config.c index 7bc9c11f5..18960ab51 100644 --- a/src/config.c +++ b/src/config.c @@ -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; } diff --git a/src/descrambler/caclient.c b/src/descrambler/caclient.c index 79042b4a6..97bb73b77 100644 --- a/src/descrambler/caclient.c +++ b/src/descrambler/caclient.c @@ -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; } diff --git a/src/dvr/dvr_autorec.c b/src/dvr/dvr_autorec.c index e3667a950..723d70de6 100644 --- a/src/dvr/dvr_autorec.c +++ b/src/dvr/dvr_autorec.c @@ -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; } diff --git a/src/dvr/dvr_config.c b/src/dvr/dvr_config.c index 1b5c98b3c..4847649dd 100644 --- a/src/dvr/dvr_config.c +++ b/src/dvr/dvr_config.c @@ -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; } diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 38984e1e8..a39b669e4 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -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; } diff --git a/src/dvr/dvr_timerec.c b/src/dvr/dvr_timerec.c index 70d239698..b3019ce6e 100644 --- a/src/dvr/dvr_timerec.c +++ b/src/dvr/dvr_timerec.c @@ -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; } diff --git a/src/epggrab.c b/src/epggrab.c index 50e80c9c3..a1170f0f0 100644 --- a/src/epggrab.c +++ b/src/epggrab.c @@ -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; } diff --git a/src/epggrab/channel.c b/src/epggrab/channel.c index 2a50a2c9a..fb25a4349 100644 --- a/src/epggrab/channel.c +++ b/src/epggrab/channel.c @@ -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; } diff --git a/src/esfilter.c b/src/esfilter.c index 9071bd7fd..11949610b 100644 --- a/src/esfilter.c +++ b/src/esfilter.c @@ -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; } diff --git a/src/idnode.c b/src/idnode.c index 19b9dd9ea..3fe3d953f 100644 --- a/src/idnode.c +++ b/src/idnode.c @@ -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 ) { diff --git a/src/idnode.h b/src/idnode.h index aaa01d8cd..f6e5ccd12 100644 --- a/src/idnode.h +++ b/src/idnode.h @@ -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) diff --git a/src/imagecache.c b/src/imagecache.c index 6d4af5717..fe8a8b2ad 100644 --- a/src/imagecache.c +++ b/src/imagecache.c @@ -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; } diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 13f9e08a2..7449d6578 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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 ); diff --git a/src/input/mpegts/iptv/iptv.c b/src/input/mpegts/iptv/iptv.c index a974a359f..347c4a43a 100644 --- a/src/input/mpegts/iptv/iptv.c +++ b/src/input/mpegts/iptv/iptv.c @@ -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; } diff --git a/src/input/mpegts/iptv/iptv_mux.c b/src/input/mpegts/iptv/iptv_mux.c index 9b4dfc3c2..fba69fee5 100644 --- a/src/input/mpegts/iptv/iptv_mux.c +++ b/src/input/mpegts/iptv/iptv_mux.c @@ -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; } diff --git a/src/input/mpegts/iptv/iptv_service.c b/src/input/mpegts/iptv/iptv_service.c index 8cf9e4389..bd90c9375 100644 --- a/src/input/mpegts/iptv/iptv_service.c +++ b/src/input/mpegts/iptv/iptv_service.c @@ -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; } diff --git a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c index deb4ac73e..81f40ea42 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c @@ -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; } diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index b085c94b6..74d7cef50 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -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 diff --git a/src/input/mpegts/mpegts_mux_dvb.c b/src/input/mpegts/mpegts_mux_dvb.c index 35bc57a17..4e3fc8e15 100644 --- a/src/input/mpegts/mpegts_mux_dvb.c +++ b/src/input/mpegts/mpegts_mux_dvb.c @@ -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; } diff --git a/src/input/mpegts/mpegts_mux_sched.c b/src/input/mpegts/mpegts_mux_sched.c index 7b7a95820..fb002a4fb 100644 --- a/src/input/mpegts/mpegts_mux_sched.c +++ b/src/input/mpegts/mpegts_mux_sched.c @@ -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; } diff --git a/src/input/mpegts/mpegts_network_dvb.c b/src/input/mpegts/mpegts_network_dvb.c index 028a6200e..549331888 100644 --- a/src/input/mpegts/mpegts_network_dvb.c +++ b/src/input/mpegts/mpegts_network_dvb.c @@ -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; } diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index 009db978e..440c1a42c 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -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; } diff --git a/src/input/mpegts/satip/satip.c b/src/input/mpegts/satip/satip.c index 62234dabe..c3262338c 100644 --- a/src/input/mpegts/satip/satip.c +++ b/src/input/mpegts/satip/satip.c @@ -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; } diff --git a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c index 47740a4a0..38372e024 100644 --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c @@ -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; } diff --git a/src/profile.c b/src/profile.c index e06aee110..0f7e53120 100644 --- a/src/profile.c +++ b/src/profile.c @@ -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; diff --git a/src/service.c b/src/service.c index 22b1171e5..f1690bba5 100644 --- a/src/service.c +++ b/src/service.c @@ -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); +} + /** * */ diff --git a/src/service_mapper.c b/src/service_mapper.c index db3667f78..def02c8c0 100644 --- a/src/service_mapper.c +++ b/src/service_mapper.c @@ -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); diff --git a/src/timeshift.c b/src/timeshift.c index 671986995..e2a0e1a01 100644 --- a/src/timeshift.c +++ b/src/timeshift.c @@ -129,7 +129,8 @@ timeshift_conf_class_save ( idnode_t *self, char *filename, size_t fsize ) { htsmsg_t *m = htsmsg_create_map(); idnode_save(×hift_conf.idnode, m); - snprintf(filename, fsize, "timeshift/config"); + if (filename) + snprintf(filename, fsize, "timeshift/config"); return m; } diff --git a/src/transcoding/codec/profile_class.c b/src/transcoding/codec/profile_class.c index 8326c0cf5..1ee6d0c5c 100644 --- a/src/transcoding/codec/profile_class.c +++ b/src/transcoding/codec/profile_class.c @@ -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; }