static KvpFrame * kvp_frame_add_value_nc(KvpFrame * frame, const char * path, KvpValue *value) { char *key = NULL; KvpValue *oldvalue; KvpFrame* orig_frame = frame; frame = (KvpFrame *) get_trailer_or_null (frame, path, &key); oldvalue = kvp_frame_get_slot (frame, key); ENTER ("old frame=%s", kvp_frame_to_string(frame)); if (oldvalue) { /* If already a glist here, just append */ if (KVP_TYPE_GLIST == oldvalue->type) { GList * vlist = oldvalue->value.list; vlist = g_list_append (vlist, value); oldvalue->value.list = vlist; } else /* If some other value, convert it to a glist */ { KvpValue *klist; GList *vlist = NULL; vlist = g_list_append (vlist, oldvalue); vlist = g_list_append (vlist, value); klist = kvp_value_new_glist_nc (vlist); kvp_frame_replace_slot_nc (frame, key, klist); } LEAVE ("new frame=%s", kvp_frame_to_string(frame)); return frame; } /* Hmm, if we are here, the path doesn't exist. We need to * create the path, add the value to it. */ frame = orig_frame; frame = kvp_frame_set_value_nc (frame, path, value); LEAVE ("new frame=%s", kvp_frame_to_string(frame)); return frame; }
KvpValue* kvp_value_from_gvalue (const GValue *gval) { KvpValue *val = NULL; GType type = G_VALUE_TYPE (gval); g_return_val_if_fail (G_VALUE_TYPE (gval), NULL); if (type == G_TYPE_INT64) val = kvp_value_new_gint64 (g_value_get_int64 (gval)); else if (type == G_TYPE_DOUBLE) val = kvp_value_new_double (g_value_get_double (gval)); else if (type == GNC_TYPE_NUMERIC) val = kvp_value_new_numeric (*(gnc_numeric*)g_value_get_boxed (gval)); else if (type == G_TYPE_STRING) val = kvp_value_new_string (g_value_get_string (gval)); else if (type == GNC_TYPE_GUID) val = kvp_value_new_guid ((GncGUID*)g_value_get_boxed (gval)); else if (type == GNC_TYPE_TIMESPEC) val = kvp_value_new_timespec (*(Timespec*)g_value_get_boxed (gval)); else if (type == G_TYPE_DATE) val = kvp_value_new_gdate (*(GDate*)g_value_get_boxed (gval)); else if (type == GNC_TYPE_VALUE_LIST) { GList *gvalue_list = (GList*)g_value_get_boxed (gval); GList *kvp_list = NULL; g_list_foreach (gvalue_list, (GFunc)kvp_value_list_from_gvalue, &kvp_list); kvp_list = g_list_reverse (kvp_list); val = kvp_value_new_glist_nc (kvp_list); // g_list_free_full (gvalue_list, (GDestroyNotify)g_value_unset); // gvalue_list = NULL; } else PWARN ("Error! Don't know how to make a KvpValue from a %s", G_VALUE_TYPE_NAME (gval)); return val; }
static void set_guid_val( gpointer pObject, /*@ null @*/ gpointer pValue ) { slot_info_t* pInfo = (slot_info_t*)pObject; g_return_if_fail( pObject != NULL ); if ( pValue == NULL ) return; switch ( pInfo->value_type) { case KVP_TYPE_GUID: { KvpValue *value = kvp_value_new_guid( (GncGUID*)pValue ); set_slot_from_value( pInfo, value ); break; } case KVP_TYPE_GLIST: { slot_info_t *newInfo = slot_info_copy( pInfo, (GncGUID*)pValue ); kvp_value *pValue = NULL; gchar *key = get_key_from_path( pInfo->path ); newInfo->context = LIST; slots_load_info( newInfo ); pValue = kvp_value_new_glist_nc( newInfo->pList ); kvp_frame_set_slot_nc(pInfo->pKvpFrame, key, pValue); g_string_free( newInfo->path, TRUE ); g_slice_free( slot_info_t, newInfo ); g_free( key ); break; } case KVP_TYPE_FRAME: { slot_info_t *newInfo = slot_info_copy( pInfo, (GncGUID*)pValue ) ; KvpFrame *newFrame = kvp_frame_new(); newInfo->pKvpFrame = newFrame; switch ( pInfo->context ) { case LIST: { KvpValue *value = kvp_value_new_frame_nc( newFrame ); gchar *key = get_key_from_path( pInfo->path ); newInfo->path = g_string_assign( newInfo->path, key ); pInfo->pList = g_list_append( pInfo->pList, value ); g_free( key ); break; } case FRAME: default: { gchar *key = get_key_from_path( pInfo->path ); kvp_frame_set_frame_nc( pInfo->pKvpFrame, key, newFrame ); g_free( key ); break; } } newInfo->context = FRAME; slots_load_info ( newInfo ); g_string_free( newInfo->path, TRUE ); g_slice_free( slot_info_t, newInfo ); break; } default: break; } }