[Gnucash-changes] Adding show_session_error support to inform the user of any write errors

Neil Williams codehelp at cvs.gnucash.org
Mon Apr 11 11:29:14 EDT 2005


Log Message:
-----------
Adding show_session_error support to inform the user of any write errors 
reported by any backend.

Tags:
----
gnucash-gnome2-dev

Modified Files:
--------------
    gnucash:
        ChangeLog
    gnucash/src/app-file:
        gnc-file.c
        gnc-file.h
    gnucash/src/backend/file:
        gnc-book-xml-v2.c
        io-gncxml-v2.c
    gnucash/src/backend/qsf:
        qsf-backend.c
    gnucash/src/business/business-gnome:
        gnc-plugin-business.c
    gnucash/src/engine:
        qof_book_merge.c
        qofbackend.h
    gnucash/src/gnome:
        Makefile.am
        dialog-chart-export.c
    gnucash/src/gnome/glade:
        chart-export.glade

Revision Data
-------------
Index: ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/ChangeLog,v
retrieving revision 1.1487.2.188
retrieving revision 1.1487.2.189
diff -LChangeLog -LChangeLog -u -r1.1487.2.188 -r1.1487.2.189
--- ChangeLog
+++ ChangeLog
@@ -1,3 +1,27 @@
+2005-04-11  Neil Williams  <linux at codehelp.co.uk>
+	* src/app-file/gnc-file.c: Added handlers for
+	write errors and made show_session_error()
+	non-static.
+	* src/app-file/gnc-file.h: Added prototype
+	for show_session_error() so that it can be called
+	to handle errors reported by any backend operation.
+	* src/backend/file/gnc-book-xml-v2.c: 
+	* src/backend/file/io-gncxml-v2.c: Wrapping fprintf()
+	in error handler to catch failed write operations.
+	* src/backend/qsf/qsf-backend.c: Handling write errors
+	on QSF export.
+	* src/business/business-gnome/gnc-plugin-business.c:
+	Adding show_session_error support to inform the user of
+	any write errors reported by QSF.
+	* src/engine/qof_book_merge.c: Re-instating fixes to
+	QOF_TYPE_CHAR handling in merge.
+	* src/engine/qofbackend.h: Definition of ERR_FILEIO_WRITE_ERROR
+	* src/gnome/Makefile.am: Building dialog-chart-export with
+	show_session_error from libgncmod-app-file
+	* src/gnome/dialog-chart-export.c: Handling write errors
+	reported by QSF backend, uses show_session_error()
+	* src/gnome/glade/chart-export.glade: Removing nuisance tooltip.
+
 2005-04-03  David Hampton  <hampton at employees.org>
 
 	* configure.in: Remove reqirement for Berkeley DB.  The G2 branch
Index: dialog-chart-export.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome/Attic/dialog-chart-export.c,v
retrieving revision 1.1.2.4
retrieving revision 1.1.2.5
diff -Lsrc/gnome/dialog-chart-export.c -Lsrc/gnome/dialog-chart-export.c -u -r1.1.2.4 -r1.1.2.5
--- src/gnome/dialog-chart-export.c
+++ src/gnome/dialog-chart-export.c
@@ -34,6 +34,7 @@
 #include "global-options.h"
 #include "gnc-event.h"
 #include "gnc-file-dialog.h"
+#include "gnc-file.h"
 
 #define EQUITY_ACCOUNT_NAME  _("Opening Balances")
 #define OPENING_BALANCE_DESC _("Opening Balance")
@@ -261,6 +262,7 @@
 		qof_object_foreach(GNC_ID_SPLIT, book, chart_reference_cb, data);
 		g_list_free(data->param_ref_list);
 	qof_session_save(chart_session, NULL);
+		show_session_error(qof_session_get_error(chart_session), filename);
 		gnc_engine_resume_events();
 	}
 	qof_session_end(chart_session);
Index: Makefile.am
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome/Makefile.am,v
retrieving revision 1.107.4.17
retrieving revision 1.107.4.18
diff -Lsrc/gnome/Makefile.am -Lsrc/gnome/Makefile.am -u -r1.107.4.17 -r1.107.4.18
--- src/gnome/Makefile.am
+++ src/gnome/Makefile.am
@@ -15,6 +15,7 @@
   ${top_builddir}/src/report/report-gnome/libgncmod-report-gnome.la \
   ${top_builddir}/src/register/ledger-core/libgncmod-ledger-core.la \
   ${top_builddir}/src/gnome-search/libgncmod-gnome-search.la \
+  ${top_builddir}/src/app-file/libgncmod-app-file.la \
   ${top_builddir}/lib/egg/libegg.la \
   ${GUILE_LIBS} ${GNOME_LIBS} ${GLIB_LIBS}
 
Index: io-gncxml-v2.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/file/io-gncxml-v2.c,v
retrieving revision 1.24.4.5
retrieving revision 1.24.4.6
diff -Lsrc/backend/file/io-gncxml-v2.c -Lsrc/backend/file/io-gncxml-v2.c -u -r1.24.4.5 -r1.24.4.6
--- src/backend/file/io-gncxml-v2.c
+++ src/backend/file/io-gncxml-v2.c
@@ -753,7 +753,6 @@
     char *type;
 
     va_start(ap, out);
-
     type = va_arg(ap, char *);
 
     while(type)
@@ -854,15 +853,22 @@
     }
     
     xmlElemDump(out, NULL, node);
-    fprintf(out, "\n");
+    if(fprintf(out, "\n") < 0)
+	{
+		qof_backend_set_error(qof_book_get_backend(book), ERR_FILEIO_WRITE_ERROR);
+		return;
+	}
 
     xmlFreeNode(node);
 #endif
 
     be_data.out = out;
     be_data.book = book;
-
-    fprintf( out, "<%s version=\"%s\">\n", BOOK_TAG, gnc_v2_book_version_string );
+    if(fprintf( out, "<%s version=\"%s\">\n", BOOK_TAG, gnc_v2_book_version_string) < 0)
+	{
+		qof_backend_set_error(qof_book_get_backend(book), ERR_FILEIO_WRITE_ERROR);
+		return;
+	}
     write_book_parts (out, book);
 
     write_counts(out,
@@ -888,7 +894,9 @@
 
     gncObjectForeachBackend (GNC_FILE_BACKEND, write_data_cb, &be_data);
 
-    fprintf( out, "</%s>\n", BOOK_TAG );
+    if(fprintf( out, "</%s>\n", BOOK_TAG ) < 0) {
+		qof_backend_set_error(qof_book_get_backend(book), ERR_FILEIO_WRITE_ERROR);
+	}
 }
 
 void
Index: gnc-book-xml-v2.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/file/gnc-book-xml-v2.c,v
retrieving revision 1.6.4.3
retrieving revision 1.6.4.4
diff -Lsrc/backend/file/gnc-book-xml-v2.c -Lsrc/backend/file/gnc-book-xml-v2.c -u -r1.6.4.3 -r1.6.4.4
--- src/backend/file/gnc-book-xml-v2.c
+++ src/backend/file/gnc-book-xml-v2.c
@@ -158,7 +158,11 @@
 
     domnode = guid_to_dom_tree(book_id_string, qof_book_get_guid(book));
     xmlElemDump(out, NULL, domnode);
-    fprintf(out, "\n");
+    if(fprintf(out, "\n") < 0) {
+		qof_backend_set_error(qof_book_get_backend(book), ERR_FILEIO_WRITE_ERROR);
+		xmlFreeNode (domnode);
+		return;
+	}
     xmlFreeNode (domnode);
 
     if(qof_book_get_slots(book))
@@ -174,6 +178,7 @@
     }
 }
 
+
 /* ================================================================ */
 
 static gboolean
Index: qsf-backend.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/qsf/Attic/qsf-backend.c,v
retrieving revision 1.1.2.6
retrieving revision 1.1.2.7
diff -Lsrc/backend/qsf/qsf-backend.c -Lsrc/backend/qsf/qsf-backend.c -u -r1.1.2.6 -r1.1.2.7
--- src/backend/qsf/qsf-backend.c
+++ src/backend/qsf/qsf-backend.c
@@ -132,15 +132,10 @@
 qsf_session_end( QofBackend *be)
 {
 	QSFBackend *qsf_be;
-	GList *book_ref_list;
-	QofBook *book;
 	
 	qsf_be = (QSFBackend*)be;
 	g_return_if_fail(qsf_be != NULL);
-	book = qsf_be->params->book;
-	book_ref_list = (GList*)qof_book_get_data(book, ENTITYREFERENCE);
-	g_list_free(book_ref_list);
-	qof_book_set_data(book, PARTIAL_QOFBOOK, (gboolean*)FALSE);
+
 	qsf_free_params(qsf_be->params);
 	g_free(qsf_be->fullpath);
 	qsf_be->fullpath = NULL;
@@ -605,16 +600,25 @@
 	return params->output_doc;
 }
 
-static void
+static gboolean
 write_qsf_from_book(FILE *out, QofBook *book)
 {
 	xmlDocPtr qsf_doc;
+	gint write_result;
+	QofBackend *be;
 	
 	qsf_doc = qofbook_to_qsf(book);
-	g_return_if_fail(qsf_is_valid(QSF_SCHEMA_DIR, QSF_OBJECT_SCHEMA, qsf_doc) == TRUE);
-	xmlDocFormatDump(out, qsf_doc, 1);
+	write_result = 0;
+	g_return_val_if_fail(qsf_is_valid(QSF_SCHEMA_DIR, QSF_OBJECT_SCHEMA, qsf_doc) == TRUE, FALSE);
+	write_result = xmlDocFormatDump(out, qsf_doc, 1);
+	if(write_result < 0) {
+		be = qof_book_get_backend(book);
+		qof_backend_set_error(be, ERR_FILEIO_WRITE_ERROR);
+		return FALSE;
+	}
 	fprintf(out, "\n");
 	xmlFreeDoc(qsf_doc);
+	return TRUE;
 }
 
 static void
@@ -635,6 +639,7 @@
 	QSFBackend *qsf_be;
 	FILE *out;
 	char *path;
+	gboolean result;
 	
 	qsf_be = (QSFBackend*)be;
 	/* if fullpath is blank, book_id was set to QOF_STDOUT */
@@ -644,7 +649,11 @@
 	}
 	path = strdup(qsf_be->fullpath);
 	out = fopen(path, "w");
-	write_qsf_from_book(out, book);
+	result = write_qsf_from_book(out, book);
+	if(result == FALSE) { 
+		g_free(path);
+		return; 
+	}
 	g_free(path);
 	fclose(out);
 }
Index: gnc-plugin-business.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/business/business-gnome/Attic/gnc-plugin-business.c,v
retrieving revision 1.1.2.7
retrieving revision 1.1.2.8
diff -Lsrc/business/business-gnome/gnc-plugin-business.c -Lsrc/business/business-gnome/gnc-plugin-business.c -u -r1.1.2.7 -r1.1.2.8
--- src/business/business-gnome/gnc-plugin-business.c
+++ src/business/business-gnome/gnc-plugin-business.c
@@ -40,7 +40,7 @@
 #include "messages.h"
 #include "gnc-ui-util.h"
 #include "gnc-file-dialog.h"
-
+#include "gnc-file.h"
 
 /* g_object functions */
 static void gnc_plugin_business_class_init (GncPluginBusinessClass *klass);
@@ -635,6 +635,7 @@
 			qof_session_save(chart_session, NULL);
 		}
 	}
+	show_session_error(qof_session_get_error(chart_session), filename);
 	g_free(filename);
 	qof_session_end(chart_session);
 	qof_session_set_current_session(current_session);
@@ -664,6 +665,7 @@
 			qof_session_save(chart_session, NULL);
 		}
 	}
+	show_session_error(qof_session_get_error(chart_session), filename);
 	qof_session_end(chart_session);
 	g_free(filename);
 	qof_session_set_current_session(current_session);
@@ -693,6 +695,7 @@
 			qof_session_save(chart_session, NULL);
 		}
 	}
+	show_session_error(qof_session_get_error(chart_session), filename);
 	qof_session_end(chart_session);
 	g_free(filename);
 	qof_session_set_current_session(current_session);
@@ -722,6 +725,7 @@
 			qof_session_save(chart_session, NULL);
 		}
 	}
+	show_session_error(qof_session_get_error(chart_session), filename);
 	qof_session_end(chart_session);
 	g_free(filename);
 	qof_session_set_current_session(current_session);
Index: gnc-file.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/app-file/gnc-file.c,v
retrieving revision 1.25.4.10
retrieving revision 1.25.4.11
diff -Lsrc/app-file/gnc-file.c -Lsrc/app-file/gnc-file.c -u -r1.25.4.10 -r1.25.4.11
--- src/app-file/gnc-file.c
+++ src/app-file/gnc-file.c
@@ -84,7 +84,7 @@
   qof_session_get_current_session ();
 }
 
-static gboolean
+gboolean
 show_session_error (QofBackendError io_error, const char *newfile)
 {
   GtkWidget *parent = gnc_ui_get_toplevel();
@@ -287,6 +287,18 @@
       gnc_error_dialog(parent, fmt, newfile);
       break;
       
+    case ERR_FILEIO_BACKUP_ERROR:
+      fmt = _("Could not make a backup of %s\n");
+      gnc_error_dialog(parent, fmt, newfile);
+      break;
+
+    case ERR_FILEIO_WRITE_ERROR:
+      fmt = _("Could not write to %s\nCheck that you have"
+              " permission to write to this file and that "
+              " there is sufficient space to create it.");
+      gnc_error_dialog(parent, fmt, newfile);
+      break;
+
     case ERR_SQL_DB_TOO_OLD:
       fmt = _("This database is from an older version of GnuCash.\n"
               "Do you want to want to upgrade the database "
Index: gnc-file.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/app-file/gnc-file.h,v
retrieving revision 1.6.4.1
retrieving revision 1.6.4.2
diff -Lsrc/app-file/gnc-file.h -Lsrc/app-file/gnc-file.h -u -r1.6.4.1 -r1.6.4.2
--- src/app-file/gnc-file.h
+++ src/app-file/gnc-file.h
@@ -114,12 +114,18 @@
 #define GNC_FILE_H
 
 #include <glib.h>
+#include "qofbackend.h"
 
 void gnc_file_new (void);
 gboolean gnc_file_open (void);
 void gnc_file_save (void);
 void gnc_file_save_as (void);
 
+/** Tell the user about errors in the backends
+
+*/
+gboolean show_session_error (QofBackendError io_error, const char *newfile);
+
 gboolean gnc_file_open_file (const char *filename);
 void gnc_file_export_file(const char * filename);
 
Index: qof_book_merge.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qof_book_merge.c,v
retrieving revision 1.2.2.5
retrieving revision 1.2.2.6
diff -Lsrc/engine/qof_book_merge.c -Lsrc/engine/qof_book_merge.c -u -r1.2.2.5 -r1.2.2.6
--- src/engine/qof_book_merge.c
+++ src/engine/qof_book_merge.c
@@ -112,9 +112,7 @@
 	g_free(mergeData);
 }
 
-/*  Q: This could be a general usage function:
-	qof_param_as_string(QofParam*, QofEntity*);
-	Useful? Worth transferring to qofclass.c?
+/*
 	Need to fix the KVP->string. How?
 
 	The QOF_TYPE_DATE output format from
@@ -142,6 +140,7 @@
 	gboolean 	param_boolean, 	(*boolean_getter)	(QofEntity*, QofParam*);
 	gint32 		param_i32, 		(*int32_getter)		(QofEntity*, QofParam*);
 	gint64 		param_i64, 		(*int64_getter)		(QofEntity*, QofParam*);
+	char        param_char,     (*char_getter)    (QofEntity*, QofParam*);
 	
 	param_string = NULL;
 	paramType = qtparam->param_type;
@@ -205,7 +204,9 @@
 			return param_string;
 		}
 		if(safe_strcmp(paramType, QOF_TYPE_CHAR) == 0) { 
-			param_string = g_strdup(qtparam->param_getfcn(qtEnt,qtparam));
+			char_getter = (char (*)(QofEntity*, QofParam*)) qtparam->param_getfcn;
+			param_char = char_getter(qtEnt, qtparam);
+			param_string = g_strdup_printf("%c", param_char);
 			return param_string;
 		}
 	return NULL;
@@ -350,6 +351,7 @@
 qof_book_mergeCompare( qof_book_mergeData *mergeData ) 
 {
 	qof_book_mergeRule *currentRule;
+
 	gchar 			*stringImport, *stringTarget, *charImport, *charTarget;
 	QofEntity	 	*mergeEnt, *targetEnt, *referenceEnt;
 	const GUID 		*guidImport, *guidTarget;
Index: qofbackend.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofbackend.h,v
retrieving revision 1.3.4.5
retrieving revision 1.3.4.6
diff -Lsrc/engine/qofbackend.h -Lsrc/engine/qofbackend.h -u -r1.3.4.5 -r1.3.4.6
--- src/engine/qofbackend.h
+++ src/engine/qofbackend.h
@@ -41,7 +41,7 @@
 #define QOF_BACKEND_H
 
 /** \brief The errors that can be reported to the GUI & other front-end users
- *  \warning If you modify QofBackendError, please update 
+ *  \warning (GnuCash) If you modify QofBackendError, please update 
  *   src/engine/gw-engine-spec.scm 
 */
 typedef enum {
@@ -106,6 +106,7 @@
   ERR_FILEIO_UNKNOWN_FILE_TYPE, /**< didn't recognize the file type */
   ERR_FILEIO_PARSE_ERROR,    /**< couldn't parse the data in the file */
   ERR_FILEIO_BACKUP_ERROR,   /**< couldn't make a backup of the file */
+  ERR_FILEIO_WRITE_ERROR,    /**< couldn't write to the file */
 
   /* network errors */
   ERR_NETIO_SHORT_READ = 2000,  /**< not enough bytes received */
Index: chart-export.glade
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome/glade/Attic/chart-export.glade,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -Lsrc/gnome/glade/chart-export.glade -Lsrc/gnome/glade/chart-export.glade -u -r1.1.2.2 -r1.1.2.3
--- src/gnome/glade/chart-export.glade
+++ src/gnome/glade/chart-export.glade
@@ -166,7 +166,6 @@
 
 <widget class="GtkFileChooserDialog" id="chartfilechooserdialog">
   <property name="visible">True</property>
-  <property name="tooltip" translatable="yes">The extension .xml is optional</property>
   <property name="action">GTK_FILE_CHOOSER_ACTION_SAVE</property>
   <property name="local_only">True</property>
   <property name="select_multiple">False</property>


More information about the gnucash-changes mailing list