35 #include <glib/gi18n.h> 45 const std::string csv_group_prefix{
"CSV-"};
46 const std::string no_settings{N_(
"No Settings")};
47 const std::string gnc_exp{N_(
"GnuCash Export Format")};
48 const std::string gnc_exp_4{N_(
"GnuCash Export Format (4.x and older)")};
50 #define CSV_NAME "Name" 51 #define CSV_FORMAT "CsvFormat" 52 #define CSV_SKIP_ALT "SkipAltLines" 53 #define CSV_SKIP_START "SkipStartLines" 54 #define CSV_SKIP_END "SkipEndLines" 56 #define CSV_SEP "Separators" 58 #define CSV_CUSTOM "Custom" 59 #define CSV_CUSTOM_ENTRY "CustomEntry" 61 #define CSV_DATE "DateFormat" 62 #define CSV_CURRENCY "CurrencyFormat" 64 #define CSV_ENCODING "Encoding" 65 #define CSV_COL_WIDTHS "ColumnWidths" 67 G_GNUC_UNUSED
static QofLogModule log_module = GNC_MOD_IMPORT;
77 handle_load_error (GError **key_error,
const std::string& group)
82 if ((*key_error)->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)
84 g_clear_error (key_error);
88 g_warning (
"Error reading group '%s' : %s", group.c_str(), (*key_error)->message);
89 g_clear_error (key_error);
95 return ((name == no_settings) ||
96 (name == _(no_settings.c_str())) ||
98 (name == _(gnc_exp.c_str())));
101 std::string get_no_settings (
void)
106 std::string get_gnc_exp (
void)
111 std::string get_gnc_exp_4 (
void)
124 GError *key_error =
nullptr;
125 m_load_error =
false;
126 auto group = get_group_prefix() + m_name;
129 m_skip_start_lines = g_key_file_get_integer (keyfile, group.c_str(), CSV_SKIP_START, &key_error);
130 m_load_error |= handle_load_error (&key_error, group);
132 m_skip_end_lines = g_key_file_get_integer (keyfile, group.c_str(), CSV_SKIP_END, &key_error);
133 m_load_error |= handle_load_error (&key_error, group);
135 m_skip_alt_lines = g_key_file_get_boolean (keyfile, group.c_str(), CSV_SKIP_ALT, &key_error);
136 m_load_error |= handle_load_error (&key_error, group);
138 auto csv_format = g_key_file_get_boolean (keyfile, group.c_str(), CSV_FORMAT, &key_error);
139 if (key_error) csv_format =
true;
140 m_load_error |= handle_load_error (&key_error, group);
142 m_file_format = GncImpFileFormat::CSV;
144 m_file_format = GncImpFileFormat::FIXED_WIDTH;
146 gchar *key_char = g_key_file_get_string (keyfile, group.c_str(), CSV_SEP, &key_error);
147 if (key_char && *key_char !=
'\0')
148 m_separators = key_char;
149 m_load_error |= handle_load_error (&key_error, group);
153 m_date_format = g_key_file_get_integer (keyfile, group.c_str(), CSV_DATE, &key_error);
154 m_load_error |= handle_load_error (&key_error, group);
156 m_currency_format = g_key_file_get_integer (keyfile, group.c_str(), CSV_CURRENCY, &key_error);
157 m_load_error |= handle_load_error (&key_error, group);
159 key_char = g_key_file_get_string (keyfile, group.c_str(), CSV_ENCODING, &key_error);
160 if (key_char && *key_char !=
'\0')
161 m_encoding = key_char;
163 m_encoding =
"UTF-8";
164 m_load_error |= handle_load_error (&key_error, group);
170 m_column_widths.clear();
171 gint *col_widths_int = g_key_file_get_integer_list (keyfile, group.c_str(), CSV_COL_WIDTHS,
172 &list_len, &key_error);
173 for (uint32_t i = 0; i < list_len; i++)
175 if (col_widths_int[i] > 0)
176 m_column_widths.push_back(col_widths_int[i]);
178 m_load_error |= handle_load_error (&key_error, group);
180 g_free (col_widths_int);
194 auto group = get_group_prefix() + m_name;
197 g_key_file_set_string (keyfile, group.c_str(), CSV_NAME, m_name.c_str());
199 g_key_file_set_integer (keyfile, group.c_str(), CSV_SKIP_START, m_skip_start_lines);
200 g_key_file_set_integer (keyfile, group.c_str(), CSV_SKIP_END, m_skip_end_lines);
201 g_key_file_set_boolean (keyfile, group.c_str(), CSV_SKIP_ALT, m_skip_alt_lines);
202 g_key_file_set_boolean (keyfile, group.c_str(), CSV_FORMAT,
203 (m_file_format == GncImpFileFormat::CSV) ?
true :
false);
205 g_key_file_set_string (keyfile, group.c_str(), CSV_SEP, m_separators.c_str());
206 g_key_file_set_integer (keyfile, group.c_str(), CSV_DATE, m_date_format);
207 std::ostringstream cmt_ss;
208 cmt_ss <<
"Supported date formats: ";
212 { cmt_ss << fmt_num++ <<
": '" << fmt.
m_fmt <<
"', "; });
213 auto cmt = cmt_ss.str().substr(0, static_cast<long>(cmt_ss.tellp()) - 2);
214 g_key_file_set_comment (keyfile, group.c_str(), CSV_DATE, cmt.c_str(),
nullptr);
215 g_key_file_set_integer (keyfile, group.c_str(), CSV_CURRENCY, m_currency_format);
216 g_key_file_set_string (keyfile, group.c_str(), CSV_ENCODING, m_encoding.c_str());
218 if (!m_column_widths.empty())
219 g_key_file_set_integer_list (keyfile, group.c_str(), CSV_COL_WIDTHS,
220 (gint*)(m_column_widths.data()), m_column_widths.size());
223 GError *key_error =
nullptr;
225 auto enc_val = g_key_file_get_string (keyfile, group.c_str(), CSV_ENCODING, &key_error);
226 auto enc_str = std::string{enc_val};
230 if ((key_error) || (enc_str != m_encoding.c_str()))
234 g_warning (
"Error reading group %s key %s: %s", group.c_str(), CSV_ENCODING, key_error->message);
235 g_error_free (key_error);
238 g_warning (
"Error comparing group %s key %s: '%s' and '%s'", group.c_str(), CSV_ENCODING, enc_str.c_str(), group.c_str());
248 auto group = get_group_prefix() + m_name;
249 g_key_file_remove_group (keyfile, group.c_str(),
nullptr);
Functions to load, save and get gui state.
utility functions for the GnuCash UI
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
Account handling public routines.
bool preset_is_reserved_name(const std::string &name)
Check whether name can be used as a preset name.
bool load(void)
Load the widget properties from a key File.
void remove(void)
Remove the preset from the state file.
bool save(void)
Save the gathered widget properties to a key File.
static const std::vector< GncDateFormat > c_formats
A vector with all the date formats supported by the string constructor.