static GConfSchema * utils_get_schema (DBusMessageIter *main_iter) { DBusMessageIter struct_iter; gint32 type, list_type, car_type, cdr_type; const gchar *locale, *short_desc, *long_desc, *owner; const gchar *encoded; GConfSchema *schema; GConfValue *default_value; g_assert (dbus_message_iter_get_arg_type (main_iter) == DBUS_TYPE_STRUCT); dbus_message_iter_recurse (main_iter, &struct_iter); dbus_message_iter_get_basic (&struct_iter, &type); dbus_message_iter_next (&struct_iter); dbus_message_iter_get_basic (&struct_iter, &list_type); dbus_message_iter_next (&struct_iter); dbus_message_iter_get_basic (&struct_iter, &car_type); dbus_message_iter_next (&struct_iter); dbus_message_iter_get_basic (&struct_iter, &cdr_type); dbus_message_iter_next (&struct_iter); locale = utils_get_optional_string (&struct_iter); dbus_message_iter_next (&struct_iter); short_desc = utils_get_optional_string (&struct_iter); dbus_message_iter_next (&struct_iter); long_desc = utils_get_optional_string (&struct_iter); dbus_message_iter_next (&struct_iter); owner = utils_get_optional_string (&struct_iter); dbus_message_iter_next (&struct_iter); dbus_message_iter_get_basic (&struct_iter, &encoded); schema = gconf_schema_new (); gconf_schema_set_type (schema, type); gconf_schema_set_list_type (schema, list_type); gconf_schema_set_car_type (schema, car_type); gconf_schema_set_cdr_type (schema, cdr_type); if (locale) gconf_schema_set_locale (schema, locale); if (short_desc) gconf_schema_set_short_desc (schema, short_desc); if (long_desc) gconf_schema_set_long_desc (schema, long_desc); if (owner) gconf_schema_set_owner (schema, owner); if (*encoded != '\0') { default_value = gconf_value_decode (encoded); if (default_value) gconf_schema_set_default_value_nocopy (schema, default_value); } return schema; }
static void schema_subnode_extract_data(xmlNodePtr node, GConfSchema* sc) { gchar* sd_str; gchar* locale_str; GError* error = NULL; sd_str = my_xmlGetProp(node, "short_desc"); locale_str = my_xmlGetProp(node, "locale"); if (sd_str) { gconf_schema_set_short_desc(sc, sd_str); xmlFree(sd_str); } if (locale_str) { gconf_log(GCL_DEBUG, "found locale `%s'", locale_str); gconf_schema_set_locale(sc, locale_str); xmlFree(locale_str); } else { gconf_log(GCL_DEBUG, "found <%s> with no locale setting", node->name ? node->name : (unsigned char*) "null"); } if (node->xmlChildrenNode != NULL) { GConfValue* default_value = NULL; xmlChar* ld_str = NULL; GSList* bad_nodes = NULL; xmlNodePtr iter = node->xmlChildrenNode; while (iter != NULL) { if (iter->type == XML_ELEMENT_NODE) { if (default_value == NULL && strcmp((char *)iter->name, "default") == 0) { default_value = node_extract_value(iter, NULL, &error); if (error != NULL) { g_assert(default_value == NULL); gconf_log(GCL_WARNING, _("Failed reading default value for schema: %s"), error->message); g_error_free(error); error = NULL; bad_nodes = g_slist_prepend(bad_nodes, iter); } } else if (ld_str == NULL && strcmp((char *)iter->name, "longdesc") == 0) { ld_str = xmlNodeGetContent(iter); } else { bad_nodes = g_slist_prepend(bad_nodes, iter); } } else bad_nodes = g_slist_prepend(bad_nodes, iter); /* what is this node? */ iter = iter->next; } /* Remove the bad nodes from the parse tree */ if (bad_nodes != NULL) { GSList* tmp = bad_nodes; while (tmp != NULL) { xmlUnlinkNode(tmp->data); xmlFreeNode(tmp->data); tmp = g_slist_next(tmp); } g_slist_free(bad_nodes); } if (default_value != NULL) gconf_schema_set_default_value_nocopy(sc, default_value); if (ld_str) { gconf_schema_set_long_desc(sc, (char *)ld_str); xmlFree(ld_str); } } }