Index: src/core-utils/gnc-gkeyfile-utils.c =================================================================== --- src/core-utils/gnc-gkeyfile-utils.c (revision 15413) +++ src/core-utils/gnc-gkeyfile-utils.c (working copy) @@ -146,5 +146,129 @@ return success; } + +/* Compatability functions to handle reading key names both with and + * without embedded spaces. The 2.0 release uses names containing + * spaces, while 2.2 uses names without spaces. These functions allow + * you to fall back to using 2.0 after trying a 2.2 release. */ + +static gchar * +gnc_key_file_translate_key (const gchar *key) +{ + gchar **parts, *part, *newkey; + gint j; + + parts = g_strsplit(key, " ", -1); + for (j = 0, part = parts[j++]; part; part = parts[j++]) + part[0] = g_ascii_toupper(part[0]); + newkey = g_strjoinv("", parts); + g_strfreev(parts); + + return newkey; +} + + +gboolean +gnc_key_file_get_boolean (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + gchar *new_key; + gboolean result; + GError *local_error = NULL; + + result = g_key_file_get_boolean (key_file, group_name, key, &local_error); + if (local_error == NULL) + return result; + if ((local_error->domain == G_KEY_FILE_ERROR) && + (local_error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)) { + g_clear_error(&local_error); + new_key = gnc_key_file_translate_key(key); + result = g_key_file_get_boolean (key_file, group_name, new_key, &local_error); + g_free(new_key); + } + if (local_error) + g_propagate_error(error, local_error); + return result; +} + +gint +gnc_key_file_get_integer (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + gchar *new_key; + gint result; + GError *local_error = NULL; + + result = g_key_file_get_integer (key_file, group_name, key, &local_error); + if (local_error == NULL) + return result; + if ((local_error->domain == G_KEY_FILE_ERROR) && + (local_error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)) { + g_clear_error(&local_error); + new_key = gnc_key_file_translate_key(key); + result = g_key_file_get_integer (key_file, group_name, new_key, &local_error); + g_free(new_key); + } + if (local_error) + g_propagate_error(error, local_error); + return result; +} + +gint * +gnc_key_file_get_integer_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) +{ + gchar *new_key; + gint *result; + GError *local_error = NULL; + + result = g_key_file_get_integer_list (key_file, group_name, key, length, &local_error); + if (local_error == NULL) + return result; + if ((local_error->domain == G_KEY_FILE_ERROR) && + (local_error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)) { + g_clear_error(&local_error); + new_key = gnc_key_file_translate_key(key); + result = g_key_file_get_integer_list (key_file, group_name, new_key, length, &local_error); + g_free(new_key); + } + if (local_error) + g_propagate_error(error, local_error); + return result; +} + +gchar * +gnc_key_file_get_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + gchar *new_key; + gchar *result; + GError *local_error = NULL; + + result = g_key_file_get_string (key_file, group_name, key, &local_error); + if (local_error == NULL) + return result; + if ((local_error->domain == G_KEY_FILE_ERROR) && + (local_error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)) { + g_clear_error(&local_error); + new_key = gnc_key_file_translate_key(key); + result = g_key_file_get_string (key_file, group_name, new_key, &local_error); + g_free(new_key); + } + if (local_error) + g_propagate_error(error, local_error); + return result; +} + + /** @} */ /** @} */ Index: src/core-utils/gnc-gkeyfile-utils.h =================================================================== --- src/core-utils/gnc-gkeyfile-utils.h (revision 15413) +++ src/core-utils/gnc-gkeyfile-utils.h (working copy) @@ -77,6 +77,31 @@ GKeyFile *key_file, GError **error); + + +/* Compatability functions to handle reading key names both with and + * without embedded spaces. The 2.0 release uses names containing + * spaces, while 2.2 uses names without spaces. These functions allow + * you to fall back to using 2.0 after trying a 2.2 release. */ +gboolean gnc_key_file_get_boolean (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +gint gnc_key_file_get_integer (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +gint *gnc_key_file_get_integer_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error); +gchar *gnc_key_file_get_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); + + #endif /* GNC_GKEYFILE_UTILS_H */ /** @} */ /** @} */ Index: src/report/report-gnome/gnc-plugin-page-report.c =================================================================== --- src/report/report-gnome/gnc-plugin-page-report.c (revision 15413) +++ src/report/report-gnome/gnc-plugin-page-report.c (working copy) @@ -58,6 +58,7 @@ #include "gnc-html-history.h" #include "gnc-html.h" #include "gnc-file.h" +#include "gnc-gkeyfile-utils.h" #include "gnc-plugin.h" #include "gnc-plugin-page-report.h" #include "gnc-report.h" @@ -646,6 +647,7 @@ * options. */ #define SCHEME_OPTIONS "Scheme Options" #define SCHEME_OPTIONS_N "Scheme Options %d" +#define SCHEME_OPTIONS_NEW "SchemeOptions" /** Save enough information about this report page that it can be @@ -759,9 +761,10 @@ } for (i = 0; i < num_keys; i++) { - if (strncmp(keys[i], SCHEME_OPTIONS, strlen(SCHEME_OPTIONS)) != 0) + if ((strncmp(keys[i], SCHEME_OPTIONS, strlen(SCHEME_OPTIONS)) != 0) && + (strncmp(keys[i], SCHEME_OPTIONS_NEW, strlen(SCHEME_OPTIONS_NEW)) != 0)) continue; - option_string = g_key_file_get_string(key_file, group_name, + option_string = gnc_key_file_get_string(key_file, group_name, keys[i], &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -780,7 +783,8 @@ } if (final_id == SCM_BOOL_F) { - if (strcmp(keys[i], SCHEME_OPTIONS) == 0) { + if ((strcmp(keys[i], SCHEME_OPTIONS) == 0) || + (strcmp(keys[i], SCHEME_OPTIONS_NEW) == 0)) { final_id = scm_id; } } Index: src/business/business-gnome/dialog-invoice.c =================================================================== --- src/business/business-gnome/dialog-invoice.c (revision 15413) +++ src/business/business-gnome/dialog-invoice.c (working copy) @@ -38,6 +38,7 @@ #include "gnc-component-manager.h" #include "gnc-ui.h" #include "gnc-gconf-utils.h" +#include "gnc-gkeyfile-utils.h" #include "gnc-gui-query.h" #include "gnc-ui-util.h" #include "qof.h" @@ -1703,7 +1704,7 @@ GncOwner owner = { 0 }; /* Get Invoice Type */ - tmp_string = g_key_file_get_string(key_file, group_name, + tmp_string = gnc_key_file_get_string(key_file, group_name, KEY_INVOICE_TYPE, &error); if (error) { g_warning("Error reading group %s key %s: %s.", @@ -1714,7 +1715,7 @@ g_free(tmp_string); /* Get Invoice GUID */ - tmp_string = g_key_file_get_string(key_file, group_name, + tmp_string = gnc_key_file_get_string(key_file, group_name, KEY_INVOICE_GUID, &error); if (error) { g_warning("Error reading group %s key %s: %s.", @@ -1734,7 +1735,7 @@ g_free(tmp_string); /* Get Owner Type */ - owner_type = g_key_file_get_string(key_file, group_name, + owner_type = gnc_key_file_get_string(key_file, group_name, KEY_OWNER_TYPE, &error); if (error) { g_warning("Error reading group %s key %s: %s.", @@ -1743,7 +1744,7 @@ } /* Get Owner GUID */ - tmp_string = g_key_file_get_string(key_file, group_name, + tmp_string = gnc_key_file_get_string(key_file, group_name, KEY_OWNER_GUID, &error); if (error) { g_warning("Error reading group %s key %s: %s.", Index: src/gnome-utils/gnc-main-window.c =================================================================== --- src/gnome-utils/gnc-main-window.c (revision 15413) +++ src/gnome-utils/gnc-main-window.c (working copy) @@ -439,7 +439,7 @@ priv = GNC_MAIN_WINDOW_GET_PRIVATE(window); page_group = g_strdup_printf(PAGE_STRING, data->page_offset + data->page_num); - page_type = g_key_file_get_string(data->key_file, page_group, + page_type = gnc_key_file_get_string(data->key_file, page_group, PAGE_TYPE, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -467,7 +467,7 @@ } /* Restore the page name */ - name = g_key_file_get_string(data->key_file, page_group, + name = gnc_key_file_get_string(data->key_file, page_group, PAGE_NAME, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -517,7 +517,7 @@ window_group = g_strdup_printf(WINDOW_STRING, data->window_num + 1); /* Get this window's notebook info */ - page_count = g_key_file_get_integer(data->key_file, + page_count = gnc_key_file_get_integer(data->key_file, window_group, WINDOW_PAGECOUNT, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -529,7 +529,7 @@ * check doesn't hurt anything. */ goto cleanup; } - page_start = g_key_file_get_integer(data->key_file, + page_start = gnc_key_file_get_integer(data->key_file, window_group, WINDOW_FIRSTPAGE, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -550,7 +550,7 @@ priv = GNC_MAIN_WINDOW_GET_PRIVATE(window); /* Get the window coordinates, etc. */ - pos = g_key_file_get_integer_list(data->key_file, window_group, + pos = gnc_key_file_get_integer_list(data->key_file, window_group, WINDOW_POSITION, &length, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -568,7 +568,7 @@ g_free(pos); } - geom = g_key_file_get_integer_list(data->key_file, window_group, + geom = gnc_key_file_get_integer_list(data->key_file, window_group, WINDOW_GEOMETRY, &length, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -586,7 +586,7 @@ g_free(geom); } - max = g_key_file_get_boolean(data->key_file, window_group, + max = gnc_key_file_get_boolean(data->key_file, window_group, WINDOW_MAXIMIZED, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -600,7 +600,7 @@ /* Common view menu items */ action = gnc_main_window_find_action(window, "ViewToolbarAction"); visible = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)); - desired_visibility = g_key_file_get_boolean(data->key_file, window_group, + desired_visibility = gnc_key_file_get_boolean(data->key_file, window_group, TOOLBAR_VISIBLE, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -613,7 +613,7 @@ action = gnc_main_window_find_action(window, "ViewSummaryAction"); visible = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)); - desired_visibility = g_key_file_get_boolean(data->key_file, window_group, + desired_visibility = gnc_key_file_get_boolean(data->key_file, window_group, SUMMARYBAR_VISIBLE, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -626,7 +626,7 @@ action = gnc_main_window_find_action(window, "ViewStatusbarAction"); visible = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)); - desired_visibility = g_key_file_get_boolean(data->key_file, window_group, + desired_visibility = gnc_key_file_get_boolean(data->key_file, window_group, STATUSBAR_VISIBLE, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -651,7 +651,7 @@ /* Restore page ordering within the notebook. Use +1 notation so the * numbers in the page order match the page sections, at least for * the one window case. */ - order = g_key_file_get_integer_list(data->key_file, window_group, + order = gnc_key_file_get_integer_list(data->key_file, window_group, WINDOW_PAGEORDER, &length, &error); if (error) { g_warning("error reading group %s key %s: %s", @@ -697,7 +697,7 @@ /* We use the same struct for reading and for writing, so we cast away the const. */ data.key_file = (GKeyFile *) keyfile; - window_count = g_key_file_get_integer(data.key_file, STATE_FILE_TOP, + window_count = gnc_key_file_get_integer(data.key_file, STATE_FILE_TOP, WINDOW_COUNT, &error); if (error) { g_warning("error reading group %s key %s: %s", Index: src/gnome-utils/gnc-tree-view-account.c =================================================================== --- src/gnome-utils/gnc-tree-view-account.c (revision 15413) +++ src/gnome-utils/gnc-tree-view-account.c (working copy) @@ -43,6 +43,7 @@ #include "gnc-commodity.h" #include "gnc-component-manager.h" #include "gnc-engine.h" +#include "gnc-gkeyfile-utils.h" #include "gnc-glib-utils.h" #include "gnc-gobject-utils.h" #include "gnc-hooks.h" @@ -2054,7 +2055,7 @@ gboolean show; /* Filter information. Ignore missing keys. */ - show = g_key_file_get_boolean(key_file, group_name, SHOW_HIDDEN, &error); + show = gnc_key_file_get_boolean(key_file, group_name, SHOW_HIDDEN, &error); if (error) { g_warning("error reading group %s key %s: %s", group_name, SHOW_HIDDEN, error->message); @@ -2064,7 +2065,7 @@ } fd->show_hidden = show; - show = g_key_file_get_boolean(key_file, group_name, SHOW_ZERO, &error); + show = gnc_key_file_get_boolean(key_file, group_name, SHOW_ZERO, &error); if (error) { g_warning("error reading group %s key %s: %s", group_name, SHOW_ZERO, error->message); @@ -2074,7 +2075,7 @@ } fd->show_zero_total = show; - i = g_key_file_get_integer(key_file, group_name, ACCT_TYPES, &error); + i = gnc_key_file_get_integer(key_file, group_name, ACCT_TYPES, &error); if (error) { g_warning("error reading group %s key %s: %s", group_name, ACCT_TYPES, error->message); @@ -2085,11 +2086,11 @@ fd->visible_types = i; /* Expanded accounts. Skip if count key missing. */ - count = g_key_file_get_integer(key_file, group_name, ACCT_COUNT, &error); + count = gnc_key_file_get_integer(key_file, group_name, ACCT_COUNT, &error); if (error == NULL) { for (i = 1; i <= count; i++) { key = g_strdup_printf(ACCT_OPEN, i); - value = g_key_file_get_string(key_file, group_name, key, &error); + value = gnc_key_file_get_string(key_file, group_name, key, &error); if (error) { g_warning("error reading group %s key %s: %s", group_name, key, error->message); @@ -2107,7 +2108,7 @@ } /* Selected account (if any) */ - value = g_key_file_get_string(key_file, group_name, ACCT_SELECTED, NULL); + value = gnc_key_file_get_string(key_file, group_name, ACCT_SELECTED, NULL); if (value) { tree_restore_selected_row(view, value); g_free(value); Index: src/gnome/gnc-plugin-page-register.c =================================================================== --- src/gnome/gnc-plugin-page-register.c (revision 15413) +++ src/gnome/gnc-plugin-page-register.c (working copy) @@ -58,6 +58,7 @@ #include "gnc-date-edit.h" #include "gnc-engine.h" #include "gnc-event.h" +#include "gnc-gkeyfile-utils.h" #include "gnc-gnome-utils.h" #include "gnc-gobject-utils.h" #include "gnc-gui-query.h" @@ -931,7 +932,7 @@ priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page); /* Convert the style name to an index */ - style_name = g_key_file_get_string(key_file, group_name, + style_name = gnc_key_file_get_string(key_file, group_name, KEY_REGISTER_STYLE, &error); for (i = 0 ; style_names[i]; i++) { if (g_ascii_strcasecmp(style_name, style_names[i]) == 0) { @@ -950,7 +951,7 @@ /* Update the double line action on this page */ use_double_line = - g_key_file_get_boolean(key_file, group_name, KEY_DOUBLE_LINE, &error); + gnc_key_file_get_boolean(key_file, group_name, KEY_DOUBLE_LINE, &error); DEBUG("Setting double_line_mode: %d", use_double_line); action = gnc_plugin_page_get_action(page, "ViewStyleDoubleLineAction"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), use_double_line); @@ -985,14 +986,14 @@ ENTER("key_file %p, group_name %s", key_file, group_name); /* Create the new page. */ - reg_type = g_key_file_get_string(key_file, group_name, + reg_type = gnc_key_file_get_string(key_file, group_name, KEY_REGISTER_TYPE, &error); DEBUG("Page type: %s", reg_type); if ((g_ascii_strcasecmp(reg_type, LABEL_ACCOUNT) == 0) || (g_ascii_strcasecmp(reg_type, LABEL_SUBACCOUNT) == 0)) { include_subs = (g_ascii_strcasecmp(reg_type, LABEL_SUBACCOUNT) == 0); DEBUG("Include subs: %d", include_subs); - acct_name = g_key_file_get_string(key_file, group_name, + acct_name = gnc_key_file_get_string(key_file, group_name, KEY_ACCOUNT_NAME, &error); book = qof_session_get_book(gnc_get_current_session()); account = xaccGetAccountFromFullName(xaccGetAccountGroup(book), Index: src/gnome/top-level.c =================================================================== --- src/gnome/top-level.c (revision 15413) +++ src/gnome/top-level.c (working copy) @@ -271,7 +271,7 @@ #endif /* validate top level info */ - file_guid = g_key_file_get_string(keyfile, STATE_FILE_TOP, + file_guid = gnc_key_file_get_string(keyfile, STATE_FILE_TOP, STATE_FILE_BOOK_GUID, &error); if (error) { g_warning("error reading group %s key %s: %s", Index: src/gnome/gnc-plugin-page-budget.c =================================================================== --- src/gnome/gnc-plugin-page-budget.c (revision 15413) +++ src/gnome/gnc-plugin-page-budget.c (working copy) @@ -48,6 +48,7 @@ #include "dialog-options.h" #include "dialog-utils.h" +#include "gnc-gkeyfile-utils.h" #include "gnc-gnome-utils.h" #include "gnc-html.h" #include "gnc-icons.h" @@ -525,7 +526,7 @@ g_return_val_if_fail(group_name, NULL); ENTER("key_file %p, group_name %s", key_file, group_name); - guid_str = g_key_file_get_string(key_file, group_name, BUDGET_GUID, + guid_str = gnc_key_file_get_string(key_file, group_name, BUDGET_GUID, &error); if (error) { g_warning("error reading group %s key %s: %s", Index: src/app-utils/file-utils.c =================================================================== --- src/app-utils/file-utils.c (revision 15413) +++ src/app-utils/file-utils.c (working copy) @@ -177,7 +177,6 @@ { gchar *basename, *original = NULL, *filename, *tmp, *file_guid; GKeyFile *key_file = NULL; - GError *error = NULL; gint i; ENTER("url %s, guid %s", url, guid); @@ -206,11 +205,11 @@ break; } - file_guid = g_key_file_get_string(key_file, + file_guid = gnc_key_file_get_string(key_file, STATE_FILE_TOP, STATE_FILE_BOOK_GUID, - &error); + NULL); DEBUG("File GUID is %s", file_guid); - if (strcmp(guid, file_guid) == 0) { + if (safe_strcmp(guid, file_guid) == 0) { DEBUG("Matched !!!"); g_free(file_guid); break;