/*** Whole desktop ***/ static void AddDesktop(services_discovery_t *sd) { input_item_t *item; item = input_item_NewCard ("screen://", _("Desktop")); if (item == NULL) return; services_discovery_AddItem(sd, item); input_item_Release (item); }
/** * Adds a source. */ static int AddSource (services_discovery_t *sd, const pa_source_info *info) { services_discovery_sys_t *sys = sd->p_sys; msg_Dbg (sd, "adding %s (%s)", info->name, info->description); char *mrl; if (unlikely(asprintf (&mrl, "pulse://%s", info->name) == -1)) return -1; input_item_t *item = input_item_NewCard (mrl, info->description); free (mrl); if (unlikely(item == NULL)) return -1; struct device *d = malloc (sizeof (*d)); if (unlikely(d == NULL)) { input_item_Release (item); return -1; } d->index = info->index; d->item = item; struct device **dp = tsearch (d, &sys->root, cmpsrc); if (dp == NULL) /* Out-of-memory */ { free (d); input_item_Release (item); return -1; } if (*dp != d) /* Update existing source */ { free (d); d = *dp; input_item_SetURI (d->item, item->psz_uri); input_item_SetName (d->item, item->psz_name); input_item_Release (item); return 0; } const char *card = pa_proplist_gets(info->proplist, "device.product.name"); services_discovery_AddItemCat(sd, item, (card != NULL) ? card : N_("Generic")); d->sd = sd; return 0; }
static struct app *AddApp (services_discovery_t *sd, xcb_window_t xid) { services_discovery_sys_t *p_sys = sd->p_sys; char *mrl, *name; if (asprintf (&mrl, "window://0x%"PRIx8, xid) == -1) return NULL; xcb_get_property_reply_t *r = xcb_get_property_reply (p_sys->conn, xcb_get_property (p_sys->conn, 0, xid, p_sys->net_wm_name, 0, 0, 1023 /* max size */), NULL); if (r != NULL) { name = strndup (xcb_get_property_value (r), xcb_get_property_value_length (r)); if (name != NULL) EnsureUTF8 (name); /* don't trust third party apps too much ;-) */ free (r); } /* TODO: use WM_NAME (Latin-1) for very old apps */ else name = NULL; input_item_t *item = input_item_NewCard (mrl, name ? name : mrl); /* FIXME */ free (mrl); free (name); if (item == NULL) return NULL; struct app *app = malloc (sizeof (*app)); if (app == NULL) { input_item_Release (item); return NULL; } app->xid = xid; app->item = item; app->owner = sd; services_discovery_AddSubItem(sd, p_sys->apps_root, item); return app; }
/* http://www.linuxtv.org/vdrwiki/index.php/Syntax_of_channels.conf or not... * Read the dvb-apps source code for reference. */ static input_item_t *ParseLine(char *line) { char *str, *end; line += strspn(line, " \t\r"); /* skip leading white spaces */ if (*line == '#') return NULL; /* skip comments */ /* Extract channel cute name */ char *name = strsep(&line, ":"); assert(name != NULL); EnsureUTF8(name); /* Extract central frequency */ str = strsep(&line, ":"); if (str == NULL) return NULL; unsigned long freq = strtoul(str, &end, 10); if (*end) return NULL; /* Extract tuning parameters */ str = strsep(&line, ":"); if (str == NULL) return NULL; char *mrl; if (!strcmp(str, "h") || !strcmp(str, "v")) { /* DVB-S */ char polarization = toupper(*str); /* TODO: sat no. */ str = strsep(&line, ":"); if (str == NULL) return NULL; /* baud rate */ str = strsep(&line, ":"); if (str == NULL) return NULL; unsigned long rate = strtoul(str, &end, 10); if (*end || rate > (ULONG_MAX / 1000u)) return NULL; rate *= 1000; if (asprintf(&mrl, "dvb-s://frequency=%"PRIu64":polarization=%c:srate=%lu", freq * UINT64_C(1000000), polarization, rate) == -1) mrl = NULL; } else if (!strncmp(str, "INVERSION_", 10)) { /* DVB-C or DVB-T */ int inversion; str += 10; if (strcmp(str, "AUTO")) inversion = -1; else if (strcmp(str, "OFF")) inversion = 0; else if (strcmp(str, "ON")) inversion = 1; else return NULL; str = strsep(&line, ":"); if (str == NULL) return NULL; if (strncmp(str, "BANDWIDTH_", 10)) { /* DVB-C */ unsigned long rate = strtoul(str, &end, 10); if (*end) return NULL; str = strsep(&line, ":"); const char *fec = ParseFEC(str); str = strsep(&line, ":"); const char *mod = ParseModulation(str); if (fec == NULL || mod == NULL) return NULL; if (asprintf(&mrl, "dvb-c://frequency=%lu:inversion:%d:srate=%lu:" "fec=%s:modulation=%s", freq, inversion, rate, fec, mod) == -1) mrl = NULL; } else { /* DVB-T */ unsigned bandwidth = atoi(str + 10); str = strsep(&line, ":"); const char *hp = ParseFEC(str); str = strsep(&line, ":"); const char *lp = ParseFEC(str); str = strsep(&line, ":"); const char *mod = ParseModulation(str); if (hp == NULL || lp == NULL || mod == NULL) return NULL; str = strsep(&line, ":"); if (str == NULL || strncmp(str, "TRANSMISSION_MODE_", 18)) return NULL; int xmit = atoi(str); if (xmit == 0) xmit = -1; /* AUTO */ str = strsep(&line, ":"); const char *guard = ParseGuard(str); if (guard == NULL) return NULL; str = strsep(&line, ":"); if (str == NULL || strncmp(str, "HIERARCHY_", 10)) return NULL; str += 10; int hierarchy = atoi(str); if (!strcmp(str, "AUTO")) hierarchy = -1; if (asprintf(&mrl, "dvb-t://frequency=%lu:inversion=%d:" "bandwidth=%u:code-rate-hp=%s:code-rate-lp=%s:" "modulation=%s:transmission=%d:guard=%s:" "hierarchy=%d", freq, inversion, bandwidth, hp, lp, mod, xmit, guard, hierarchy) == -1) mrl = NULL; } } else { /* ATSC */ const char *mod = ParseModulation(str); if (mod == NULL) return NULL; if (asprintf(&mrl, "atsc://frequency=%lu:modulation=%s", freq, mod) == -1) mrl = NULL; } if (unlikely(mrl == NULL)) return NULL; /* Video PID (TODO? set video track) */ strsep(&line, ":"); /* Audio PID (TODO? set audio track) */ strsep(&line, ":"); /* Extract SID */ str = strsep(&line, ":"); if (str == NULL) { free(mrl); return NULL; } unsigned long sid = strtoul(str, &end, 10); if (*end || sid > 65535) { free(mrl); return NULL; } char sid_opt[sizeof("program=65535")]; snprintf(sid_opt, sizeof(sid_opt), "program=%lu", sid); input_item_t *item = input_item_NewCard(mrl, name); free(mrl); if (item != NULL) input_item_AddOption(item, sid_opt, 0); return item; }