static void playtrack_dtor(event_t *e) { event_playtrack_t *ep = (event_playtrack_t *)e; prop_destroy(ep->track); if(ep->source != NULL) prop_destroy(ep->source); }
static JSBool js_appendItem0(JSContext *cx, js_model_t *model, prop_t *parent, const char *url, const char *type, JSObject *metaobj, jsval *data, jsval *rval, int enabled, const char *metabind) { prop_t *item = prop_create_root(NULL); if(url != NULL) prop_set_string(prop_create(item, "url"), url); if(data != NULL) js_prop_set_from_jsval(cx, prop_create(item, "data"), *data); *rval = JSVAL_VOID; if(metabind != NULL) metadb_bind_url_to_prop(NULL, metabind, item); if(type != NULL) { prop_set_string(prop_create(item, "type"), type); if(metaobj) js_prop_from_object(cx, metaobj, prop_create(item, "metadata")); } else if(url != NULL) { if(backend_resolve_item(url, item)) { prop_destroy(item); return JS_TRUE; } } prop_set_int(prop_create(item, "enabled"), enabled); prop_t *p = prop_ref_inc(item); if(prop_set_parent(item, parent)) { prop_destroy(item); prop_ref_dec(p); } else { JSObject *robj = JS_NewObjectWithGivenProto(cx, &item_class, JSVAL_TO_OBJECT(model->jm_item_proto), NULL); *rval = OBJECT_TO_JSVAL(robj); js_item_t *ji = calloc(1, sizeof(js_item_t)); ji->ji_model = model; ji->ji_root = p; LIST_INSERT_HEAD(&model->jm_items, ji, ji_link); JS_SetPrivate(cx, robj, ji); ji->ji_enable_set_property = 1; } return JS_TRUE; }
static void news_sink(void *opaque, prop_event_t event, ...) { prop_t *p = opaque; event_t *e; va_list ap; va_start(ap, event); switch(event) { case PROP_DESTROYED: prop_unsubscribe(va_arg(ap, prop_sub_t *)); prop_ref_dec(p); break; case PROP_EXT_EVENT: e = va_arg(ap, event_t *); if(event_is_type(e, EVENT_DYNAMIC_ACTION)) { const event_payload_t *ep = (const event_payload_t *)e; if(!strcmp(ep->payload, "dismiss")) { rstr_t *id = prop_get_string(p, "id", NULL); dismis_news(rstr_get(id)); rstr_release(id); prop_destroy(opaque); } } break; default: break; } va_end(ap); }
static JSBool js_item_addOptAction(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { js_item_t *ji = JS_GetPrivate(cx, obj); const char *title; const char *action; if (!JS_ConvertArguments(cx, argc, argv, "ss", &title, &action)) return JS_FALSE; prop_t *p = prop_create_root(NULL); prop_set_string(prop_create(p, "type"), "action"); prop_set_string(prop_create(prop_create(p, "metadata"), "title"), title); prop_set_int(prop_create(p, "enabled"), 1); prop_set_string(prop_create(p, "action"), action); prop_t *opts = prop_create_r(ji->ji_root, "options"); if(prop_set_parent(p, opts)) prop_destroy(p); prop_ref_dec(opts); *rval = JSVAL_VOID; return JS_TRUE; }
static void trace_prop(int l, const char *pfx, const char *msg, const char *sev) { trace_entry_t *te = malloc(sizeof(trace_entry_t)); te->p = prop_create_root(NULL); prop_set_string(prop_create(te->p, "prefix"), pfx); prop_set_string(prop_create(te->p, "message"), msg); prop_set_string(prop_create(te->p, "severity"), sev); TAILQ_INSERT_TAIL(&traces, te, link); if(prop_set_parent(te->p, log_root)) abort(); entries++; if(entries > 50) { te = TAILQ_FIRST(&traces); TAILQ_REMOVE(&traces, te, link); prop_destroy(te->p); free(te); entries--; } }
static prop_t * add_news_locked(const char *id, const char *message, const char *location, const char *caption, const char *action) { prop_t *p, *ret = NULL; prop_t *root = prop_create(prop_get_global(), "news"); if(dismissed_news_out != NULL) { if(htsmsg_get_u32_or_default(dismissed_news_in, id, 0)) { dismis_news(id); } else { p = prop_create_root(id); prop_set(p, "message", PROP_SET_STRING, message); prop_set(p, "id", PROP_SET_STRING, id); prop_set(p, "location", PROP_SET_STRING, location); prop_set(p, "caption", PROP_SET_STRING, caption); prop_set(p, "action", PROP_SET_STRING, action); prop_subscribe(PROP_SUB_TRACK_DESTROY, PROP_TAG_CALLBACK, news_sink, prop_ref_inc(p), PROP_TAG_ROOT, prop_create(p, "eventSink"), PROP_TAG_MUTEX, &news_mutex, NULL); ret = prop_ref_inc(p); if(prop_set_parent(p, root)) prop_destroy(p); } } return ret; }
static void nav_reload_current(navigator_t *nav) { nav_page_t *np; if((np = nav->nav_page_current) == NULL) return; plugins_reload_dev_plugin(); TRACE(TRACE_INFO, "navigator", "Reloading %s", np->np_url); prop_unsubscribe(np->np_close_sub); prop_unsubscribe(np->np_direct_close_sub); prop_destroy(np->np_prop_root); nav_page_setup_prop(nav, np, NULL); if(prop_set_parent(np->np_prop_root, nav->nav_prop_pages)) { /* nav->nav_prop_pages is a zombie, this is an error */ abort(); } nav_select(nav, np, NULL); if(backend_open(np->np_prop_root, np->np_url)) nav_open_errorf(np->np_prop_root, _("No handler for URL")); }
int message_popup(const char *message, int flags) { prop_t *p; int rval; p = prop_create_root(NULL); prop_set_string(prop_create(p, "type"), "message"); prop_set_string_ex(prop_create(p, "message"), NULL, message, flags & MESSAGE_POPUP_RICH_TEXT ? PROP_STR_RICH : PROP_STR_UTF8); if(flags & MESSAGE_POPUP_CANCEL) prop_set_int(prop_create(p, "cancel"), 1); if(flags & MESSAGE_POPUP_OK) prop_set_int(prop_create(p, "ok"), 1); event_t *e = popup_display(p); prop_destroy(p); if(event_is_action(e, ACTION_OK)) rval = MESSAGE_POPUP_OK; else if(event_is_action(e, ACTION_CANCEL)) rval = MESSAGE_POPUP_CANCEL; else rval = 0; event_release(e); return rval; }
prop_t * add_news(const char *message, const char *location, const char *caption) { prop_t *p, *ret = NULL; prop_t *root = prop_create(prop_get_global(), "news"); hts_mutex_lock(&news_mutex); if(dismissed_news_out != NULL) { if(htsmsg_get_u32_or_default(dismissed_news_in, message, 0)) { dismis_news(message); } else { p = prop_create_root(NULL); prop_set_string(prop_create(p, "message"), message); prop_set_string(prop_create(p, "location"), location); prop_set_string(prop_create(p, "caption"), caption); prop_subscribe(PROP_SUB_TRACK_DESTROY, PROP_TAG_CALLBACK, news_sink, prop_ref_inc(p), PROP_TAG_ROOT, prop_create(p, "eventSink"), PROP_TAG_MUTEX, &news_mutex, NULL); ret = prop_ref_inc(p); if(prop_set_parent(p, root)) prop_destroy(p); } } hts_mutex_unlock(&news_mutex); return ret; }
static void nav_close(nav_page_t *np, int with_prop) { navigator_t *nav = np->np_nav; prop_unsubscribe(np->np_close_sub); prop_unsubscribe(np->np_url_sub); prop_unsubscribe(np->np_direct_close_sub); if(nav->nav_page_current == np) nav->nav_page_current = NULL; if(np->np_inhistory) nav_remove_from_history(nav, np); TAILQ_REMOVE(&nav->nav_pages, np, np_global_link); if(with_prop) { prop_destroy(np->np_prop_root); nav_update_cango(nav); } free(np->np_url); free(np->np_view); free(np); }
int search_class_create(prop_t *parent, prop_t **nodesp, prop_t **entriesp, const char *title, const char *icon) { prop_t *p = prop_create_root(NULL); prop_t *m = prop_create(p, "metadata"); prop_t *n, *e; char url[URL_MAX]; backend_prop_make(p, url, sizeof(url)); prop_set_string(prop_create(p, "url"), url); prop_set_string(prop_create(m, "title"), title); if(icon != NULL) prop_set_string(prop_create(m, "icon"), icon); prop_set_string(prop_create(p, "type"), "directory"); n = prop_create(p, "nodes"); e = prop_create(p, "entries"); prop_set_int(e, 0); *nodesp = prop_ref_inc(n); *entriesp = prop_ref_inc(e); if(prop_set_parent(p, parent)) { prop_destroy(p); return 1; } return 0; }
static void mp_final_release(void *aux) { media_pipe_t *mp = aux; prop_destroy(mp->mp_prop_root); free(mp); }
void prop_vec_destroy_entries(prop_vec_t *pv) { int i; for(i = 0; i < pv->pv_length; i++) prop_destroy(pv->pv_vec[i]); }
static void notify_timeout(callout_t *c, void *aux) { prop_t *p = aux; prop_destroy(p); prop_ref_dec(p); free(c); }
static void channel_destroy(htsp_connection_t *hc, htsp_channel_t *ch) { prop_destroy(ch->ch_root); TAILQ_REMOVE(&hc->hc_channels, ch, ch_link); free(ch->ch_title); free(ch); }
static void channel_destroy(htsp_channel_t *ch) { prop_destroy(ch->ch_root); LIST_REMOVE(ch, ch_link); free(ch->ch_title); free(ch); }
static void js_subprovider_release(JSContext *cx, js_subprovider_t *sp) { if(atomic_dec(&sp->sp_refcnt)) return; JS_RemoveRoot(cx, &sp->sp_func); prop_destroy(sp->sp_title); free(sp); }
static void event_playurl_dtor(event_t *e) { event_playurl_t *ep = (event_playurl_t *)e; if(ep->model != NULL) prop_destroy(ep->model); free(ep->url); free(ep->how); }
void group_info_destroy(group_info_t *ginfo) { mpr_hash_destroy(ginfo->ht_prom); mpr_hash_destroy(ginfo->ht_accd); if (ginfo->max_prop != NULL) { prop_destroy(ginfo->max_prop); } free(ginfo); }
void setting_destroy(setting_t *s) { free(s->s_id); prop_unsubscribe(s->s_sub); prop_destroy(s->s_root); prop_ref_dec(s->s_val); free(s); }
static void gu_tab_destroy(gu_tab_t *gt) { gtk_widget_destroy(gt->gt_notebook); prop_destroy(gt->gt_nav); gt->gt_gw->gw_ntabs--; LIST_REMOVE(gt, gt_link); free(gt); }
static JSBool js_item_destroy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { js_item_t *ji = JS_GetPrivate(cx, obj); prop_destroy(ji->ji_root); *rval = JSVAL_VOID; return JS_TRUE; }
static int file_open_file(prop_t *page, const char *url, struct fa_stat *fs) { char redir[URL_MAX]; char errbuf[200]; int c; prop_t *meta; meta = prop_create_root("metadata"); c = fa_probe(meta, url, redir, sizeof(redir), errbuf, sizeof(errbuf), fs, 1); switch(c) { case CONTENT_ARCHIVE: case CONTENT_ALBUM: prop_destroy(meta); return file_open_dir(page, redir); case CONTENT_AUDIO: if(!file_open_audio(page, url)) { prop_destroy(meta); return 0; } playqueue_play(url, meta, 0); return playqueue_open(page); case CONTENT_VIDEO: case CONTENT_DVD: prop_destroy(meta); return backend_open_video(page, url); case CONTENT_IMAGE: return file_open_image(page, meta); case CONTENT_PLUGIN: plugin_open_file(page, url); return 0; default: prop_destroy(meta); return nav_open_error(page, errbuf); } }
static void event_playurl_dtor(event_t *e) { event_playurl_t *ep = (event_playurl_t *)e; prop_destroy(ep->model); free(ep->url); free(ep->how); free(ep->parent_url); prop_ref_dec(ep->origin); }
static void connman_service_destroy(connman_service_t *cs) { connman_stop_input_request(cs); prop_unsubscribe(cs->cs_sub); TAILQ_REMOVE(&connman_services, cs, cs_link); prop_destroy(cs->cs_prop); cs->cs_prop = NULL; connman_service_release(cs); }
int message_popup(const char *message, int flags, const char **extra) { prop_t *p; int rval; p = prop_ref_inc(prop_create_root(NULL)); TRACE(TRACE_DEBUG, "Notification", "%s", message); prop_set_string(prop_create(p, "type"), "message"); prop_set_string_ex(prop_create(p, "message"), NULL, message, flags & MESSAGE_POPUP_RICH_TEXT ? PROP_STR_RICH : PROP_STR_UTF8); if(extra) { int cnt = 1; prop_t *btns = prop_create(p, "buttons"); while(*extra) { prop_t *b = prop_create_root(NULL); prop_set_string(prop_create(b, "title"), *extra); char action[10]; snprintf(action, sizeof(action), "btn%d", cnt); prop_set_string(prop_create(b, "action"), action); if(prop_set_parent(b, btns)) abort(); cnt++; extra++; } } if(flags & MESSAGE_POPUP_CANCEL) prop_set_int(prop_create(p, "cancel"), 1); if(flags & MESSAGE_POPUP_OK) prop_set_int(prop_create(p, "ok"), 1); event_t *e = popup_display(p); prop_destroy(p); prop_ref_dec(p); const event_payload_t *ep = (const event_payload_t *)e; if(event_is_action(e, ACTION_OK)) rval = MESSAGE_POPUP_OK; else if(event_is_action(e, ACTION_CANCEL)) rval = MESSAGE_POPUP_CANCEL; else if(event_is_type(e, EVENT_DYNAMIC_ACTION) && !strncmp(ep->payload, "btn", 3)) rval = atoi(ep->payload + 3); else rval = 0; event_release(e); return rval; }
static int play_with_context(const char *uri, htsmsg_t *meta) { const char *parentid, *id; upnp_service_t *us; parentid = htsmsg_get_str_multi(meta, "DIDL-Lite", "item", "parentID", NULL); if(parentid == NULL) return 1; id = htsmsg_get_str_multi(meta, "DIDL-Lite", "item", "id", NULL); if(id == NULL) return 1; UPNP_TRACE("Playing %s (id: %s, parent: %s)", uri, id, parentid); hts_mutex_lock(&upnp_lock); us = upnp_service_guess(uri); if(us != NULL) { UPNP_TRACE("Using controlpoint %s", us->us_control_url); prop_t *model = prop_create_root(NULL); prop_t *nodes = prop_create(model, "nodes"); prop_t *t = NULL; if(upnp_browse_children(us->us_control_url, parentid, nodes, id, &t) || t == NULL) { prop_destroy(model); } else { playqueue_load_with_source(t, model, PQ_PAUSED); hts_mutex_unlock(&upnp_lock); return 0; } } hts_mutex_unlock(&upnp_lock); return 1; }
void glw_settings_fini(void) { setting_destroy(glw_settings.gs_setting_screensaver); setting_destroy(glw_settings.gs_setting_underscan_v); setting_destroy(glw_settings.gs_setting_underscan_h); setting_destroy(glw_settings.gs_setting_size); setting_destroy(glw_settings.gs_setting_wrap); prop_destroy(glw_settings.gs_settings); htsmsg_release(glw_settings.gs_settings_store); }
void * notify_add(prop_t *root, notify_type_t type, const char *icon, int delay, rstr_t *fmt, ...) { char msg[256]; prop_t *p; const char *typestr; int tl; va_list ap, apx; switch(type) { case NOTIFY_INFO: typestr = "info"; tl = TRACE_INFO; break; case NOTIFY_WARNING: typestr = "warning"; tl = TRACE_INFO; break; case NOTIFY_ERROR: typestr = "error"; tl = TRACE_ERROR; break; default: return NULL; } va_start(ap, fmt); va_copy(apx, ap); tracev(0, tl, "notify", rstr_get(fmt), ap); vsnprintf(msg, sizeof(msg), rstr_get(fmt), apx); va_end(ap); va_end(apx); rstr_release(fmt); p = prop_create_root(NULL); prop_set_string(prop_create(p, "text"), msg); prop_set_string(prop_create(p, "type"), typestr); if(icon != NULL) prop_set_string(prop_create(p, "icon"), icon); p = prop_ref_inc(p); if(prop_set_parent(p, root ?: notify_prop_entries)) prop_destroy(p); if(delay != 0) { prop_t *r = NULL; if(delay < 0) { r = prop_ref_inc(p); delay = -delay; } callout_arm(NULL, notify_timeout, p, delay); return r; } return p; }
void setting_destroy(setting_t *s) { s->s_callback = NULL; free(s->s_id); free(s->s_initial_value); free(s->s_first); prop_unsubscribe(s->s_sub); prop_destroy(s->s_root); prop_ref_dec(s->s_val); free(s); }