Skip to content

Commit 16ca9a4

Browse files
committed
app: port gradient loading to GIO
1 parent 01878cc commit 16ca9a4

File tree

1 file changed

+94
-101
lines changed

1 file changed

+94
-101
lines changed

app/core/gimpgradient-load.c

+94-101
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323

2424
#include <cairo.h>
2525
#include <gegl.h>
26-
#include <glib/gstdio.h>
2726
#include <gdk-pixbuf/gdk-pixbuf.h>
2827

2928
#include "libgimpbase/gimpbase.h"
@@ -44,69 +43,60 @@ gimp_gradient_load (GimpContext *context,
4443
GFile *file,
4544
GError **error)
4645
{
47-
GimpGradient *gradient;
46+
GimpGradient *gradient = NULL;
4847
GimpGradientSegment *prev;
4948
gint num_segments;
5049
gint i;
51-
gchar *path;
52-
FILE *f;
53-
gchar line[1024];
50+
GInputStream *input;
51+
GDataInputStream *data_input;
52+
gchar *line;
53+
gsize line_len;
5454
gint linenum;
55+
GError *my_error = NULL;
5556

5657
g_return_val_if_fail (G_IS_FILE (file), NULL);
57-
58-
path = g_file_get_path (file);
59-
60-
g_return_val_if_fail (g_path_is_absolute (path), NULL);
6158
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
6259

63-
f = g_fopen (path, "rb");
64-
g_free (path);
65-
66-
if (! f)
60+
input = G_INPUT_STREAM (g_file_read (file, NULL, &my_error));
61+
if (! input)
6762
{
6863
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
6964
_("Could not open '%s' for reading: %s"),
70-
gimp_file_get_utf8_name (file), g_strerror (errno));
65+
gimp_file_get_utf8_name (file), my_error->message);
66+
g_clear_error (&my_error);
7167
return NULL;
7268
}
7369

70+
data_input = g_data_input_stream_new (input);
71+
g_object_unref (input);
72+
7473
linenum = 1;
75-
if (! fgets (line, sizeof (line), f))
76-
{
77-
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
78-
_("Fatal parse error in gradient file '%s': "
79-
"Read error in line %d."),
80-
gimp_file_get_utf8_name (file), linenum);
81-
fclose (f);
82-
return NULL;
83-
}
74+
line_len = 1024;
75+
line = g_data_input_stream_read_line (data_input, &line_len,
76+
NULL, &my_error);
77+
if (! line)
78+
goto failed;
8479

8580
if (! g_str_has_prefix (line, "GIMP Gradient"))
8681
{
87-
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
88-
_("Fatal parse error in gradient file '%s': "
89-
"Not a GIMP gradient file."),
90-
gimp_file_get_utf8_name (file));
91-
fclose (f);
92-
return NULL;
82+
g_set_error (&my_error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
83+
_("Not a GIMP gradient file."));
84+
g_free (line);
85+
goto failed;
9386
}
9487

88+
g_free (line);
89+
9590
gradient = g_object_new (GIMP_TYPE_GRADIENT,
9691
"mime-type", "application/x-gimp-gradient",
9792
NULL);
9893

9994
linenum++;
100-
if (! fgets (line, sizeof (line), f))
101-
{
102-
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
103-
_("Fatal parse error in gradient file '%s': "
104-
"Read error in line %d."),
105-
gimp_file_get_utf8_name (file), linenum);
106-
fclose (f);
107-
g_object_unref (gradient);
108-
return NULL;
109-
}
95+
line_len = 1024;
96+
line = g_data_input_stream_read_line (data_input, &line_len,
97+
NULL, &my_error);
98+
if (! line)
99+
goto failed;
110100

111101
if (g_str_has_prefix (line, "Name: "))
112102
{
@@ -117,17 +107,14 @@ gimp_gradient_load (GimpContext *context,
117107
gimp_file_get_utf8_name (file));
118108
gimp_object_take_name (GIMP_OBJECT (gradient), utf8);
119109

110+
g_free (line);
111+
120112
linenum++;
121-
if (! fgets (line, sizeof (line), f))
122-
{
123-
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
124-
_("Fatal parse error in gradient file '%s': "
125-
"Read error in line %d."),
126-
gimp_file_get_utf8_name (file), linenum);
127-
fclose (f);
128-
g_object_unref (gradient);
129-
return NULL;
130-
}
113+
line_len = 1024;
114+
line = g_data_input_stream_read_line (data_input, &line_len,
115+
NULL, &my_error);
116+
if (! line)
117+
goto failed;
131118
}
132119
else /* old gradient format */
133120
{
@@ -137,15 +124,13 @@ gimp_gradient_load (GimpContext *context,
137124

138125
num_segments = atoi (line);
139126

127+
g_free (line);
128+
140129
if (num_segments < 1)
141130
{
142-
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
143-
_("Fatal parse error in gradient file '%s': "
144-
"File is corrupt in line %d."),
145-
gimp_file_get_utf8_name (file), linenum);
146-
g_object_unref (gradient);
147-
fclose (f);
148-
return NULL;
131+
g_set_error (&my_error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
132+
_("File is corrupt."));
133+
goto failed;
149134
}
150135

151136
prev = NULL;
@@ -154,10 +139,6 @@ gimp_gradient_load (GimpContext *context,
154139
{
155140
GimpGradientSegment *seg;
156141
gchar *end;
157-
gint color;
158-
gint type;
159-
gint left_color_type;
160-
gint right_color_type;
161142

162143
seg = gimp_gradient_segment_new ();
163144

@@ -169,16 +150,11 @@ gimp_gradient_load (GimpContext *context,
169150
gradient->segments = seg;
170151

171152
linenum++;
172-
if (! fgets (line, sizeof (line), f))
173-
{
174-
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
175-
_("Fatal parse error in gradient file '%s': "
176-
"Read error in line %d."),
177-
gimp_file_get_utf8_name (file), linenum);
178-
fclose (f);
179-
g_object_unref (gradient);
180-
return NULL;
181-
}
153+
line_len = 1024;
154+
line = g_data_input_stream_read_line (data_input, &line_len,
155+
NULL, &my_error);
156+
if (! line)
157+
goto failed;
182158

183159
seg->left = g_ascii_strtod (line, &end);
184160
if (end && errno != ERANGE)
@@ -206,6 +182,11 @@ gimp_gradient_load (GimpContext *context,
206182

207183
if (errno != ERANGE)
208184
{
185+
gint color;
186+
gint type;
187+
gint left_color_type;
188+
gint right_color_type;
189+
209190
switch (sscanf (end, "%d %d %d %d",
210191
&type, &color,
211192
&left_color_type, &right_color_type))
@@ -221,55 +202,67 @@ gimp_gradient_load (GimpContext *context,
221202
break;
222203

223204
default:
224-
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
225-
_("Fatal parse error in gradient file '%s': "
226-
"Corrupt segment %d in line %d."),
227-
gimp_file_get_utf8_name (file), i, linenum);
228-
g_object_unref (gradient);
229-
fclose (f);
230-
return NULL;
205+
g_set_error (&my_error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
206+
_("Corrupt segment %d."), i);
207+
goto failed;
231208
}
232209
}
233210
else
234211
{
235-
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
236-
_("Fatal parse error in gradient file '%s': "
237-
"Corrupt segment %d in line %d."),
238-
gimp_file_get_utf8_name (file), i, linenum);
239-
g_object_unref (gradient);
240-
fclose (f);
241-
return NULL;
212+
g_set_error (&my_error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
213+
_("Corrupt segment %d."), i);
214+
goto failed;
242215
}
243216

244-
if ( (prev && (prev->right < seg->left))
245-
|| (!prev && (0. < seg->left) ))
217+
if (( prev && (prev->right < seg->left)) ||
218+
(! prev && (0.0 < seg->left)))
246219
{
247-
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
248-
_("Gradient file '%s' is corrupt: "
249-
"Segments do not span the range 0-1."),
250-
gimp_file_get_utf8_name (file));
251-
g_object_unref (gradient);
252-
fclose (f);
253-
return NULL;
220+
g_set_error (&my_error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
221+
_("Segments do not span the range 0-1."));
222+
goto failed;
254223
}
255224

256225
prev = seg;
257226
}
258227

259228
if (prev->right < 1.0)
260229
{
261-
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
262-
_("Gradient file '%s' is corrupt: "
263-
"Segments do not span the range 0-1."),
264-
gimp_file_get_utf8_name (file));
265-
g_object_unref (gradient);
266-
fclose (f);
267-
return NULL;
230+
g_set_error (&my_error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
231+
_("Segments do not span the range 0-1."));
232+
goto failed;
268233
}
269234

270-
fclose (f);
235+
g_object_unref (data_input);
271236

272237
return g_list_prepend (NULL, gradient);
238+
239+
failed:
240+
241+
g_object_unref (data_input);
242+
243+
if (gradient)
244+
g_object_unref (gradient);
245+
246+
if (error && *error == NULL)
247+
{
248+
gchar *msg;
249+
250+
if (my_error)
251+
msg = g_strdup_printf (_("Error in line %d: %s"), linenum,
252+
my_error->message);
253+
else
254+
msg = g_strdup_printf (_("File is truncated in line %d"), linenum);
255+
256+
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
257+
_("Error while reading gradient file '%s': %s"),
258+
gimp_file_get_utf8_name (file), msg);
259+
260+
g_free (msg);
261+
}
262+
263+
g_clear_error (&my_error);
264+
265+
return NULL;
273266
}
274267

275268

0 commit comments

Comments
 (0)