/*
* 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)
#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 );
void mpegts_service_save ( mpegts_service_t *s, htsmsg_t *c );
+void mpegts_service_delete ( service_t *s );
+
#endif /* __TVH_MPEGTS_H__ */
/******************************************************************************
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));
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
* ***************************************************************************/
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;
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));
/* 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))) {
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
* ***************************************************************************/
#include "service.h"
#include "input/mpegts.h"
+#include "settings.h"
/* **************************************************************************
* Class definition
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
}
va_end(ap);
if (stat(fullpath, &st) == 0) {
if (S_ISDIR(st.st_mode))
- rmdir(fullpath);
+ rmtree(fullpath);
else
unlink(fullpath);
}
{
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);
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;