#include "acl_cpp/lib_acl.hpp"

static const char* data = "{'server': "
  "["
  " {'conns': '10', 'used': '0', 'pid': '47841', 'max_threads': '10',"
  "  'curr_threads': '1', 'busy_threads': '0', 'qlen': '0', 'type': 'default'"
  " },"
  " {'conns': '10', 'used': '0', 'pid': '49628', 'max_threads': '10', "
  "  'curr_threads': '1', 'busy_threads': '0', 'qlen': '0', 'type': 'default'"
  " }"
  "],"
  "'conns': '20', 'used': '0', 'qlen': '0', 'max_threads': '20', "
  "'curr_threads': '2', 'busy_threads': '0', 'addr': '192.168.111.158:1080', "
  "'load': '0.02'}";

int main(void)
{
	acl::json json;
	json.update(data);

	// 将 JSON 数据转为 XML 数据的过程

	acl::xml1 xml;
	acl::xml_node& server_node = xml.create_node("server");
	xml.get_root().add_child(server_node);

	acl::string key;
	acl::json_node& root = json.get_root();
	acl::json_node* child = root.first_child();

	while (child != NULL)
	{
		const char* name = child->tag_name();
		if (name == NULL || *name == 0)
		{
			child = root.next_child();
			continue;
		}

		if (strcasecmp(name, "server") != 0)
		{
			const char* value = child->get_text();
			if (value != NULL)
			{
				if (strcasecmp(name, "addr") == 0)
					key = value;
				server_node.add_attr(name, value);
			}

			child = root.next_child();
			continue;
		}

		acl::json_node* server = child->get_obj();
		if (server == NULL)
		{
			child = root.next_child();
			continue;
		}


		acl::json_node* proc = server->first_child();

		while (proc != NULL)
		{
			// 创建  proc XML 结点
			acl::xml_node& proc_node = xml.create_node("proc");
			server_node.add_child(proc_node);

			acl::json_node* status = proc->first_child();
			while (status != NULL)
			{
				const char* tag = status->tag_name();
				const char* val = status->get_text();
				if (tag && val)
					proc_node.add_child(tag, false, val);
				status = proc->next_child();
			}
			proc = server->next_child();
		}

		child = root.next_child();
	}

	acl::string buf;
	xml.build_xml(buf);
	printf(">>>>>>xml: %s\n", buf.c_str());
	printf("\r\n%s\r\n", data);

	return 0;
}
