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;
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));
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];
(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;
if (ms)
iptv_bouquet_trigger(in, 0);
}
- htsmsg_destroy(c);
+ htsmsg_destroy(c2);
return im;
}
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);
}
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);
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
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;
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];
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) {
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;
}
/*
{
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)
va_list ap;
htsbuf_queue_t hq;
htsbuf_data_t *hd;
- int ok;
+ int ok, r;
if(settingspath == NULL)
return;
/* 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