Re: GConf and storing GSList - how?



Hi Jukka,

I have a problem that I haven't found the answer to, despite looking for source codes.

I am using gconf 2.6, and I would like to store a list of integers into the gconf (to keep track of bookmarks).

I use following kind of code (actually separated into different functions, but here for clarity shortened, removed error checks etc):

GConfValue *conf_value;
gconf_value = gconf_client_get_without_default(gconf_client, KEY_BOOKMARKS_LIST, NULL);
GSList *list = gconf_value_get_list(gconf_value);
g_slist_foreach(list, add_bookmark_to_list, NULL);

void add_bookmark_to_list(gpointer list_data, gpointer user_data)
{
	gint bookmark_id;
	gint *tmp = list_data;
	bookmark_id = *tmp; /***/
}

/***/: If I understand correctly, this should return the numeric value that the list item holds. But this always has the value 2. If I put *(tmp + 1) here, it works correctly, but I have no idea why.

Now, the same problem occurs when saving the list. But I have no idea in what format the numbers should be appended to list. I am using following:

[...]
g_slist_append(list_copy, GINT_TO_POINTER(bookmark_id))
gconf_client_set_list(gconf_client, KEY_BOOKMARKS_LIST, GCONF_VALUE_INT,
	list_copy, NULL);
g_slist_free(list_copy);
[...]

This, however, saves just random data to the gconf.

This all hints that there is some container, for example a struct, used internally in GConf, and those are stored to GSList, but I haven't found any clarification to this by searching the source codes.

Could someone tell how can I fix this problem?
The problem is that the GSList which is manipulated by GConf when dealing with value lists is a GSList of GConfValue objects (which all are expected to have the same GConfValueType), and not a GSList of integers, or of pointers to integers (your code above is inconsistent, the callback function assumes the GSList contains pointers to bookmark ids, while your saving function passes the integer off as a pointer directly).

So you need to interpret list_data as GConfValue, and then do a gconf_value_get_int on the result, while when saving you need to build GConfValue objects with your integers in it, and append these GConfValue objects to the GSList you pass to set_list.

The reason your callback code "works" when using *(tmp + 1) is that list_data is a GConfValue *, meaning its first word is the GConfValueType (the 2 you're consistently getting) and the rest of the memory is the union containing the actual value (in your case the integer) so if you go over the type you end up pointing to your int.

Cyrille




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]