]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Fix the service <-> channel mapping editor #3
authorJaroslav Kysela <perex@perex.cz>
Mon, 17 Mar 2014 09:06:03 +0000 (10:06 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 17 Mar 2014 09:06:03 +0000 (10:06 +0100)
- introduce service_mapper_notify() and origin arguments to avoid mess
- fix the service_mapper_process()

src/channels.c
src/input/mpegts/tsfile/tsfile.c
src/service.c
src/service_mapper.c
src/service_mapper.h

index 668bb09ac1f656ebc65b6af35802602984cb75c1..c1b866270ffa8fac57ccc7d05d9e4b083ea49a60 100644 (file)
@@ -434,11 +434,11 @@ channel_set_services_by_list ( channel_t *ch, htsmsg_t *svcs )
   HTSMSG_FOREACH(f, svcs) {
     if ((str = htsmsg_field_get_str(f)))
       if ((svc = service_find(str)))
-        save |= service_mapper_link(svc, ch, 0);
+        save |= service_mapper_link(svc, ch, ch);
   }
 
   /* Remove */
-  save |= service_mapper_clean(NULL, ch, 0);
+  save |= service_mapper_clean(NULL, ch, ch);
 
   return save;
 }
@@ -559,7 +559,7 @@ channel_delete ( channel_t *ch, int delconf )
 
   /* Services */
   while((csm = LIST_FIRST(&ch->ch_services)) != NULL)
-    service_mapper_unlink(csm->csm_svc, ch, 0);
+    service_mapper_unlink(csm->csm_svc, ch, ch);
 
   /* Subscriptions */
   while((s = LIST_FIRST(&ch->ch_subscriptions)) != NULL) {
index 938a0c1ba5d971482b82e247f3bc36b259cb3f1f..3e660e45a7ad1e374c909a4d538166585cb17e66 100644 (file)
@@ -47,7 +47,7 @@ tsfile_network_create_service
   // TODO: HACK: REMOVE ME
   if (s) {
     channel_t *c = channel_create(NULL, NULL, NULL);
-    service_mapper_link((service_t*)s, c, 0);
+    service_mapper_link((service_t*)s, c, NULL);
   }
   return s;
 }
index 0f4bcc77e1cfb4585bb8b277b9dd8adda76f50e0..053b74fbf17cfe5deaf665728e3219326d7ad8ea 100644 (file)
@@ -98,11 +98,11 @@ service_class_channel_set
   HTSMSG_FOREACH(f, chns) {
     if ((str = htsmsg_field_get_str(f)))
       if ((ch = channel_find(str)))
-        service_mapper_link(svc, ch, 1);
+        service_mapper_link(svc, ch, svc);
   }
 
   /* Delete unlinked */
-  service_mapper_clean(svc, NULL, 1);
+  service_mapper_clean(svc, NULL, svc);
 
   /* no save - the link information is in the saved channel record */
   /* only send a notify about the change to other clients */
index 732ea021ed1694ed46cddfb2ca8a4a5d884b205f..364131be9e1234e730b9225423f75594b72bdb44 100644 (file)
@@ -174,11 +174,22 @@ service_mapper_remove ( service_t *s )
   api_service_mapper_notify();
 }
 
+static void
+service_mapper_notify ( channel_service_mapping_t *csm, void *origin )
+{
+  if (origin == NULL || origin == csm->csm_svc) {
+    idnode_notify_simple(&csm->csm_chn->ch_id);
+    channel_save(csm->csm_chn);
+  }
+  if (origin == NULL || origin == csm->csm_chn)
+    idnode_notify_simple(&csm->csm_svc->s_id);
+}
+
 /*
  * Link service and channel
  */
 int
-service_mapper_link ( service_t *s, channel_t *c, int dosave )
+service_mapper_link ( service_t *s, channel_t *c, void *origin )
 {
   channel_service_mapping_t *csm;
 
@@ -200,36 +211,35 @@ service_mapper_link ( service_t *s, channel_t *c, int dosave )
   csm->csm_svc = s;
   LIST_INSERT_HEAD(&s->s_channels,  csm, csm_svc_link);
   LIST_INSERT_HEAD(&c->ch_services, csm, csm_chn_link);
-  if (dosave) channel_save(c);
-  idnode_notify_simple(dosave ? &c->ch_id : &s->s_id);
+  service_mapper_notify( csm, origin );
   return 1;
 }
 
 static void
-service_mapper_unlink0 ( channel_service_mapping_t *csm, int save )
+service_mapper_unlink0 ( channel_service_mapping_t *csm, void *origin )
 {
   LIST_REMOVE(csm, csm_chn_link);
   LIST_REMOVE(csm, csm_svc_link);
-  if (save) channel_save(csm->csm_chn);
+  service_mapper_notify( csm, origin );
   free(csm);
 }
 
 void
-service_mapper_unlink ( service_t *s, channel_t *c, int save )
+service_mapper_unlink ( service_t *s, channel_t *c, void *origin )
 {
   channel_service_mapping_t *csm;
 
   /* Unlink */
   LIST_FOREACH(csm, &s->s_channels, csm_svc_link) {
     if (csm->csm_chn == c) {
-      service_mapper_unlink0(csm, save);
+      service_mapper_unlink0(csm, origin);
       break;
     }
   }
 }
 
 int
-service_mapper_clean ( service_t *s, channel_t *c, int dosave )
+service_mapper_clean ( service_t *s, channel_t *c, void *origin )
 {
   int save = 0;
   channel_service_mapping_t *csm, *n;
@@ -238,9 +248,8 @@ service_mapper_clean ( service_t *s, channel_t *c, int dosave )
   for (; csm != NULL; csm = n ) {
     n = s ? LIST_NEXT(csm, csm_svc_link) : LIST_NEXT(csm, csm_chn_link);
     if (csm->csm_mark) {
-      service_mapper_unlink0(csm, dosave);
+      service_mapper_unlink0(csm, origin);
       save = 1;
-      idnode_notify_simple(s ? &csm->csm_chn->ch_id : &csm->csm_svc->s_id);
     }
   }
   return save;
@@ -277,7 +286,7 @@ service_mapper_process ( service_t *s )
   /* Map */
   if (chn) {
     const char *prov;
-    service_mapper_link(s, chn, 0);
+    service_mapper_link(s, chn, chn);
 
     /* Type tags */
     if (service_is_hdtv(s)) {
@@ -296,6 +305,7 @@ service_mapper_process ( service_t *s )
         channel_tag_map(chn, channel_tag_find_by_name(prov, 1));
 
     /* save */
+    idnode_notify_simple(&chn->ch_id);
     channel_save(chn);
   }
   service_mapper_stat.ok++;
index 8e54dd6ec320878d265124fb8b9b8a364b1441a4..132249e73612c02439a592155b4ba97c15014f63 100644 (file)
@@ -53,22 +53,23 @@ void service_mapper_remove ( struct service *t );
 service_mapper_status_t service_mapper_status ( void );
 
 // Link service to channel
-int  service_mapper_link   ( struct service *s, struct channel *c, int save );
+int  service_mapper_link   ( struct service *s, struct channel *c, void *origin );
 
 // Unlink service from channel
-void service_mapper_unlink ( struct service *s, struct channel *c, int save );
+void service_mapper_unlink ( struct service *s, struct channel *c, void *origin );
 
 /**
  * Clean linkages that are marked for deletion
  *
  * Note: only ever pass one of s and c
  *
- * @param s     The service to clean linkages for
- * @param c     The channel to clean linkages for
- * @parma save  Force channel saves for affected channels
+ * @param s       The service to clean linkages for
+ * @param c       The channel to clean linkages for
+ * @parma origin  Origin of the change (should be a service or a channel ptr).
+ *                NULL = both changed, other ptr = no save and notifications.
  *
  * @return 1 if changes were made, else 0
  */
-int service_mapper_clean ( struct service *s, struct channel *ch, int save );
+int service_mapper_clean ( struct service *s, struct channel *ch, void *origin );
 
 #endif /* __TVH_SERVICE_MAPPER_H__ */