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;
}
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;
}
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;
}
#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 )
idnode_set_t *is;
idnode_t *in;
htsmsg_t *l, *e;
- char filename[PATH_MAX];
+ char ubuf[UUID_HEX_SIZE];
/* Find class */
idc = opaque;
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);
}
free(is);
}
- *resp = htsmsg_create_map();
- htsmsg_add_msg(*resp, "entries", l);
+ *resp = l;
return 0;
}
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"))) {
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;
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);
}
/* 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);
}
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);
continue;
}
count++;
- idnode_update(in, msg);
+ idnode_loadfn(in, msg);
idnode_perm_unset(in);
}
if (count)
err = EPERM;
goto exit;
}
- idnode_update(in, msg);
+ idnode_loadfn(in, msg);
idnode_perm_unset(in);
err = 0;
continue;
}
count++;
- idnode_update(in, conf);
+ idnode_load(in, conf);
idnode_perm_unset(in);
}
if (count)
* 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 },
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;
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;
}
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;
}
#if ENABLE_SATIP_SERVER
idnode_save(&satip_server_conf.idnode, c);
#endif
- snprintf(filename, fsize, "config");
+ if (filename)
+ snprintf(filename, fsize, "config");
return c;
}
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;
}
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;
}
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;
}
}
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;
}
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;
}
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;
}
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;
}
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;
}
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 )
{
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);
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)
{
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;
}
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 );
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;
}
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;
}
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;
}
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;
}
}
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
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
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;
.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[]){
{
return NULL;
}
+/**
+ *
+ */
+static void
+service_class_load(struct idnode *self, htsmsg_t *c)
+{
+ service_load((service_t *)self, c);
+}
+
/**
*
*/
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);
{
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;
}
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;
}