From 29f6d712e85cd734661f3a7cb4ed233b15dfd57f Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Tue, 6 Aug 2013 23:02:41 +0100 Subject: [PATCH] mpegts: added deleting of entire network --- src/input/mpegts.h | 7 +++++ src/input/mpegts/linuxdvb/linuxdvb_mux.c | 3 +- src/input/mpegts/linuxdvb/linuxdvb_network.c | 13 ++++++++ src/input/mpegts/mpegts_input.c | 1 + src/input/mpegts/mpegts_mux.c | 2 -- src/input/mpegts/mpegts_network.c | 33 ++++++++++++++++++++ src/input/mpegts/mpegts_service.c | 14 +++++++-- src/settings.c | 2 +- src/webui/extjs_dvb.c | 18 ++++++++++- 9 files changed, 84 insertions(+), 9 deletions(-) diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 85639f00..98ccac89 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -177,6 +177,7 @@ struct mpegts_network /* * Functions */ + void (*mn_delete) (mpegts_network_t *mn); void (*mn_display_name) (mpegts_network_t*, char *buf, size_t len); void (*mn_config_save) (mpegts_network_t*); mpegts_mux_t* (*mn_create_mux) @@ -468,6 +469,10 @@ extern const idclass_t mpegts_network_class; #define mpegts_network_find(u)\ idnode_find(u, &mpegts_network_class) +#define mpegts_network_delete_by_uuid(u)\ + { mpegts_network_t *mn = mpegts_network_find(u); if (mn && mn->mn_delete) mn->mn_delete(mn); } + +void mpegts_network_delete ( mpegts_network_t *mn ); void mpegts_network_schedule_initial_scan ( mpegts_network_t *mm ); @@ -557,6 +562,8 @@ mpegts_service_t *mpegts_service_find void mpegts_service_save ( mpegts_service_t *s, htsmsg_t *c ); +void mpegts_service_delete ( service_t *s ); + #endif /* __TVH_MPEGTS_H__ */ /****************************************************************************** diff --git a/src/input/mpegts/linuxdvb/linuxdvb_mux.c b/src/input/mpegts/linuxdvb/linuxdvb_mux.c index 656248a4..2bd8c1cc 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_mux.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_mux.c @@ -453,9 +453,8 @@ static void linuxdvb_mux_delete ( mpegts_mux_t *mm ) { - printf("delete %p\n", mm); /* Remove config */ - hts_settings_remove("input/linuxdvb/networks/%s/muxes/%s/config", + hts_settings_remove("input/linuxdvb/networks/%s/muxes/%s", idnode_uuid_as_str(&mm->mm_network->mn_id), idnode_uuid_as_str(&mm->mm_id)); diff --git a/src/input/mpegts/linuxdvb/linuxdvb_network.c b/src/input/mpegts/linuxdvb/linuxdvb_network.c index 0cfede78..e3d11eba 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_network.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_network.c @@ -169,6 +169,18 @@ linuxdvb_network_mux_create2 NULL, NULL, conf); } +static void +linuxdvb_network_delete + ( mpegts_network_t *mn ) +{ + /* remove config */ + hts_settings_remove("input/linuxdvb/networks/%s", + idnode_uuid_as_str(&mn->mn_id)); + + /* Parent delete */ + mpegts_network_delete(mn); +} + /* **************************************************************************** * Creation/Config * ***************************************************************************/ @@ -196,6 +208,7 @@ linuxdvb_network_create0 ln->ln_type = FE_ATSC; /* Callbacks */ + ln->mn_delete = linuxdvb_network_delete; ln->mn_create_mux = linuxdvb_network_create_mux; ln->mn_create_service = linuxdvb_network_create_service; ln->mn_config_save = linuxdvb_network_config_save; diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 7054bf7a..736a0f80 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -424,6 +424,7 @@ mpegts_input_set_network ( mpegts_input_t *mi, mpegts_network_t *mn ) mi->mi_network->mn_display_name(mi->mi_network, buf2, sizeof(buf2)); LIST_REMOVE(mi, mi_network_link); tvhdebug("mpegts", "%s - remove network %s", buf1, buf2); + mi->mi_network = NULL; } if (mn) { mn->mn_display_name(mn, buf2, sizeof(buf2)); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 5910629d..27ae9bda 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -251,9 +251,7 @@ mpegts_mux_delete ( mpegts_mux_t *mm ) /* Remove from lists */ LIST_REMOVE(mm, mm_network_link); - printf("SCAN STATUS = %d\n", mm->mm_initial_scan_done); if (mm->mm_initial_scan_status != MM_SCAN_DONE) { - printf("remove from pending Q\n"); TAILQ_REMOVE(&mn->mn_initial_scan_pending_queue, mm, mm_initial_scan_link); } while ((mmi = LIST_FIRST(&mm->mm_instances))) { diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c index dfc9c0f5..e49feb6c 100644 --- a/src/input/mpegts/mpegts_network.c +++ b/src/input/mpegts/mpegts_network.c @@ -181,6 +181,39 @@ mpegts_network_mux_create2 return NULL; } +void +mpegts_network_delete + ( mpegts_network_t *mn ) +{ + mpegts_input_t *mi; + mpegts_mux_t *mm; + + /* Remove from global list */ + LIST_REMOVE(mn, mn_global_link); + + /* Delete all muxes */ + while ((mm = LIST_FIRST(&mn->mn_muxes))) { + mm->mm_delete(mm); + } + + /* Check */ + assert(TAILQ_FIRST(&mn->mn_initial_scan_pending_queue) == NULL); + assert(TAILQ_FIRST(&mn->mn_initial_scan_current_queue) == NULL); + + + /* Disable timer */ + gtimer_disarm(&mn->mn_initial_scan_timer); + + /* Remove from input */ + while ((mi = LIST_FIRST(&mn->mn_inputs))) + mpegts_input_set_network(mi, NULL); + + /* Free memory */ + idnode_unlink(&mn->mn_id); + free(mn->mn_network_name); + free(mn); +} + /* **************************************************************************** * Scanning * ***************************************************************************/ diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index ff493cba..fa07c490 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -21,6 +21,7 @@ #include "service.h" #include "input/mpegts.h" +#include "settings.h" /* ************************************************************************** * Class definition @@ -306,17 +307,24 @@ mpegts_service_provider_name ( service_t *s ) return ((mpegts_service_t*)s)->s_dvb_provider; } -static void +void mpegts_service_delete ( service_t *t ) { mpegts_service_t *ms = (mpegts_service_t*)t; + mpegts_mux_t *mm = ms->s_dvb_mux; + + /* Remove config */ + hts_settings_remove("input/linuxdvb/networks/%s/muxes/%s/services/%s", + idnode_uuid_as_str(&mm->mm_network->mn_id), + idnode_uuid_as_str(&mm->mm_id), + idnode_uuid_as_str(&t->s_id)); + + /* Free memory */ free(ms->s_dvb_svcname); free(ms->s_dvb_provider); free(ms->s_dvb_charset); LIST_REMOVE(ms, s_dvb_mux_link); - // TODO: delete config - // Note: the ultimate deletion and removal from the idnode list // is done in service_destroy } diff --git a/src/settings.c b/src/settings.c index 5623155f..cc768e84 100644 --- a/src/settings.c +++ b/src/settings.c @@ -338,7 +338,7 @@ hts_settings_remove(const char *pathfmt, ...) va_end(ap); if (stat(fullpath, &st) == 0) { if (S_ISDIR(st.st_mode)) - rmdir(fullpath); + rmtree(fullpath); else unlink(fullpath); } diff --git a/src/webui/extjs_dvb.c b/src/webui/extjs_dvb.c index 89ecb8e7..4b0c0981 100644 --- a/src/webui/extjs_dvb.c +++ b/src/webui/extjs_dvb.c @@ -283,10 +283,15 @@ extjs_mpegts_network { mpegts_network_t *mn = NULL; htsbuf_queue_t *hq = &hc->hc_reply; - const char *op = http_arg_get(&hc->hc_req_args, "op"); + const char *op; + htsmsg_t *args; htsmsg_t *out = htsmsg_create_map(); extjs_grid_conf_t conf = { 0 }; + http_api_boilerplate(hc, &op, &args); + if (!op) + return HTTP_STATUS_BAD_REQUEST; + if (!strcmp(op, "list")) { idnode_set_t ins = { 0 }; extjs_grid_conf(&hc->hc_req_args, &conf); @@ -305,6 +310,17 @@ extjs_mpegts_network if ((e = idclass_serialize(mnb->idc))) htsmsg_add_msg(c, NULL, e); htsmsg_add_msg(out, "entries", c); + } else if (!strcmp(op, "delete") && args) { + htsmsg_field_t *f; + htsmsg_t *uuids = htsmsg_get_list(args, "uuids"); + if (uuids) { + pthread_mutex_lock(&global_lock); + HTSMSG_FOREACH(f, uuids) { + if (f->hmf_type == HMF_STR) + mpegts_network_delete_by_uuid(f->hmf_str); + } + pthread_mutex_unlock(&global_lock); + } } else if (!strcmp(op, "create")) { htsmsg_t *conf = NULL; const char *s, *c;