static void htsp_channelAddUpdate(htsp_connection_t *hc, htsmsg_t *m, int create) { uint32_t id, next; int chnum; char txt[200]; const char *title, *icon; htsp_channel_t *ch; if(htsmsg_get_u32(m, "channelId", &id)) return; title = htsmsg_get_str(m, "channelName"); icon = htsmsg_get_str(m, "channelIcon"); chnum = htsmsg_get_s32_or_default(m, "channelNumber", -1); snprintf(txt, sizeof(txt), "%d", id); hts_mutex_lock(&hc->hc_meta_mutex); if(create) { ch = htsp_channel_get(hc, id, 1); if(prop_set_parent(ch->ch_root, hc->hc_channels_nodes)) abort(); } else { ch = htsp_channel_get(hc, id, 0); if(ch == NULL) { TRACE(TRACE_ERROR, "HTSP", "Got update for unknown channel %d", id); hts_mutex_unlock(&hc->hc_meta_mutex); return; } } hts_mutex_unlock(&hc->hc_meta_mutex); if(icon != NULL) prop_set_string(ch->ch_prop_icon, icon); if(title != NULL) { mystrset(&ch->ch_title, title); prop_set_string(ch->ch_prop_title, title); } if(chnum != -1) prop_set_int(ch->ch_prop_channelNumber, chnum); if(htsmsg_get_u32(m, "eventId", &id)) id = 0; if(htsmsg_get_u32(m, "nextEventId", &next)) next = 0; update_events(hc, ch->ch_prop_events, id, next); }
static void htsp_channelDelete(htsp_connection_t *hc, htsmsg_t *m) { uint32_t id; htsp_channel_t *ch; if(htsmsg_get_u32(m, "channelId", &id)) return; hts_mutex_lock(&hc->hc_meta_mutex); if((ch = htsp_channel_get(hc, id, 0)) != NULL) channel_destroy(ch); hts_mutex_unlock(&hc->hc_meta_mutex); }
static void htsp_channelAddUpdate(htsp_connection_t *hc, htsmsg_t *m, int create) { uint32_t id, next; int chnum; prop_t *p; char txt[200]; const char *title, *icon; htsp_channel_t *ch, *n; if(htsmsg_get_u32(m, "channelId", &id)) return; title = htsmsg_get_str(m, "channelName"); icon = htsmsg_get_str(m, "channelIcon"); chnum = htsmsg_get_s32_or_default(m, "channelNumber", -1); if(chnum == 0) chnum = INT32_MAX; snprintf(txt, sizeof(txt), "%d", id); hts_mutex_lock(&hc->hc_meta_mutex); if(create) { ch = calloc(1, sizeof(htsp_channel_t)); p = ch->ch_root = prop_create_root(txt); prop_t *m = prop_create(p, "metadata"); ch->ch_prop_icon = prop_create(m, "icon"); ch->ch_prop_title = prop_create(m, "title"); ch->ch_prop_channelNumber = prop_create(m, "channelNumber"); ch->ch_prop_events = prop_create(m, "events"); ch->ch_id = id; snprintf(txt, sizeof(txt), "htsp://%s:%d/channel/%d", hc->hc_hostname, hc->hc_port, id); prop_set_string(prop_create(p, "url"), txt); prop_set_string(prop_create(p, "type"), "tvchannel"); ch->ch_channel_num = chnum; mystrset(&ch->ch_title, title); TAILQ_INSERT_SORTED(&hc->hc_channels, ch, ch_link, channel_compar); n = TAILQ_NEXT(ch, ch_link); if(prop_set_parent_ex(p, hc->hc_channels_nodes, n ? n->ch_root : NULL, NULL)) abort(); } else { int move = 0; ch = htsp_channel_get(hc, id); if(ch == NULL) { TRACE(TRACE_ERROR, "HTSP", "Got update for unknown channel %d", id); hts_mutex_unlock(&hc->hc_meta_mutex); return; } p = ch->ch_root; if(title != NULL) { move = 1; mystrset(&ch->ch_title, title); } if(chnum != -1) { move = 1; ch->ch_channel_num = chnum; } if(move) { TAILQ_REMOVE(&hc->hc_channels, ch, ch_link); TAILQ_INSERT_SORTED(&hc->hc_channels, ch, ch_link, channel_compar); n = TAILQ_NEXT(ch, ch_link); prop_move(p, n ? n->ch_root : NULL); } } hts_mutex_unlock(&hc->hc_meta_mutex); if(icon != NULL) prop_set_string(ch->ch_prop_icon, icon); if(title != NULL) prop_set_string(ch->ch_prop_title, title); if(chnum != -1) prop_set_int(ch->ch_prop_channelNumber, chnum); if(htsmsg_get_u32(m, "eventId", &id)) id = 0; if(htsmsg_get_u32(m, "nextEventId", &next)) next = 0; update_events(hc, ch->ch_prop_events, id, next); }