static void sop_sax_style (GsfXMLIn *xin, xmlChar const **attrs) { SheetObject *so = gnm_xml_in_cur_obj (xin); GnmSOPath *sop = GNM_SO_PATH (so); go_persist_prep_sax (GO_PERSIST (sop->style), xin, attrs); }
/* NOTE : every path through this must push something onto obj_stack. */ static void gogo_start (GsfXMLIn *xin, xmlChar const **attrs) { GogXMLReadState *state = (GogXMLReadState *)xin->user_state; xmlChar const *type = NULL, *role = NULL; GogObject *res; unsigned i; for (i = 0; attrs != NULL && attrs[i] && attrs[i+1] ; i += 2) if (0 == strcmp (attrs[i], "type")) type = attrs[i+1]; else if (0 == strcmp (attrs[i], "role")) role = attrs[i+1]; if (NULL != type) { GType t = g_type_from_name (type); if (t == 0) { res = (GogObject *)gog_plot_new_by_name (type); if (NULL == res) res = (GogObject *)gog_trend_line_new_by_name (type); } else if (g_type_is_a (t, GOG_TYPE_OBJECT) && !G_TYPE_IS_ABSTRACT (t)) res = g_object_new (t, NULL); else res = NULL; if (res == NULL) { g_warning ("unknown type '%s'", type); } if (GOG_IS_GRAPH (res)) ((GogGraph *) res)->doc = (GODoc *) g_object_get_data (G_OBJECT (gsf_xml_in_get_input (xin)), "document"); } else res = NULL; if (role != NULL) { if (strcmp (role, GOG_BACKPLANE_OLD_ROLE_NAME) == 0) res = gog_object_add_by_name (state->obj, GOG_BACKPLANE_NEW_ROLE_NAME, res); else res = gog_object_add_by_name (state->obj, role, res); } if (res != NULL) { res->explicitly_typed_role = (type != NULL); if (GO_IS_PERSIST (res)) go_persist_prep_sax (GO_PERSIST (res), xin, attrs); } state->obj_stack = g_slist_prepend (state->obj_stack, state->obj); state->obj = res; }
static void gogo_prop_start (GsfXMLIn *xin, xmlChar const **attrs) { GogXMLReadState *state = (GogXMLReadState *)xin->user_state; xmlChar const *prop_str = NULL, *type_str = NULL; GType prop_type; int i; if (NULL == state->obj) { state->prop_spec = NULL; return; } for (i = 0; attrs != NULL && attrs[i] && attrs[i+1] ; i += 2) if (0 == strcmp (attrs[i], "name")) prop_str = attrs[i+1]; else if (0 == strcmp (attrs[i], "type")) type_str = attrs[i+1]; if (prop_str == NULL) { g_warning ("missing name for property of class `%s'", G_OBJECT_TYPE_NAME (state->obj)); return; } state->prop_spec = g_object_class_find_property ( G_OBJECT_GET_CLASS (state->obj), prop_str); if (state->prop_spec == NULL) { g_warning ("unknown property `%s' for class `%s'", prop_str, G_OBJECT_TYPE_NAME (state->obj)); return; } prop_type = G_PARAM_SPEC_VALUE_TYPE (state->prop_spec); if (G_TYPE_FUNDAMENTAL (prop_type) == G_TYPE_OBJECT) { GType type; GogObject *obj; if (NULL == type_str) { g_warning ("missing type for property `%s' of class `%s'", prop_str, G_OBJECT_TYPE_NAME (state->obj)); return; } type = g_type_from_name (type_str); if (0 == type) { g_warning ("unknown type '%s' for property `%s' of class `%s'", type_str, prop_str, G_OBJECT_TYPE_NAME (state->obj)); return; } else if (!g_type_is_a (type, prop_type) || G_TYPE_IS_ABSTRACT (type)) { g_warning ("invalid type '%s' for property `%s' of class `%s'", type_str, prop_str, G_OBJECT_TYPE_NAME (state->obj)); return; } obj = g_object_new (type, NULL); g_return_if_fail (obj != NULL); state->obj_stack = g_slist_prepend (state->obj_stack, state->obj); state->obj = obj; state->prop_pushed_obj = TRUE; if (GO_IS_PERSIST (obj)) go_persist_prep_sax (GO_PERSIST (obj), xin, attrs); } }