void load(const xmlDocPtr doc, xml_node &node) { if (!doc) { std::string msg("XML document not well formed"); xmlError * error = xmlCtxtGetLastError( ctx_ ); if (error) { msg += ":\n"; msg += error->message; throw config_error(msg, error->line, error->file); } else { throw config_error(msg); } } int iXIncludeReturn = xmlXIncludeProcessFlags(doc, options_); if (iXIncludeReturn < 0) { xmlFreeDoc(doc); throw config_error("XML XInclude error. One or more files failed to load."); } xmlNode * root = xmlDocGetRootElement(doc); if (!root) { xmlFreeDoc(doc); throw config_error("XML document is empty."); } populate_tree(root, node); xmlFreeDoc(doc); }
gint main (gint argc, gchar **argv) { GOptionContext *context; xmlParserCtxtPtr parser; xmlDocPtr doc; YelpTransform *transform; gchar **params; const gchar *stylesheet; gchar *file; context = g_option_context_new ("[STYLESHEET] FILE"); g_option_context_add_main_entries (context, options, NULL); g_option_context_parse (context, &argc, &argv, NULL); if (files == NULL || files[0] == NULL) { g_printerr ("Usage: test-transform [OPTION...] [STYLESHEET] FILE\n"); return 1; } if (files[1] == NULL) { stylesheet = DATADIR"/yelp/xslt/db2html.xsl"; file = files[0]; } else { stylesheet = files[0]; file = files[1]; } params = g_new0 (gchar *, 7); params[0] = g_strdup ("db.chunk.extension"); params[1] = g_strdup ("\"\""); params[2] = g_strdup ("db.chunk.info_basename"); params[3] = g_strdup ("\"x-yelp-titlepage\""); params[4] = g_strdup ("db.chunk.max_depth"); params[5] = g_strdup ("2"); params[6] = NULL; transform = yelp_transform_new (stylesheet); g_object_weak_ref ((GObject *) transform, transform_destroyed, NULL); g_signal_connect (transform, "chunk-ready", (GCallback) transform_chunk, NULL); g_signal_connect (transform, "finished", (GCallback) transform_finished, NULL); g_signal_connect (transform, "error", (GCallback) transform_error, NULL); parser = xmlNewParserCtxt (); doc = xmlCtxtReadFile (parser, file, NULL, XML_PARSE_DTDLOAD | XML_PARSE_NOCDATA | XML_PARSE_NOENT | XML_PARSE_NONET ); xmlFreeParserCtxt (parser); xmlXIncludeProcessFlags (doc, XML_PARSE_DTDLOAD | XML_PARSE_NOCDATA | XML_PARSE_NOENT | XML_PARSE_NONET ); if (!yelp_transform_start (transform, doc, (xmlDocPtr)params, NULL)) return 1; if (random_timeout) { GRand *rand = g_rand_new (); timeout = g_rand_int_range (rand, 80, 280); g_rand_free (rand); } if (timeout >= 0) g_timeout_add (timeout, (GSourceFunc) transform_release, transform); loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); return 0; }