[devhelp] parser: use GIO to load the index files
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [devhelp] parser: use GIO to load the index files
- Date: Wed, 10 May 2017 17:30:24 +0000 (UTC)
commit 79354b33d931d7b8751c2da2541263af5c6282ef
Author: Sébastien Wilmet <swilmet gnome org>
Date: Wed May 10 18:31:43 2017 +0200
parser: use GIO to load the index files
To have more modern code, and to remove the zlib dependency.
The file is still loaded synchronously, it would require much more work
to have asychronous I/O in Devhelp.
configure.ac | 18 -------
src/Makefile.am | 7 +--
src/dh-parser.c | 144 +++++++++++++++++++------------------------------------
3 files changed, 52 insertions(+), 117 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index ad42694..4c8ecf8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -59,24 +59,6 @@ AX_PKG_CHECK_MODULES([DEVHELP],
[gio-2.0 >= 2.38 gtk+-3.0 >= 3.22 webkit2gtk-4.0 >= 2.6],
[gsettings-desktop-schemas])
-AC_ARG_WITH(zlib, [ --with-zlib=DIR use zlib in DIR], zlibdir=$with_zlib)
-have_zlib=no
-if test "x$zlibdir" != x; then
- ZLIB_CPPFLAGS=-I$zlibdir/include
- ZLIB_LDFLAGS=-L$zlibdir/lib
-fi
-save_CPPFLAGS="$CPPFLAGS"
-save_LDFLAGS="$LDFLAGS"
-CPPFLAGS="$CPPFLAGS $ZLIB_CPPFLAGS"
-LDFLAGS="$LDFLAGS $ZLIB_LDFLAGS"
-AC_CHECK_HEADERS(zlib.h, AC_CHECK_LIB(z, gzread, have_zlib=yes))
-CPPFLAGS="$save_CPPFLAGS"
-LDFLAGS="$save_LDFLAGS"
-ZLIB_LIBS=-lz
-AC_SUBST(ZLIB_CFLAGS)
-AC_SUBST(ZLIB_LDFLAGS)
-AC_SUBST(ZLIB_LIBS)
-
# i18n stuff
AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.19.7])
diff --git a/src/Makefile.am b/src/Makefile.am
index 5706e31..4664b36 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -113,23 +113,20 @@ nodist_libdevhelp_3_la_SOURCES = \
$(libdevhelp_built_sources)
libdevhelp_3_la_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- $(ZLIB_CPPFLAGS)
+ $(AM_CPPFLAGS)
libdevhelp_3_la_CFLAGS = \
$(DEVHELP_CFLAGS)
libdevhelp_3_la_LIBADD = \
$(DEVHELP_LIBS) \
- $(ZLIB_LIBS) \
$(LIBM)
libdevhelp_3_la_LDFLAGS = \
$(AM_LDFLAGS) \
-no-undefined \
-version-info $(LIBDEVHELP_LT_VERSION) \
- -export-symbols-regex ^dh_ \
- $(ZLIB_LDFLAGS)
+ -export-symbols-regex ^dh_
# The application
bin_PROGRAMS = devhelp
diff --git a/src/dh-parser.c b/src/dh-parser.c
index cccc049..5fd2e4b 100644
--- a/src/dh-parser.c
+++ b/src/dh-parser.c
@@ -21,9 +21,8 @@
#include "config.h"
#include "dh-parser.h"
+#include <gio/gio.h>
#include <string.h>
-#include <errno.h>
-#include <zlib.h>
#include <glib/gi18n-lib.h>
#include "dh-error.h"
@@ -482,55 +481,6 @@ parser_end_node_cb (GMarkupParseContext *context,
}
}
-static gboolean
-parser_read_gz_file (DhParser *parser,
- const gchar *path,
- GError **error)
-{
- gchar buf[BYTES_PER_READ];
- gzFile file;
-
- file = gzopen (path, "r");
- if (!file) {
- g_set_error (error,
- DH_ERROR,
- DH_ERROR_FILE_NOT_FOUND,
- "%s", g_strerror (errno));
- return FALSE;
- }
-
- while (TRUE) {
- gint bytes_read;
-
- bytes_read = gzread (file, buf, BYTES_PER_READ);
- if (bytes_read == -1) {
- gint err;
- const gchar *message;
-
- message = gzerror (file, &err);
- g_set_error (error,
- DH_ERROR,
- DH_ERROR_INTERNAL_ERROR,
- _("Cannot uncompress book '%s': %s"),
- path, message);
- return FALSE;
- }
-
- g_markup_parse_context_parse (parser->context, buf,
- bytes_read, error);
- if (error != NULL && *error != NULL) {
- return FALSE;
- }
- if (bytes_read < BYTES_PER_READ) {
- break;
- }
- }
-
- gzclose (file);
-
- return TRUE;
-}
-
gboolean
dh_parser_read_file (const gchar *index_file_path,
gchar **book_title,
@@ -540,11 +490,12 @@ dh_parser_read_file (const gchar *index_file_path,
GList **keywords,
GError **error)
{
- DhParser *parser;
- gboolean gz;
- GIOChannel *io = NULL;
- gchar buf[BYTES_PER_READ];
- gboolean result = TRUE;
+ DhParser *parser;
+ gboolean gz;
+ GFile *index_file = NULL;
+ GFileInputStream *file_input_stream = NULL;
+ GInputStream *input_stream = NULL;
+ gboolean ok = TRUE;
parser = g_new0 (DhParser, 1);
@@ -565,7 +516,6 @@ dh_parser_read_file (const gchar *index_file_path,
}
parser->markup_parser = g_new0 (GMarkupParser, 1);
-
parser->markup_parser->start_element = parser_start_node_cb;
parser->markup_parser->end_element = parser_end_node_cb;
@@ -578,54 +528,60 @@ dh_parser_read_file (const gchar *index_file_path,
parser->book_tree = book_tree;
parser->keywords = keywords;
- if (gz) {
- if (!parser_read_gz_file (parser,
- index_file_path,
- error)) {
- result = FALSE;
- }
+ index_file = g_file_new_for_path (index_file_path);
+ file_input_stream = g_file_read (index_file, NULL, error);
+ if (file_input_stream == NULL) {
+ ok = FALSE;
goto exit;
- } else {
- io = g_io_channel_new_file (index_file_path, "r", error);
- if (io == NULL) {
- result = FALSE;
- goto exit;
- }
+ }
- while (TRUE) {
- GIOStatus io_status;
- gsize bytes_read;
+ if (gz) {
+ GZlibDecompressor *zlib_decompressor;
- do {
- io_status = g_io_channel_read_chars (io, buf, BYTES_PER_READ,
- &bytes_read, error);
- } while (io_status == G_IO_STATUS_AGAIN);
+ zlib_decompressor = g_zlib_decompressor_new (G_ZLIB_COMPRESSOR_FORMAT_GZIP);
+ input_stream = g_converter_input_stream_new (G_INPUT_STREAM (file_input_stream),
+ G_CONVERTER (zlib_decompressor));
+ g_object_unref (zlib_decompressor);
+ } else {
+ input_stream = G_INPUT_STREAM (g_object_ref (file_input_stream));
+ }
- if (io_status == G_IO_STATUS_ERROR) {
- result = FALSE;
- goto exit;
- }
- if (io_status == G_IO_STATUS_EOF || io_status == G_IO_STATUS_ERROR) {
- break;
- }
- if (!g_markup_parse_context_parse (parser->context, buf,
- bytes_read, error)) {
- result = FALSE;
+ while (TRUE) {
+ gchar buffer[BYTES_PER_READ];
+ gssize bytes_read;
+
+ bytes_read = g_input_stream_read (input_stream,
+ buffer,
+ BYTES_PER_READ,
+ NULL,
+ error);
+
+ if (bytes_read > 0) {
+ if (!g_markup_parse_context_parse (parser->context,
+ buffer,
+ bytes_read,
+ error)) {
+ ok = FALSE;
goto exit;
}
- }
- if (!g_markup_parse_context_end_parse (parser->context, error)) {
- result = FALSE;
+ } else if (bytes_read == 0) {
+ /* End of file */
+ break;
+ } else {
+ ok = FALSE;
goto exit;
}
}
- exit:
- if (io != NULL) {
- g_io_channel_unref (io);
- }
+ if (!g_markup_parse_context_end_parse (parser->context, error))
+ ok = FALSE;
+
+exit:
+ g_clear_object (&index_file);
+ g_clear_object (&file_input_stream);
+ g_clear_object (&input_stream);
dh_parser_free (parser);
- return result;
+ return ok;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]