Beispiel #1
0
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);
}
Beispiel #2
0
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;
}
Beispiel #3
0
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();
  }
}