/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* * Copyright (C) 2006 Shaun McCance * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . * * Author: Shaun McCance */ #include #include #include #include #include "yelp-error.h" #include "yelp-transform.h" static gint num_chunks = 0; static gboolean freed; static gint timeout = -1; static gboolean random_timeout = FALSE; static gchar **files = NULL; static const GOptionEntry options[] = { { "random-timeout", 'r', 0, G_OPTION_ARG_NONE, &random_timeout, "Time out after a random amount of time", NULL }, { "timeout", 't', 0, G_OPTION_ARG_INT, &timeout, "Time out after N milliseconds", "N" }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &files, NULL, NULL }, { NULL } }; GMainLoop *loop; static gboolean transform_release (YelpTransform *transform) { printf ("\nRELEASE\n"); if (!freed) { yelp_transform_cancel (transform); g_object_unref (transform); } freed = TRUE; return FALSE; } static void transform_chunk (YelpTransform *transform, const gchar *chunk_id, gpointer user_data) { gchar *chunk, *small; num_chunks++; printf ("\nCHUNK %i: %s\n", num_chunks, chunk_id); chunk = yelp_transform_take_chunk (transform, chunk_id); small = g_strndup (chunk, 300); printf ("%s\n", small); g_free (small); g_free (chunk); } static void transform_finished (YelpTransform *transform, gpointer user_data) { printf ("\nFINAL\n"); if (!freed) { yelp_transform_cancel (transform); g_object_unref (transform); } freed = TRUE; } static void transform_error (YelpTransform *transform, gpointer user_data) { printf ("\nERROR\n"); } static void transform_destroyed (gpointer data, GObject *object) { printf ("\nFREED\n"); g_main_loop_quit (loop); } 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, NULL, (const gchar **) params)) 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; }