* plugins/class-gen/element-editor.c: Fixed typo.
[anjuta-git-plugin.git] / libanjuta / anjuta-serializer.c
blob62d84fadfebc85c725323fde4eddd45ed72366bc
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * anjuta-serializer.c
4 * Copyright (C) 2000 Naba Kumar <naba@gnome.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Library General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 #include <stdio.h>
21 #include <anjuta-enum-types.h>
22 #include "anjuta-serializer.h"
24 static void anjuta_serializer_class_init(AnjutaSerializerClass *klass);
25 static void anjuta_serializer_init(AnjutaSerializer *sp);
26 static void anjuta_serializer_finalize(GObject *object);
28 struct _AnjutaSerializerPrivate {
29 AnjutaSerializerMode mode;
30 gchar *filepath;
31 FILE *stream;
34 static GObjectClass *parent_class = NULL;
36 enum
38 PROP_0,
39 PROP_FILEPATH,
40 PROP_MODE
43 GType
44 anjuta_serializer_get_type (void)
46 static GType type = 0;
48 if(type == 0) {
49 static const GTypeInfo our_info = {
50 sizeof (AnjutaSerializerClass),
51 NULL,
52 NULL,
53 (GClassInitFunc)anjuta_serializer_class_init,
54 NULL,
55 NULL,
56 sizeof (AnjutaSerializer),
58 (GInstanceInitFunc)anjuta_serializer_init,
61 type = g_type_register_static(G_TYPE_OBJECT,
62 "AnjutaSerializer", &our_info, 0);
65 return type;
68 static void
69 anjuta_serializer_set_property (GObject * object,
70 guint property_id,
71 const GValue * value, GParamSpec * pspec)
73 AnjutaSerializer *self = ANJUTA_SERIALIZER (object);
74 g_return_if_fail (value != NULL);
75 g_return_if_fail (pspec != NULL);
77 switch (property_id)
79 case PROP_MODE:
80 self->priv->mode = g_value_get_enum (value);
81 break;
82 case PROP_FILEPATH:
83 g_free (self->priv->filepath);
84 self->priv->filepath = g_value_dup_string (value);
85 if (self->priv->stream)
86 fclose (self->priv->stream);
87 if (self->priv->mode == ANJUTA_SERIALIZER_READ)
88 self->priv->stream = fopen (self->priv->filepath, "r");
89 else
90 self->priv->stream = fopen (self->priv->filepath, "w");
91 if (self->priv->stream == NULL)
94 g_warning ("Could not open %s for serialization: %s",
95 self->priv->filepath, g_strerror (errno));
98 break;
99 default:
100 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
104 static void
105 anjuta_serializer_get_property (GObject * object,
106 guint property_id,
107 GValue * value, GParamSpec * pspec)
109 AnjutaSerializer *self = ANJUTA_SERIALIZER (object);
111 g_return_if_fail(value != NULL);
112 g_return_if_fail(pspec != NULL);
114 switch (property_id)
116 case PROP_MODE:
117 g_value_set_enum (value, self->priv->mode);
118 break;
119 case PROP_FILEPATH:
120 g_value_set_string (value, self->priv->filepath);
121 break;
122 default:
123 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
127 static void
128 anjuta_serializer_class_init (AnjutaSerializerClass *klass)
130 GObjectClass *object_class = G_OBJECT_CLASS(klass);
132 parent_class = g_type_class_peek_parent(klass);
133 object_class->finalize = anjuta_serializer_finalize;
134 object_class->set_property = anjuta_serializer_set_property;
135 object_class->get_property = anjuta_serializer_get_property;
137 g_object_class_install_property (object_class,
138 PROP_FILEPATH,
139 g_param_spec_string ("filepath",
140 "File path",
141 "Used to store and retrieve the stream"
142 "translateable",
143 NULL,
144 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
145 g_object_class_install_property (object_class,
146 PROP_MODE,
147 g_param_spec_enum ("mode",
148 "Serialization mode",
149 "Used to decide read or write operation",
150 ANJUTA_TYPE_SERIALIZER_MODE,
151 ANJUTA_SERIALIZER_READ,
152 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
155 static void
156 anjuta_serializer_init (AnjutaSerializer *obj)
158 obj->priv = g_new0 (AnjutaSerializerPrivate, 1);
161 static void
162 anjuta_serializer_finalize (GObject *object)
164 AnjutaSerializer *cobj;
165 cobj = ANJUTA_SERIALIZER(object);
167 g_free (cobj->priv->filepath);
168 if (cobj->priv->stream)
169 fclose (cobj->priv->stream);
170 g_free (cobj->priv);
171 G_OBJECT_CLASS (parent_class)->finalize (object);
174 AnjutaSerializer *
175 anjuta_serializer_new (const gchar *filepath, AnjutaSerializerMode mode)
177 AnjutaSerializer *obj;
179 obj = ANJUTA_SERIALIZER (g_object_new (ANJUTA_TYPE_SERIALIZER,
180 "mode", mode,
181 "filepath", filepath, NULL));
182 if (obj->priv->stream == NULL)
184 g_object_unref (obj);
185 return NULL;
187 return obj;
190 static gboolean
191 anjuta_serializer_write_buffer (AnjutaSerializer *serializer,
192 const gchar *name, const gchar *value)
194 gint length;
195 gchar *buffer;
197 g_return_val_if_fail (ANJUTA_IS_SERIALIZER (serializer), FALSE);
198 g_return_val_if_fail (serializer->priv->stream != NULL, FALSE);
199 g_return_val_if_fail (serializer->priv->mode == ANJUTA_SERIALIZER_WRITE,
200 FALSE);
201 g_return_val_if_fail (name != NULL, FALSE);
202 g_return_val_if_fail (value != NULL, FALSE);
204 buffer = g_strconcat (name, ": ", value, NULL);
205 length = strlen (buffer);
206 if (fprintf (serializer->priv->stream, "%d\n", length) < 1)
208 g_free (buffer);
209 return FALSE;
211 if (fwrite (buffer, length, 1, serializer->priv->stream) < 1)
213 g_free (buffer);
214 return FALSE;
216 if (fprintf (serializer->priv->stream, "\n") < 0)
218 g_free (buffer);
219 return FALSE;
221 g_free (buffer);
222 return TRUE;
225 static gboolean
226 anjuta_serializer_read_buffer (AnjutaSerializer *serializer,
227 const gchar *name, gchar **value)
229 gint length;
230 gchar *buffer;
232 g_return_val_if_fail (ANJUTA_IS_SERIALIZER (serializer), FALSE);
233 g_return_val_if_fail (serializer->priv->stream != NULL, FALSE);
234 g_return_val_if_fail (serializer->priv->mode == ANJUTA_SERIALIZER_READ,
235 FALSE);
236 g_return_val_if_fail (name != NULL, FALSE);
237 g_return_val_if_fail (value != NULL, FALSE);
239 if (fscanf (serializer->priv->stream, "%d\n", &length) < 1)
240 return FALSE;
242 buffer = g_new0 (gchar, length + 1);
243 if (fread (buffer, length, 1, serializer->priv->stream) < 1)
245 g_free (buffer);
246 return FALSE;
248 if (fscanf (serializer->priv->stream, "\n") < 0)
250 g_free (buffer);
251 return FALSE;
253 if (strncmp (buffer, name, strlen (name)) != 0)
255 g_free (buffer);
256 return FALSE;
258 if (strncmp (buffer + strlen (name), ": ", 2) != 0)
260 g_free (buffer);
261 return FALSE;
263 strcpy (buffer, buffer + strlen (name) + 2);
264 *value = buffer;
266 return TRUE;
269 gboolean
270 anjuta_serializer_write_int (AnjutaSerializer *serializer,
271 const gchar *name, gint value)
273 gchar buffer[64];
274 snprintf (buffer, 64, "%d", value);
275 return anjuta_serializer_write_buffer (serializer, name, buffer);
278 gboolean
279 anjuta_serializer_write_float (AnjutaSerializer *serializer,
280 const gchar *name, gfloat value)
282 gchar buffer[64];
283 snprintf (buffer, 64, "%f", value);
284 return anjuta_serializer_write_buffer (serializer, name, buffer);
287 gboolean
288 anjuta_serializer_write_string (AnjutaSerializer *serializer,
289 const gchar *name, const gchar *value)
291 if (value)
292 return anjuta_serializer_write_buffer (serializer, name, value);
293 else
294 return anjuta_serializer_write_buffer (serializer, name, "(null)");
297 gboolean
298 anjuta_serializer_read_int (AnjutaSerializer *serializer,
299 const gchar *name, gint *value)
301 gchar *buffer;
303 g_return_val_if_fail (value != NULL, FALSE);
305 if (!anjuta_serializer_read_buffer (serializer, name, &buffer))
306 return FALSE;
307 *value = atoi (buffer);
308 g_free (buffer);
309 return TRUE;
312 gboolean
313 anjuta_serializer_read_float (AnjutaSerializer *serializer,
314 const gchar *name, gfloat *value)
316 gchar *buffer;
318 g_return_val_if_fail (value != NULL, FALSE);
320 if (!anjuta_serializer_read_buffer (serializer, name, &buffer))
321 return FALSE;
322 *value = atof (buffer);
323 g_free (buffer);
324 return TRUE;
327 gboolean
328 anjuta_serializer_read_string (AnjutaSerializer *serializer,
329 const gchar *name, gchar **value,
330 gboolean replace)
332 gchar *buffer;
334 g_return_val_if_fail (value != NULL, FALSE);
336 if (!anjuta_serializer_read_buffer (serializer, name, &buffer))
337 return FALSE;
338 if (replace)
339 g_free (*value);
340 if (strcmp (buffer, "(null)") == 0)
342 g_free (buffer);
343 *value = NULL;
345 else
347 *value = buffer;
349 return TRUE;