summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Hallendal <micke@codefactory.se>2002-05-17 23:28:49 +0000
committerMikael Hallendal <hallski@src.gnome.org>2002-05-17 23:28:49 +0000
commit43a631a402525808e38800dd6ca19554ba87c7ea (patch)
treec91669a6a303be164b971da1a368efd7fd818731
parent9dd1c80f1627a81ab41f140361a2cf5f8b9e7b5a (diff)
downloadyelp-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--ChangeLog19
-rw-r--r--src/yelp-html.c316
-rw-r--r--src/yelp-reader.c83
3 files changed, 140 insertions, 278 deletions
diff --git a/ChangeLog b/ChangeLog
index aba057dd..2feb7ceb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 ();
}
}
-
-