r18045 - gnucash/trunk - 1) Remove obsolete xxx-backend-file files (now are backend-xml)
Phil Longstaff
plongstaff at code.gnucash.org
Sun Apr 12 13:14:21 EDT 2009
Author: plongstaff
Date: 2009-04-12 13:14:21 -0400 (Sun, 12 Apr 2009)
New Revision: 18045
Trac: http://svn.gnucash.org/trac/changeset/18045
Added:
gnucash/trunk/src/backend/xml/gnc-backend-xml.c
gnucash/trunk/src/backend/xml/gnc-backend-xml.h
Removed:
gnucash/trunk/src/backend/xml/gnc-backend-file.c
gnucash/trunk/src/backend/xml/gnc-backend-file.h
gnucash/trunk/src/backend/xml/gncmod-backend-file.c
gnucash/trunk/src/business/business-core/xml/gncmod-business-backend-file.c
Modified:
gnucash/trunk/configure.in
gnucash/trunk/make-gnucash-potfiles.in
gnucash/trunk/po/POTFILES.in
gnucash/trunk/po/POTFILES.skip
gnucash/trunk/src/backend/Makefile.am
gnucash/trunk/src/backend/dbi/Makefile.am
gnucash/trunk/src/backend/xml/Makefile.am
gnucash/trunk/src/backend/xml/gncmod-backend-xml.c
gnucash/trunk/src/backend/xml/io-gncxml-v2.h
gnucash/trunk/src/backend/xml/test/test-load-xml2.c
gnucash/trunk/src/gnome-utils/druid-gnc-xml-import.c
gnucash/trunk/src/html/Makefile.am
Log:
1) Remove obsolete xxx-backend-file files (now are backend-xml)
2) Fix 'make check', 'make dist' and 'make distcheck' problems
Make distcheck now passes
Modified: gnucash/trunk/configure.in
===================================================================
--- gnucash/trunk/configure.in 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/configure.in 2009-04-12 17:14:21 UTC (rev 18045)
@@ -1498,8 +1498,6 @@
src/backend/xml/test/Makefile
src/backend/xml/test/test-files/Makefile
src/backend/xml/test/test-files/xml2/Makefile
- src/backend/postgres/Makefile
- src/backend/postgres/test/Makefile
src/backend/sql/Makefile
src/backend/sql/test/Makefile
src/bin/Makefile
@@ -1557,8 +1555,6 @@
src/libqof/backend/Makefile
src/libqof/backend/file/Makefile
src/optional/Makefile
- src/optional/python-bindings/Makefile
- src/optional/python-bindings/tests/Makefile
src/optional/xsl/Makefile
src/pixmaps/Makefile
src/quotes/Makefile
Modified: gnucash/trunk/make-gnucash-potfiles.in
===================================================================
--- gnucash/trunk/make-gnucash-potfiles.in 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/make-gnucash-potfiles.in 2009-04-12 17:14:21 UTC (rev 18045)
@@ -50,7 +50,7 @@
}
# These are also added, even though they are outside of src/
-print "lib/libqof/backend/file/qsf-backend.c\n";
-print "lib/libqof/qof/gnc-date.c\n";
+print "src/libqof/backend/file/qsf-backend.c\n";
+print "src/libqof/qof/gnc-date.c\n";
print "intl-scm/guile-strings.c\n";
print "doc/tip_of_the_day.list.in\n"
Modified: gnucash/trunk/po/POTFILES.in
===================================================================
--- gnucash/trunk/po/POTFILES.in 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/po/POTFILES.in 2009-04-12 17:14:21 UTC (rev 18045)
@@ -24,15 +24,24 @@
src/app-utils/guile-util.c
src/app-utils/option-util.c
src/backend/dbi/gnc-backend-dbi.c
-src/backend/dbi/gncmod-backend-dbi.c
+src/backend/sql/gnc-account-sql.c
+src/backend/sql/gnc-backend-sql.c
+src/backend/sql/gnc-book-sql.c
+src/backend/sql/gnc-budget-sql.c
+src/backend/sql/gnc-commodity-sql.c
+src/backend/sql/gnc-lots-sql.c
+src/backend/sql/gnc-price-sql.c
+src/backend/sql/gnc-recurrence-sql.c
+src/backend/sql/gnc-schedxaction-sql.c
+src/backend/sql/gnc-slots-sql.c
+src/backend/sql/gnc-transaction-sql.c
src/backend/xml/gnc-account-xml-v2.c
-src/backend/xml/gnc-backend-file.c
+src/backend/xml/gnc-backend-xml.c
src/backend/xml/gnc-book-xml-v2.c
src/backend/xml/gnc-budget-xml-v2.c
src/backend/xml/gnc-commodity-xml-v2.c
src/backend/xml/gnc-freqspec-xml-v2.c
src/backend/xml/gnc-lot-xml-v2.c
-src/backend/xml/gncmod-backend-xml.c
src/backend/xml/gnc-pricedb-xml-v2.c
src/backend/xml/gnc-recurrence-xml-v2.c
src/backend/xml/gnc-schedxaction-xml-v2.c
@@ -48,46 +57,7 @@
src/backend/xml/sixtp-stack.c
src/backend/xml/sixtp-to-dom-parser.c
src/backend/xml/sixtp-utils.c
-src/backend/postgres/account.c
-src/backend/postgres/book.c
-src/backend/postgres/builder.c
-src/backend/postgres/checkpoint.c
-src/backend/postgres/demo.c
-src/backend/postgres/escape.c
-src/backend/postgres/events.c
-src/backend/postgres/gncquery.c
-src/backend/postgres/kvp-sql.c
-src/backend/postgres/PostgresBackend.c
-src/backend/postgres/price.c
-src/backend/postgres/putil.c
-src/backend/postgres/txn.c
-src/backend/postgres/txnmass.c
-src/backend/postgres/upgrade.c
-src/backend/sql/gnc-account-sql.c
-src/backend/sql/gnc-backend-sql.c
-src/backend/sql/gnc-book-sql.c
-src/backend/sql/gnc-budget-sql.c
-src/backend/sql/gnc-commodity-sql.c
-src/backend/sql/gnc-lots-sql.c
-src/backend/sql/gnc-price-sql.c
-src/backend/sql/gnc-recurrence-sql.c
-src/backend/sql/gnc-schedxaction-sql.c
-src/backend/sql/gnc-slots-sql.c
-src/backend/sql/gnc-transaction-sql.c
src/bin/gnucash-bin.c
-src/business/business-core/xml/gnc-address-xml-v2.c
-src/business/business-core/xml/gnc-bill-term-xml-v2.c
-src/business/business-core/xml/gnc-customer-xml-v2.c
-src/business/business-core/xml/gnc-employee-xml-v2.c
-src/business/business-core/xml/gnc-entry-xml-v2.c
-src/business/business-core/xml/gnc-invoice-xml-v2.c
-src/business/business-core/xml/gnc-job-xml-v2.c
-src/business/business-core/xml/gncmod-business-backend-file.c
-src/business/business-core/xml/gncmod-business-backend-xml.c
-src/business/business-core/xml/gnc-order-xml-v2.c
-src/business/business-core/xml/gnc-owner-xml-v2.c
-src/business/business-core/xml/gnc-tax-table-xml-v2.c
-src/business/business-core/xml/gnc-vendor-xml-v2.c
src/business/business-core/gncAddress.c
src/business/business-core/gncBillTerm.c
src/business/business-core/gncBusGuile.c
@@ -114,6 +84,18 @@
src/business/business-core/sql/gnc-owner-sql.c
src/business/business-core/sql/gnc-tax-table-sql.c
src/business/business-core/sql/gnc-vendor-sql.c
+src/business/business-core/xml/gnc-address-xml-v2.c
+src/business/business-core/xml/gnc-bill-term-xml-v2.c
+src/business/business-core/xml/gnc-customer-xml-v2.c
+src/business/business-core/xml/gnc-employee-xml-v2.c
+src/business/business-core/xml/gnc-entry-xml-v2.c
+src/business/business-core/xml/gnc-invoice-xml-v2.c
+src/business/business-core/xml/gnc-job-xml-v2.c
+src/business/business-core/xml/gncmod-business-backend-xml.c
+src/business/business-core/xml/gnc-order-xml-v2.c
+src/business/business-core/xml/gnc-owner-xml-v2.c
+src/business/business-core/xml/gnc-tax-table-xml-v2.c
+src/business/business-core/xml/gnc-vendor-xml-v2.c
src/business/business-gnome/business-gnome-utils.c
src/business/business-gnome/business-options-gnome.c
src/business/business-gnome/business-urls.c
@@ -295,7 +277,6 @@
src/gnome-utils/druid-utils.c
src/gnome-utils/glade/commodity.glade
src/gnome-utils/glade/dialog-book-close.glade
-src/gnome-utils/glade/dialog-database-connection.glade
src/gnome-utils/glade/dialog-file-access.glade
src/gnome-utils/glade/dialog-query-list.glade
src/gnome-utils/glade/dialog-reset-warnings.glade
@@ -330,9 +311,6 @@
src/gnome-utils/gnc-general-select.c
src/gnome-utils/gnc-gnome-utils.c
src/gnome-utils/gnc-gui-query.c
-src/gnome-utils/gnc-html.c
-src/gnome-utils/gnc-html-graph-gog.c
-src/gnome-utils/gnc-html-history.c
src/gnome-utils/gnc-icons.c
src/gnome-utils/gnc-main-window.c
src/gnome-utils/gnc-menu-extensions.c
@@ -367,6 +345,15 @@
src/gnome-utils/search-param.c
src/gnome-utils/window-main-summarybar.c
src/gnome/window-reconcile.c
+src/html/gnc-html.c
+src/html/gnc-html-factory.c
+src/html/gnc-html-graph-gog.c
+src/html/gnc-html-graph-gog-gtkhtml.c
+src/html/gnc-html-graph-gog-webkit.c
+src/html/gnc-html-gtkhtml.c
+src/html/gnc-html-history.c
+src/html/gnc-html-webkit.c
+src/html/gncmod-html.c
src/import-export/aqbanking/aqbanking.glade
src/import-export/aqbanking/dialog-ab-trans.c
src/import-export/aqbanking/dialog-daterange.c
@@ -441,6 +428,32 @@
src/import-export/qif/qif-file.c
src/import-export/qif/qif-objects.c
src/import-export/schemas/apps_gnucash_import_generic_matcher.schemas.in
+src/libqof/backend/file/qsf-backend.c
+src/libqof/backend/file/qsf-xml.c
+src/libqof/backend/file/qsf-xml-map.c
+src/libqof/qof/gnc-date.c
+src/libqof/qof/gnc-numeric.c
+src/libqof/qof/guid.c
+src/libqof/qof/kvp_frame.c
+src/libqof/qof/kvp-util.c
+src/libqof/qof/md5.c
+src/libqof/qof/qofbackend.c
+src/libqof/qof/qofbook.c
+src/libqof/qof/qofbookmerge.c
+src/libqof/qof/qofchoice.c
+src/libqof/qof/qofclass.c
+src/libqof/qof/qofevent.c
+src/libqof/qof/qofid.c
+src/libqof/qof/qofinstance.c
+src/libqof/qof/qoflog.c
+src/libqof/qof/qofmath128.c
+src/libqof/qof/qofobject.c
+src/libqof/qof/qofquery.c
+src/libqof/qof/qofquerycore.c
+src/libqof/qof/qofreference.c
+src/libqof/qof/qofsession.c
+src/libqof/qof/qofutil.c
+src/libqof/qof/qof-win32.c
src/register/ledger-core/dialog-dup-trans.c
src/register/ledger-core/gnc-ledger-display.c
src/register/ledger-core/gncmod-ledger-core.c
Modified: gnucash/trunk/po/POTFILES.skip
===================================================================
--- gnucash/trunk/po/POTFILES.skip 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/po/POTFILES.skip 2009-04-12 17:14:21 UTC (rev 18045)
@@ -7,8 +7,29 @@
src/gnome-utils/gnctreemodelsort.c
src/gnome-utils/gtktreedatalist.c
src/gnome-utils/gnc-tree-model-selection.c
-src/backend/file/gncmod-backend-file.c
+src/backend/dbi/gncmod-backend-dbi.c
src/backend/file/io-gncbin-r.c
+src/backend/xml/gncmod-backend-xml.c
src/import-export/binary-import/binary-import.glade
src/import-export/binary-import/druid-commodity.c
src/import-export/binary-import/gncmod-binary-import.c
+src/backend/postgres/PostgresBackend.c
+src/backend/postgres/account.c
+src/backend/postgres/book.c
+src/backend/postgres/builder.c
+src/backend/postgres/checkpoint.c
+src/backend/postgres/demo.c
+src/backend/postgres/escape.c
+src/backend/postgres/events.c
+src/backend/postgres/gncquery.c
+src/backend/postgres/kvp-sql.c
+src/backend/postgres/price.c
+src/backend/postgres/putil.c
+src/backend/postgres/txn.c
+src/backend/postgres/txnmass.c
+src/backend/postgres/upgrade.c
+src/gnome-utils/glade/dialog-database-connection.glade
+src/libqof/qof/qofgobj.c
+src/libqof/qof/qofquery-deserial.c
+src/libqof/qof/qofquery-serialize.c
+src/libqof/qof/qofsql.c
Modified: gnucash/trunk/src/backend/Makefile.am
===================================================================
--- gnucash/trunk/src/backend/Makefile.am 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/backend/Makefile.am 2009-04-12 17:14:21 UTC (rev 18045)
@@ -1,3 +1,3 @@
SUBDIRS = xml sql ${DBI_DIR}
-DIST_SUBDIRS = xml sql ${DBI_DIR}
+DIST_SUBDIRS = xml sql dbi
Modified: gnucash/trunk/src/backend/dbi/Makefile.am
===================================================================
--- gnucash/trunk/src/backend/dbi/Makefile.am 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/backend/dbi/Makefile.am 2009-04-12 17:14:21 UTC (rev 18045)
@@ -10,8 +10,8 @@
-I${top_srcdir}/src/backend \
-I${top_srcdir}/src/backend/sql \
-I${top_srcdir}/src/engine \
- -I${top_srcdir}/src/core-utils\
- -I${top_srcdir}/lib/libc\
+ -I${top_srcdir}/src/core-utils \
+ -I${top_srcdir}/lib/libc \
-I${top_srcdir}/src/libqof/qof \
${GLIB_CFLAGS} \
${GCONF_CFLAGS} \
Modified: gnucash/trunk/src/backend/xml/Makefile.am
===================================================================
--- gnucash/trunk/src/backend/xml/Makefile.am 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/backend/xml/Makefile.am 2009-04-12 17:14:21 UTC (rev 18045)
@@ -9,7 +9,8 @@
-DLOCALE_DIR=\""$(datadir)/locale"\" \
-I${top_srcdir}/src/backend \
-I${top_srcdir}/src/engine \
- -I${top_srcdir}/src/core-utils\
+ -I${top_srcdir}/src/core-utils \
+ -I${top_srcdir}/src/gnc-module \
-I${top_srcdir}/lib/libc\
-I${top_srcdir}/src/libqof/qof \
${LIBXML2_CFLAGS} \
@@ -40,10 +41,10 @@
sixtp.c
libgncmod_backend_xml_la_SOURCES = \
- gnc-backend-file.c
+ gnc-backend-xml.c
noinst_HEADERS = \
- gnc-backend-file.h \
+ gnc-backend-xml.h \
gnc-xml.h \
gnc-xml-helper.h \
io-example-account.h \
Deleted: gnucash/trunk/src/backend/xml/gnc-backend-file.c
===================================================================
--- gnucash/trunk/src/backend/xml/gnc-backend-file.c 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/backend/xml/gnc-backend-file.c 2009-04-12 17:14:21 UTC (rev 18045)
@@ -1,1111 +0,0 @@
-/********************************************************************
- * gnc-backend-file.c: load and save data to XML files *
- * *
- * 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 *
- * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
- * Boston, MA 02110-1301, USA gnu at gnu.org *
-\********************************************************************/
-/** @file gnc-backend-file.c
- * @brief load and save data to XML files
- * @author Copyright (c) 2000 Gnumatic Inc.
- * @author Copyright (c) 2002 Derek Atkins <warlord at MIT.EDU>
- * @author Copyright (c) 2003 Linas Vepstas <linas at linas.org>
- *
- * This file implements the top-level QofBackend API for saving/
- * restoring data to/from an ordinary Unix filesystem file.
- */
-
-#include "config.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <glib/gstdio.h>
-#ifndef HAVE_GLIB_2_8
-#include <gstdio-2.8.h>
-#endif
-#include <libintl.h>
-#include <locale.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <dirent.h>
-#include <time.h>
-
-#include "qof.h"
-#include "TransLog.h"
-#include "gnc-engine.h"
-
-#include "gnc-filepath-utils.h"
-
-#include "io-gncxml.h"
-#include "io-gncxml-v2.h"
-#include "gnc-backend-file.h"
-#include "gnc-gconf-utils.h"
-
-#ifndef HAVE_STRPTIME
-# include "strptime.h"
-#endif
-
-#define GNC_BE_DAYS "file_retention_days"
-#define GNC_BE_ZIP "file_compression"
-
-static QofLogModule log_module = GNC_MOD_BACKEND;
-
-typedef enum
-{
- GNC_BOOK_NOT_OURS,
- GNC_BOOK_BIN_FILE,
- GNC_BOOK_XML1_FILE,
- GNC_BOOK_XML2_FILE,
- GNC_BOOK_XML2_FILE_NO_ENCODING,
- QSF_GNC_OBJECT,
- QSF_OBJECT,
- QSF_MAP,
-} QofBookFileType;
-
-/* ================================================================= */
-
-static gboolean
-gnc_file_be_get_file_lock (FileBackend *be)
-{
- struct stat statbuf;
-#ifndef G_OS_WIN32
- char pathbuf[PATH_MAX];
- char *path = NULL;
-#endif
- int rc;
- QofBackendError be_err;
-
- rc = g_stat (be->lockfile, &statbuf);
- if (!rc)
- {
- /* oops .. file is locked by another user .. */
- qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_LOCKED);
- return FALSE;
- }
-
- be->lockfd = g_open (be->lockfile, O_RDWR | O_CREAT | O_EXCL , 0);
- if (be->lockfd < 0)
- {
- /* oops .. we can't create the lockfile .. */
- switch (errno) {
- case EACCES:
- case EROFS:
- case ENOSPC:
- be_err = ERR_BACKEND_READONLY;
- break;
- default:
- be_err = ERR_BACKEND_LOCKED;
- break;
- }
- qof_backend_set_error ((QofBackend*)be, be_err);
- return FALSE;
- }
-
- /* OK, now work around some NFS atomic lock race condition
- * mumbo-jumbo. We do this by linking a unique file, and
- * then examing the link count. At least that's what the
- * NFS programmers guide suggests.
- * Note: the "unique filename" must be unique for the
- * triplet filename-host-process, otherwise accidental
- * aliases can occur.
- */
-
- /* apparently, even this code may not work for some NFS
- * implementations. In the long run, I am told that
- * ftp.debian.org
- * /pub/debian/dists/unstable/main/source/libs/liblockfile_0.1-6.tar.gz
- * provides a better long-term solution.
- */
-
-#ifndef G_OS_WIN32
- strcpy (pathbuf, be->lockfile);
- path = strrchr (pathbuf, '.');
- sprintf (path, ".%lx.%d.LNK", gethostid(), getpid());
-
- rc = link (be->lockfile, pathbuf);
- if (rc)
- {
- /* If hard links aren't supported, just allow the lock. */
- if (errno == EPERM || errno == ENOSYS
-# ifdef EOPNOTSUPP
- || errno == EOPNOTSUPP
-# endif
-# ifdef ENOTSUP
- || errno == ENOTSUP
-# endif
-# ifdef ENOSYS
- || errno == ENOSYS
-# endif
- )
- {
- be->linkfile = NULL;
- return TRUE;
- }
-
- /* Otherwise, something else is wrong. */
- qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_LOCKED);
- g_unlink (pathbuf);
- close (be->lockfd);
- g_unlink (be->lockfile);
- return FALSE;
- }
-
- rc = g_stat (be->lockfile, &statbuf);
- if (rc)
- {
- /* oops .. stat failed! This can't happen! */
- qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_LOCKED);
- g_unlink (pathbuf);
- close (be->lockfd);
- g_unlink (be->lockfile);
- return FALSE;
- }
-
- if (statbuf.st_nlink != 2)
- {
- qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_LOCKED);
- g_unlink (pathbuf);
- close (be->lockfd);
- g_unlink (be->lockfile);
- return FALSE;
- }
-
- be->linkfile = g_strdup (pathbuf);
-
- return TRUE;
-
-#else /* ifndef G_OS_WIN32 */
- /* On windows, there is no NFS and the open(,O_CREAT | O_EXCL)
- is sufficient for locking. */
- be->linkfile = NULL;
- return TRUE;
-#endif /* ifndef G_OS_WIN32 */
-}
-
-/* ================================================================= */
-
-static void
-file_session_begin(QofBackend *be_start, QofSession *session,
- const char *book_id,
- gboolean ignore_lock, gboolean create_if_nonexistent)
-{
- FileBackend *be = (FileBackend*) be_start;
-
- ENTER (" ");
-
- /* Make sure the directory is there */
- be->fullpath = xaccResolveFilePath(book_id);
- if (NULL == be->fullpath)
- {
- qof_backend_set_error (be_start, ERR_FILEIO_FILE_NOT_FOUND);
- LEAVE("");
- return;
- }
- be->be.fullpath = be->fullpath;
- be->dirname = g_path_get_dirname (be->fullpath);
-
- {
- struct stat statbuf;
- int rc;
-
- /* Again check whether the directory can be accessed */
- rc = g_stat (be->dirname, &statbuf);
- if (rc != 0 || !S_ISDIR(statbuf.st_mode))
- {
- /* Error on stat or if it isn't a directory means we
- cannot find this filename */
- qof_backend_set_error (be_start, ERR_FILEIO_FILE_NOT_FOUND);
- g_free (be->fullpath); be->fullpath = NULL;
- g_free (be->dirname); be->dirname = NULL;
- LEAVE("");
- return;
- }
-
- /* Now check whether we can g_stat the file itself */
- rc = g_stat (be->fullpath, &statbuf);
- if ((rc != 0) && (!create_if_nonexistent))
- {
- /* Error on stat means the file doesn't exist */
- qof_backend_set_error (be_start, ERR_FILEIO_FILE_NOT_FOUND);
- g_free (be->fullpath); be->fullpath = NULL;
- g_free (be->dirname); be->dirname = NULL;
- LEAVE("");
- return;
- }
- if (rc == 0 && S_ISDIR(statbuf.st_mode))
- {
- /* FIXME: What is actually checked here? Whether the
- fullpath erroneously points to a directory or what?
- Then the error message should be changed into something
- much more clear! */
- qof_backend_set_error (be_start, ERR_FILEIO_UNKNOWN_FILE_TYPE);
- g_free (be->fullpath); be->fullpath = NULL;
- g_free (be->dirname); be->dirname = NULL;
- LEAVE("");
- return;
- }
- }
-
- /* ---------------------------------------------------- */
- /* We should now have a fully resolved path name.
- * Lets see if we can get a lock on it. */
-
- be->lockfile = g_strconcat(be->fullpath, ".LCK", NULL);
-
- if (!ignore_lock && !gnc_file_be_get_file_lock (be))
- {
- g_free (be->lockfile); be->lockfile = NULL;
- LEAVE("");
- return;
- }
-
- LEAVE (" ");
- return;
-}
-
-/* ================================================================= */
-
-static void
-file_session_end(QofBackend *be_start)
-{
- FileBackend *be = (FileBackend*)be_start;
- ENTER (" ");
-
- if (be->linkfile)
- g_unlink (be->linkfile);
-
- if (be->lockfd > 0)
- close (be->lockfd);
-
- if (be->lockfile) {
- int rv;
-#ifdef G_OS_WIN32
- /* On windows, we need to allow write-access before
- g_unlink() can succeed */
- rv = g_chmod (be->lockfile, S_IWRITE | S_IREAD);
-#endif
- rv = g_unlink (be->lockfile);
- if (rv) {
- PWARN("Error on g_unlink(%s): %d: %s", be->lockfile,
- errno, strerror(errno) ? strerror(errno) : "");
- }
- }
-
- g_free (be->dirname);
- be->dirname = NULL;
-
- g_free (be->fullpath);
- be->fullpath = NULL;
-
- g_free (be->lockfile);
- be->lockfile = NULL;
-
- g_free (be->linkfile);
- be->linkfile = NULL;
- LEAVE (" ");
-}
-
-static void
-file_destroy_backend(QofBackend *be)
-{
- qof_backend_destroy(be);
- g_free(be);
-}
-
-/* ================================================================= */
-/* Write the financial data in a book to a file, returning FALSE on
- error and setting the error_result to indicate what went wrong if
- it's not NULL. This function does not manage file locks in any
- way.
-
- If make_backup is true, write out a time-stamped copy of the file
- into the same directory as the indicated file, with a filename of
- "file.YYYYMMDDHHMMSS.xac" where YYYYMMDDHHMMSS is replaced with the
- current year/month/day/hour/minute/second. */
-
-static gboolean
-copy_file(const char *orig, const char *bkup)
-{
- static int buf_size = 1024;
- char buf[buf_size];
- int orig_fd;
- int bkup_fd;
- int flags=0;
- ssize_t count_write;
- ssize_t count_read;
-
-#ifdef G_OS_WIN32
- flags = O_BINARY;
-#endif
-
- orig_fd = g_open(orig, O_RDONLY | flags, 0);
- if(orig_fd == -1)
- {
- return FALSE;
- }
- bkup_fd = g_open(bkup, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL | flags, 0600);
- if(bkup_fd == -1)
- {
- close(orig_fd);
- return FALSE;
- }
-
- do
- {
- count_read = read(orig_fd, buf, buf_size);
- if(count_read == -1 && errno != EINTR)
- {
- close(orig_fd);
- close(bkup_fd);
- return FALSE;
- }
-
- if(count_read > 0)
- {
- count_write = write(bkup_fd, buf, count_read);
- if(count_write == -1)
- {
- close(orig_fd);
- close(bkup_fd);
- return FALSE;
- }
- }
- } while(count_read > 0);
-
- close(orig_fd);
- close(bkup_fd);
-
- return TRUE;
-}
-
-/* ================================================================= */
-
-static gboolean
-gnc_int_link_or_make_backup(FileBackend *be, const char *orig, const char *bkup)
-{
- gboolean copy_success = FALSE;
- int err_ret =
-#ifdef HAVE_LINK
- link (orig, bkup)
-#else
- -1
-#endif
- ;
- if(err_ret != 0)
- {
-#ifdef HAVE_LINK
- if(errno == EPERM || errno == ENOSYS
-# ifdef EOPNOTSUPP
- || errno == EOPNOTSUPP
-# endif
-# ifdef ENOTSUP
- || errno == ENOTSUP
-# endif
-# ifdef ENOSYS
- || errno == ENOSYS
-# endif
- )
-#endif
- {
- copy_success = copy_file(orig, bkup);
- }
-
- if(!copy_success)
- {
- qof_backend_set_error((QofBackend*)be, ERR_FILEIO_BACKUP_ERROR);
- PWARN ("unable to make file backup from %s to %s: %s",
- orig, bkup, strerror(errno) ? strerror(errno) : "");
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-/* ================================================================= */
-
-static QofBookFileType
-gnc_file_be_determine_file_type(const char *path)
-{
- gboolean with_encoding;
- if (gnc_is_xml_data_file_v2(path, &with_encoding)) {
- if (with_encoding) {
- return GNC_BOOK_XML2_FILE;
- } else {
- return GNC_BOOK_XML2_FILE_NO_ENCODING;
- }
- } else if (gnc_is_xml_data_file(path)) {
- return GNC_BOOK_XML1_FILE;
- }
- return GNC_BOOK_NOT_OURS;
-}
-
-static gboolean
-gnc_determine_file_type (const char *path)
-{
- struct stat sbuf;
- int rc;
- FILE *t;
-
- if (!path) { return FALSE; }
-
- // Since this can be called with "xml:" as a prefix, remove it if it exists
- if( g_str_has_prefix( path, "xml:" ) ) {
- path += 4;
- }
-
- if (0 == safe_strcmp(path, QOF_STDOUT)) { return FALSE; }
- t = g_fopen(path, "r");
- if(!t) { PINFO (" new file"); return TRUE; }
- fclose(t);
- rc = g_stat(path, &sbuf);
- if(rc < 0) { return FALSE; }
- if (sbuf.st_size == 0) { PINFO (" empty file"); return TRUE; }
- if(gnc_is_xml_data_file_v2(path, NULL)) { return TRUE; }
- else if(gnc_is_xml_data_file(path)) { return TRUE; }
- PINFO (" %s is not a gnc XML file", path);
- return FALSE;
-}
-
-static gboolean
-gnc_file_be_backup_file(FileBackend *be)
-{
- gboolean bkup_ret;
- char *timestamp;
- char *backup;
- const char *datafile;
- struct stat statbuf;
- int rc;
-
- datafile = be->fullpath;
-
- rc = g_stat (datafile, &statbuf);
- if (rc)
- return (errno == ENOENT);
-
- if(gnc_file_be_determine_file_type(datafile) == GNC_BOOK_BIN_FILE)
- {
- /* make a more permament safer backup */
- const char *back = "-binfmt.bkup";
- char *bin_bkup = g_new(char, strlen(datafile) + strlen(back) + 1);
- strcpy(bin_bkup, datafile);
- strcat(bin_bkup, back);
- bkup_ret = gnc_int_link_or_make_backup(be, datafile, bin_bkup);
- g_free(bin_bkup);
- if(!bkup_ret)
- {
- return FALSE;
- }
- }
-
- timestamp = xaccDateUtilGetStampNow ();
- backup = g_new (char, strlen (datafile) + strlen (timestamp) + 6);
- strcpy (backup, datafile);
- strcat (backup, ".");
- strcat (backup, timestamp);
- strcat (backup, ".xac");
- g_free (timestamp);
-
- bkup_ret = gnc_int_link_or_make_backup(be, datafile, backup);
- g_free(backup);
-
- return bkup_ret;
-}
-
-/* ================================================================= */
-
-static gboolean
-gnc_file_be_write_to_file(FileBackend *fbe,
- QofBook *book,
- const gchar *datafile,
- gboolean make_backup)
-{
- QofBackend *be = &fbe->be;
- char *tmp_name;
- struct stat statbuf;
- int rc;
- QofBackendError be_err;
-
- ENTER (" book=%p file=%s", book, datafile);
-
- /* If the book is 'clean', recently saved, then don't save again. */
- /* XXX this is currently broken due to faulty 'Save As' logic. */
- /* if (FALSE == qof_book_not_saved (book)) return FALSE; */
-
- tmp_name = g_new(char, strlen(datafile) + 12);
- strcpy(tmp_name, datafile);
- strcat(tmp_name, ".tmp-XXXXXX");
-
- if(!mktemp(tmp_name))
- {
- qof_backend_set_error(be, ERR_BACKEND_MISC);
- LEAVE("");
- return FALSE;
- }
-
- if(make_backup)
- {
- if(!gnc_file_be_backup_file(fbe))
- {
- LEAVE("");
- return FALSE;
- }
- }
-
- if (gnc_book_write_to_xml_file_v2(book, tmp_name, fbe->file_compression))
- {
- /* Record the file's permissions before g_unlinking it */
- rc = g_stat(datafile, &statbuf);
- if(rc == 0)
- {
- /* Use the permissions from the original data file */
- if(g_chmod(tmp_name, statbuf.st_mode) != 0)
- {
- /* qof_backend_set_error(be, ERR_BACKEND_PERM); */
- /* Even if the chmod did fail, the save
- nevertheless completed successfully. It is
- therefore wrong to signal the ERR_BACKEND_PERM
- error here which implies that the saving itself
- failed. Instead, we simply ignore this. */
- PWARN("unable to chmod filename %s: %s",
- tmp_name ? tmp_name : "(null)",
- strerror(errno) ? strerror(errno) : "");
-#if VFAT_DOESNT_SUCK /* chmod always fails on vfat/samba fs */
- /* g_free(tmp_name); */
- /* return FALSE; */
-#endif
- }
-#ifdef HAVE_CHOWN
- /* Don't try to change the owner. Only root can do
- that. */
- if(chown(tmp_name, -1, statbuf.st_gid) != 0)
- {
- /* qof_backend_set_error(be, ERR_BACKEND_PERM); */
- /* A failed chown doesn't mean that the saving itself
- failed. So don't abort with an error here! */
- PWARN("unable to chown filename %s: %s",
- tmp_name ? tmp_name : "(null)",
- strerror(errno) ? strerror(errno) : "");
-#if VFAT_DOESNT_SUCK /* chown always fails on vfat fs */
- /* g_free(tmp_name);
- return FALSE; */
-#endif
- }
-#endif
- }
- if(g_unlink(datafile) != 0 && errno != ENOENT)
- {
- qof_backend_set_error(be, ERR_BACKEND_READONLY);
- PWARN("unable to unlink filename %s: %s",
- datafile ? datafile : "(null)",
- strerror(errno) ? strerror(errno) : "");
- g_free(tmp_name);
- LEAVE("");
- return FALSE;
- }
- if(!gnc_int_link_or_make_backup(fbe, tmp_name, datafile))
- {
- qof_backend_set_error(be, ERR_FILEIO_BACKUP_ERROR);
- g_free(tmp_name);
- LEAVE("");
- return FALSE;
- }
- if(g_unlink(tmp_name) != 0)
- {
- qof_backend_set_error(be, ERR_BACKEND_PERM);
- PWARN("unable to unlink temp filename %s: %s",
- tmp_name ? tmp_name : "(null)",
- strerror(errno) ? strerror(errno) : "");
- g_free(tmp_name);
- LEAVE("");
- return FALSE;
- }
- g_free(tmp_name);
-
- /* Since we successfully saved the book,
- * we should mark it clean. */
- qof_book_mark_saved (book);
- LEAVE (" sucessful save of book=%p to file=%s", book, datafile);
- return TRUE;
- }
- else
- {
- if(g_unlink(tmp_name) != 0)
- {
- switch (errno) {
- case ENOENT: /* tmp_name doesn't exist? Assume "RO" error */
- case EACCES:
- case EPERM:
- case ENOSYS:
- case EROFS:
- be_err = ERR_BACKEND_READONLY;
- break;
- default:
- be_err = ERR_BACKEND_MISC;
- }
- qof_backend_set_error(be, be_err);
- PWARN("unable to unlink temp_filename %s: %s",
- tmp_name ? tmp_name : "(null)",
- strerror(errno) ? strerror(errno) : "");
- /* already in an error just flow on through */
- }
- g_free(tmp_name);
- LEAVE("");
- return FALSE;
- }
- LEAVE("");
- return TRUE;
-}
-
-/* ================================================================= */
-
-static int
-gnc_file_be_select_files (const gchar *d)
-{
- return (g_str_has_suffix(d, ".LNK") ||
- g_str_has_suffix(d, ".xac") ||
- g_str_has_suffix(d, ".log"));
-}
-
-static void
-gnc_file_be_remove_old_files(FileBackend *be)
-{
- const gchar *dent;
- GDir *dir;
- struct stat lockstatbuf, statbuf;
- int pathlen;
- time_t now;
-
- if (g_stat (be->lockfile, &lockstatbuf) != 0)
- return;
- pathlen = strlen(be->fullpath);
-
- /*
- * Clean up any lockfiles from prior crashes, and clean up old
- * data and log files. Scandir will do a fist pass on the
- * filenames and cull the directory down to just files with the
- * appropriate extensions. Pity you can't pass user data into
- * scandir...
- */
-
- /*
- * Unfortunately scandir() is not portable, so re-write this
- * function without it. Note that this version will be even a bit
- * faster because it does not have to sort, malloc, or anything
- * else that scandir did, and it only performs a single pass
- * through the directory rather than one pass through the
- * directory and then one pass over the 'matching' files. --
- * warlord at MIT.EDU 2002-05-06
- */
-
- dir = g_dir_open (be->dirname, 0, NULL);
- if (!dir)
- return;
-
- now = time(NULL);
- while((dent = g_dir_read_name(dir)) != NULL) {
- char *name;
- int len;
-
- if (gnc_file_be_select_files (dent) == 0)
- continue;
-
- name = g_build_filename(be->dirname, dent, (gchar*)NULL);
- len = strlen(name) - 4;
-
- /* Is this file associated with the current data file */
- if (strncmp(name, be->fullpath, pathlen) == 0)
- {
- if ((safe_strcmp(name + len, ".LNK") == 0) &&
- /* Is a lock file. Skip the active lock file */
- (safe_strcmp(name, be->linkfile) != 0) &&
- /* Only delete lock files older than the active one */
- (g_stat(name, &statbuf) == 0) &&
- (statbuf.st_mtime <lockstatbuf.st_mtime))
- {
- PINFO ("unlink lock file: %s", name);
- g_unlink(name);
- }
- else if (be->file_retention_days > 0)
- {
- time_t file_time;
- struct tm file_tm;
- int days;
- const char* res;
-
- PINFO ("file retention = %d days", be->file_retention_days);
-
- /* Is the backup file old enough to delete */
- memset(&file_tm, 0, sizeof(file_tm));
- res = strptime(name+pathlen+1, "%Y%m%d%H%M%S", &file_tm);
- file_time = mktime(&file_tm);
- days = (int)(difftime(now, file_time) / 86400);
-
-
- if (res
- && res != name+pathlen+1
- && (strcmp(res, ".xac") == 0
- || strcmp(res, ".log") == 0)
- && file_time > 0
- && days > be->file_retention_days)
- {
- PINFO ("g_unlink stale (%d days old) file: %s", days, name);
- g_unlink(name);
- }
- }
- }
- g_free(name);
- }
- g_dir_close (dir);
-}
-
-static void
-file_sync_all(QofBackend* be, QofBook *book)
-{
- FileBackend *fbe = (FileBackend *) be;
- ENTER ("book=%p, primary=%p", book, fbe->primary_book);
-
- /* We make an important assumption here, that we might want to change
- * in the future: when the user says 'save', we really save the one,
- * the only, the current open book, and nothing else. We do this
- * because we assume that any other books that we are dealing with
- * are 'read-only', non-editable, because they are closed books.
- * If we ever want to have more than one book open read-write,
- * this will have to change.
- */
- if (NULL == fbe->primary_book) fbe->primary_book = book;
- if (book != fbe->primary_book) return;
-
- gnc_file_be_write_to_file (fbe, book, fbe->fullpath, TRUE);
- gnc_file_be_remove_old_files (fbe);
- LEAVE ("book=%p", book);
-}
-
-/* ================================================================= */
-/* Routines to deal with the creation of multiple books.
- * The core design assumption here is that the book
- * begin-edit/commit-edit routines are used solely to write out
- * closed accounting periods to files. They're not currently
- * designed to do anything other than this. (Although they could be).
- */
-
-static char *
-build_period_filepath (FileBackend *fbe, QofBook *book)
-{
- int len;
- char *str, *p, *q;
-
- len = strlen (fbe->fullpath) + GUID_ENCODING_LENGTH + 14;
- str = g_new (char, len);
- strcpy (str, fbe->fullpath);
-
- /* XXX it would be nice for the user if we made the book
- * closing date and/or title part of the file-name. */
- p = strrchr (str, G_DIR_SEPARATOR);
- p++;
- p = stpcpy (p, "book-");
- p = guid_to_string_buff (qof_book_get_guid(book), p);
- p = stpcpy (p, "-");
- q = strrchr (fbe->fullpath, G_DIR_SEPARATOR);
- q++;
- p = stpcpy (p, q);
- p = stpcpy (p, ".gml");
-
- return str;
-}
-
-static void
-file_begin_edit (QofBackend *be, QofInstance *inst)
-{
- if (0) build_period_filepath(0, 0);
-#if BORKEN_FOR_NOW
- FileBackend *fbe = (FileBackend *) be;
- QofBook *book = gp;
- const char * filepath;
-
- QofIdTypeConst typ = QOF_INSTANCE(inst)->e_type;
- if (strcmp (GNC_ID_PERIOD, typ)) return;
- filepath = build_period_filepath(fbe, book);
- PINFO (" ====================== book=%p filepath=%s\n", book, filepath);
-
- if (NULL == fbe->primary_book)
- {
- PERR ("You should have saved the data "
- "at least once before closing the books!\n");
- }
- /* XXX To be anal about it, we should really be checking to see
- * if there already is a file with this book GUID, and disallowing
- * further progress. This is because we are not allowed to
- * modify books that are closed (They should be treated as
- * 'read-only').
- */
-#endif
-}
-
-static void
-file_rollback_edit (QofBackend *be, QofInstance *inst)
-{
-#if BORKEN_FOR_NOW
- QofBook *book = gp;
-
- if (strcmp (GNC_ID_PERIOD, typ)) return;
- PINFO ("book=%p", book);
-#endif
-}
-
-static void
-file_commit_edit (QofBackend *be, QofInstance *inst)
-{
- if (qof_instance_get_dirty(inst) && qof_get_alt_dirty_mode() &&
- !(qof_instance_get_infant(inst) && qof_instance_get_destroying(inst))) {
- qof_collection_mark_dirty(qof_instance_get_collection(inst));
- qof_book_mark_dirty(qof_instance_get_book(inst));
- }
-#if BORKEN_FOR_NOW
- FileBackend *fbe = (FileBackend *) be;
- QofBook *book = gp;
- const char * filepath;
-
- if (strcmp (GNC_ID_PERIOD, typ)) return;
- filepath = build_period_filepath(fbe, book);
- PINFO (" ====================== book=%p filepath=%s\n", book, filepath);
- gnc_file_be_write_to_file(fbe, book, filepath, FALSE);
-
- /* We want to force a save of the current book at this point,
- * because if we don't, and the user forgets to do so, then
- * there'll be the same transactions in the closed book,
- * and also in the current book. */
- gnc_file_be_write_to_file (fbe, fbe->primary_book, fbe->fullpath, TRUE);
-#endif
-}
-
-/* ---------------------------------------------------------------------- */
-
-
-/* Load financial data from a file into the book, automatically
- detecting the format of the file, if possible. Return FALSE on
- error, and set the error parameter to indicate what went wrong if
- it's not NULL. This function does not manage file locks in any
- way. */
-
-static void
-gnc_file_be_load_from_file (QofBackend *bend, QofBook *book, QofBackendLoadType loadType)
-{
- QofBackendError error;
- gboolean rc;
- FileBackend *be = (FileBackend *) bend;
-
- if (loadType != LOAD_TYPE_INITIAL_LOAD) return;
-
- error = ERR_BACKEND_NO_ERR;
- be->primary_book = book;
-
- switch (gnc_file_be_determine_file_type(be->fullpath))
- {
- case GNC_BOOK_XML2_FILE:
- rc = qof_session_load_from_xml_file_v2 (be, book);
- if (FALSE == rc) error = ERR_FILEIO_PARSE_ERROR;
- break;
-
- case GNC_BOOK_XML2_FILE_NO_ENCODING:
- error = ERR_FILEIO_NO_ENCODING;
- break;
- case GNC_BOOK_XML1_FILE:
- rc = qof_session_load_from_xml_file (book, be->fullpath);
- if (FALSE == rc) error = ERR_FILEIO_PARSE_ERROR;
- break;
- default:
- /* If file type wasn't known, check errno again to give the
- user some more useful feedback for some particular error
- conditions. */
- switch (errno)
- {
- case EACCES: /* No read permission */
- PWARN("No read permission to file");
- error = ERR_FILEIO_FILE_EACCES;
- break;
- case EISDIR: /* File is a directory - but on this error we don't arrive here */
- PWARN("Filename is a directory");
- error = ERR_FILEIO_FILE_NOT_FOUND;
- break;
- default:
- PWARN("File not any known type");
- error = ERR_FILEIO_UNKNOWN_FILE_TYPE;
- break;
- }
- break;
- }
-
- if(error != ERR_BACKEND_NO_ERR)
- {
- qof_backend_set_error(bend, error);
- }
-
- /* We just got done loading, it can't possibly be dirty !! */
- qof_book_mark_saved (book);
-}
-
-/* ---------------------------------------------------------------------- */
-
-static gboolean
-gnc_file_be_save_may_clobber_data (QofBackend *bend)
-{
- struct stat statbuf;
- if (!bend->fullpath) return FALSE;
-
- /* FIXME: Make sure this doesn't need more sophisticated semantics
- * in the face of special file, devices, pipes, symlinks, etc. */
- if (g_stat(bend->fullpath, &statbuf) == 0) return TRUE;
- return FALSE;
-}
-
-
-static void
-gnc_file_be_write_accounts_to_file(QofBackend *be, QofBook *book)
-{
- const gchar *datafile;
-
- datafile = ((FileBackend *)be)->fullpath;
- gnc_book_write_accounts_to_xml_file_v2(be, book, datafile);
-}
-
-/* ================================================================= */
-#if 0 //def GNUCASH_MAJOR_VERSION
-QofBackend *
-libgncmod_backend_file_LTX_gnc_backend_new(void)
-{
-
- fbe->dirname = NULL;
- fbe->fullpath = NULL;
- fbe->lockfile = NULL;
- fbe->linkfile = NULL;
- fbe->lockfd = -1;
-
- fbe->primary_book = NULL;
-
- return be;
-}
-#endif
-
-static void
-retain_changed_cb(GConfEntry *entry, gpointer user_data)
-{
- FileBackend *be = (FileBackend*)user_data;
- g_return_if_fail(be != NULL);
- be->file_retention_days = (int)gnc_gconf_get_float("general", "retain_days", NULL);
-}
-
-static void
-compression_changed_cb(GConfEntry *entry, gpointer user_data)
-{
- FileBackend *be = (FileBackend*)user_data;
- g_return_if_fail(be != NULL);
- be->file_compression = gnc_gconf_get_bool("general", "file_compression", NULL);
-}
-
-static QofBackend*
-gnc_backend_new(void)
-{
- FileBackend *gnc_be;
- QofBackend *be;
-
- gnc_be = g_new0(FileBackend, 1);
- be = (QofBackend*) gnc_be;
- qof_backend_init(be);
-
- be->session_begin = file_session_begin;
- be->session_end = file_session_end;
- be->destroy_backend = file_destroy_backend;
-
- be->load = gnc_file_be_load_from_file;
- be->save_may_clobber_data = gnc_file_be_save_may_clobber_data;
-
- /* The file backend treats accounting periods transactionally. */
- be->begin = file_begin_edit;
- be->commit = file_commit_edit;
- be->rollback = file_rollback_edit;
-
- /* The file backend always loads all data ... */
- be->compile_query = NULL;
- be->free_query = NULL;
- be->run_query = NULL;
-
- be->counter = NULL;
-
- /* The file backend will never be multi-user... */
- be->events_pending = NULL;
- be->process_events = NULL;
-
- be->sync = file_sync_all;
- be->load_config = NULL;
- be->get_config = NULL;
-
- be->export = gnc_file_be_write_accounts_to_file;
-
- gnc_be->dirname = NULL;
- gnc_be->fullpath = NULL;
- gnc_be->lockfile = NULL;
- gnc_be->linkfile = NULL;
- gnc_be->lockfd = -1;
-
- gnc_be->primary_book = NULL;
-
- gnc_be->file_retention_days = (int)gnc_gconf_get_float("general", "retain_days", NULL);
- gnc_be->file_compression = gnc_gconf_get_bool("general", "file_compression", NULL);
-
- gnc_gconf_general_register_cb("retain_days", retain_changed_cb, be);
- gnc_gconf_general_register_cb("file_compression", compression_changed_cb, be);
-
- return be;
-}
-
-static void
-gnc_provider_free (QofBackendProvider *prov)
-{
- prov->provider_name = NULL;
- prov->access_method = NULL;
- g_free (prov);
-}
-
-G_MODULE_EXPORT void
-qof_backend_module_init(void)
-{
- QofBackendProvider *prov;
- prov = g_new0 (QofBackendProvider, 1);
- prov->provider_name = "GnuCash File Backend Version 2";
- prov->access_method = "file";
- prov->partial_book_supported = FALSE;
- prov->backend_new = gnc_backend_new;
- prov->provider_free = gnc_provider_free;
- prov->check_data_type = gnc_determine_file_type;
- qof_backend_register_provider (prov);
-
- prov = g_new0 (QofBackendProvider, 1);
- prov->provider_name = "GnuCash File Backend Version 2";
- prov->access_method = "xml";
- prov->partial_book_supported = FALSE;
- prov->backend_new = gnc_backend_new;
- prov->provider_free = gnc_provider_free;
- prov->check_data_type = gnc_determine_file_type;
- qof_backend_register_provider (prov);
-}
-
-/* ========================== END OF FILE ===================== */
Deleted: gnucash/trunk/src/backend/xml/gnc-backend-file.h
===================================================================
--- gnucash/trunk/src/backend/xml/gnc-backend-file.h 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/backend/xml/gnc-backend-file.h 2009-04-12 17:14:21 UTC (rev 18045)
@@ -1,62 +0,0 @@
-/********************************************************************
- * gnc-backend-file.h: load and save data to XML files *
- * *
- * 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 *
- * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
- * Boston, MA 02110-1301, USA gnu at gnu.org *
-\********************************************************************/
-/** @file gnc-backend-file.h
- * @brief load and save data to files
- * @author Copyright (c) 2000 Gnumatic Inc.
- * @author Copyright (c) 2002 Derek Atkins <warlord at MIT.EDU>
- * @author Copyright (c) 2003 Linas Vepstas <linas at linas.org>
- *
- * This file implements the top-level QofBackend API for saving/
- * restoring data to/from an ordinary Unix filesystem file.
- */
-
-#ifndef GNC_BACKEND_XML_H_
-#define GNC_BACKEND_XML_H_
-
-#include "qof.h"
-#include <gmodule.h>
-
-#include "qofbackend-p.h"
-struct FileBackend_struct
-{
- QofBackend be;
-
- char *dirname;
- char *fullpath; /* Fully qualified path to book */
- char *lockfile;
- char *linkfile;
- int lockfd;
-
- QofBook *primary_book; /* The primary, main open book */
-
- int file_retention_days;
- gboolean file_compression;
-};
-
-typedef struct FileBackend_struct FileBackend;
-
-// This is now a static inside the module
-//QofBackend * libgncmod_backend_file_LTX_gnc_backend_new(void);
-
-G_MODULE_EXPORT void
-qof_backend_module_init(void);
-
-#endif /* GNC_BACKEND_XML_H_ */
Copied: gnucash/trunk/src/backend/xml/gnc-backend-xml.c (from rev 18026, gnucash/trunk/src/backend/xml/gnc-backend-file.c)
===================================================================
--- gnucash/trunk/src/backend/xml/gnc-backend-xml.c (rev 0)
+++ gnucash/trunk/src/backend/xml/gnc-backend-xml.c 2009-04-12 17:14:21 UTC (rev 18045)
@@ -0,0 +1,1111 @@
+/********************************************************************
+ * gnc-backend-xml.c: load and save data to XML files *
+ * *
+ * 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 *
+ * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
+ * Boston, MA 02110-1301, USA gnu at gnu.org *
+\********************************************************************/
+/** @file gnc-backend-xml.c
+ * @brief load and save data to XML files
+ * @author Copyright (c) 2000 Gnumatic Inc.
+ * @author Copyright (c) 2002 Derek Atkins <warlord at MIT.EDU>
+ * @author Copyright (c) 2003 Linas Vepstas <linas at linas.org>
+ *
+ * This file implements the top-level QofBackend API for saving/
+ * restoring data to/from an ordinary Unix filesystem file.
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+#ifndef HAVE_GLIB_2_8
+#include <gstdio-2.8.h>
+#endif
+#include <libintl.h>
+#include <locale.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <dirent.h>
+#include <time.h>
+
+#include "qof.h"
+#include "TransLog.h"
+#include "gnc-engine.h"
+
+#include "gnc-filepath-utils.h"
+
+#include "io-gncxml.h"
+#include "io-gncxml-v2.h"
+#include "gnc-backend-xml.h"
+#include "gnc-gconf-utils.h"
+
+#ifndef HAVE_STRPTIME
+# include "strptime.h"
+#endif
+
+#define GNC_BE_DAYS "file_retention_days"
+#define GNC_BE_ZIP "file_compression"
+
+static QofLogModule log_module = GNC_MOD_BACKEND;
+
+typedef enum
+{
+ GNC_BOOK_NOT_OURS,
+ GNC_BOOK_BIN_FILE,
+ GNC_BOOK_XML1_FILE,
+ GNC_BOOK_XML2_FILE,
+ GNC_BOOK_XML2_FILE_NO_ENCODING,
+ QSF_GNC_OBJECT,
+ QSF_OBJECT,
+ QSF_MAP,
+} QofBookFileType;
+
+/* ================================================================= */
+
+static gboolean
+gnc_file_be_get_file_lock (FileBackend *be)
+{
+ struct stat statbuf;
+#ifndef G_OS_WIN32
+ char pathbuf[PATH_MAX];
+ char *path = NULL;
+#endif
+ int rc;
+ QofBackendError be_err;
+
+ rc = g_stat (be->lockfile, &statbuf);
+ if (!rc)
+ {
+ /* oops .. file is locked by another user .. */
+ qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_LOCKED);
+ return FALSE;
+ }
+
+ be->lockfd = g_open (be->lockfile, O_RDWR | O_CREAT | O_EXCL , 0);
+ if (be->lockfd < 0)
+ {
+ /* oops .. we can't create the lockfile .. */
+ switch (errno) {
+ case EACCES:
+ case EROFS:
+ case ENOSPC:
+ be_err = ERR_BACKEND_READONLY;
+ break;
+ default:
+ be_err = ERR_BACKEND_LOCKED;
+ break;
+ }
+ qof_backend_set_error ((QofBackend*)be, be_err);
+ return FALSE;
+ }
+
+ /* OK, now work around some NFS atomic lock race condition
+ * mumbo-jumbo. We do this by linking a unique file, and
+ * then examing the link count. At least that's what the
+ * NFS programmers guide suggests.
+ * Note: the "unique filename" must be unique for the
+ * triplet filename-host-process, otherwise accidental
+ * aliases can occur.
+ */
+
+ /* apparently, even this code may not work for some NFS
+ * implementations. In the long run, I am told that
+ * ftp.debian.org
+ * /pub/debian/dists/unstable/main/source/libs/liblockfile_0.1-6.tar.gz
+ * provides a better long-term solution.
+ */
+
+#ifndef G_OS_WIN32
+ strcpy (pathbuf, be->lockfile);
+ path = strrchr (pathbuf, '.');
+ sprintf (path, ".%lx.%d.LNK", gethostid(), getpid());
+
+ rc = link (be->lockfile, pathbuf);
+ if (rc)
+ {
+ /* If hard links aren't supported, just allow the lock. */
+ if (errno == EPERM || errno == ENOSYS
+# ifdef EOPNOTSUPP
+ || errno == EOPNOTSUPP
+# endif
+# ifdef ENOTSUP
+ || errno == ENOTSUP
+# endif
+# ifdef ENOSYS
+ || errno == ENOSYS
+# endif
+ )
+ {
+ be->linkfile = NULL;
+ return TRUE;
+ }
+
+ /* Otherwise, something else is wrong. */
+ qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_LOCKED);
+ g_unlink (pathbuf);
+ close (be->lockfd);
+ g_unlink (be->lockfile);
+ return FALSE;
+ }
+
+ rc = g_stat (be->lockfile, &statbuf);
+ if (rc)
+ {
+ /* oops .. stat failed! This can't happen! */
+ qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_LOCKED);
+ g_unlink (pathbuf);
+ close (be->lockfd);
+ g_unlink (be->lockfile);
+ return FALSE;
+ }
+
+ if (statbuf.st_nlink != 2)
+ {
+ qof_backend_set_error ((QofBackend*)be, ERR_BACKEND_LOCKED);
+ g_unlink (pathbuf);
+ close (be->lockfd);
+ g_unlink (be->lockfile);
+ return FALSE;
+ }
+
+ be->linkfile = g_strdup (pathbuf);
+
+ return TRUE;
+
+#else /* ifndef G_OS_WIN32 */
+ /* On windows, there is no NFS and the open(,O_CREAT | O_EXCL)
+ is sufficient for locking. */
+ be->linkfile = NULL;
+ return TRUE;
+#endif /* ifndef G_OS_WIN32 */
+}
+
+/* ================================================================= */
+
+static void
+file_session_begin(QofBackend *be_start, QofSession *session,
+ const char *book_id,
+ gboolean ignore_lock, gboolean create_if_nonexistent)
+{
+ FileBackend *be = (FileBackend*) be_start;
+
+ ENTER (" ");
+
+ /* Make sure the directory is there */
+ be->fullpath = xaccResolveFilePath(book_id);
+ if (NULL == be->fullpath)
+ {
+ qof_backend_set_error (be_start, ERR_FILEIO_FILE_NOT_FOUND);
+ LEAVE("");
+ return;
+ }
+ be->be.fullpath = be->fullpath;
+ be->dirname = g_path_get_dirname (be->fullpath);
+
+ {
+ struct stat statbuf;
+ int rc;
+
+ /* Again check whether the directory can be accessed */
+ rc = g_stat (be->dirname, &statbuf);
+ if (rc != 0 || !S_ISDIR(statbuf.st_mode))
+ {
+ /* Error on stat or if it isn't a directory means we
+ cannot find this filename */
+ qof_backend_set_error (be_start, ERR_FILEIO_FILE_NOT_FOUND);
+ g_free (be->fullpath); be->fullpath = NULL;
+ g_free (be->dirname); be->dirname = NULL;
+ LEAVE("");
+ return;
+ }
+
+ /* Now check whether we can g_stat the file itself */
+ rc = g_stat (be->fullpath, &statbuf);
+ if ((rc != 0) && (!create_if_nonexistent))
+ {
+ /* Error on stat means the file doesn't exist */
+ qof_backend_set_error (be_start, ERR_FILEIO_FILE_NOT_FOUND);
+ g_free (be->fullpath); be->fullpath = NULL;
+ g_free (be->dirname); be->dirname = NULL;
+ LEAVE("");
+ return;
+ }
+ if (rc == 0 && S_ISDIR(statbuf.st_mode))
+ {
+ /* FIXME: What is actually checked here? Whether the
+ fullpath erroneously points to a directory or what?
+ Then the error message should be changed into something
+ much more clear! */
+ qof_backend_set_error (be_start, ERR_FILEIO_UNKNOWN_FILE_TYPE);
+ g_free (be->fullpath); be->fullpath = NULL;
+ g_free (be->dirname); be->dirname = NULL;
+ LEAVE("");
+ return;
+ }
+ }
+
+ /* ---------------------------------------------------- */
+ /* We should now have a fully resolved path name.
+ * Lets see if we can get a lock on it. */
+
+ be->lockfile = g_strconcat(be->fullpath, ".LCK", NULL);
+
+ if (!ignore_lock && !gnc_file_be_get_file_lock (be))
+ {
+ g_free (be->lockfile); be->lockfile = NULL;
+ LEAVE("");
+ return;
+ }
+
+ LEAVE (" ");
+ return;
+}
+
+/* ================================================================= */
+
+static void
+file_session_end(QofBackend *be_start)
+{
+ FileBackend *be = (FileBackend*)be_start;
+ ENTER (" ");
+
+ if (be->linkfile)
+ g_unlink (be->linkfile);
+
+ if (be->lockfd > 0)
+ close (be->lockfd);
+
+ if (be->lockfile) {
+ int rv;
+#ifdef G_OS_WIN32
+ /* On windows, we need to allow write-access before
+ g_unlink() can succeed */
+ rv = g_chmod (be->lockfile, S_IWRITE | S_IREAD);
+#endif
+ rv = g_unlink (be->lockfile);
+ if (rv) {
+ PWARN("Error on g_unlink(%s): %d: %s", be->lockfile,
+ errno, strerror(errno) ? strerror(errno) : "");
+ }
+ }
+
+ g_free (be->dirname);
+ be->dirname = NULL;
+
+ g_free (be->fullpath);
+ be->fullpath = NULL;
+
+ g_free (be->lockfile);
+ be->lockfile = NULL;
+
+ g_free (be->linkfile);
+ be->linkfile = NULL;
+ LEAVE (" ");
+}
+
+static void
+file_destroy_backend(QofBackend *be)
+{
+ qof_backend_destroy(be);
+ g_free(be);
+}
+
+/* ================================================================= */
+/* Write the financial data in a book to a file, returning FALSE on
+ error and setting the error_result to indicate what went wrong if
+ it's not NULL. This function does not manage file locks in any
+ way.
+
+ If make_backup is true, write out a time-stamped copy of the file
+ into the same directory as the indicated file, with a filename of
+ "file.YYYYMMDDHHMMSS.xac" where YYYYMMDDHHMMSS is replaced with the
+ current year/month/day/hour/minute/second. */
+
+static gboolean
+copy_file(const char *orig, const char *bkup)
+{
+ static int buf_size = 1024;
+ char buf[buf_size];
+ int orig_fd;
+ int bkup_fd;
+ int flags=0;
+ ssize_t count_write;
+ ssize_t count_read;
+
+#ifdef G_OS_WIN32
+ flags = O_BINARY;
+#endif
+
+ orig_fd = g_open(orig, O_RDONLY | flags, 0);
+ if(orig_fd == -1)
+ {
+ return FALSE;
+ }
+ bkup_fd = g_open(bkup, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL | flags, 0600);
+ if(bkup_fd == -1)
+ {
+ close(orig_fd);
+ return FALSE;
+ }
+
+ do
+ {
+ count_read = read(orig_fd, buf, buf_size);
+ if(count_read == -1 && errno != EINTR)
+ {
+ close(orig_fd);
+ close(bkup_fd);
+ return FALSE;
+ }
+
+ if(count_read > 0)
+ {
+ count_write = write(bkup_fd, buf, count_read);
+ if(count_write == -1)
+ {
+ close(orig_fd);
+ close(bkup_fd);
+ return FALSE;
+ }
+ }
+ } while(count_read > 0);
+
+ close(orig_fd);
+ close(bkup_fd);
+
+ return TRUE;
+}
+
+/* ================================================================= */
+
+static gboolean
+gnc_int_link_or_make_backup(FileBackend *be, const char *orig, const char *bkup)
+{
+ gboolean copy_success = FALSE;
+ int err_ret =
+#ifdef HAVE_LINK
+ link (orig, bkup)
+#else
+ -1
+#endif
+ ;
+ if(err_ret != 0)
+ {
+#ifdef HAVE_LINK
+ if(errno == EPERM || errno == ENOSYS
+# ifdef EOPNOTSUPP
+ || errno == EOPNOTSUPP
+# endif
+# ifdef ENOTSUP
+ || errno == ENOTSUP
+# endif
+# ifdef ENOSYS
+ || errno == ENOSYS
+# endif
+ )
+#endif
+ {
+ copy_success = copy_file(orig, bkup);
+ }
+
+ if(!copy_success)
+ {
+ qof_backend_set_error((QofBackend*)be, ERR_FILEIO_BACKUP_ERROR);
+ PWARN ("unable to make file backup from %s to %s: %s",
+ orig, bkup, strerror(errno) ? strerror(errno) : "");
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+/* ================================================================= */
+
+static QofBookFileType
+gnc_file_be_determine_file_type(const char *path)
+{
+ gboolean with_encoding;
+ if (gnc_is_xml_data_file_v2(path, &with_encoding)) {
+ if (with_encoding) {
+ return GNC_BOOK_XML2_FILE;
+ } else {
+ return GNC_BOOK_XML2_FILE_NO_ENCODING;
+ }
+ } else if (gnc_is_xml_data_file(path)) {
+ return GNC_BOOK_XML1_FILE;
+ }
+ return GNC_BOOK_NOT_OURS;
+}
+
+static gboolean
+gnc_determine_file_type (const char *path)
+{
+ struct stat sbuf;
+ int rc;
+ FILE *t;
+
+ if (!path) { return FALSE; }
+
+ // Since this can be called with "xml:" as a prefix, remove it if it exists
+ if( g_str_has_prefix( path, "xml:" ) ) {
+ path += 4;
+ }
+
+ if (0 == safe_strcmp(path, QOF_STDOUT)) { return FALSE; }
+ t = g_fopen(path, "r");
+ if(!t) { PINFO (" new file"); return TRUE; }
+ fclose(t);
+ rc = g_stat(path, &sbuf);
+ if(rc < 0) { return FALSE; }
+ if (sbuf.st_size == 0) { PINFO (" empty file"); return TRUE; }
+ if(gnc_is_xml_data_file_v2(path, NULL)) { return TRUE; }
+ else if(gnc_is_xml_data_file(path)) { return TRUE; }
+ PINFO (" %s is not a gnc XML file", path);
+ return FALSE;
+}
+
+static gboolean
+gnc_file_be_backup_file(FileBackend *be)
+{
+ gboolean bkup_ret;
+ char *timestamp;
+ char *backup;
+ const char *datafile;
+ struct stat statbuf;
+ int rc;
+
+ datafile = be->fullpath;
+
+ rc = g_stat (datafile, &statbuf);
+ if (rc)
+ return (errno == ENOENT);
+
+ if(gnc_file_be_determine_file_type(datafile) == GNC_BOOK_BIN_FILE)
+ {
+ /* make a more permament safer backup */
+ const char *back = "-binfmt.bkup";
+ char *bin_bkup = g_new(char, strlen(datafile) + strlen(back) + 1);
+ strcpy(bin_bkup, datafile);
+ strcat(bin_bkup, back);
+ bkup_ret = gnc_int_link_or_make_backup(be, datafile, bin_bkup);
+ g_free(bin_bkup);
+ if(!bkup_ret)
+ {
+ return FALSE;
+ }
+ }
+
+ timestamp = xaccDateUtilGetStampNow ();
+ backup = g_new (char, strlen (datafile) + strlen (timestamp) + 6);
+ strcpy (backup, datafile);
+ strcat (backup, ".");
+ strcat (backup, timestamp);
+ strcat (backup, ".xac");
+ g_free (timestamp);
+
+ bkup_ret = gnc_int_link_or_make_backup(be, datafile, backup);
+ g_free(backup);
+
+ return bkup_ret;
+}
+
+/* ================================================================= */
+
+static gboolean
+gnc_file_be_write_to_file(FileBackend *fbe,
+ QofBook *book,
+ const gchar *datafile,
+ gboolean make_backup)
+{
+ QofBackend *be = &fbe->be;
+ char *tmp_name;
+ struct stat statbuf;
+ int rc;
+ QofBackendError be_err;
+
+ ENTER (" book=%p file=%s", book, datafile);
+
+ /* If the book is 'clean', recently saved, then don't save again. */
+ /* XXX this is currently broken due to faulty 'Save As' logic. */
+ /* if (FALSE == qof_book_not_saved (book)) return FALSE; */
+
+ tmp_name = g_new(char, strlen(datafile) + 12);
+ strcpy(tmp_name, datafile);
+ strcat(tmp_name, ".tmp-XXXXXX");
+
+ if(!mktemp(tmp_name))
+ {
+ qof_backend_set_error(be, ERR_BACKEND_MISC);
+ LEAVE("");
+ return FALSE;
+ }
+
+ if(make_backup)
+ {
+ if(!gnc_file_be_backup_file(fbe))
+ {
+ LEAVE("");
+ return FALSE;
+ }
+ }
+
+ if (gnc_book_write_to_xml_file_v2(book, tmp_name, fbe->file_compression))
+ {
+ /* Record the file's permissions before g_unlinking it */
+ rc = g_stat(datafile, &statbuf);
+ if(rc == 0)
+ {
+ /* Use the permissions from the original data file */
+ if(g_chmod(tmp_name, statbuf.st_mode) != 0)
+ {
+ /* qof_backend_set_error(be, ERR_BACKEND_PERM); */
+ /* Even if the chmod did fail, the save
+ nevertheless completed successfully. It is
+ therefore wrong to signal the ERR_BACKEND_PERM
+ error here which implies that the saving itself
+ failed. Instead, we simply ignore this. */
+ PWARN("unable to chmod filename %s: %s",
+ tmp_name ? tmp_name : "(null)",
+ strerror(errno) ? strerror(errno) : "");
+#if VFAT_DOESNT_SUCK /* chmod always fails on vfat/samba fs */
+ /* g_free(tmp_name); */
+ /* return FALSE; */
+#endif
+ }
+#ifdef HAVE_CHOWN
+ /* Don't try to change the owner. Only root can do
+ that. */
+ if(chown(tmp_name, -1, statbuf.st_gid) != 0)
+ {
+ /* qof_backend_set_error(be, ERR_BACKEND_PERM); */
+ /* A failed chown doesn't mean that the saving itself
+ failed. So don't abort with an error here! */
+ PWARN("unable to chown filename %s: %s",
+ tmp_name ? tmp_name : "(null)",
+ strerror(errno) ? strerror(errno) : "");
+#if VFAT_DOESNT_SUCK /* chown always fails on vfat fs */
+ /* g_free(tmp_name);
+ return FALSE; */
+#endif
+ }
+#endif
+ }
+ if(g_unlink(datafile) != 0 && errno != ENOENT)
+ {
+ qof_backend_set_error(be, ERR_BACKEND_READONLY);
+ PWARN("unable to unlink filename %s: %s",
+ datafile ? datafile : "(null)",
+ strerror(errno) ? strerror(errno) : "");
+ g_free(tmp_name);
+ LEAVE("");
+ return FALSE;
+ }
+ if(!gnc_int_link_or_make_backup(fbe, tmp_name, datafile))
+ {
+ qof_backend_set_error(be, ERR_FILEIO_BACKUP_ERROR);
+ g_free(tmp_name);
+ LEAVE("");
+ return FALSE;
+ }
+ if(g_unlink(tmp_name) != 0)
+ {
+ qof_backend_set_error(be, ERR_BACKEND_PERM);
+ PWARN("unable to unlink temp filename %s: %s",
+ tmp_name ? tmp_name : "(null)",
+ strerror(errno) ? strerror(errno) : "");
+ g_free(tmp_name);
+ LEAVE("");
+ return FALSE;
+ }
+ g_free(tmp_name);
+
+ /* Since we successfully saved the book,
+ * we should mark it clean. */
+ qof_book_mark_saved (book);
+ LEAVE (" sucessful save of book=%p to file=%s", book, datafile);
+ return TRUE;
+ }
+ else
+ {
+ if(g_unlink(tmp_name) != 0)
+ {
+ switch (errno) {
+ case ENOENT: /* tmp_name doesn't exist? Assume "RO" error */
+ case EACCES:
+ case EPERM:
+ case ENOSYS:
+ case EROFS:
+ be_err = ERR_BACKEND_READONLY;
+ break;
+ default:
+ be_err = ERR_BACKEND_MISC;
+ }
+ qof_backend_set_error(be, be_err);
+ PWARN("unable to unlink temp_filename %s: %s",
+ tmp_name ? tmp_name : "(null)",
+ strerror(errno) ? strerror(errno) : "");
+ /* already in an error just flow on through */
+ }
+ g_free(tmp_name);
+ LEAVE("");
+ return FALSE;
+ }
+ LEAVE("");
+ return TRUE;
+}
+
+/* ================================================================= */
+
+static int
+gnc_file_be_select_files (const gchar *d)
+{
+ return (g_str_has_suffix(d, ".LNK") ||
+ g_str_has_suffix(d, ".xac") ||
+ g_str_has_suffix(d, ".log"));
+}
+
+static void
+gnc_file_be_remove_old_files(FileBackend *be)
+{
+ const gchar *dent;
+ GDir *dir;
+ struct stat lockstatbuf, statbuf;
+ int pathlen;
+ time_t now;
+
+ if (g_stat (be->lockfile, &lockstatbuf) != 0)
+ return;
+ pathlen = strlen(be->fullpath);
+
+ /*
+ * Clean up any lockfiles from prior crashes, and clean up old
+ * data and log files. Scandir will do a fist pass on the
+ * filenames and cull the directory down to just files with the
+ * appropriate extensions. Pity you can't pass user data into
+ * scandir...
+ */
+
+ /*
+ * Unfortunately scandir() is not portable, so re-write this
+ * function without it. Note that this version will be even a bit
+ * faster because it does not have to sort, malloc, or anything
+ * else that scandir did, and it only performs a single pass
+ * through the directory rather than one pass through the
+ * directory and then one pass over the 'matching' files. --
+ * warlord at MIT.EDU 2002-05-06
+ */
+
+ dir = g_dir_open (be->dirname, 0, NULL);
+ if (!dir)
+ return;
+
+ now = time(NULL);
+ while((dent = g_dir_read_name(dir)) != NULL) {
+ char *name;
+ int len;
+
+ if (gnc_file_be_select_files (dent) == 0)
+ continue;
+
+ name = g_build_filename(be->dirname, dent, (gchar*)NULL);
+ len = strlen(name) - 4;
+
+ /* Is this file associated with the current data file */
+ if (strncmp(name, be->fullpath, pathlen) == 0)
+ {
+ if ((safe_strcmp(name + len, ".LNK") == 0) &&
+ /* Is a lock file. Skip the active lock file */
+ (safe_strcmp(name, be->linkfile) != 0) &&
+ /* Only delete lock files older than the active one */
+ (g_stat(name, &statbuf) == 0) &&
+ (statbuf.st_mtime <lockstatbuf.st_mtime))
+ {
+ PINFO ("unlink lock file: %s", name);
+ g_unlink(name);
+ }
+ else if (be->file_retention_days > 0)
+ {
+ time_t file_time;
+ struct tm file_tm;
+ int days;
+ const char* res;
+
+ PINFO ("file retention = %d days", be->file_retention_days);
+
+ /* Is the backup file old enough to delete */
+ memset(&file_tm, 0, sizeof(file_tm));
+ res = strptime(name+pathlen+1, "%Y%m%d%H%M%S", &file_tm);
+ file_time = mktime(&file_tm);
+ days = (int)(difftime(now, file_time) / 86400);
+
+
+ if (res
+ && res != name+pathlen+1
+ && (strcmp(res, ".xac") == 0
+ || strcmp(res, ".log") == 0)
+ && file_time > 0
+ && days > be->file_retention_days)
+ {
+ PINFO ("g_unlink stale (%d days old) file: %s", days, name);
+ g_unlink(name);
+ }
+ }
+ }
+ g_free(name);
+ }
+ g_dir_close (dir);
+}
+
+static void
+file_sync_all(QofBackend* be, QofBook *book)
+{
+ FileBackend *fbe = (FileBackend *) be;
+ ENTER ("book=%p, primary=%p", book, fbe->primary_book);
+
+ /* We make an important assumption here, that we might want to change
+ * in the future: when the user says 'save', we really save the one,
+ * the only, the current open book, and nothing else. We do this
+ * because we assume that any other books that we are dealing with
+ * are 'read-only', non-editable, because they are closed books.
+ * If we ever want to have more than one book open read-write,
+ * this will have to change.
+ */
+ if (NULL == fbe->primary_book) fbe->primary_book = book;
+ if (book != fbe->primary_book) return;
+
+ gnc_file_be_write_to_file (fbe, book, fbe->fullpath, TRUE);
+ gnc_file_be_remove_old_files (fbe);
+ LEAVE ("book=%p", book);
+}
+
+/* ================================================================= */
+/* Routines to deal with the creation of multiple books.
+ * The core design assumption here is that the book
+ * begin-edit/commit-edit routines are used solely to write out
+ * closed accounting periods to files. They're not currently
+ * designed to do anything other than this. (Although they could be).
+ */
+
+static char *
+build_period_filepath (FileBackend *fbe, QofBook *book)
+{
+ int len;
+ char *str, *p, *q;
+
+ len = strlen (fbe->fullpath) + GUID_ENCODING_LENGTH + 14;
+ str = g_new (char, len);
+ strcpy (str, fbe->fullpath);
+
+ /* XXX it would be nice for the user if we made the book
+ * closing date and/or title part of the file-name. */
+ p = strrchr (str, G_DIR_SEPARATOR);
+ p++;
+ p = stpcpy (p, "book-");
+ p = guid_to_string_buff (qof_book_get_guid(book), p);
+ p = stpcpy (p, "-");
+ q = strrchr (fbe->fullpath, G_DIR_SEPARATOR);
+ q++;
+ p = stpcpy (p, q);
+ p = stpcpy (p, ".gml");
+
+ return str;
+}
+
+static void
+file_begin_edit (QofBackend *be, QofInstance *inst)
+{
+ if (0) build_period_filepath(0, 0);
+#if BORKEN_FOR_NOW
+ FileBackend *fbe = (FileBackend *) be;
+ QofBook *book = gp;
+ const char * filepath;
+
+ QofIdTypeConst typ = QOF_INSTANCE(inst)->e_type;
+ if (strcmp (GNC_ID_PERIOD, typ)) return;
+ filepath = build_period_filepath(fbe, book);
+ PINFO (" ====================== book=%p filepath=%s\n", book, filepath);
+
+ if (NULL == fbe->primary_book)
+ {
+ PERR ("You should have saved the data "
+ "at least once before closing the books!\n");
+ }
+ /* XXX To be anal about it, we should really be checking to see
+ * if there already is a file with this book GUID, and disallowing
+ * further progress. This is because we are not allowed to
+ * modify books that are closed (They should be treated as
+ * 'read-only').
+ */
+#endif
+}
+
+static void
+file_rollback_edit (QofBackend *be, QofInstance *inst)
+{
+#if BORKEN_FOR_NOW
+ QofBook *book = gp;
+
+ if (strcmp (GNC_ID_PERIOD, typ)) return;
+ PINFO ("book=%p", book);
+#endif
+}
+
+static void
+file_commit_edit (QofBackend *be, QofInstance *inst)
+{
+ if (qof_instance_get_dirty(inst) && qof_get_alt_dirty_mode() &&
+ !(qof_instance_get_infant(inst) && qof_instance_get_destroying(inst))) {
+ qof_collection_mark_dirty(qof_instance_get_collection(inst));
+ qof_book_mark_dirty(qof_instance_get_book(inst));
+ }
+#if BORKEN_FOR_NOW
+ FileBackend *fbe = (FileBackend *) be;
+ QofBook *book = gp;
+ const char * filepath;
+
+ if (strcmp (GNC_ID_PERIOD, typ)) return;
+ filepath = build_period_filepath(fbe, book);
+ PINFO (" ====================== book=%p filepath=%s\n", book, filepath);
+ gnc_file_be_write_to_file(fbe, book, filepath, FALSE);
+
+ /* We want to force a save of the current book at this point,
+ * because if we don't, and the user forgets to do so, then
+ * there'll be the same transactions in the closed book,
+ * and also in the current book. */
+ gnc_file_be_write_to_file (fbe, fbe->primary_book, fbe->fullpath, TRUE);
+#endif
+}
+
+/* ---------------------------------------------------------------------- */
+
+
+/* Load financial data from a file into the book, automatically
+ detecting the format of the file, if possible. Return FALSE on
+ error, and set the error parameter to indicate what went wrong if
+ it's not NULL. This function does not manage file locks in any
+ way. */
+
+static void
+gnc_file_be_load_from_file (QofBackend *bend, QofBook *book, QofBackendLoadType loadType)
+{
+ QofBackendError error;
+ gboolean rc;
+ FileBackend *be = (FileBackend *) bend;
+
+ if (loadType != LOAD_TYPE_INITIAL_LOAD) return;
+
+ error = ERR_BACKEND_NO_ERR;
+ be->primary_book = book;
+
+ switch (gnc_file_be_determine_file_type(be->fullpath))
+ {
+ case GNC_BOOK_XML2_FILE:
+ rc = qof_session_load_from_xml_file_v2 (be, book);
+ if (FALSE == rc) error = ERR_FILEIO_PARSE_ERROR;
+ break;
+
+ case GNC_BOOK_XML2_FILE_NO_ENCODING:
+ error = ERR_FILEIO_NO_ENCODING;
+ break;
+ case GNC_BOOK_XML1_FILE:
+ rc = qof_session_load_from_xml_file (book, be->fullpath);
+ if (FALSE == rc) error = ERR_FILEIO_PARSE_ERROR;
+ break;
+ default:
+ /* If file type wasn't known, check errno again to give the
+ user some more useful feedback for some particular error
+ conditions. */
+ switch (errno)
+ {
+ case EACCES: /* No read permission */
+ PWARN("No read permission to file");
+ error = ERR_FILEIO_FILE_EACCES;
+ break;
+ case EISDIR: /* File is a directory - but on this error we don't arrive here */
+ PWARN("Filename is a directory");
+ error = ERR_FILEIO_FILE_NOT_FOUND;
+ break;
+ default:
+ PWARN("File not any known type");
+ error = ERR_FILEIO_UNKNOWN_FILE_TYPE;
+ break;
+ }
+ break;
+ }
+
+ if(error != ERR_BACKEND_NO_ERR)
+ {
+ qof_backend_set_error(bend, error);
+ }
+
+ /* We just got done loading, it can't possibly be dirty !! */
+ qof_book_mark_saved (book);
+}
+
+/* ---------------------------------------------------------------------- */
+
+static gboolean
+gnc_file_be_save_may_clobber_data (QofBackend *bend)
+{
+ struct stat statbuf;
+ if (!bend->fullpath) return FALSE;
+
+ /* FIXME: Make sure this doesn't need more sophisticated semantics
+ * in the face of special file, devices, pipes, symlinks, etc. */
+ if (g_stat(bend->fullpath, &statbuf) == 0) return TRUE;
+ return FALSE;
+}
+
+
+static void
+gnc_file_be_write_accounts_to_file(QofBackend *be, QofBook *book)
+{
+ const gchar *datafile;
+
+ datafile = ((FileBackend *)be)->fullpath;
+ gnc_book_write_accounts_to_xml_file_v2(be, book, datafile);
+}
+
+/* ================================================================= */
+#if 0 //def GNUCASH_MAJOR_VERSION
+QofBackend *
+libgncmod_backend_file_LTX_gnc_backend_new(void)
+{
+
+ fbe->dirname = NULL;
+ fbe->fullpath = NULL;
+ fbe->lockfile = NULL;
+ fbe->linkfile = NULL;
+ fbe->lockfd = -1;
+
+ fbe->primary_book = NULL;
+
+ return be;
+}
+#endif
+
+static void
+retain_changed_cb(GConfEntry *entry, gpointer user_data)
+{
+ FileBackend *be = (FileBackend*)user_data;
+ g_return_if_fail(be != NULL);
+ be->file_retention_days = (int)gnc_gconf_get_float("general", "retain_days", NULL);
+}
+
+static void
+compression_changed_cb(GConfEntry *entry, gpointer user_data)
+{
+ FileBackend *be = (FileBackend*)user_data;
+ g_return_if_fail(be != NULL);
+ be->file_compression = gnc_gconf_get_bool("general", "file_compression", NULL);
+}
+
+static QofBackend*
+gnc_backend_new(void)
+{
+ FileBackend *gnc_be;
+ QofBackend *be;
+
+ gnc_be = g_new0(FileBackend, 1);
+ be = (QofBackend*) gnc_be;
+ qof_backend_init(be);
+
+ be->session_begin = file_session_begin;
+ be->session_end = file_session_end;
+ be->destroy_backend = file_destroy_backend;
+
+ be->load = gnc_file_be_load_from_file;
+ be->save_may_clobber_data = gnc_file_be_save_may_clobber_data;
+
+ /* The file backend treats accounting periods transactionally. */
+ be->begin = file_begin_edit;
+ be->commit = file_commit_edit;
+ be->rollback = file_rollback_edit;
+
+ /* The file backend always loads all data ... */
+ be->compile_query = NULL;
+ be->free_query = NULL;
+ be->run_query = NULL;
+
+ be->counter = NULL;
+
+ /* The file backend will never be multi-user... */
+ be->events_pending = NULL;
+ be->process_events = NULL;
+
+ be->sync = file_sync_all;
+ be->load_config = NULL;
+ be->get_config = NULL;
+
+ be->export = gnc_file_be_write_accounts_to_file;
+
+ gnc_be->dirname = NULL;
+ gnc_be->fullpath = NULL;
+ gnc_be->lockfile = NULL;
+ gnc_be->linkfile = NULL;
+ gnc_be->lockfd = -1;
+
+ gnc_be->primary_book = NULL;
+
+ gnc_be->file_retention_days = (int)gnc_gconf_get_float("general", "retain_days", NULL);
+ gnc_be->file_compression = gnc_gconf_get_bool("general", "file_compression", NULL);
+
+ gnc_gconf_general_register_cb("retain_days", retain_changed_cb, be);
+ gnc_gconf_general_register_cb("file_compression", compression_changed_cb, be);
+
+ return be;
+}
+
+static void
+gnc_provider_free (QofBackendProvider *prov)
+{
+ prov->provider_name = NULL;
+ prov->access_method = NULL;
+ g_free (prov);
+}
+
+G_MODULE_EXPORT void
+qof_backend_module_init(void)
+{
+ QofBackendProvider *prov;
+ prov = g_new0 (QofBackendProvider, 1);
+ prov->provider_name = "GnuCash File Backend Version 2";
+ prov->access_method = "file";
+ prov->partial_book_supported = FALSE;
+ prov->backend_new = gnc_backend_new;
+ prov->provider_free = gnc_provider_free;
+ prov->check_data_type = gnc_determine_file_type;
+ qof_backend_register_provider (prov);
+
+ prov = g_new0 (QofBackendProvider, 1);
+ prov->provider_name = "GnuCash File Backend Version 2";
+ prov->access_method = "xml";
+ prov->partial_book_supported = FALSE;
+ prov->backend_new = gnc_backend_new;
+ prov->provider_free = gnc_provider_free;
+ prov->check_data_type = gnc_determine_file_type;
+ qof_backend_register_provider (prov);
+}
+
+/* ========================== END OF FILE ===================== */
Property changes on: gnucash/trunk/src/backend/xml/gnc-backend-xml.c
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:mergeinfo
+
Copied: gnucash/trunk/src/backend/xml/gnc-backend-xml.h (from rev 18026, gnucash/trunk/src/backend/xml/gnc-backend-file.h)
===================================================================
--- gnucash/trunk/src/backend/xml/gnc-backend-xml.h (rev 0)
+++ gnucash/trunk/src/backend/xml/gnc-backend-xml.h 2009-04-12 17:14:21 UTC (rev 18045)
@@ -0,0 +1,62 @@
+/********************************************************************
+ * gnc-backend-xml.h: load and save data to XML files *
+ * *
+ * 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 *
+ * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
+ * Boston, MA 02110-1301, USA gnu at gnu.org *
+\********************************************************************/
+/** @file gnc-backend-xml.h
+ * @brief load and save data to files
+ * @author Copyright (c) 2000 Gnumatic Inc.
+ * @author Copyright (c) 2002 Derek Atkins <warlord at MIT.EDU>
+ * @author Copyright (c) 2003 Linas Vepstas <linas at linas.org>
+ *
+ * This file implements the top-level QofBackend API for saving/
+ * restoring data to/from an ordinary Unix filesystem file.
+ */
+
+#ifndef GNC_BACKEND_XML_H_
+#define GNC_BACKEND_XML_H_
+
+#include "qof.h"
+#include <gmodule.h>
+
+#include "qofbackend-p.h"
+struct FileBackend_struct
+{
+ QofBackend be;
+
+ char *dirname;
+ char *fullpath; /* Fully qualified path to book */
+ char *lockfile;
+ char *linkfile;
+ int lockfd;
+
+ QofBook *primary_book; /* The primary, main open book */
+
+ int file_retention_days;
+ gboolean file_compression;
+};
+
+typedef struct FileBackend_struct FileBackend;
+
+// This is now a static inside the module
+//QofBackend * libgncmod_backend_file_LTX_gnc_backend_new(void);
+
+G_MODULE_EXPORT void
+qof_backend_module_init(void);
+
+#endif /* GNC_BACKEND_XML_H_ */
Property changes on: gnucash/trunk/src/backend/xml/gnc-backend-xml.h
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:mergeinfo
+
Deleted: gnucash/trunk/src/backend/xml/gncmod-backend-file.c
===================================================================
--- gnucash/trunk/src/backend/xml/gncmod-backend-file.c 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/backend/xml/gncmod-backend-file.c 2009-04-12 17:14:21 UTC (rev 18045)
@@ -1,65 +0,0 @@
-/*********************************************************************
- * gncmod-file-backend.c
- * module definition/initialization for the file backend module
- *
- * Copyright (c) 2001 Linux Developers Group, Inc.
- *********************************************************************/
-
-#include <stdio.h>
-#include <gmodule.h>
-/* #include <glib-gobject.h> */
-
-#include "gnc-module.h"
-#include "gnc-module-api.h"
-
-GNC_MODULE_API_DECL(libgncmod_backend_file)
-
-/* version of the gnc module system interface we require */
-int libgnc_backend_file_utils_gnc_module_system_interface = 0;
-
-/* module versioning uses libtool semantics. */
-int libgncmod_backend_file_gnc_module_current = 0;
-int libgncmod_backend_file_gnc_module_revision = 0;
-int libgncmod_backend_file_gnc_module_age = 0;
-
-static GNCModule engine;
-
-
-char *
-libgncmod_backend_file_gnc_module_path(void)
-{
- return g_strdup("gnucash/backend/file");
-}
-
-char *
-libgncmod_backend_file_gnc_module_description(void)
-{
- return g_strdup("The binary and XML (v1 and v2) backends for GnuCash");
-}
-
-int
-libgncmod_backend_file_gnc_module_init(int refcount)
-{
- engine = gnc_module_load("gnucash/engine", 0);
- if(!engine) return FALSE;
-
- /* Need to initialize g-type engine for gconf */
- if (refcount == 0)
- g_type_init();
-
- return TRUE;
-}
-
-int
-libgncmod_backend_file_gnc_module_end(int refcount)
-{
- int unload = TRUE;
-
- if (engine)
- unload = libgnc_backend_file_utils_gnc_module_unload(engine);
-
- if (refcount == 0)
- engine = NULL;
-
- return unload;
-}
Modified: gnucash/trunk/src/backend/xml/gncmod-backend-xml.c
===================================================================
--- gnucash/trunk/src/backend/xml/gncmod-backend-xml.c 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/backend/xml/gncmod-backend-xml.c 2009-04-12 17:14:21 UTC (rev 18045)
@@ -1,5 +1,5 @@
/*********************************************************************
- * gncmod-file-backend.c
+ * gncmod-backend-xml.c
* module definition/initialization for the file backend module
*
* Copyright (c) 2001 Linux Developers Group, Inc.
Modified: gnucash/trunk/src/backend/xml/io-gncxml-v2.h
===================================================================
--- gnucash/trunk/src/backend/xml/io-gncxml-v2.h 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/backend/xml/io-gncxml-v2.h 2009-04-12 17:14:21 UTC (rev 18045)
@@ -34,7 +34,7 @@
#include <glib.h>
#include "gnc-engine.h"
-#include "gnc-backend-file.h"
+#include "gnc-backend-xml.h"
#include "sixtp.h"
Modified: gnucash/trunk/src/backend/xml/test/test-load-xml2.c
===================================================================
--- gnucash/trunk/src/backend/xml/test/test-load-xml2.c 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/backend/xml/test/test-load-xml2.c 2009-04-12 17:14:21 UTC (rev 18045)
@@ -40,7 +40,7 @@
#include "cashobjects.h"
#include "TransLog.h"
#include "gnc-engine.h"
-#include "gnc-backend-file.h"
+#include "gnc-backend-xml.h"
#include "io-gncxml-v2.h"
#include "test-stuff.h"
Deleted: gnucash/trunk/src/business/business-core/xml/gncmod-business-backend-file.c
===================================================================
--- gnucash/trunk/src/business/business-core/xml/gncmod-business-backend-file.c 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/business/business-core/xml/gncmod-business-backend-file.c 2009-04-12 17:14:21 UTC (rev 18045)
@@ -1,112 +0,0 @@
-/*********************************************************************
- * gncmod-business-backend-file.c
- * module definition/initialization for the file backend module
- *
- * Copyright (c) 2002 Derek Atkins <warlord at MIT.EDU>
- *
- * 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
- * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
- * Boston, MA 02110-1301, USA gnu at gnu.org
- *
- *********************************************************************/
-
-#include "config.h"
-#include <gmodule.h>
-
-#include "gnc-module.h"
-#include "gnc-module-api.h"
-#include "gnc-engine.h"
-#include "io-gncxml-v2.h"
-
-#include "gnc-address-xml-v2.h"
-#include "gnc-bill-term-xml-v2.h"
-#include "gnc-customer-xml-v2.h"
-#include "gnc-employee-xml-v2.h"
-#include "gnc-entry-xml-v2.h"
-#include "gnc-invoice-xml-v2.h"
-#include "gnc-job-xml-v2.h"
-#include "gnc-order-xml-v2.h"
-#include "gnc-owner-xml-v2.h"
-#include "gnc-tax-table-xml-v2.h"
-#include "gnc-vendor-xml-v2.h"
-
-GNC_MODULE_API_DECL(libgncmod_business_backend_file)
-
-/* version of the gnc module system interface we require */
-int libgncmod_business_backend_file_gnc_module_system_interface = 0;
-
-/* module versioning uses libtool semantics. */
-int libgncmod_business_backend_file_gnc_module_current = 0;
-int libgncmod_business_backend_file_gnc_module_revision = 0;
-int libgncmod_business_backend_file_gnc_module_age = 0;
-
-static GNCModule bus_core;
-static GNCModule file;
-
-
-char *
-libgncmod_business_backend_file_gnc_module_path(void)
-{
- return g_strdup("gnucash/business-core-file");
-}
-
-char *
-libgncmod_business_backend_file_gnc_module_description(void)
-{
- return g_strdup("The XML (v2) parsers for GnuCash business objects");
-}
-
-int
-libgncmod_business_backend_file_gnc_module_init(int refcount)
-{
- if(!gnc_engine_is_initialized()) { return FALSE; }
-
- bus_core = gnc_module_load("gnucash/business-core", 0);
- if(!bus_core) return FALSE;
-
- if (refcount == 0) {
- /* Initialize our pointers into the backend subsystem */
- gnc_address_xml_initialize ();
- gnc_billterm_xml_initialize ();
- gnc_customer_xml_initialize ();
- gnc_employee_xml_initialize ();
- gnc_entry_xml_initialize ();
- gnc_invoice_xml_initialize ();
- gnc_job_xml_initialize ();
- gnc_order_xml_initialize ();
- gnc_owner_xml_initialize ();
- gnc_taxtable_xml_initialize ();
- gnc_vendor_xml_initialize ();
- }
-
- return TRUE;
-}
-
-int
-libgncmod_business_backend_file_gnc_module_end(int refcount)
-{
- int unload = TRUE;
-
- if (bus_core)
- unload = gnc_module_unload(bus_core);
-
- if (refcount == 0) {
- bus_core = NULL;
- file = NULL;
- }
-
- return unload;
-}
Modified: gnucash/trunk/src/gnome-utils/druid-gnc-xml-import.c
===================================================================
--- gnucash/trunk/src/gnome-utils/druid-gnc-xml-import.c 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/gnome-utils/druid-gnc-xml-import.c 2009-04-12 17:14:21 UTC (rev 18045)
@@ -30,7 +30,7 @@
#include "druid-gnc-xml-import.h"
#include "dialog-utils.h"
#include "druid-utils.h"
-#include "gnc-backend-file.h"
+#include "gnc-backend-xml.h"
#include "gnc-filepath-utils.h"
#include "gnc-module.h"
#include "gnc-ui.h"
Modified: gnucash/trunk/src/html/Makefile.am
===================================================================
--- gnucash/trunk/src/html/Makefile.am 2009-04-11 13:58:12 UTC (rev 18044)
+++ gnucash/trunk/src/html/Makefile.am 2009-04-12 17:14:21 UTC (rev 18045)
@@ -31,7 +31,16 @@
gnc-html-graph-gog.h \
gnc-html-history.h \
gnc-html.h \
- gnc-html-factory.h
+ gnc-html-p.h \
+ gnc-html-factory.h \
+ gnc-html-gtkhtml.h \
+ gnc-html-webkit.h \
+ gnc-html-extras.h \
+ gnc-html-gtkhtml-p.h \
+ gnc-html-webkit-p.h \
+ gnc-html-graph-gog-gtkhtml.h \
+ gnc-html-graph-gog-webkit.h \
+ gnc-html-graph-gog-extras.h
libgncmod_html_la_LDFLAGS = -avoid-version
@@ -82,7 +91,6 @@
endif
EXTRA_DIST = \
- gnc-svninfo.h \
gnc-html.i
if !GTKHTML_USES_GTKPRINT
More information about the gnucash-changes
mailing list