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;
}
/* 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) {
// 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;
}
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 */
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;
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;
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;
/* 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)) {
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++;
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__ */