void xdebug_xml_return_node(xdebug_xml_node* node, struct xdebug_str *output) { xdebug_str_addl(output, "<", 1, 0); xdebug_str_add(output, node->tag, 0); if (node->text && node->text->encode) { xdebug_xml_add_attribute_ex(node, "encoding", "base64", 0, 0); } if (node->attribute) { xdebug_xml_return_attribute(node->attribute, output); } xdebug_str_addl(output, ">", 1, 0); if (node->child) { xdebug_xml_return_node(node->child, output); } if (node->text) { xdebug_xml_return_text_node(node->text, output); } xdebug_str_addl(output, "</", 2, 0); xdebug_str_add(output, node->tag, 0); xdebug_str_addl(output, ">", 1, 0); if (node->next) { xdebug_xml_return_node(node->next, output); } }
int main(void) { FILE *f; int ret; char chars[10]; xmlParserCtxtPtr ctxt; xdebug_str message = {0, 0, NULL}; xdebug_xml_reader_priv data; data.level = 0; data.xml = NULL; data.current = NULL; f = fopen("test.xml", "r"); ctxt = xmlCreatePushParserCtxt(sax_handler_ptr, NULL, NULL, 0, "test"); ctxt->_private = &data; while ((ret = fread(chars, 1, 3, f)) > 0) { xmlParseChunk(ctxt, chars, ret, 0); } xmlParseChunk(ctxt, chars, 0, 1); xdebug_xml_return_node(data.xml, &message); xdebug_xml_node_dtor(data.xml); printf("%s\n", message.d); xdebug_str_dtor(message); xmlFreeParserCtxt(ctxt); fclose(f); xmlCleanupParser(); xmlMemoryDump(); return 0; }
void XDebugServer::sendMessage(xdebug_xml_node& xml) { auto const message = xdebug_xml_return_node(&xml); auto const message_len = message.size() + sizeof(XML_MSG_HEADER) - 1; log("-> %s\n\n", message.data()); logFlush(); StringBuffer buf; buf.append(static_cast<int64_t>(message_len)); buf.append('\0'); buf.append(XML_MSG_HEADER); buf.append(message); buf.append('\0'); write(m_socket, buf.data(), buf.size()); return; }
void XDebugServer::sendMessage(xdebug_xml_node& xml) { // Convert xml to an xdebug_str. xdebug_str xml_message = {0, 0, nullptr}; xdebug_xml_return_node(&xml, &xml_message); size_t msg_len = xml_message.l + sizeof(XML_MSG_HEADER) - 1; // Log the message log("-> %s\n\n", xml_message.d); logFlush(); StringBuffer buf; buf.append(static_cast<int64_t>(msg_len)); buf.append('\0'); buf.append(XML_MSG_HEADER); buf.append(xml_message.d); buf.append('\0'); write(m_socket, buf.data(), buf.size()); return; }
void XDebugServer::sendMessage(xdebug_xml_node& xml) { // Convert xml to an xdebug_str xdebug_str xml_message = {0, 0, nullptr}; xdebug_xml_return_node(&xml, &xml_message); size_t msg_len = xml_message.l + sizeof(XML_MSG_HEADER) - 1; // Log the message log("-> %s\n\n", xml_message.d); logFlush(); // Format the message xdebug_str* message; xdebug_str_ptr_init(message); xdebug_str_add(message, xdebug_sprintf("%d", msg_len, 1), 1); xdebug_str_addl(message, "\0", 1, 0); xdebug_str_add(message, XML_MSG_HEADER, 0); xdebug_str_add(message, xml_message.d, 0); xdebug_str_addl(message, "\0", 1, 0); xdebug_str_dtor(xml_message); // Write the message write(m_socket, message->d, message->l); xdebug_str_ptr_dtor(message); }