static void js_item_eventsub(void *opaque, prop_event_t event, ...) { js_item_t *ji = opaque; va_list ap; va_start(ap, event); switch(event) { default: break; case PROP_DESTROYED: js_event_destroy_handlers(ji->ji_model->jm_cx, &ji->ji_event_handlers); prop_unsubscribe(ji->ji_eventsub); ji->ji_eventsub = NULL; ji->ji_model->jm_subs--; JS_RemoveRoot(ji->ji_model->jm_cx, &ji->ji_this); prop_tag_clear(ji->ji_root, ji->ji_model); break; case PROP_EXT_EVENT: js_event_dispatch(ji->ji_model->jm_cx, &ji->ji_event_handlers, va_arg(ap, event_t *), JSVAL_TO_OBJECT(ji->ji_this)); break; } va_end(ap); }
static void js_clear_props(jni_subscription_t *js) { jni_prop_t *jp; while((jp = LIST_FIRST(&js->js_props)) != NULL) { prop_tag_clear(jp->jp_prop, js); jni_property_unexport_from_sub(js, jp); } }
static void src_cb(void *opaque, prop_event_t event, ...) { prop_reorder_t *pr = opaque; va_list ap; prop_t *p, *out; prop_vec_t *pv; int i; va_start(ap, event); switch(event) { case PROP_ADD_CHILD: case PROP_ADD_CHILD_BEFORE: add_child(pr, va_arg(ap, prop_t *)); break; case PROP_ADD_CHILD_VECTOR: case PROP_ADD_CHILD_VECTOR_DIRECT: pv = va_arg(ap, prop_vec_t *); for(i = 0; i < prop_vec_len(pv); i++) add_child(pr, prop_vec_get(pv, i)); break; case PROP_DEL_CHILD: p = va_arg(ap, prop_t *); out = prop_tag_clear(p, pr); prop_destroy0(out); break; case PROP_MOVE_CHILD: break; case PROP_SET_VOID: break; case PROP_SET_DIR: case PROP_REQ_DELETE_VECTOR: case PROP_HAVE_MORE_CHILDS_YES: case PROP_HAVE_MORE_CHILDS_NO: case PROP_WANT_MORE_CHILDS: break; default: printf("Cant handle event %d\n", event); abort(); } }
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(); } }