]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts: added deleting of entire network
authorAdam Sutton <dev@adamsutton.me.uk>
Tue, 6 Aug 2013 22:02:41 +0000 (23:02 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Tue, 6 Aug 2013 22:11:03 +0000 (23:11 +0100)
src/input/mpegts.h
src/input/mpegts/linuxdvb/linuxdvb_mux.c
src/input/mpegts/linuxdvb/linuxdvb_network.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_network.c
src/input/mpegts/mpegts_service.c
src/settings.c
src/webui/extjs_dvb.c

index 85639f0065e56e2f60649f03d7d641e771fd56a4..98ccac897bea29ae9ae46e600fe244a9458b390c 100644 (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__ */
 
 /******************************************************************************
index 656248a4b84f082eda4c9b970501e0b9d8f56122..2bd8c1cc86aa2e21ea209a914808c9501420c3ba 100644 (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));
 
index 0cfede78cb4af4bd0833322c0ab8ebe5bb06e709..e3d11eba65d6b26bcd237b1e1bf3419ce695f74b 100644 (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;
index 7054bf7a6d389a14760c58748ef55c313f9f6459..736a0f8069f019be32119aeba2e84c1f301c8bdb 100644 (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));
index 5910629d9fb5ac9a2056b0d552e649b8089d680c..27ae9bdac2250375e98a78a4dd5ce0861393c7d5 100644 (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))) {
index dfc9c0f5be8b17a4f6a3de86a28c6ffdb92ad344..e49feb6c0b103fc32c5df983eab6bf12d93c0e2e 100644 (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
  * ***************************************************************************/
index ff493cba06d85f22cacdeed4d9cfe855bd7215eb..fa07c4905ab8cd84d1e83ea48ae4a5f660e1ba11 100644 (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
 }
index 5623155f24e617d687403be343279752e7b5d088..cc768e84beed748033d018160af42670d564d8d1 100644 (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);
   }
index 89ecb8e7b7debd4f78cb68404d0f9452be6d51d2..4b0c0981be0f189bd744c39f683f991f78b18780 100644 (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;