static void add_child(prop_reorder_t *pr, prop_t *p) { prop_t *out = prop_make(NULL, 0, NULL); prop_tag_set(p, pr, out); prop_link0(p, out, NULL, 0, 0); prop_set_parent0(out, pr->pr_dst, get_before(pr, get_id(p)), NULL); }
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) { install_nodesub(model); prop_t *item = prop_create_root(NULL); rstr_t *rurl = url ? rstr_alloc(url) : NULL; if(url != NULL) prop_set(item, "url", PROP_SET_RSTRING, rurl); if(data != NULL) js_prop_set_from_jsval(cx, prop_create(item, "data"), *data); *rval = JSVAL_VOID; if(metabind != NULL) playinfo_bind_url_to_prop(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); rstr_release(rurl); 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)); atomic_add(&model->jm_refcount, 1); ji->ji_url = rstr_dup(rurl); ji->ji_model = model; ji->ji_root = p; TAILQ_INSERT_TAIL(&model->jm_items, ji, ji_link); JS_SetPrivate(cx, robj, ji); ji->ji_enable_set_property = 1; ji->ji_eventsub = prop_subscribe(PROP_SUB_TRACK_DESTROY, PROP_TAG_CALLBACK, js_item_eventsub, ji, PROP_TAG_ROOT, ji->ji_root, PROP_TAG_COURIER, model->jm_pc, NULL); model->jm_subs++; ji->ji_this = OBJECT_TO_JSVAL(robj); JS_AddNamedRoot(cx, &ji->ji_this, "item_this"); prop_tag_set(ji->ji_root, model, ji); } rstr_release(rurl); return JS_TRUE; }
static void src_cb(void *opaque, prop_event_t event, ...) { prop_concat_source_t *pcs = opaque; prop_concat_t *pc = pcs->pcs_pc; prop_t *p, *q, *out, *before; va_list ap; va_start(ap, event); switch(event) { case PROP_ADD_CHILD: p = va_arg(ap, prop_t *); out = prop_create_root(NULL); prop_tag_set(p, pcs, out); prop_link0(p, out, NULL, 0); prop_set_parent0(out, pc->pc_dst, find_next_out(pcs), NULL); if(pcs->pcs_count == 0) { pcs->pcs_first = out; if(pcs->pcs_header != NULL) prop_set_parent0(pcs->pcs_header, pc->pc_dst, out, NULL); } pcs->pcs_count++; break; case PROP_ADD_CHILD_BEFORE: p = va_arg(ap, prop_t *); out = prop_create_root(NULL); prop_tag_set(p, pcs, out); prop_link0(p, out, NULL, 0); q = va_arg(ap, prop_t *); before = prop_tag_get(q, pcs); assert(before != NULL); prop_set_parent0(out, pc->pc_dst, before, NULL); pcs->pcs_count++; break; case PROP_DEL_CHILD: p = va_arg(ap, prop_t *); out = prop_tag_clear(p, pcs); before = TAILQ_NEXT(out, hp_parent_link); prop_destroy0(out); pcs->pcs_count--; if(pcs->pcs_count == 0) { pcs->pcs_first = NULL; if(pcs->pcs_header != NULL) prop_unparent0(pcs->pcs_header, NULL); } else if(pcs->pcs_first == out) { pcs->pcs_first = before; } break; case PROP_MOVE_CHILD: p = va_arg(ap, prop_t *); q = va_arg(ap, prop_t *); prop_move0(prop_tag_get(p, pcs), q != NULL ? prop_tag_get(q, pcs) : find_next_out(pcs), NULL); break; case PROP_SET_VOID: break; case PROP_SET_DIR: case PROP_REQ_DELETE_VECTOR: case PROP_HAVE_MORE_CHILDS: case PROP_WANT_MORE_CHILDS: break; default: printf("Cant handle event %d\n", event); abort(); } }