diff options
author | Mikael Hallendal <micke@codefactory.se> | 2002-05-17 23:28:49 +0000 |
---|---|---|
committer | Mikael Hallendal <hallski@src.gnome.org> | 2002-05-17 23:28:49 +0000 |
commit | 43a631a402525808e38800dd6ca19554ba87c7ea (patch) | |
tree | c91669a6a303be164b971da1a368efd7fd818731 | |
parent | 9dd1c80f1627a81ab41f140361a2cf5f8b9e7b5a (diff) | |
download | yelp-43a631a402525808e38800dd6ca19554ba87c7ea.tar.gz |
emit "start"-signal. (reader_io_watch_cb): do the right thing (hopefully)
2002-05-18 Mikael Hallendal <micke@codefactory.se>
* src/yelp-reader.c:
(reader_man_info_start): emit "start"-signal.
(reader_io_watch_cb): do the right thing (hopefully) :)
* src/yelp-html.c:
(html_do_write): removed
(html_do_close): removed
(html_do_docbook): removed
(html_io_watch_cb): removed
(html_reader_start_cb): added/implemented, temporary
(html_reader_data_cb): added/implemented, temporary
(html_reader_finished_cb): added/implemented, temporary
(html_reader_error_cb): added/implemented, temporary
(html_do_maninfo): removed
(html_do_html): removed
(html_init): connect to reader signals.
(yelp_html_open_uri): removed lots of code and use YelpReader
instead. This should be removed entirely later on.
-rw-r--r-- | ChangeLog | 19 | ||||
-rw-r--r-- | src/yelp-html.c | 316 | ||||
-rw-r--r-- | src/yelp-reader.c | 83 |
3 files changed, 140 insertions, 278 deletions
@@ -1,5 +1,24 @@ 2002-05-18 Mikael Hallendal <micke@codefactory.se> + * src/yelp-reader.c: + (reader_man_info_start): emit "start"-signal. + (reader_io_watch_cb): do the right thing (hopefully) :) + + * src/yelp-html.c: + (html_do_write): removed + (html_do_close): removed + (html_do_docbook): removed + (html_io_watch_cb): removed + (html_reader_start_cb): added/implemented, temporary + (html_reader_data_cb): added/implemented, temporary + (html_reader_finished_cb): added/implemented, temporary + (html_reader_error_cb): added/implemented, temporary + (html_do_maninfo): removed + (html_do_html): removed + (html_init): connect to reader signals. + (yelp_html_open_uri): removed lots of code and use YelpReader + instead. This should be removed entirely later on. + * src/yelp-html.c: - renamed static functions to correspond to style. diff --git a/src/yelp-html.c b/src/yelp-html.c index 186af23e..081f78eb 100644 --- a/src/yelp-html.c +++ b/src/yelp-html.c @@ -37,6 +37,7 @@ #include "yelp-db2html.h" #include "yelp-error.h" #include "yelp-uri.h" +#include "yelp-reader.h" #include "yelp-html.h" #define d(x) @@ -48,38 +49,25 @@ struct _YelpHtmlPriv { HtmlDocument *load_doc; GSList *connections; YelpURI *base_uri; + YelpReader *reader; }; -typedef struct { - YelpHtml *html; - HtmlStream *stream; - gchar *section; -} ReadData; static void html_init (YelpHtml *html); static void html_class_init (YelpHtmlClass *klass); -static int html_do_write (void *context, - const char *buffer, - int len); -static int html_do_close (void *context); - -static void html_do_docbook (YelpHtml *html, - YelpURI *uri, - GError **error); -static gboolean html_io_watch_cb (GIOChannel *iochannel, - GIOCondition cond, - ReadData *read_data); +static void html_reader_start_cb (YelpReader *reader, + YelpHtml *html); +static void html_reader_data_cb (YelpReader *reader, + gint len, + const gchar *data, + YelpHtml *html); +static void html_reader_finished_cb (YelpReader *reader, + YelpHtml *html); +static void html_reader_error_cb (YelpReader *reader, + GError *error, + YelpHtml *html); -static void html_do_maninfo (YelpHtml *html, - HtmlStream *stream, - YelpURI *uri, - GError **error); -static void html_do_html (YelpHtml *html, - HtmlStream *stream, - const gchar *uri, - const gchar *section, - GError **error); static void html_url_requested_cb (HtmlDocument *doc, const gchar *uri, HtmlStream *stream, @@ -141,6 +129,21 @@ html_init (YelpHtml *html) priv->connections = NULL; priv->base_uri = NULL; priv->load_doc = html_document_new (); + priv->reader = yelp_reader_new (FALSE); + + g_signal_connect (G_OBJECT (priv->reader), "start", + G_CALLBACK (html_reader_start_cb), + html); + g_signal_connect (G_OBJECT (priv->reader), "data", + G_CALLBACK (html_reader_data_cb), + html); + g_signal_connect (G_OBJECT (priv->reader), "finished", + G_CALLBACK (html_reader_finished_cb), + html); + g_signal_connect (G_OBJECT (priv->reader), "error", + G_CALLBACK (html_reader_error_cb), + html); + html_document_open_stream (priv->load_doc, "text/html"); @@ -182,223 +185,81 @@ html_class_init (YelpHtmlClass *klass) 2, G_TYPE_POINTER, G_TYPE_BOOLEAN); } -static int -html_do_write (void * context, const char * buffer, int len) +static void +html_reader_start_cb (YelpReader *reader, YelpHtml *html) { - YelpHtml *html; YelpHtmlPriv *priv; - - g_return_val_if_fail (YELP_IS_HTML (context), -1); - - html = YELP_HTML (context); - priv = html->priv; + GdkCursor *cursor; - if (len <= 0) { - return 0; - } - - d(g_print ("Do Write: %d\n", len)); - - html_document_write_stream (priv->doc, buffer, len); - - return len; -} + g_return_if_fail (YELP_IS_READER (reader)); + g_return_if_fail (YELP_IS_HTML (html)); -static int -html_do_close (void *context) -{ - YelpHtml *html; - YelpHtmlPriv *priv; - - g_return_val_if_fail (YELP_IS_HTML (context), -1); - - html = YELP_HTML (context); priv = html->priv; - d(g_print ("Do Close\n")); - - html_document_close_stream (priv->doc); - gtk_adjustment_set_value (gtk_layout_get_vadjustment (GTK_LAYOUT (priv->view)), - 0); - - gdk_window_set_cursor (GTK_WIDGET (priv->view)->window, NULL); + cursor = gdk_cursor_new (GDK_WATCH); + + gdk_window_set_cursor (GTK_WIDGET (priv->view)->window, cursor); + gdk_cursor_unref (cursor); + + html_document_clear (priv->doc); + html_document_open_stream (priv->doc, "text/html"); - return 0; + html_stream_set_cancel_func (priv->doc->current_stream, + html_cancel_stream, + html); } static void -html_do_docbook (YelpHtml *html, YelpURI *uri, GError **error) +html_reader_data_cb (YelpReader *reader, + gint len, + const gchar *data, + YelpHtml *html) { - xmlOutputBufferPtr buf; - YelpHtmlPriv *priv; + YelpHtmlPriv *priv; + g_return_if_fail (YELP_IS_READER (reader)); g_return_if_fail (YELP_IS_HTML (html)); priv = html->priv; - buf = xmlAllocOutputBuffer (NULL); - - buf->writecallback = html_do_write; - buf->closecallback = html_do_close; - buf->context = html; - - yelp_db2html_convert (uri, buf, error); - - g_free (uri); -} - -static gboolean -html_io_watch_cb (GIOChannel *iochannel, - GIOCondition cond, - ReadData *read_data) -{ - YelpHtmlPriv *priv; - static gchar buffer[BUFFER_SIZE]; - guint n; - gboolean finished = FALSE; - GIOStatus status; - - g_return_val_if_fail (read_data != NULL, FALSE); - g_return_val_if_fail (YELP_IS_HTML (read_data->html), FALSE); - - priv = read_data->html->priv; - - if (cond & G_IO_IN) { - d(g_print ("Read available\n")); - - status = g_io_channel_read_chars (iochannel, - buffer, - BUFFER_SIZE, - &n, - NULL); - - if (status == G_IO_STATUS_NORMAL) { - html_do_write (read_data->html, buffer, n); - } - else if (status == G_IO_STATUS_EOF || - status == G_IO_STATUS_ERROR) { - if (n > 0) { - html_do_write (read_data->html, - buffer, n); - } - - finished = TRUE; - } - } - - if (cond & G_IO_HUP || finished) { - html_stream_close (read_data->stream); - - d(g_print ("Close\n")); - - g_io_channel_unref (iochannel); - - gtk_adjustment_set_value ( - gtk_layout_get_vadjustment (GTK_LAYOUT (priv->view)), - 0); - - gdk_window_set_cursor (GTK_WIDGET (priv->view)->window, NULL); - - if (read_data->section) { - html_view_jump_to_anchor (priv->view, - read_data->section); - g_free (read_data->section); - } - - g_free (read_data); - return FALSE; + if (len <= 0) { + return; } - return TRUE; + html_document_write_stream (html->priv->doc, data, len); } static void -html_do_maninfo (YelpHtml *html, - HtmlStream *stream, - YelpURI *uri, - GError **error) +html_reader_finished_cb (YelpReader *reader, YelpHtml *html) { - gchar *command_line = NULL; - gchar **argv = 0; - gint output_fd; - GIOChannel *io_channel; - ReadData *read_data; - - d(g_print ("entering from maninfo: %d\n", output_fd)); - - switch (yelp_uri_get_type (uri)) { - case YELP_URI_TYPE_MAN: - command_line = g_strdup_printf ("gnome2-man2html %s", - yelp_uri_get_path (uri)); - break; - case YELP_URI_TYPE_INFO: - command_line = g_strdup_printf ("gnome2-info2html %s", - yelp_uri_get_path (uri)); - break; - default: - g_warning ("Non-supported doctype"); - return; - }; - - if (!g_shell_parse_argv (command_line, NULL, &argv, error)) { - return; - } - - g_free (command_line); - - d(g_print ("spawning in maninfo\n")); - - if (!g_spawn_async_with_pipes (NULL, argv, NULL, - G_SPAWN_STDERR_TO_DEV_NULL | G_SPAWN_SEARCH_PATH, - NULL, NULL, NULL, NULL, - &output_fd, NULL, error)) { - return; - } + YelpHtmlPriv *priv; - d(g_print ("spawned in maninfo: %d\n", output_fd)); + g_return_if_fail (YELP_IS_READER (reader)); + g_return_if_fail (YELP_IS_HTML (html)); - g_strfreev (argv); + priv = html->priv; - io_channel = g_io_channel_unix_new (output_fd); - - read_data = g_new (ReadData, 1); - read_data->html = html; - read_data->stream = stream; - read_data->section = NULL; + html_document_close_stream (html->priv->doc); - g_io_add_watch (io_channel, G_IO_IN | G_IO_HUP, - (GIOFunc) html_io_watch_cb, - read_data); + gtk_adjustment_set_value (gtk_layout_get_vadjustment (GTK_LAYOUT (priv->view)), + 0); - d(g_print ("returning from maninfo: %d\n", output_fd)); + gdk_window_set_cursor (GTK_WIDGET (priv->view)->window, NULL); } static void -html_do_html (YelpHtml *html, - HtmlStream *stream, - const gchar *docpath, - const gchar *section, - GError **error) +html_reader_error_cb (YelpReader *reader, GError *error, YelpHtml *html) { - GIOChannel *io_channel = NULL; - ReadData *read_data; - - d(g_print ("Opening html-file: %s\n", docpath)); - - io_channel = g_io_channel_new_file (docpath, "r", error); + YelpHtmlPriv *priv; + + g_return_if_fail (YELP_IS_READER (reader)); + g_return_if_fail (YELP_IS_HTML (html)); - if (!io_channel) { - return; - } + priv = html->priv; - read_data = g_new (ReadData, 1); - read_data->html = html; - read_data->stream = stream; - read_data->section = g_strdup (section); + /* Popup window */ - g_io_add_watch (io_channel, G_IO_IN | G_IO_HUP, - (GIOFunc) html_io_watch_cb, - read_data); + g_warning ("%s\n", error->message); } static void @@ -522,8 +383,7 @@ void yelp_html_open_uri (YelpHtml *html, YelpURI *uri, GError **error) { YelpHtmlPriv *priv; - GdkCursor *cursor; - + d(g_print ("Open URI: %s\n", yelp_uri_to_string (uri))); g_return_if_fail (YELP_IS_HTML (html)); @@ -531,47 +391,13 @@ yelp_html_open_uri (YelpHtml *html, YelpURI *uri, GError **error) priv = html->priv; - html_document_clear (priv->doc); - html_document_open_stream (priv->doc, "text/html"); - html_stream_set_cancel_func (priv->doc->current_stream, - html_cancel_stream, - html); - gtk_adjustment_set_value ( - gtk_layout_get_vadjustment ( - GTK_LAYOUT (priv->view)), 0); - gtk_adjustment_set_value ( - gtk_layout_get_hadjustment ( - GTK_LAYOUT (priv->view)), 0); - - cursor = gdk_cursor_new (GDK_WATCH); - - gdk_window_set_cursor (GTK_WIDGET (priv->view)->window, cursor); - gdk_cursor_unref (cursor); - if (priv->base_uri) { yelp_uri_unref (priv->base_uri); } priv->base_uri = yelp_uri_ref (uri); - switch (yelp_uri_get_type (uri)) { - case YELP_URI_TYPE_MAN: - case YELP_URI_TYPE_INFO: - html_do_maninfo (html, priv->doc->current_stream, - uri, error); - break; - case YELP_URI_TYPE_DOCBOOK_XML: - case YELP_URI_TYPE_DOCBOOK_SGML: - html_do_docbook (html, uri, error); - break; - case YELP_URI_TYPE_HTML: - html_do_html (html, priv->doc->current_stream, - yelp_uri_get_path (uri), - yelp_uri_get_section (uri), error); - break; - default: - g_assert_not_reached (); - } + yelp_reader_read (priv->reader, uri); } void diff --git a/src/yelp-reader.c b/src/yelp-reader.c index fe430dfd..d5d6ecde 100644 --- a/src/yelp-reader.c +++ b/src/yelp-reader.c @@ -27,7 +27,7 @@ #include "yelp-marshal.h" #include "yelp-reader.h" -#define d(x) x +#define d(x) #define BUFFER_SIZE 16384 struct _YelpReaderPriv { @@ -163,7 +163,7 @@ reader_db_start (YelpReader *reader, YelpURI *uri) yelp_db2html_convert (uri, buf, &error); if (error) { - g_print ("Have an error here: %s\n", error->message); + g_warning ("Have an error here: %s\n", error->message); g_signal_emit (reader, signals[ERROR], 0, error); g_error_free (error); } @@ -226,6 +226,8 @@ reader_man_info_start (YelpReader *reader, YelpURI *uri) g_shell_parse_argv (command_line, NULL, &argv, &error); g_free (command_line); + g_signal_emit (reader, signals[START], 0); + g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_STDERR_TO_DEV_NULL | G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, @@ -245,43 +247,60 @@ reader_man_info_start (YelpReader *reader, YelpURI *uri) } static gboolean -reader_io_watch_cb(GIOChannel *io_channel, - GIOCondition condition, - YelpReader *reader) +reader_io_watch_cb (GIOChannel *io_channel, + GIOCondition condition, + YelpReader *reader) { - static gchar buffer[BUFFER_SIZE]; - guint n; - gboolean finished = FALSE; - GIOStatus io_status; + static gchar buffer[BUFFER_SIZE]; + guint n = 0; + gboolean finished = FALSE; + GIOStatus io_status; + GError *error = NULL; g_return_val_if_fail (YELP_IS_READER (reader), FALSE); if (condition & G_IO_IN) { d(g_print ("Read available\n")); - io_status = g_io_channel_read_chars (io_channel, - buffer, - BUFFER_SIZE, - &n, - NULL); - switch (io_status) { - case G_IO_STATUS_NORMAL: - g_signal_emit (reader, signals[DATA], 0, n, buffer); - break; - case G_IO_STATUS_EOF: - case G_IO_STATUS_ERROR: - if (n > 0) { - g_signal_emit (reader, signals[DATA], 0, - n, buffer); + do { + io_status = g_io_channel_read_chars (io_channel, + buffer, + BUFFER_SIZE, + &n, + &error); + + if (error) { + g_signal_emit (reader, signals[ERROR], 0, + error); + g_error_free (error); + finished = TRUE; + } else { + switch (io_status) { + case G_IO_STATUS_NORMAL: + g_signal_emit (reader, signals[DATA], + 0, + n, buffer); + + break; + case G_IO_STATUS_EOF: + case G_IO_STATUS_ERROR: + d(g_print ("Finished!\n")); + if (n > 0) { + g_signal_emit (reader, + signals[DATA], + 0, + n, buffer); + } + + /* Signal error */ + + finished = TRUE; + break; + default: + break; + } } - - /* Signal error */ - - finished = TRUE; - break; - default: - break; - } + } while (io_status == G_IO_STATUS_NORMAL); } if (condition & G_IO_HUP || finished) { @@ -369,5 +388,3 @@ yelp_reader_read (YelpReader *reader, YelpURI *uri) g_assert_not_reached (); } } - - |