From 2c6f584b5e1c8bf10a715f9f10c7664f6d71c06d Mon Sep 17 00:00:00 2001 From: Chris Shoemaker Date: Fri, 14 Jul 2006 00:57:17 +0000 Subject: [PATCH] Avoid crash from opening transaction in more than one register. Bug #347089. In any case where we might be opening the transaction and marking it as the pending transaction, check first if it's already open. If it is, we assume that it's being edited by another register. We report the error and abort the action that would have opened the transaction. BP git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@14495 57a11ea4-9604-0410-9ed3-97b8803252fd --- .../ledger-core/split-register-control.c | 10 ++--- src/register/ledger-core/split-register.c | 37 +++++++++++++------ src/register/ledger-core/split-register.h | 4 ++ 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/register/ledger-core/split-register-control.c b/src/register/ledger-core/split-register-control.c index a1a848955d..2ea2ef8023 100644 --- a/src/register/ledger-core/split-register-control.c +++ b/src/register/ledger-core/split-register-control.c @@ -675,19 +675,17 @@ gnc_split_register_auto_completion (SplitRegister *reg, return FALSE; /* now perform the completion */ - - gnc_suspend_gui_refresh (); - - info->pending_trans_guid = *xaccTransGetGUID(trans); if ((pending_trans != NULL) && (pending_trans != trans)) { + if (gnc_split_register_begin_edit_or_warn(info, trans)) + return TRUE; + if (xaccTransIsOpen (pending_trans)) xaccTransCommitEdit (pending_trans); else g_assert_not_reached(); - g_assert(!xaccTransIsOpen(trans)); - xaccTransBeginEdit(trans); } g_assert(xaccTransIsOpen(trans)); pending_trans = trans; + gnc_suspend_gui_refresh (); gnc_copy_trans_onto_trans (auto_trans, trans, FALSE, FALSE); blank_split = NULL; diff --git a/src/register/ledger-core/split-register.c b/src/register/ledger-core/split-register.c index 1b8e97db0a..5989b60377 100644 --- a/src/register/ledger-core/split-register.c +++ b/src/register/ledger-core/split-register.c @@ -143,6 +143,24 @@ gnc_split_get_amount_denom (Split *split) return denom; } +/* returns TRUE if begin_edit was aborted */ +gboolean +gnc_split_register_begin_edit_or_warn(SRInfo *info, Transaction *trans) +{ + if (!xaccTransIsOpen(trans)) { + xaccTransBeginEdit(trans); + /* This is now the pending transaction */ + info->pending_trans_guid = *xaccTransGetGUID(trans); + return FALSE; + } else { + GtkWidget *parent = NULL; + if (info->get_parent) + parent = info->get_parent(info->user_data); + gnc_error_dialog(parent, "%s", _("This transaction is already being edited in another register. Please finish editing it there first.")); + return TRUE; + } +} + void gnc_split_register_expand_current_trans (SplitRegister *reg, gboolean expand) { @@ -829,9 +847,8 @@ gnc_split_register_delete_current_split (SplitRegister *reg) g_assert(xaccTransIsOpen(trans)); } else { g_assert(!pending_trans); - g_assert(!xaccTransIsOpen(trans)); - xaccTransBeginEdit(trans); - info->pending_trans_guid = *xaccTransGetGUID(trans); + if (gnc_split_register_begin_edit_or_warn(info, trans)) + return; } xaccSplitDestroy (split); @@ -1001,10 +1018,8 @@ gnc_split_register_empty_current_trans_except_split (SplitRegister *reg, trans = xaccSplitGetParent(split); if (!pending) { - g_assert(!xaccTransIsOpen(trans)); - xaccTransBeginEdit(trans); - /* This is now the pending transaction */ - info->pending_trans_guid = *xaccTransGetGUID(trans); + if (gnc_split_register_begin_edit_or_warn(info, trans)) + return; } else if (pending == trans) { g_assert(xaccTransIsOpen(trans)); } else g_assert_not_reached(); @@ -1351,15 +1366,12 @@ gnc_split_register_save (SplitRegister *reg, gboolean do_commit) if (gnc_split_register_handle_exchange (reg, FALSE)) return TRUE; - gnc_suspend_gui_refresh (); - /* determine whether we should commit the pending transaction */ if (pending_trans != trans) { // FIXME: How could the pending transaction not be open? // FIXME: For that matter, how could an open pending // transaction ever not be the current trans? - info->pending_trans_guid = *xaccTransGetGUID(trans); if (xaccTransIsOpen (pending_trans)) { g_message("Impossible? commiting pending %p", pending_trans); xaccTransCommitEdit (pending_trans); @@ -1371,10 +1383,13 @@ gnc_split_register_save (SplitRegister *reg, gboolean do_commit) g_assert(xaccTransIsOpen(blank_trans)); } else { PINFO("beginning edit of trans %p", trans); - xaccTransBeginEdit (trans); + if (gnc_split_register_begin_edit_or_warn(info, trans)) + return FALSE; } pending_trans = trans; } + g_assert(xaccTransIsOpen(trans)); + gnc_suspend_gui_refresh (); /* If we are committing the blank split, add it to the account now */ if (trans == blank_trans) diff --git a/src/register/ledger-core/split-register.h b/src/register/ledger-core/split-register.h index 71628ecf56..1f926ae9d9 100644 --- a/src/register/ledger-core/split-register.h +++ b/src/register/ledger-core/split-register.h @@ -431,6 +431,10 @@ const char * gnc_split_register_get_credit_string (SplitRegister *reg); gboolean gnc_split_register_handle_exchange (SplitRegister *reg, gboolean force_dialog); +/* returns TRUE if begin_edit was aborted */ +gboolean +gnc_split_register_begin_edit_or_warn(SRInfo *info, Transaction *trans); + /** @} */ /** @} */ /* -------------------------------------------------------------- */