The attached patch fixes the G_TYPE_ENUM/G_TYPE_FLAGS saving/restoring
to/from XML streams. Previously, the libgsf routines
glade_enum_from_string and glade_flags_from_string were unable to
determine the enum/flags type, which is required to look up strings like
"FOO_FLAGS_BAR" against the "FooFlags" type.
Not passing fundamental types to the libgsf helper in goffice didn't
have any negative consequences for me so far, and it shouldn't unless we
have non-GObject, non-flags and non-enum (i.e. weird) types that are not
fundamentals. I've added some debugging code for the purpose of
determining such issues.
--
Christian Neumair <[EMAIL PROTECTED]>
Index: goffice/graph/gog-object-xml.c
===================================================================
RCS file: /cvs/gnome/goffice/goffice/graph/gog-object-xml.c,v
retrieving revision 1.25
diff -u -p -r1.25 gog-object-xml.c
--- goffice/graph/gog-object-xml.c 8 Apr 2006 17:53:41 -0000 1.25
+++ goffice/graph/gog-object-xml.c 26 Nov 2006 18:54:51 -0000
@@ -116,7 +116,7 @@ gog_object_set_arg_full (char const *nam
g_object_unref (val_obj);
}
}
- } else if (!gsf_xml_gvalue_from_str (&res, G_TYPE_FUNDAMENTAL (prop_type), val))
+ } else if (!gsf_xml_gvalue_from_str (&res, prop_type, val))
success = FALSE;
if (!success) {
@@ -150,6 +150,7 @@ gog_object_write_property_sax (GogObject
return;
}
+
switch (G_TYPE_FUNDAMENTAL (prop_type)) {
case G_TYPE_CHAR:
case G_TYPE_UCHAR:
@@ -159,7 +160,9 @@ gog_object_write_property_sax (GogObject
case G_TYPE_LONG:
case G_TYPE_ULONG:
case G_TYPE_FLOAT:
- case G_TYPE_DOUBLE: {
+ case G_TYPE_DOUBLE:
+ case G_TYPE_ENUM:
+ case G_TYPE_FLAGS: {
GValue str = { 0 };
g_value_init (&str, G_TYPE_STRING);
g_value_transform (&value, &str);
@@ -196,7 +199,8 @@ gog_object_write_property_sax (GogObject
break;
default:
- ;
+ g_warning ("I could not persist property \"%s\", since type \"%s\" is unhandled.",
+ g_param_spec_get_name (pspec), g_type_name (G_TYPE_FUNDAMENTAL(prop_type)));
}
g_value_unset (&value);
}
Index: gsf/gsf-libxml.c
===================================================================
RCS file: /cvs/gnome/libgsf/gsf/gsf-libxml.c,v
retrieving revision 1.72
diff -u -p -r1.72 gsf-libxml.c
--- gsf/gsf-libxml.c 21 Nov 2006 02:59:45 -0000 1.72
+++ gsf/gsf-libxml.c 26 Nov 2006 18:53:12 -0000
@@ -204,6 +204,17 @@ gsf_xml_gvalue_from_str (GValue *res, GT
g_return_val_if_fail (str != NULL, FALSE);
g_value_init (res, t);
+
+ /* If the passed-in type is derived from G_TYPE_ENUM
+ * or G_TYPE_FLAGS, we cannot switch on its type
+ * because we don't know its GType at compile time.
+ * We just pretend to have a G_TYPE_ENUM/G_TYPE_FLAGS.
+ */
+ if (G_TYPE_FUNDAMENTAL (t) == G_TYPE_ENUM ||
+ G_TYPE_FUNDAMENTAL (t) == G_TYPE_FLAGS) {
+ t = G_TYPE_FUNDAMENTAL (t);
+ }
+
switch (t) {
case G_TYPE_CHAR:
g_value_set_char (res, str[0]);
@@ -230,10 +241,10 @@ gsf_xml_gvalue_from_str (GValue *res, GT
g_value_set_ulong (res, strtoul (str, NULL, 0));
break;
case G_TYPE_ENUM:
- g_value_set_enum (res, glade_enum_from_string (t, str));
+ g_value_set_enum (res, glade_enum_from_string (G_VALUE_TYPE (res), str));
break;
case G_TYPE_FLAGS:
- g_value_set_flags (res, glade_flags_from_string (t, str));
+ g_value_set_flags (res, glade_flags_from_string (G_VALUE_TYPE (res), str));
break;
case G_TYPE_FLOAT:
g_value_set_float (res, g_strtod (str, NULL));
@@ -252,7 +263,7 @@ gsf_xml_gvalue_from_str (GValue *res, GT
gsf_value_set_timestamp (res, &ts);
break;
}
- }
+ } else g_warning ("gsf_xml_gvalue_from_str(): Don't know how to handle type '%s'", g_type_name (t));
return FALSE;
}
_______________________________________________
gnumeric-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gnumeric-list