/** Toggles the multi-split state of the importer and will subsequently * sanitize the column_types list. All types that don't make sense * in the new state are reset to type GncTransPropType::NONE. * Additionally the interpretation of the columns with transaction * properties changes when changing multi-split mode. So this function * will force a reparsing of the transaction properties (if there are * any) by resetting the first column with a transaction property * it encounters. * @param multi_split Boolean value with desired state (multi-split * vs two-split). */ void GncTxImport::multi_split (bool multi_split) { auto trans_prop_seen = false; m_settings.m_multi_split = multi_split; for (uint32_t i = 0; i < m_settings.m_column_types.size(); i++) { auto old_prop = m_settings.m_column_types[i]; auto is_trans_prop = ((old_prop > GncTransPropType::NONE) && (old_prop <= GncTransPropType::TRANS_PROPS)); auto san_prop = sanitize_trans_prop (old_prop, m_settings.m_multi_split); if (san_prop != old_prop) set_column_type (i, san_prop); else if (is_trans_prop && !trans_prop_seen) set_column_type (i, old_prop, true); trans_prop_seen |= is_trans_prop; } if (m_settings.m_multi_split) m_settings.m_base_account = nullptr; }
/************************************************** * load * * load the settings from a state key file **************************************************/ bool CsvTransSettings::load (void) { if (trans_preset_is_reserved_name (m_name)) return true; GError *key_error = nullptr; m_load_error = false; auto group = csv_group_prefix + m_name; auto keyfile = gnc_state_get_current (); m_skip_start_lines = g_key_file_get_integer (keyfile, group.c_str(), CSV_SKIP_START, &key_error); m_load_error |= handle_load_error (&key_error, group); m_skip_end_lines = g_key_file_get_integer (keyfile, group.c_str(), CSV_SKIP_END, &key_error); m_load_error |= handle_load_error (&key_error, group); m_skip_alt_lines = g_key_file_get_boolean (keyfile, group.c_str(), CSV_SKIP_ALT, &key_error); m_load_error |= handle_load_error (&key_error, group); m_multi_split = g_key_file_get_boolean (keyfile, group.c_str(), CSV_MULTI_SPLIT, &key_error); m_load_error |= handle_load_error (&key_error, group); auto csv_format = g_key_file_get_boolean (keyfile, group.c_str(), CSV_FORMAT, &key_error); if (key_error) csv_format = true; // default to true, but above command will return false in case of error m_load_error |= handle_load_error (&key_error, group); if (csv_format) m_file_format = GncImpFileFormat::CSV; else m_file_format = GncImpFileFormat::FIXED_WIDTH; gchar *key_char = g_key_file_get_string (keyfile, group.c_str(), CSV_SEP, &key_error); if (key_char && *key_char != '\0') m_separators = key_char; m_load_error |= handle_load_error (&key_error, group); if (key_char) g_free (key_char); m_date_format = g_key_file_get_integer (keyfile, group.c_str(), CSV_DATE, &key_error); m_load_error |= handle_load_error (&key_error, group); m_currency_format = g_key_file_get_integer (keyfile, group.c_str(), CSV_CURRENCY, &key_error); m_load_error |= handle_load_error (&key_error, group); key_char = g_key_file_get_string (keyfile, group.c_str(), CSV_ENCODING, &key_error); if (key_char && *key_char != '\0') m_encoding = key_char; else m_encoding = "UTF-8"; m_load_error |= handle_load_error (&key_error, group); if (key_char) g_free (key_char); key_char = g_key_file_get_string (keyfile, group.c_str(), CSV_ACCOUNT, &key_error); if (key_char && *key_char != '\0') m_base_account = gnc_account_lookup_by_full_name (gnc_get_current_root_account(), key_char); m_load_error |= handle_load_error (&key_error, group); if (key_char) g_free (key_char); m_column_types.clear(); gsize list_len; gchar** col_types_str = g_key_file_get_string_list (keyfile, group.c_str(), CSV_COL_TYPES, &list_len, &key_error); for (uint32_t i = 0; i < list_len; i++) { auto col_types_it = std::find_if (gnc_csv_col_type_strs.begin(), gnc_csv_col_type_strs.end(), test_prop_type_str (col_types_str[i])); if (col_types_it != gnc_csv_col_type_strs.end()) { /* Found a valid column type. Now check whether it is allowed * in the selected mode (two-split vs multi-split) */ auto prop = sanitize_trans_prop (col_types_it->first, m_multi_split); m_column_types.push_back(prop); if (prop != col_types_it->first) PWARN("Found column type '%s', but this is blacklisted when multi-split mode is %s. " "Inserting column type 'NONE' instead'.", col_types_it->second, m_multi_split ? "enabled" : "disabled"); } else PWARN("Found invalid column type '%s'. Inserting column type 'NONE' instead'.", col_types_str[i]); } if (col_types_str) g_strfreev (col_types_str); m_column_widths.clear(); gint *col_widths_int = g_key_file_get_integer_list (keyfile, group.c_str(), CSV_COL_WIDTHS, &list_len, &key_error); for (uint32_t i = 0; i < list_len; i++) { if (col_widths_int[i] > 0) m_column_widths.push_back(col_widths_int[i]); } m_load_error |= handle_load_error (&key_error, group); if (col_widths_int) g_free (col_widths_int); return m_load_error; }