json::json(const json_node& node) { json_ = acl_json_create(node.get_json_node()); root_ = NEW json_node(json_->root, this); buf_ = NULL; iter_ = NULL; }
json_node* json::getFirstElementByTagName(const char* tag) const { ACL_JSON_NODE* n = acl_json_getFirstElementByTagName(json_, tag); if (n == NULL) return NULL; json_node* node = NEW json_node(n, const_cast<json*>(this)); const_cast<json*>(this)->nodes_query_.push_back(node); return node; }
json_node* json_node::get_obj(void) const { if (obj_ != NULL) return obj_; if (node_me_->tag_node == NULL) return NULL; const_cast<json_node*>(this)->obj_ = NEW json_node(node_me_->tag_node, json_); return obj_; }
const std::vector<json_node*>& json::getElementsByTagName(const char* tag) const { const_cast<json*>(this)->clear(); ACL_ARRAY* a = acl_json_getElementsByTagName(json_, tag); if (a == NULL) return nodes_query_; ACL_ITER iter; acl_foreach(iter, a) { ACL_JSON_NODE *tmp = (ACL_JSON_NODE*) iter.data; json_node* node = NEW json_node(tmp, const_cast<json*>(this)); const_cast<json*>(this)->nodes_query_.push_back(node); }
json_node* json_node::next_child(void) { acl_assert(iter_); acl_assert(children_); ACL_JSON_NODE* node = node_me_->iter_next(iter_, node_me_); if (node == NULL) return NULL; json_node* child = NEW json_node(node, json_); children_->push_back(child); return child; }
json_node& json_node::get_parent(void) const { if (parent_) return *parent_; else if (node_me_->parent == node_me_->json->root) return json_->get_root(); else if (node_me_->parent == NULL) // xxx: can this happen? return json_->get_root(); const_cast<json_node*>(this)->parent_saved_ = NEW json_node(node_me_->parent, json_); const_cast<json_node*>(this)->parent_ = parent_saved_; return *parent_saved_; }
json_node* json_node::first_child(void) { if (iter_ == NULL) iter_ = (ACL_ITER*) acl_mymalloc(sizeof(ACL_ITER)); ACL_JSON_NODE* node = node_me_->iter_head(iter_, node_me_); if (node == NULL) return NULL; prepare_iter(); json_node* child = NEW json_node(node, json_); children_->push_back(child); return child; }
json_node* json_node::first_child(void) { if (iter_ == NULL) iter_ = (ACL_ITER*) acl_mymalloc(sizeof(ACL_ITER)); ACL_JSON_NODE* node = node_me_->iter_head(iter_, node_me_); if (node == NULL) return NULL; if (child_ == NULL) child_ = NEW json_node(node, json_); else child_->node_me_ = node; return child_; }