示例#1
0
int dslink_node_add_child(DSLink *link, DSNode *node) {
    assert(node);
    assert(node->parent);
    int ret = 0;
    if (!node->parent->children) {
        node->parent->children = malloc(sizeof(Map));
        if (!node->parent->children) {
            return DSLINK_ALLOC_ERR;
        }
        if (dslink_map_init(node->parent->children,
                            dslink_map_str_cmp,
                            dslink_map_str_key_len_cal) != 0) {
            free(node->parent->children);
            node->parent->children = NULL;
            return DSLINK_ALLOC_ERR;
        }

    }

    assert(!dslink_map_contains(node->parent->children,
                                (void *) node->name));
    {
        DSNode *tmp = node;
        if ((ret = dslink_map_set(node->parent->children,
                                  (void *) node->name,
                                  (void **) &tmp)) != 0) {
            return ret;
        }
    }

    if (!link->_ws) {
        return ret;
    }

    uint32_t *id = dslink_map_get(link->responder->list_subs,
                                  (void *) node->parent->path);
    if (!id) {
        return ret;
    }
    json_t *top = json_object();
    if (!top) {
        return ret;
    }
    json_t *resps = json_array();
    if (!resps) {
        goto cleanup;
    }
    json_object_set_new_nocheck(top, "responses", resps);
    json_t *resp = json_object();
    if (!resp) {
        goto cleanup;
    }
    json_array_append_new(resps, resp);
    json_object_set_new_nocheck(resp, "stream",
                                json_string("open"));
    json_object_set_new_nocheck(resp, "rid", json_integer(*id));
    json_t *updates = json_array();
    if (!updates) {
        goto cleanup;
    }
    json_object_set_new_nocheck(resp, "updates", updates);
    json_t *update = json_array();
    if (!update) {
        goto cleanup;
    }
    json_array_append_new(updates, update);
    dslink_response_list_append_child(update, node);
    dslink_ws_send_obj(link->_ws, top);
cleanup:
    json_delete(top);
    return ret;
}
示例#2
0
void virtual_downstream_node_init(VirtualDownstreamNode *node) {
    node->permissionList = NULL;
    dslink_map_init(&node->childrenNode, dslink_map_str_cmp,
                    dslink_map_str_key_len_cal, dslink_map_hash_key);
    node->meta = json_object();
}
示例#3
0
文件: broker.c 项目: ghalwasi/c-mlib
static
int broker_init(Broker *broker, json_t *defaultPermission) {
    broker->root = broker_node_create("", "node");
    if (!broker->root) {
        goto fail;
    }
    broker->root->permissionList = permission_list_load(defaultPermission);

    broker->root->path = dslink_strdup("/");
    json_object_set_new(broker->root->meta, "$downstream",
                        json_string_nocheck("/downstream"));

    broker->sys = broker_node_create("sys", "static");
    if (!(broker->sys && broker_node_add(broker->root, broker->sys) == 0)) {
        broker_node_free(broker->sys);
        goto fail;
    }

    broker->upstream = broker_node_create("upstream", "static");
    if (!(broker->upstream && broker_node_add(broker->root, broker->upstream) == 0)) {
        broker_node_free(broker->upstream);
        goto fail;
    }

    broker->data = broker_node_create("data", "node");
    if (!(broker->data && broker_node_add(broker->root, broker->data) == 0
          && broker_load_data_nodes(broker) == 0
          && broker_data_node_populate(broker->data) == 0)) {
        broker_node_free(broker->data);
        goto fail;
    }

    broker->downstream = broker_node_create("downstream", "node");
    if (!(broker->downstream
          && broker_node_add(broker->root, broker->downstream) == 0)) {
        broker_node_free(broker->downstream);
        goto fail;
    }
    broker_load_downstream_nodes(broker);
    broker_load_qos_storage(broker);

    if (broker_sys_node_populate(broker->sys)) {
        goto fail;
    }




    BrokerNode *node = broker_node_create("defs", "static");
    if (!(node && json_object_set_new_nocheck(node->meta,
                                              "$hidden",
                                              json_true()) == 0
          && broker_node_add(broker->root, node) == 0)) {
        broker_node_free(node);
        goto fail;
    }

    if (dslink_map_init(&broker->client_connecting, dslink_map_str_cmp,
                        dslink_map_str_key_len_cal, dslink_map_hash_key) != 0) {
        goto fail;
    }

    if (dslink_map_init(&broker->remote_pending_sub, dslink_map_str_cmp,
                        dslink_map_str_key_len_cal, dslink_map_hash_key) != 0) {
        goto fail;
    }

    if (dslink_map_init(&broker->local_pending_sub, dslink_map_str_cmp,
                        dslink_map_str_key_len_cal, dslink_map_hash_key) != 0) {
        goto fail;
    }

    return 0;
fail:
    broker_free(broker);
    return 1;
}