int main(int argc, char* argv[]) { XmlParser* thiz = xml_parser_create(); XmlBuilder* builder = xml_builder_tree_create(); xml_parser_set_builder(thiz, builder); if(argc > 1) { char* buffer = read_file(argv[1]); xml_parser_parse(thiz, buffer); free(buffer); } XmlNode* tree = xml_builder_get_tree(builder); dump_tree(tree); xml_node_destroy(tree); xml_builder_destroy(builder); xml_parser_destroy(thiz); return 0; }
static void process_http(struct http_thread_env *hte, HttpRequest *req) { if (process_http_auth(hte->te, req) == FALSE) { push_http_msg(hte, MBB_MSG_UNAUTHORIZED); return; } if (req->body) { GError *error = NULL; guint len; len = strlen(req->body); if (! xml_parser_parse(hte->te->parser, req->body, len, &error)) { mbb_log_lvl(MBB_LOG_HTTP, "xml_parser failed"); g_error_free(error); push_http_error_msg(hte, "invalid xml"); return; } } process_request(hte); }
gboolean xml_parser_parse_io_channel (XMLParser *parser, GIOChannel *io, gboolean recode, GError **error) { GIOStatus status; guchar buffer[8196]; gsize len = 0; gsize bytes; g_return_val_if_fail (parser != NULL, FALSE); g_return_val_if_fail (io != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); if (recode) { const gchar *io_encoding = g_io_channel_get_encoding (io); gchar *encoding = NULL; if (io_encoding && strcmp (io_encoding, "UTF-8")) { g_warning ("xml_parser_parse_io_channel(): " "The encoding has already been set on this IOChannel!"); return FALSE; } /* try to determine the encoding */ while (len < sizeof (buffer) && !encoding) { status = g_io_channel_read_chars (io, buffer + len, 1, &bytes, error); len += bytes; if (status == G_IO_STATUS_ERROR) return FALSE; if (status == G_IO_STATUS_EOF) break; encoding = xml_parse_encoding (buffer, len); } if (encoding) { if (!g_io_channel_set_encoding (io, encoding, error)) return FALSE; g_free (encoding); } } while (TRUE) { if (!xml_parser_parse (parser, buffer, len, error)) return FALSE; status = g_io_channel_read_chars (io, buffer, sizeof(buffer), &len, error); switch (status) { case G_IO_STATUS_ERROR: return FALSE; case G_IO_STATUS_EOF: return xml_parser_end_parse (parser, error); case G_IO_STATUS_NORMAL: case G_IO_STATUS_AGAIN: break; } } }