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

Reply via email to