GValue* kvp_frame_get_gvalue (KvpFrame *frame, const gchar *key) { KvpValue *kval = kvp_frame_get_value (frame, key); GValue *value = gvalue_from_kvp_value (kval); return value; }
/* Check if the session requires features unknown to this version of GnuCash. * * Returns a message to display if we found unknown features, NULL if we're okay. */ gchar *gnc_features_test_unknown (QofBook *book) { KvpFrame *frame = qof_book_get_slots (book); KvpValue *value; /* Setup the known_features hash table */ gnc_features_init(); g_assert(frame); value = kvp_frame_get_value(frame, "features"); if (value) { GList* features_list = NULL; frame = kvp_value_get_frame(value); g_assert(frame); /* Iterate over the members of this frame for unknown features */ kvp_frame_for_each_slot(frame, &gnc_features_test_one, &features_list); if (features_list) { GList *i; char* msg = g_strdup( _("This Dataset contains features not supported by this " "version of GnuCash. You must use a newer version of " "GnuCash in order to support the following features:" )); for (i = features_list; i; i = i->next) { char *tmp = g_strconcat(msg, "\n* ", i->data, NULL); g_free (msg); msg = tmp; } g_list_free(features_list); return msg; } } return NULL; }
xmlNodePtr kvp_frame_to_dom_tree(const char *tag, const KvpFrame *frame) { xmlNodePtr ret; const char ** keys; unsigned int i; if (!frame) { return NULL; } ret = xmlNewNode(NULL, BAD_CAST tag); keys = kvp_frame_get_keys(frame); for (i = 0; keys[i]; ++i) add_kvp_slot(keys[i], kvp_frame_get_value(frame, keys[i]), ret); g_free(keys); return ret; }
static void add_kvp_value_node(xmlNodePtr node, gchar *tag, KvpValue* val) { xmlNodePtr val_node; kvp_value_t kvp_type; kvp_type = kvp_value_get_type(val); if (kvp_type == KVP_TYPE_STRING) { gchar *newstr = g_strdup (kvp_value_get_string(val)); val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, checked_char_cast (newstr)); g_free (newstr); } else if (kvp_type == KVP_TYPE_TIMESPEC) val_node = NULL; else if (kvp_type == KVP_TYPE_GDATE) { GDate d = kvp_value_get_gdate(val); val_node = gdate_to_dom_tree(tag, &d); xmlAddChild (node, val_node); } else val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, NULL); switch (kvp_value_get_type(val)) { case KVP_TYPE_GINT64: add_text_to_node(val_node, "integer", g_strdup_printf("%" G_GINT64_FORMAT, kvp_value_get_gint64(val))); break; case KVP_TYPE_DOUBLE: add_text_to_node(val_node, "double", double_to_string(kvp_value_get_double(val))); break; case KVP_TYPE_NUMERIC: add_text_to_node(val_node, "numeric", gnc_numeric_to_string(kvp_value_get_numeric(val))); break; case KVP_TYPE_STRING: xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "string"); break; case KVP_TYPE_GUID: { gchar guidstr[GUID_ENCODING_LENGTH+1]; guid_to_string_buff(kvp_value_get_guid(val), guidstr); add_text_to_node(val_node, "guid", guidstr); break; } case KVP_TYPE_TIMESPEC: { Timespec ts = kvp_value_get_timespec (val); val_node = timespec_to_dom_tree (tag, &ts); xmlSetProp (val_node, BAD_CAST "type", BAD_CAST "timespec"); xmlAddChild (node, val_node); } break; case KVP_TYPE_GDATE: xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "gdate"); break; case KVP_TYPE_GLIST: { GList *cursor; xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "list"); for (cursor = kvp_value_get_glist(val); cursor; cursor = cursor->next) { KvpValue *val = (KvpValue*)cursor->data; add_kvp_value_node(val_node, "slot:value", val); } } break; case KVP_TYPE_FRAME: { KvpFrame *frame; const char ** keys; unsigned int i; xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "frame"); frame = kvp_value_get_frame (val); if (!frame) break; keys = kvp_frame_get_keys(frame); for (i = 0; keys[i]; ++i) add_kvp_slot(keys[i], kvp_frame_get_value(frame, keys[i]), val_node); g_free(keys); } break; default: break; } }