static void notifications_update(void *opaque, prop_event_t event, ...) { statusbar_t *sb = opaque; prop_t *p, *txt; statusbar_entry_t *sbe; char *buf; rstr_t *msg; int i, l; va_list ap; va_start(ap, event); switch(event) { case PROP_ADD_CHILD: p = va_arg(ap, prop_t *); txt = prop_get_by_name(PNVEC("self", "text"), 1, PROP_TAG_NAMED_ROOT, p, "self", NULL); if(txt != NULL) { msg = prop_get_string(txt); if(msg != NULL) { buf = mystrdupa(rstr_get(msg)); l = strlen(buf); for(i = 0; i < l; i++) if(buf[i] < ' ') buf[i] = ' '; sbe = calloc(1, sizeof(statusbar_entry_t)); sbe->p = prop_ref_inc(p); sbe->id = gtk_statusbar_push(GTK_STATUSBAR(sb->bar), sb->ctxid, buf); LIST_INSERT_HEAD(&sb->entries, sbe, link); rstr_release(msg); } prop_ref_dec(txt); } break; case PROP_DEL_CHILD: p = va_arg(ap, prop_t *); LIST_FOREACH(sbe, &sb->entries, link) if(sbe->p == p) break; if(sbe == NULL) break; prop_ref_dec(sbe->p); gtk_statusbar_remove(GTK_STATUSBAR(sb->bar), sb->ctxid, sbe->id); LIST_REMOVE(sbe, link); free(sbe); break; default: break; } }
static void bmdb_destroy(bmdb_t *b) { prop_ref_dec(b->b_nodes); prop_ref_dec(b->b_metadata); free(b->b_query); free(b); }
static void event_openurl_dtor(event_t *e) { event_openurl_t *ou = (void *)e; prop_ref_dec(ou->origin); prop_ref_dec(ou->model); free(ou->url); free(ou->view); free(ou->how); }
static void event_openurl_dtor(event_t *e) { event_openurl_t *ou = (void *)e; prop_ref_dec(ou->item_model); prop_ref_dec(ou->parent_model); free(ou->url); free(ou->view); free(ou->how); free(ou->parent_url); }
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); prop_ref_dec(s->s_root); free(s); }
static void event_prop_action_dtor(event_t *e) { event_prop_action_t *epa = (event_prop_action_t *)e; prop_ref_dec(epa->p); rstr_release(epa->action); }
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 int top_event_handler(glw_t *w, void *opaque, glw_signal_t sig, void *extra) { event_t *e = extra; glw_root_t *gr = opaque; if(sig != GLW_SIGNAL_EVENT_BUBBLE) return 0; if(e->e_type_x == EVENT_KEYDESC) return 0; if(event_is_action(e, ACTION_ENABLE_SCREENSAVER)) { gr->gr_screensaver_force_enable = 1; } else if(event_is_action(e, ACTION_NAV_BACK) || event_is_action(e, ACTION_NAV_FWD) || event_is_action(e, ACTION_HOME) || event_is_action(e, ACTION_PLAYQUEUE) || event_is_action(e, ACTION_RELOAD_DATA) || event_is_type(e, EVENT_OPENURL)) { prop_t *p = prop_get_by_name(PNVEC("nav", "eventsink"), 0, PROP_TAG_ROOT, gr->gr_prop_nav, NULL); prop_send_ext_event(p, e); prop_ref_dec(p); } else { event_addref(e); event_dispatch(e); } return 1; }
static int hc_prop(http_connection_t *hc, const char *remain, void *opaque, http_cmd_t method) { htsbuf_queue_t out; rstr_t *r; int rval, i; prop_t *p; const char *action = http_arg_get_req(hc, "action"); if(remain == NULL) return 404; p = prop_from_path(remain); if(p == NULL) return 404; htsbuf_queue_init(&out, 0); switch(method) { case HTTP_CMD_GET: if(action != NULL) { event_t *e = event_create_action_str(action); prop_send_ext_event(p, e); event_release(e); rval = HTTP_STATUS_OK; break; } r = prop_get_string(p, NULL); if(r == NULL) { char **childs = prop_get_name_of_childs(p); if(childs == NULL) { rval = HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE; break; } for(i = 0; childs[i] != NULL; i++) { htsbuf_qprintf(&out, "\t%s\n", childs[i]); } } else { htsbuf_append(&out, rstr_get(r), strlen(rstr_get(r))); htsbuf_append(&out, "\n", 1); rstr_release(r); } rval = http_send_reply(hc, 0, "text/ascii", NULL, NULL, 0, &out); break; default: rval = HTTP_STATUS_METHOD_NOT_ALLOWED; break; } prop_ref_dec(p); return rval; }
static void video_destroy(GtkWidget *w, gu_video_t *gv) { prop_unsubscribe(gv->gv_status_sub); prop_ref_dec(gv->gv_closeprop); free(gv); }
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 void prop_callback(void *opaque, prop_event_t event, ...) { glw_text_bitmap_t *gtb = opaque; const char *caption; prop_str_type_t type = 0; va_list ap; va_start(ap, event); switch(event) { case PROP_SET_VOID: caption = NULL; break; case PROP_SET_RSTRING: caption = rstr_get(va_arg(ap, const rstr_t *)); type = va_arg(ap, prop_str_type_t); break; case PROP_VALUE_PROP: prop_ref_dec(gtb->gtb_p); gtb->gtb_p = prop_ref_inc(va_arg(ap, prop_t *)); return; default: return; } caption_set_internal(gtb, caption, type); }
static void prop_callback(void *opaque, prop_event_t event, ...) { glw_keyintercept_t *ki = opaque; const char *str; prop_t *p; int c; va_list ap; va_start(ap, event); switch(event) { case PROP_SET_VOID: ki->buflen = 0; str = NULL; p = va_arg(ap, prop_t *); break; case PROP_SET_RSTRING: str = rstr_get(va_arg(ap, const rstr_t *)); ki->buflen = 0; while((c = utf8_get(&str)) != 0 && ki->buflen < 64) ki->buf[ki->buflen++] = c; p = va_arg(ap, prop_t *); break; default: return; } prop_ref_dec(ki->prop); ki->prop = prop_ref_inc(p); }
static void event_prop_dtor(event_t *e) { event_prop_t *ep = (event_prop_t *)e; prop_ref_dec(ep->p); free(e); }
static void jni_property_unexport_from_sub(jni_subscription_t *js, jni_prop_t *jp) { prop_ref_dec(jp->jp_prop); LIST_REMOVE(jp, jp_sub_link); RB_REMOVE(&jni_props, jp, jp_link); free(jp); }
static void popup_destroy(popup_t *pop) { gtk_widget_destroy(pop->win); prop_ref_dec(pop->p); LIST_REMOVE(pop, link); free(pop); }
static void notify_timeout(callout_t *c, void *aux) { prop_t *p = aux; prop_destroy(p); prop_ref_dec(p); free(c); }
static void mip_release(metadb_item_prop_t *mip) { mip->mip_refcount--; if(mip->mip_refcount > 0) return; LIST_REMOVE(mip, mip_link); prop_unsubscribe(mip->mip_destroy_sub); prop_unsubscribe(mip->mip_playcount_sub); prop_ref_dec(mip->mip_playcount); prop_ref_dec(mip->mip_lastplayed); prop_ref_dec(mip->mip_restartpos); free(mip->mip_url); free(mip); }
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 item_finalize(JSContext *cx, JSObject *obj) { js_item_t *ji = JS_GetPrivate(cx, obj); assert(LIST_FIRST(&ji->ji_event_handlers) == NULL); TAILQ_REMOVE(&ji->ji_model->jm_items, ji, ji_link); prop_ref_dec(ji->ji_root); free(ji); }
void event_release(event_t *e) { if(atomic_add(&e->e_refcount, -1) == 1) { if(e->e_dtor != NULL) e->e_dtor(e); prop_ref_dec(e->e_nav); free(e); } }
static void event_openurl_dtor(event_t *e) { event_openurl_t *ou = (void *)e; if(ou->origin != NULL) prop_ref_dec(ou->origin); free(ou->url); free(ou->view); free(ou); }
static void gtb_unbind(glw_text_bitmap_t *gtb) { prop_unsubscribe(gtb->gtb_sub); if(gtb->gtb_p != NULL) { prop_ref_dec(gtb->gtb_p); gtb->gtb_p = NULL; } }
static void gu_playqueue_send_event(gu_tab_t *gt, struct event *e) { prop_t *p = prop_get_by_name(PNVEC("global", "playqueue", "eventsink"), 1, NULL); prop_send_ext_event(p, e); prop_ref_dec(p); event_release(e); }
void event_release(event_t *e) { if(atomic_dec(&e->e_refcount)) return; if(e->e_dtor != NULL) e->e_dtor(e); prop_ref_dec(e->e_nav); free(e); }
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); }
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 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 artist_query(bmdb_t *b, void *db) { sqlite3_stmt *stmt; int rc; int artist_id = atoi(b->b_query); rc = db_prepare(db, &stmt, "SELECT title " "FROM artist " "WHERE ds_id = 1 " "AND id = ?1"); if(rc != SQLITE_OK) return; sqlite3_bind_int(stmt, 1, artist_id); if(db_step(stmt) == SQLITE_ROW) { rstr_t *artist = db_rstr(stmt, 0); prop_set(b->b_metadata, "title", PROP_SET_RSTRING, artist); prop_t *p = prop_create_r(b->b_metadata, "artist_images"); metadata_bind_artistpics(p, artist); prop_ref_dec(p); rstr_release(artist); } sqlite3_finalize(stmt); rc = db_prepare(db, &stmt, "SELECT id,title " "FROM album " "WHERE ds_id = 1 " "AND artist_id = ?1"); if(rc != SQLITE_OK) return; sqlite3_bind_int(stmt, 1, artist_id); rstr_t *ct = rstr_alloc("album"); while((rc = db_step(stmt)) == SQLITE_ROW) { char url[PATH_MAX]; snprintf(url, sizeof(url), "library:album:%d", sqlite3_column_int(stmt, 0)); add_item(b, url, NULL, ct, (const char *)sqlite3_column_text(stmt, 1), 0, NULL, 0); } rstr_release(ct); sqlite3_finalize(stmt); }
static void add_item(bmdb_t *b, const char *url, const char *parent, rstr_t *contenttype, const char *title, int track, const char *artist, int duration) { prop_t *c = prop_create_r(b->b_nodes, url); prop_unmark(c); prop_set(c, "type", PROP_SET_RSTRING, contenttype); prop_set(c, "url", PROP_SET_STRING, url); prop_t *metadata = prop_create_r(c, "metadata"); if(track) prop_set(metadata, "track", PROP_SET_INT, track); if(artist) prop_set(metadata, "artist", PROP_SET_STRING, artist); if(duration > 0) prop_set(metadata, "duration", PROP_SET_INT, duration / 1000); if(title == NULL) { char fname[512]; fa_url_get_last_component(fname, sizeof(fname), url); rstr_t *ft = metadata_remove_postfix(fname); prop_set(metadata, "title", PROP_SET_RSTRING, ft); rstr_release(ft); } else { prop_set(metadata, "title", PROP_SET_STRING, title); } #if 0 prop_t *options = prop_create(bi->bi_prop, "options"); metadata_bind_video_info(metadata, bi->bi_url, title, NULL, 0, options, bi->bi_prop, NULL, 0, 1); #endif prop_ref_dec(metadata); prop_ref_dec(c); }