Skip to content

Commit d781217

Browse files
committed
libgimpconfig: add gimp_config_deserialize_stream()
and gimp_scanner_new_stream().
1 parent e7d9e01 commit d781217

File tree

5 files changed

+157
-71
lines changed

5 files changed

+157
-71
lines changed

libgimpconfig/gimpconfig-iface.c

+48
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,54 @@ gimp_config_deserialize_gfile (GimpConfig *config,
535535
return success;
536536
}
537537

538+
/**
539+
* gimp_config_deserialize_stream:
540+
* @config: a #GObject that implements the #GimpConfigInterface.
541+
* @input: the #GInputStream to read configuration from.
542+
* @data: user data passed to the deserialize implementation.
543+
* @error: return location for a possible error
544+
*
545+
* Reads configuration data from @input and configures @config
546+
* accordingly. Basically this function creates a properly configured
547+
* #GScanner for you and calls the deserialize function of the
548+
* @config's #GimpConfigInterface.
549+
*
550+
* Return value: %TRUE if deserialization succeeded, %FALSE otherwise.
551+
*
552+
* Since: GIMP 2.10
553+
**/
554+
gboolean
555+
gimp_config_deserialize_stream (GimpConfig *config,
556+
GInputStream *input,
557+
gpointer data,
558+
GError **error)
559+
{
560+
GScanner *scanner;
561+
gboolean success;
562+
563+
g_return_val_if_fail (GIMP_IS_CONFIG (config), FALSE);
564+
g_return_val_if_fail (G_IS_INPUT_STREAM (input), FALSE);
565+
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
566+
567+
scanner = gimp_scanner_new_stream (input, error);
568+
if (! scanner)
569+
return FALSE;
570+
571+
g_object_freeze_notify (G_OBJECT (config));
572+
573+
success = GIMP_CONFIG_GET_INTERFACE (config)->deserialize (config,
574+
scanner, 0, data);
575+
576+
g_object_thaw_notify (G_OBJECT (config));
577+
578+
gimp_scanner_destroy (scanner);
579+
580+
if (! success)
581+
g_assert (error == NULL || *error != NULL);
582+
583+
return success;
584+
}
585+
538586
/**
539587
* gimp_config_deserialize_string:
540588
* @config: a #GObject that implements the #GimpConfigInterface.

libgimpconfig/gimpconfig-iface.h

+4
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ gboolean gimp_config_deserialize_gfile (GimpConfig *config,
104104
GFile *file,
105105
gpointer data,
106106
GError **error);
107+
gboolean gimp_config_deserialize_stream (GimpConfig *config,
108+
GInputStream *input,
109+
gpointer data,
110+
GError **error);
107111
gboolean gimp_config_deserialize_string (GimpConfig *config,
108112
const gchar *text,
109113
gint text_len,

libgimpconfig/gimpconfig.def

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ EXPORTS
1212
gimp_config_deserialize_properties
1313
gimp_config_deserialize_property
1414
gimp_config_deserialize_return
15+
gimp_config_deserialize_stream
1516
gimp_config_deserialize_string
1617
gimp_config_diff
1718
gimp_config_duplicate
@@ -59,6 +60,7 @@ EXPORTS
5960
gimp_scanner_destroy
6061
gimp_scanner_new_file
6162
gimp_scanner_new_gfile
63+
gimp_scanner_new_stream
6264
gimp_scanner_new_string
6365
gimp_scanner_parse_boolean
6466
gimp_scanner_parse_color

libgimpconfig/gimpscanner.c

+70-40
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ GScanner *
109109
gimp_scanner_new_gfile (GFile *file,
110110
GError **error)
111111
{
112-
GScanner *scanner;
113-
gchar *path;
112+
GScanner *scanner;
113+
gchar *path;
114114

115115
g_return_val_if_fail (G_IS_FILE (file), NULL);
116116
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
@@ -148,9 +148,6 @@ gimp_scanner_new_gfile (GFile *file,
148148
else
149149
{
150150
GInputStream *input;
151-
GString *string;
152-
gchar buffer[4096];
153-
gsize bytes_read;
154151

155152
input = G_INPUT_STREAM (g_file_read (file, NULL, error));
156153

@@ -167,51 +164,84 @@ gimp_scanner_new_gfile (GFile *file,
167164
return NULL;
168165
}
169166

170-
string = g_string_new (NULL);
167+
g_object_set_data (G_OBJECT (input), "gimp-data", file);
171168

172-
do
173-
{
174-
GError *my_error = NULL;
175-
gboolean success;
169+
scanner = gimp_scanner_new_stream (input, error);
170+
171+
g_object_unref (input);
172+
}
173+
174+
return scanner;
175+
}
176+
177+
/**
178+
* gimp_scanner_new_stream:
179+
* @input: a #GInputStream
180+
* @error: return location for #GError, or %NULL
181+
*
182+
* Return value: The new #GScanner.
183+
*
184+
* Since: GIMP 2.10
185+
**/
186+
GScanner *
187+
gimp_scanner_new_stream (GInputStream *input,
188+
GError **error)
189+
{
190+
GScanner *scanner;
191+
GFile *file;
192+
const gchar *path;
193+
GString *string;
194+
gchar buffer[4096];
195+
gsize bytes_read;
196+
197+
g_return_val_if_fail (G_IS_INPUT_STREAM (input), NULL);
198+
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
199+
200+
file = g_object_get_data (G_OBJECT (input), "gimp-file");
201+
if (file)
202+
path = gimp_file_get_utf8_name (file);
203+
else
204+
path = "stream";
176205

177-
success = g_input_stream_read_all (input, buffer, sizeof (buffer),
178-
&bytes_read, NULL, &my_error);
206+
string = g_string_new (NULL);
179207

180-
if (bytes_read > 0)
181-
g_string_append_len (string, buffer, bytes_read);
208+
do
209+
{
210+
GError *my_error = NULL;
211+
gboolean success;
212+
213+
success = g_input_stream_read_all (input, buffer, sizeof (buffer),
214+
&bytes_read, NULL, &my_error);
215+
216+
if (bytes_read > 0)
217+
g_string_append_len (string, buffer, bytes_read);
182218

183-
if (! success)
219+
if (! success)
220+
{
221+
if (string->len > 0)
184222
{
185-
if (string->len > 0)
186-
{
187-
g_printerr ("%s: read error in '%s', trying to scan "
188-
"partial content: %s",
189-
G_STRFUNC, gimp_file_get_utf8_name (file),
190-
my_error->message);
191-
g_clear_error (&my_error);
192-
break;
193-
}
194-
195-
g_string_free (string, TRUE);
196-
g_object_unref (input);
197-
198-
g_propagate_error (error, my_error);
199-
200-
return NULL;
223+
g_printerr ("%s: read error in '%s', trying to scan "
224+
"partial content: %s",
225+
G_STRFUNC, path, my_error->message);
226+
g_clear_error (&my_error);
227+
break;
201228
}
202-
}
203-
while (bytes_read == sizeof (buffer));
204229

205-
g_object_unref (input);
230+
g_string_free (string, TRUE);
206231

207-
/* gimp_scanner_new() takes a "name" for the scanner, not a filename */
208-
scanner = gimp_scanner_new (gimp_file_get_utf8_name (file),
209-
NULL, string->str, error);
232+
g_propagate_error (error, my_error);
210233

211-
bytes_read = string->len;
212-
213-
g_scanner_input_text (scanner, g_string_free (string, FALSE), bytes_read);
234+
return NULL;
235+
}
214236
}
237+
while (bytes_read == sizeof (buffer));
238+
239+
/* gimp_scanner_new() takes a "name" for the scanner, not a filename */
240+
scanner = gimp_scanner_new (path, NULL, string->str, error);
241+
242+
bytes_read = string->len;
243+
244+
g_scanner_input_text (scanner, g_string_free (string, FALSE), bytes_read);
215245

216246
return scanner;
217247
}

libgimpconfig/gimpscanner.h

+33-31
Original file line numberDiff line numberDiff line change
@@ -28,38 +28,40 @@
2828
#define __GIMP_SCANNER_H__
2929

3030

31-
GScanner * gimp_scanner_new_file (const gchar *filename,
32-
GError **error);
33-
GScanner * gimp_scanner_new_gfile (GFile *file,
34-
GError **error);
35-
GScanner * gimp_scanner_new_string (const gchar *text,
36-
gint text_len,
37-
GError **error);
38-
void gimp_scanner_destroy (GScanner *scanner);
31+
GScanner * gimp_scanner_new_file (const gchar *filename,
32+
GError **error);
33+
GScanner * gimp_scanner_new_gfile (GFile *file,
34+
GError **error);
35+
GScanner * gimp_scanner_new_stream (GInputStream *input,
36+
GError **error);
37+
GScanner * gimp_scanner_new_string (const gchar *text,
38+
gint text_len,
39+
GError **error);
40+
void gimp_scanner_destroy (GScanner *scanner);
3941

40-
gboolean gimp_scanner_parse_token (GScanner *scanner,
41-
GTokenType token);
42-
gboolean gimp_scanner_parse_identifier (GScanner *scanner,
43-
const gchar *identifier);
44-
gboolean gimp_scanner_parse_string (GScanner *scanner,
45-
gchar **dest);
46-
gboolean gimp_scanner_parse_string_no_validate (GScanner *scanner,
47-
gchar **dest);
48-
gboolean gimp_scanner_parse_data (GScanner *scanner,
49-
gint length,
50-
guint8 **dest);
51-
gboolean gimp_scanner_parse_int (GScanner *scanner,
52-
gint *dest);
53-
gboolean gimp_scanner_parse_int64 (GScanner *scanner,
54-
gint64 *dest);
55-
gboolean gimp_scanner_parse_float (GScanner *scanner,
56-
gdouble *dest);
57-
gboolean gimp_scanner_parse_boolean (GScanner *scanner,
58-
gboolean *dest);
59-
gboolean gimp_scanner_parse_color (GScanner *scanner,
60-
GimpRGB *dest);
61-
gboolean gimp_scanner_parse_matrix2 (GScanner *scanner,
62-
GimpMatrix2 *dest);
42+
gboolean gimp_scanner_parse_token (GScanner *scanner,
43+
GTokenType token);
44+
gboolean gimp_scanner_parse_identifier (GScanner *scanner,
45+
const gchar *identifier);
46+
gboolean gimp_scanner_parse_string (GScanner *scanner,
47+
gchar **dest);
48+
gboolean gimp_scanner_parse_string_no_validate (GScanner *scanner,
49+
gchar **dest);
50+
gboolean gimp_scanner_parse_data (GScanner *scanner,
51+
gint length,
52+
guint8 **dest);
53+
gboolean gimp_scanner_parse_int (GScanner *scanner,
54+
gint *dest);
55+
gboolean gimp_scanner_parse_int64 (GScanner *scanner,
56+
gint64 *dest);
57+
gboolean gimp_scanner_parse_float (GScanner *scanner,
58+
gdouble *dest);
59+
gboolean gimp_scanner_parse_boolean (GScanner *scanner,
60+
gboolean *dest);
61+
gboolean gimp_scanner_parse_color (GScanner *scanner,
62+
GimpRGB *dest);
63+
gboolean gimp_scanner_parse_matrix2 (GScanner *scanner,
64+
GimpMatrix2 *dest);
6365

6466

6567
#endif /* __GIMP_SCANNER_H__ */

0 commit comments

Comments
 (0)