Files
gnucash/src/engine/Ledger-xml-parser-v1.c
Dave Peticolas c8fcd36996 2001-07-11 Dave Peticolas <dave@krondo.com>
* src/engine/io-gncxml-v2.c: same as below

	* src/engine/io-gncbin-r.c: same as below

	* src/engine/io-example-account.c: same as below

	* src/engine/Ledger-xml-parser-v1.c: remove autocode

	* src/engine/Group.[ch]: remove autocode api. This hasn't
	really been used in a while, and account codes are generally
	assigned based on account function, not just hierarchy position.

	* src/engine/Account.[ch]: remove autocode api

	* src/guile/gnc.gwp: remove auto code api

	* src/scm/commodity-utilities.scm: fix function calls


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@4944 57a11ea4-9604-0410-9ed3-97b8803252fd
2001-07-12 06:35:01 +00:00

195 lines
6.5 KiB
C

/********************************************************************\
* Ledger-xml-parser-v1.c *
* Copyright (C) 2000 Gnumatic, Inc. *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 59 Temple Place - Suite 330 Fax: +1-617-542-2652 *
* Boston, MA 02111-1307, USA gnu@gnu.org *
\********************************************************************/
#include "config.h"
#include <string.h>
#include "gnc-engine-util.h"
#include "gnc-pricedb-p.h"
#include "io-gncxml-p.h"
#include "sixtp.h"
#include "sixtp-parsers.h"
#include "sixtp-utils.h"
#include "Group.h"
#include "TransLog.h"
/* This static indicates the debugging module that this .o belongs to. */
static short module = MOD_IO;
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/* <ledger-data> (parent <gnc-data>)
On failure or on normal cleanup, the account group will be killed,
so if you want it, you better set should_cleanup to false
input: NA
to-children-via-*result: new AccountGroup*
returns: an AccountGroup*
start: creates the account group and puts it into *result
characters: NA
end: finishes up the account group and leaves it in result.
cleanup-result: deletes the account group (use should_cleanup to avoid).
cleanup-chars: NA
fail: deletes the account group in *result.
result-fail: same as cleanup-result.
chars-fail: NA
*/
static gboolean
ledger_data_start_handler(GSList* sibling_data, gpointer parent_data,
gpointer global_data, gpointer *data_for_children,
gpointer *result, const gchar *tag, gchar **attrs)
{
AccountGroup *ag;
/* disable logging during load; otherwise its just a mess */
xaccLogDisable();
ag = xaccMallocAccountGroup();
g_return_val_if_fail(ag, FALSE);
*data_for_children = ag;
return(ag != NULL);
}
static gboolean
ledger_data_after_child_handler(gpointer data_for_children,
GSList* data_from_children,
GSList* sibling_data,
gpointer parent_data,
gpointer global_data,
gpointer *result,
const gchar *tag,
const gchar *child_tag,
sixtp_child_result *child_result)
{
if(!child_result) return(TRUE);
/* if we see the pricedb, deal with it */
if(child_result->type != SIXTP_CHILD_RESULT_NODE) return(TRUE);
if(strcmp(child_result->tag, "pricedb") == 0) {
GNCPriceDB *pdb = (GNCPriceDB *) child_result->data;
GNCParseStatus *status = (GNCParseStatus *) global_data;
g_return_val_if_fail(pdb, FALSE);
g_return_val_if_fail(status, FALSE);
if(status->pricedb) {
PERR("hit pricedb twice in data file.");
return FALSE;
}
status->pricedb = pdb;
gnc_pricedb_mark_clean(pdb);
child_result->should_cleanup = FALSE;
}
return(TRUE);
}
static gboolean
ledger_data_end_handler(gpointer data_for_children,
GSList *data_from_children, GSList *sibling_data,
gpointer parent_data, gpointer global_data,
gpointer *result, const gchar *tag)
{
AccountGroup *ag = (AccountGroup *) data_for_children;
g_return_val_if_fail(ag, FALSE);
/* mark the newly read group as saved, since the act of putting
* it together will have caused it to be marked up as not-saved.
*/
xaccGroupMarkSaved (ag);
/* commit all groups, this completes the BeginEdit started when the
* account_end_handler finished reading the account.
*/
xaccAccountGroupCommitEdit (ag);
xaccLogEnable();
*result = ag;
return(TRUE);
}
static void
ledger_data_fail_handler(gpointer data_for_children,
GSList* data_from_children,
GSList* sibling_data,
gpointer parent_data,
gpointer global_data,
gpointer *result,
const gchar *tag)
{
AccountGroup *ag = (AccountGroup *) data_for_children;
if(ag) xaccFreeAccountGroup(ag);
}
static void
ledger_data_result_cleanup(sixtp_child_result *cr)
{
AccountGroup *ag = (AccountGroup *) cr->data;
if(ag) xaccFreeAccountGroup(ag);
}
sixtp*
ledger_data_parser_new(void)
{
sixtp *top_level;
/* <ledger-data> */
if(!(top_level = sixtp_set_any(
sixtp_new(), FALSE,
SIXTP_START_HANDLER_ID, ledger_data_start_handler,
SIXTP_CHARACTERS_HANDLER_ID, allow_and_ignore_only_whitespace,
SIXTP_AFTER_CHILD_HANDLER_ID, ledger_data_after_child_handler,
SIXTP_END_HANDLER_ID, ledger_data_end_handler,
SIXTP_CLEANUP_RESULT_ID, ledger_data_result_cleanup,
SIXTP_FAIL_HANDLER_ID, ledger_data_fail_handler,
SIXTP_RESULT_FAIL_ID, ledger_data_result_cleanup,
SIXTP_NO_MORE_HANDLERS)))
{
return NULL;
}
if(!sixtp_add_some_sub_parsers(
top_level, TRUE,
"commodity", commodity_restore_parser_new(),
"pricedb", gnc_pricedb_parser_new(),
"account", gnc_account_parser_new(),
"transaction", gnc_transaction_parser_new(),
0))
{
return NULL;
}
return(top_level);
}