mpegts: added deleting of entire network
This commit is contained in:
parent
c2723dd7cf
commit
29f6d712e8
9 changed files with 84 additions and 9 deletions
|
@ -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__ */
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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))) {
|
||||
|
|
|
@ -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
|
||||
* ***************************************************************************/
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue