25 #include <glib/gi18n.h> 26 #include <glib/gstdio.h> 35 #include <sys/types.h> 51 # define g_fopen fopen 57 #include "io-example-account.h" 58 #include "io-gncxml-gen.h" 60 #include "sixtp-dom-generators.h" 61 #include "sixtp-dom-parsers.h" 62 #include "sixtp-parsers.h" 65 static QofLogModule log_module = GNC_MOD_IO;
67 #define GNC_ACCOUNT_STRING "gnc-account-example" 68 #define GNC_ACCOUNT_SHORT "gnc-act:short-description" 69 #define GNC_ACCOUNT_LONG "gnc-act:long-description" 70 #define GNC_ACCOUNT_TITLE "gnc-act:title" 71 #define GNC_ACCOUNT_EXCLUDEP "gnc-act:exclude-from-select-all" 72 #define GNC_ACCOUNT_SELECTED "gnc-act:start-selected" 75 gnc_destroy_example_account (GncExampleAccount* gea)
77 if (gea->title != NULL)
82 if (gea->filename != NULL)
84 g_free (gea->filename);
87 if (gea->root != NULL)
93 if (gea->short_description != NULL)
95 g_free (gea->short_description);
96 gea->short_description = NULL;
98 if (gea->long_description != NULL)
100 g_free (gea->long_description);
101 gea->long_description = NULL;
103 if (gea->book != NULL)
112 clear_up_account_commodity (
113 gnc_commodity_table* tbl,
Account* act,
114 gnc_commodity * (*getter) (
const Account* account),
115 void (*setter) (
Account* account, gnc_commodity* comm))
118 gnc_commodity* com = getter (act);
125 g_return_if_fail (tbl != NULL);
127 gcom = gnc_commodity_table_lookup (tbl,
137 PWARN (
"unable to find global commodity for %s adding new",
149 add_account_local (GncExampleAccount* gea,
Account* act)
151 gnc_commodity_table*
table;
155 clear_up_account_commodity (
table, act,
169 g_warning (
"The example account file should declared a ROOT " 170 "account before declaring any other accounts.");
171 gea->root = gnc_book_get_root_account (gea->book);
178 generic_callback (
const char* tag, gpointer globaldata, gpointer data)
180 GncExampleAccount* gea = (GncExampleAccount*)globaldata;
182 if (g_strcmp0 (tag,
"gnc:account") == 0)
184 add_account_local (gea, (
Account*)data);
190 squash_extra_whitespace (
char* text)
193 int length = strlen (text);
195 for (spot = 1; spot < length; spot++)
197 if (isspace (text[spot]) && isspace (text[spot - 1]))
199 memmove (text + spot, text + spot + 1, length - spot + 1);
211 grab_clean_string (xmlNodePtr tree)
213 return squash_extra_whitespace (g_strstrip (dom_tree_to_text (tree)));
217 gnc_short_descrip_end_handler (gpointer data_for_children,
218 GSList* data_from_children, GSList* sibling_data,
219 gpointer parent_data, gpointer global_data,
220 gpointer* result,
const gchar* tag)
222 GncExampleAccount* gea =
223 (GncExampleAccount*) ((gxpf_data*)global_data)->parsedata;
225 gea->short_description = grab_clean_string ((xmlNodePtr)data_for_children);
231 gnc_short_descrip_sixtp_parser_create (
void)
233 return sixtp_dom_parser_new (gnc_short_descrip_end_handler, NULL, NULL);
237 gnc_long_descrip_end_handler (gpointer data_for_children,
238 GSList* data_from_children, GSList* sibling_data,
239 gpointer parent_data, gpointer global_data,
240 gpointer* result,
const gchar* tag)
242 GncExampleAccount* gea =
243 (GncExampleAccount*) ((gxpf_data*)global_data)->parsedata;
245 gea->long_description = grab_clean_string ((xmlNodePtr)data_for_children);
251 gnc_long_descrip_sixtp_parser_create (
void)
253 return sixtp_dom_parser_new (gnc_long_descrip_end_handler, NULL, NULL);
257 gnc_excludep_end_handler (gpointer data_for_children,
258 GSList* data_from_children, GSList* sibling_data,
259 gpointer parent_data, gpointer global_data,
260 gpointer* result,
const gchar* tag)
262 GncExampleAccount* gea =
263 (GncExampleAccount*) ((gxpf_data*)global_data)->parsedata;
266 dom_tree_to_integer ((xmlNodePtr)data_for_children, &val);
267 gea->exclude_from_select_all = (val ? TRUE : FALSE);
273 gnc_excludep_sixtp_parser_create (
void)
275 return sixtp_dom_parser_new (gnc_excludep_end_handler, NULL, NULL);
279 gnc_selected_end_handler (gpointer data_for_children,
280 GSList* data_from_children, GSList* sibling_data,
281 gpointer parent_data, gpointer global_data,
282 gpointer* result,
const gchar* tag)
284 GncExampleAccount* gea =
285 (GncExampleAccount*) ((gxpf_data*)global_data)->parsedata;
288 dom_tree_to_integer ((xmlNodePtr)data_for_children, &val);
289 gea->start_selected = (val ? TRUE : FALSE);
295 gnc_selected_sixtp_parser_create (
void)
297 return sixtp_dom_parser_new (gnc_selected_end_handler, NULL, NULL);
301 gnc_title_end_handler (gpointer data_for_children,
302 GSList* data_from_children, GSList* sibling_data,
303 gpointer parent_data, gpointer global_data,
304 gpointer* result,
const gchar* tag)
306 GncExampleAccount* gea =
307 (GncExampleAccount*) ((gxpf_data*)global_data)->parsedata;
309 gea->title = grab_clean_string ((xmlNodePtr)data_for_children);
315 gnc_titse_sixtp_parser_create (
void)
317 return sixtp_dom_parser_new (gnc_title_end_handler, NULL, NULL);
322 gnc_read_example_account (
const gchar* filename)
324 GncExampleAccount* gea;
328 g_return_val_if_fail (filename != NULL, NULL);
330 gea = g_new0 (GncExampleAccount, 1);
333 gea->filename = g_strdup (filename);
335 top_parser = sixtp_new ();
336 main_parser = sixtp_new ();
338 if (!sixtp_add_some_sub_parsers (
340 GNC_ACCOUNT_STRING, main_parser,
343 gnc_destroy_example_account (gea);
347 if (!sixtp_add_some_sub_parsers (
349 GNC_ACCOUNT_TITLE, gnc_titse_sixtp_parser_create (),
350 GNC_ACCOUNT_SHORT, gnc_short_descrip_sixtp_parser_create (),
351 GNC_ACCOUNT_LONG, gnc_long_descrip_sixtp_parser_create (),
352 GNC_ACCOUNT_EXCLUDEP, gnc_excludep_sixtp_parser_create (),
353 GNC_ACCOUNT_SELECTED, gnc_selected_sixtp_parser_create (),
354 "gnc:account", gnc_account_sixtp_parser_create (),
357 gnc_destroy_example_account (gea);
361 if (!gnc_xml_parse_file (top_parser, filename,
362 generic_callback, gea, gea->book))
364 sixtp_destroy (top_parser);
366 gnc_destroy_example_account (gea);
374 write_string_part (FILE* out,
const char* tag,
const char* data)
378 node = text_to_dom_tree (tag, data);
380 xmlElemDump (out, NULL, node);
387 write_bool_part (FILE* out,
const char* tag, gboolean data)
391 node = int_to_dom_tree (tag, data);
393 xmlElemDump (out, NULL, node);
400 gnc_write_example_account (GncExampleAccount* gea,
const gchar* filename)
405 out = g_fopen (filename,
"w");
411 fprintf (out,
"<?xml version=\"1.0\"?>\n");
412 fprintf (out,
"<" GNC_ACCOUNT_STRING
">\n");
414 write_string_part (out, GNC_ACCOUNT_TITLE, gea->title);
416 write_string_part (out, GNC_ACCOUNT_SHORT, gea->short_description);
418 write_string_part (out, GNC_ACCOUNT_LONG, gea->long_description);
420 write_bool_part (out, GNC_ACCOUNT_EXCLUDEP, gea->exclude_from_select_all);
422 write_account_tree (out, gea->root, &data);
424 fprintf (out,
"</" GNC_ACCOUNT_STRING
">\n\n");
435 slist_destroy_example_account (gpointer data, gpointer user_data)
439 gnc_destroy_example_account ((GncExampleAccount*)data);
443 PWARN (
"GncExampleAccount pointer in slist was NULL");
448 gnc_free_example_account_list (GSList* list)
450 g_slist_foreach (list, slist_destroy_example_account, NULL);
455 gnc_load_example_account_list (
const char* dirname)
459 const gchar* direntry;
461 dir = g_dir_open (dirname, 0, NULL);
470 for (direntry = g_dir_read_name (dir); direntry != NULL;
471 direntry = g_dir_read_name (dir))
474 GncExampleAccount* gea;
475 if (!g_str_has_suffix (direntry,
"xea"))
478 filename = g_build_filename (dirname, direntry, (gchar*) NULL);
480 if (!g_file_test (filename, G_FILE_TEST_IS_DIR))
482 gea = gnc_read_example_account (filename);
487 gnc_free_example_account_list (ret);
492 ret = g_slist_append (ret, gea);
gnc_commodity * gnc_commodity_table_insert(gnc_commodity_table *table, gnc_commodity *comm)
Add a new commodity to the commodity table.
Account * gnc_account_get_parent(const Account *acc)
This routine returns a pointer to the parent of the specified account.
gnc_commodity_table * gnc_commodity_table_get_table(QofBook *book)
Returns the commodity table associated with a book.
void gnc_account_append_child(Account *new_parent, Account *child)
This function will remove from the child account any pre-existing parent relationship, and will then add the account as a child of the new parent.
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account's account type.
void xaccAccountScrubCommodity(Account *account)
The xaccAccountScrubCommodity method fixed accounts without a commodity by using the old account curr...
QofBook * qof_book_new(void)
Allocate, initialise and return a new QofBook.
const char * gnc_commodity_get_namespace(const gnc_commodity *cm)
Retrieve the namespace for the specified commodity.
void xaccAccountDestroy(Account *acc)
The xaccAccountDestroy() routine can be used to get rid of an account.
#define PWARN(format, args...)
Log a warning.
convert single-entry accounts to clean double-entry
All type declarations for the whole Gnucash engine.
API for the transaction logger.
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity.
const char * gnc_commodity_get_unique_name(const gnc_commodity *cm)
Retrieve the 'unique' name for the specified commodity.
The hidden root account of an account tree.
void gnc_commodity_destroy(gnc_commodity *cm)
Destroy a commodity.
void xaccLogEnable(void)
document me
void qof_book_destroy(QofBook *book)
End any editing sessions associated with book, and free all memory associated with it...
void xaccAccountSetCommodity(Account *acc, gnc_commodity *com)
Set the account's commodity.