mpegts: added deleting of entire network

This commit is contained in:
Adam Sutton 2013-08-06 23:02:41 +01:00
parent c2723dd7cf
commit 29f6d712e8
9 changed files with 84 additions and 9 deletions

View file

@ -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__ */
/******************************************************************************

View file

@ -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));

View file

@ -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;

View file

@ -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));

View file

@ -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))) {

View file

@ -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
* ***************************************************************************/

View file

@ -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
}

View file

@ -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);
}

View file

@ -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;