[gimp] libgimpconfig: add gimp_config_deserialize_stream()
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] libgimpconfig: add gimp_config_deserialize_stream()
- Date: Fri, 4 Jul 2014 01:35:22 +0000 (UTC)
commit d7812173f4499e69eb6e868f8ffd06bbbf9a6ef8
Author: Michael Natterer <mitch gimp org>
Date: Fri Jul 4 03:29:09 2014 +0200
libgimpconfig: add gimp_config_deserialize_stream()
and gimp_scanner_new_stream().
libgimpconfig/gimpconfig-iface.c | 48 ++++++++++++++++
libgimpconfig/gimpconfig-iface.h | 4 ++
libgimpconfig/gimpconfig.def | 2 +
libgimpconfig/gimpscanner.c | 110 ++++++++++++++++++++++++--------------
libgimpconfig/gimpscanner.h | 64 +++++++++++-----------
5 files changed, 157 insertions(+), 71 deletions(-)
---
diff --git a/libgimpconfig/gimpconfig-iface.c b/libgimpconfig/gimpconfig-iface.c
index 1d48c3e..9710de9 100644
--- a/libgimpconfig/gimpconfig-iface.c
+++ b/libgimpconfig/gimpconfig-iface.c
@@ -536,6 +536,54 @@ gimp_config_deserialize_gfile (GimpConfig *config,
}
/**
+ * gimp_config_deserialize_stream:
+ * @config: a #GObject that implements the #GimpConfigInterface.
+ * @input: the #GInputStream to read configuration from.
+ * @data: user data passed to the deserialize implementation.
+ * @error: return location for a possible error
+ *
+ * Reads configuration data from @input and configures @config
+ * accordingly. Basically this function creates a properly configured
+ * #GScanner for you and calls the deserialize function of the
+ * @config's #GimpConfigInterface.
+ *
+ * Return value: %TRUE if deserialization succeeded, %FALSE otherwise.
+ *
+ * Since: GIMP 2.10
+ **/
+gboolean
+gimp_config_deserialize_stream (GimpConfig *config,
+ GInputStream *input,
+ gpointer data,
+ GError **error)
+{
+ GScanner *scanner;
+ gboolean success;
+
+ g_return_val_if_fail (GIMP_IS_CONFIG (config), FALSE);
+ g_return_val_if_fail (G_IS_INPUT_STREAM (input), FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ scanner = gimp_scanner_new_stream (input, error);
+ if (! scanner)
+ return FALSE;
+
+ g_object_freeze_notify (G_OBJECT (config));
+
+ success = GIMP_CONFIG_GET_INTERFACE (config)->deserialize (config,
+ scanner, 0, data);
+
+ g_object_thaw_notify (G_OBJECT (config));
+
+ gimp_scanner_destroy (scanner);
+
+ if (! success)
+ g_assert (error == NULL || *error != NULL);
+
+ return success;
+}
+
+/**
* gimp_config_deserialize_string:
* @config: a #GObject that implements the #GimpConfigInterface.
* @text: string to deserialize (in UTF-8 encoding)
diff --git a/libgimpconfig/gimpconfig-iface.h b/libgimpconfig/gimpconfig-iface.h
index e582b4d..03cf121 100644
--- a/libgimpconfig/gimpconfig-iface.h
+++ b/libgimpconfig/gimpconfig-iface.h
@@ -104,6 +104,10 @@ gboolean gimp_config_deserialize_gfile (GimpConfig *config,
GFile *file,
gpointer data,
GError **error);
+gboolean gimp_config_deserialize_stream (GimpConfig *config,
+ GInputStream *input,
+ gpointer data,
+ GError **error);
gboolean gimp_config_deserialize_string (GimpConfig *config,
const gchar *text,
gint text_len,
diff --git a/libgimpconfig/gimpconfig.def b/libgimpconfig/gimpconfig.def
index 57a3800..f3c558f 100644
--- a/libgimpconfig/gimpconfig.def
+++ b/libgimpconfig/gimpconfig.def
@@ -12,6 +12,7 @@ EXPORTS
gimp_config_deserialize_properties
gimp_config_deserialize_property
gimp_config_deserialize_return
+ gimp_config_deserialize_stream
gimp_config_deserialize_string
gimp_config_diff
gimp_config_duplicate
@@ -59,6 +60,7 @@ EXPORTS
gimp_scanner_destroy
gimp_scanner_new_file
gimp_scanner_new_gfile
+ gimp_scanner_new_stream
gimp_scanner_new_string
gimp_scanner_parse_boolean
gimp_scanner_parse_color
diff --git a/libgimpconfig/gimpscanner.c b/libgimpconfig/gimpscanner.c
index bd3b2e7..756ee4e 100644
--- a/libgimpconfig/gimpscanner.c
+++ b/libgimpconfig/gimpscanner.c
@@ -109,8 +109,8 @@ GScanner *
gimp_scanner_new_gfile (GFile *file,
GError **error)
{
- GScanner *scanner;
- gchar *path;
+ GScanner *scanner;
+ gchar *path;
g_return_val_if_fail (G_IS_FILE (file), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
@@ -148,9 +148,6 @@ gimp_scanner_new_gfile (GFile *file,
else
{
GInputStream *input;
- GString *string;
- gchar buffer[4096];
- gsize bytes_read;
input = G_INPUT_STREAM (g_file_read (file, NULL, error));
@@ -167,51 +164,84 @@ gimp_scanner_new_gfile (GFile *file,
return NULL;
}
- string = g_string_new (NULL);
+ g_object_set_data (G_OBJECT (input), "gimp-data", file);
- do
- {
- GError *my_error = NULL;
- gboolean success;
+ scanner = gimp_scanner_new_stream (input, error);
+
+ g_object_unref (input);
+ }
+
+ return scanner;
+}
+
+/**
+ * gimp_scanner_new_stream:
+ * @input: a #GInputStream
+ * @error: return location for #GError, or %NULL
+ *
+ * Return value: The new #GScanner.
+ *
+ * Since: GIMP 2.10
+ **/
+GScanner *
+gimp_scanner_new_stream (GInputStream *input,
+ GError **error)
+{
+ GScanner *scanner;
+ GFile *file;
+ const gchar *path;
+ GString *string;
+ gchar buffer[4096];
+ gsize bytes_read;
+
+ g_return_val_if_fail (G_IS_INPUT_STREAM (input), NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ file = g_object_get_data (G_OBJECT (input), "gimp-file");
+ if (file)
+ path = gimp_file_get_utf8_name (file);
+ else
+ path = "stream";
- success = g_input_stream_read_all (input, buffer, sizeof (buffer),
- &bytes_read, NULL, &my_error);
+ string = g_string_new (NULL);
- if (bytes_read > 0)
- g_string_append_len (string, buffer, bytes_read);
+ do
+ {
+ GError *my_error = NULL;
+ gboolean success;
+
+ success = g_input_stream_read_all (input, buffer, sizeof (buffer),
+ &bytes_read, NULL, &my_error);
+
+ if (bytes_read > 0)
+ g_string_append_len (string, buffer, bytes_read);
- if (! success)
+ if (! success)
+ {
+ if (string->len > 0)
{
- if (string->len > 0)
- {
- g_printerr ("%s: read error in '%s', trying to scan "
- "partial content: %s",
- G_STRFUNC, gimp_file_get_utf8_name (file),
- my_error->message);
- g_clear_error (&my_error);
- break;
- }
-
- g_string_free (string, TRUE);
- g_object_unref (input);
-
- g_propagate_error (error, my_error);
-
- return NULL;
+ g_printerr ("%s: read error in '%s', trying to scan "
+ "partial content: %s",
+ G_STRFUNC, path, my_error->message);
+ g_clear_error (&my_error);
+ break;
}
- }
- while (bytes_read == sizeof (buffer));
- g_object_unref (input);
+ g_string_free (string, TRUE);
- /* gimp_scanner_new() takes a "name" for the scanner, not a filename */
- scanner = gimp_scanner_new (gimp_file_get_utf8_name (file),
- NULL, string->str, error);
+ g_propagate_error (error, my_error);
- bytes_read = string->len;
-
- g_scanner_input_text (scanner, g_string_free (string, FALSE), bytes_read);
+ return NULL;
+ }
}
+ while (bytes_read == sizeof (buffer));
+
+ /* gimp_scanner_new() takes a "name" for the scanner, not a filename */
+ scanner = gimp_scanner_new (path, NULL, string->str, error);
+
+ bytes_read = string->len;
+
+ g_scanner_input_text (scanner, g_string_free (string, FALSE), bytes_read);
return scanner;
}
diff --git a/libgimpconfig/gimpscanner.h b/libgimpconfig/gimpscanner.h
index 6592dba..c53de80 100644
--- a/libgimpconfig/gimpscanner.h
+++ b/libgimpconfig/gimpscanner.h
@@ -28,38 +28,40 @@
#define __GIMP_SCANNER_H__
-GScanner * gimp_scanner_new_file (const gchar *filename,
- GError **error);
-GScanner * gimp_scanner_new_gfile (GFile *file,
- GError **error);
-GScanner * gimp_scanner_new_string (const gchar *text,
- gint text_len,
- GError **error);
-void gimp_scanner_destroy (GScanner *scanner);
+GScanner * gimp_scanner_new_file (const gchar *filename,
+ GError **error);
+GScanner * gimp_scanner_new_gfile (GFile *file,
+ GError **error);
+GScanner * gimp_scanner_new_stream (GInputStream *input,
+ GError **error);
+GScanner * gimp_scanner_new_string (const gchar *text,
+ gint text_len,
+ GError **error);
+void gimp_scanner_destroy (GScanner *scanner);
-gboolean gimp_scanner_parse_token (GScanner *scanner,
- GTokenType token);
-gboolean gimp_scanner_parse_identifier (GScanner *scanner,
- const gchar *identifier);
-gboolean gimp_scanner_parse_string (GScanner *scanner,
- gchar **dest);
-gboolean gimp_scanner_parse_string_no_validate (GScanner *scanner,
- gchar **dest);
-gboolean gimp_scanner_parse_data (GScanner *scanner,
- gint length,
- guint8 **dest);
-gboolean gimp_scanner_parse_int (GScanner *scanner,
- gint *dest);
-gboolean gimp_scanner_parse_int64 (GScanner *scanner,
- gint64 *dest);
-gboolean gimp_scanner_parse_float (GScanner *scanner,
- gdouble *dest);
-gboolean gimp_scanner_parse_boolean (GScanner *scanner,
- gboolean *dest);
-gboolean gimp_scanner_parse_color (GScanner *scanner,
- GimpRGB *dest);
-gboolean gimp_scanner_parse_matrix2 (GScanner *scanner,
- GimpMatrix2 *dest);
+gboolean gimp_scanner_parse_token (GScanner *scanner,
+ GTokenType token);
+gboolean gimp_scanner_parse_identifier (GScanner *scanner,
+ const gchar *identifier);
+gboolean gimp_scanner_parse_string (GScanner *scanner,
+ gchar **dest);
+gboolean gimp_scanner_parse_string_no_validate (GScanner *scanner,
+ gchar **dest);
+gboolean gimp_scanner_parse_data (GScanner *scanner,
+ gint length,
+ guint8 **dest);
+gboolean gimp_scanner_parse_int (GScanner *scanner,
+ gint *dest);
+gboolean gimp_scanner_parse_int64 (GScanner *scanner,
+ gint64 *dest);
+gboolean gimp_scanner_parse_float (GScanner *scanner,
+ gdouble *dest);
+gboolean gimp_scanner_parse_boolean (GScanner *scanner,
+ gboolean *dest);
+gboolean gimp_scanner_parse_color (GScanner *scanner,
+ GimpRGB *dest);
+gboolean gimp_scanner_parse_matrix2 (GScanner *scanner,
+ GimpMatrix2 *dest);
#endif /* __GIMP_SCANNER_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]