23
23
24
24
#include <cairo.h>
25
25
#include <gegl.h>
26
- #include <glib/gstdio.h>
27
26
#include <gdk-pixbuf/gdk-pixbuf.h>
28
27
29
28
#include "libgimpbase/gimpbase.h"
@@ -44,69 +43,60 @@ gimp_gradient_load (GimpContext *context,
44
43
GFile * file ,
45
44
GError * * error )
46
45
{
47
- GimpGradient * gradient ;
46
+ GimpGradient * gradient = NULL ;
48
47
GimpGradientSegment * prev ;
49
48
gint num_segments ;
50
49
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 ;
54
54
gint linenum ;
55
+ GError * my_error = NULL ;
55
56
56
57
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 );
61
58
g_return_val_if_fail (error == NULL || * error == NULL , NULL );
62
59
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 )
67
62
{
68
63
g_set_error (error , GIMP_DATA_ERROR , GIMP_DATA_ERROR_OPEN ,
69
64
_ ("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 );
71
67
return NULL ;
72
68
}
73
69
70
+ data_input = g_data_input_stream_new (input );
71
+ g_object_unref (input );
72
+
74
73
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 ;
84
79
85
80
if (! g_str_has_prefix (line , "GIMP Gradient" ))
86
81
{
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 ;
93
86
}
94
87
88
+ g_free (line );
89
+
95
90
gradient = g_object_new (GIMP_TYPE_GRADIENT ,
96
91
"mime-type" , "application/x-gimp-gradient" ,
97
92
NULL );
98
93
99
94
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 ;
110
100
111
101
if (g_str_has_prefix (line , "Name: " ))
112
102
{
@@ -117,17 +107,14 @@ gimp_gradient_load (GimpContext *context,
117
107
gimp_file_get_utf8_name (file ));
118
108
gimp_object_take_name (GIMP_OBJECT (gradient ), utf8 );
119
109
110
+ g_free (line );
111
+
120
112
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 ;
131
118
}
132
119
else /* old gradient format */
133
120
{
@@ -137,15 +124,13 @@ gimp_gradient_load (GimpContext *context,
137
124
138
125
num_segments = atoi (line );
139
126
127
+ g_free (line );
128
+
140
129
if (num_segments < 1 )
141
130
{
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 ;
149
134
}
150
135
151
136
prev = NULL ;
@@ -154,10 +139,6 @@ gimp_gradient_load (GimpContext *context,
154
139
{
155
140
GimpGradientSegment * seg ;
156
141
gchar * end ;
157
- gint color ;
158
- gint type ;
159
- gint left_color_type ;
160
- gint right_color_type ;
161
142
162
143
seg = gimp_gradient_segment_new ();
163
144
@@ -169,16 +150,11 @@ gimp_gradient_load (GimpContext *context,
169
150
gradient -> segments = seg ;
170
151
171
152
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 ;
182
158
183
159
seg -> left = g_ascii_strtod (line , & end );
184
160
if (end && errno != ERANGE )
@@ -206,6 +182,11 @@ gimp_gradient_load (GimpContext *context,
206
182
207
183
if (errno != ERANGE )
208
184
{
185
+ gint color ;
186
+ gint type ;
187
+ gint left_color_type ;
188
+ gint right_color_type ;
189
+
209
190
switch (sscanf (end , "%d %d %d %d" ,
210
191
& type , & color ,
211
192
& left_color_type , & right_color_type ))
@@ -221,55 +202,67 @@ gimp_gradient_load (GimpContext *context,
221
202
break ;
222
203
223
204
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 ;
231
208
}
232
209
}
233
210
else
234
211
{
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 ;
242
215
}
243
216
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 )))
246
219
{
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 ;
254
223
}
255
224
256
225
prev = seg ;
257
226
}
258
227
259
228
if (prev -> right < 1.0 )
260
229
{
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 ;
268
233
}
269
234
270
- fclose ( f );
235
+ g_object_unref ( data_input );
271
236
272
237
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 ;
273
266
}
274
267
275
268
0 commit comments