[Gnucash-changes] QOF sync

Neil Williams codehelp at cvs.gnucash.org
Thu Oct 13 08:35:03 EDT 2005


Log Message:
-----------
QOF sync

Tags:
----
gnucash-gnome2-dev

Modified Files:
--------------
    gnucash/src/backend/qsf:
        qsf-backend.c
        qsf-xml.c
    gnucash/src/engine:
        gnc-trace.c
        gnc-trace.h
        qof-be-utils.h
        qof.h
        qofbackend.c
    gnucash/src/gnome:
        dialog-chart-export.c

Revision Data
-------------
Index: qsf-xml.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/qsf/Attic/qsf-xml.c,v
retrieving revision 1.1.2.8
retrieving revision 1.1.2.9
diff -Lsrc/backend/qsf/qsf-xml.c -Lsrc/backend/qsf/qsf-xml.c -u -r1.1.2.8 -r1.1.2.9
--- src/backend/qsf/qsf-xml.c
+++ src/backend/qsf/qsf-xml.c
@@ -38,8 +38,7 @@
 		g_list_free(params->referenceList);
 	}
 	g_slist_free(params->supported_types);
-	xmlFreeDoc(params->output_doc);
-	xmlFreeNs(params->map_ns);
+	if(params->map_ns) { xmlFreeNs(params->map_ns); }
 }
 
 int
Index: qsf-backend.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/qsf/Attic/qsf-backend.c,v
retrieving revision 1.1.2.19
retrieving revision 1.1.2.20
diff -Lsrc/backend/qsf/qsf-backend.c -Lsrc/backend/qsf/qsf-backend.c -u -r1.1.2.19 -r1.1.2.20
--- src/backend/qsf/qsf-backend.c
+++ src/backend/qsf/qsf-backend.c
@@ -418,10 +418,12 @@
 
 	params = (qsf_param*)data;
 	qof_param = params->qof_param;
-	g_return_if_fail(params != NULL);
+	g_return_if_fail(params && path && content);
+	ENTER (" path=%s", path);
 	switch(kvp_value_get_type(content))
 	{
 		case KVP_TYPE_STRING:
+		{
 			node = xmlAddChild(params->output_node, xmlNewNode(params->qsf_ns,
 				BAD_CAST qof_param->param_type));
 			xmlNodeAddContent(node, BAD_CAST kvp_value_to_bare_string(content));
@@ -429,7 +431,9 @@
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_KVP, BAD_CAST path);
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_VALUE, BAD_CAST QOF_TYPE_STRING);
 			break;
+		}
 		case KVP_TYPE_GUID:
+		{
 			node = xmlAddChild(params->output_node, xmlNewNode(params->qsf_ns,
 				BAD_CAST qof_param->param_type));
 			xmlNodeAddContent(node, BAD_CAST kvp_value_to_bare_string(content));
@@ -437,7 +441,9 @@
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_KVP, BAD_CAST path);
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_VALUE, BAD_CAST QOF_TYPE_GUID);
 			break;
+		}
 		case KVP_TYPE_BINARY:
+		{
 			node = xmlAddChild(params->output_node, xmlNewNode(params->qsf_ns,
 				BAD_CAST qof_param->param_type));
 			xmlNodeAddContent(node, BAD_CAST kvp_value_to_bare_string(content));
@@ -445,7 +451,9 @@
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_KVP, BAD_CAST path);
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_VALUE, BAD_CAST QSF_TYPE_BINARY);
 			break;
+		}
 		case KVP_TYPE_GLIST:
+		{
 			node = xmlAddChild(params->output_node, xmlNewNode(params->qsf_ns,
 				BAD_CAST qof_param->param_type));
 			xmlNodeAddContent(node, BAD_CAST kvp_value_to_bare_string(content));
@@ -453,7 +461,9 @@
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_KVP, BAD_CAST path);
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_VALUE, BAD_CAST QSF_TYPE_GLIST);
 			break;
+		}
 		case KVP_TYPE_FRAME:
+		{
 			node = xmlAddChild(params->output_node, xmlNewNode(params->qsf_ns,
 				BAD_CAST qof_param->param_type));
 			xmlNodeAddContent(node, BAD_CAST kvp_value_to_bare_string(content));
@@ -461,7 +471,9 @@
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_KVP, BAD_CAST path);
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_VALUE, BAD_CAST QSF_TYPE_FRAME);
 			break;
+		}
 		case KVP_TYPE_GINT64:
+		{
 			node = xmlAddChild(params->output_node, xmlNewNode(params->qsf_ns,
 				BAD_CAST qof_param->param_type));
 			xmlNodeAddContent(node, BAD_CAST kvp_value_to_bare_string(content));
@@ -469,7 +481,9 @@
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_KVP, BAD_CAST path);
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_VALUE, BAD_CAST QOF_TYPE_INT64);
 			break;
+		}
 		case KVP_TYPE_DOUBLE:
+		{
 			node = xmlAddChild(params->output_node, xmlNewNode(params->qsf_ns,
 				BAD_CAST qof_param->param_type));
 			xmlNodeAddContent(node, BAD_CAST kvp_value_to_bare_string(content));
@@ -477,7 +491,9 @@
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_KVP, BAD_CAST path);
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_VALUE, BAD_CAST QOF_TYPE_DOUBLE);
 			break;
+		}
 		case KVP_TYPE_NUMERIC:
+		{
 			node = xmlAddChild(params->output_node, xmlNewNode(params->qsf_ns,
 				BAD_CAST qof_param->param_type));
 			xmlNodeAddContent(node, BAD_CAST kvp_value_to_bare_string(content));
@@ -485,9 +501,11 @@
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_KVP, BAD_CAST path);
 			xmlNewProp(node, BAD_CAST QSF_OBJECT_VALUE, BAD_CAST QOF_TYPE_NUMERIC);
 			break;
+		}
 		default:
-		break;
+		{ break; }
 	}
+	LEAVE (" ");
 }
 
 static void
@@ -724,17 +742,14 @@
 =======================================================*/
 /*	QSF only uses one QofBook per file - count may be removed later. */
 static xmlDocPtr
-qofbook_to_qsf(QofBook *book)
+qofbook_to_qsf(QofBook *book, qsf_param *params)
 {
 	xmlNodePtr top_node, node;
 	xmlDocPtr doc;
 	gchar buffer[GUID_ENCODING_LENGTH + 1];
-	qsf_param *params;
 	const GUID *book_guid;
 	
 	g_return_val_if_fail(book != NULL, NULL);
-	params = g_new(qsf_param, 1);
-	qsf_param_init(params);
 	params->book = book;
 	params->referenceList = g_list_copy((GList*)qof_book_get_data(book, ENTITYREFERENCE));
 	doc = xmlNewDoc(BAD_CAST QSF_XML_VERSION);
@@ -755,14 +770,14 @@
 }
 
 static void
-write_qsf_from_book(const char *path, QofBook *book)
+write_qsf_from_book(const char *path, QofBook *book, qsf_param *params)
 {
 	xmlDocPtr qsf_doc;
 	gint write_result;
 	QofBackend *be;
 
 	be = qof_book_get_backend(book);
-	qsf_doc = qofbook_to_qsf(book);
+	qsf_doc = qofbook_to_qsf(book, params);
 	write_result = 0;
 	if((use_gz_level > 0) && (use_gz_level <= 9)) 
 	{
@@ -779,11 +794,11 @@
 }
 
 static void
-write_qsf_to_stdout(QofBook *book)
+write_qsf_to_stdout(QofBook *book, qsf_param *params)
 {
 	xmlDocPtr qsf_doc;
 
-	qsf_doc = qofbook_to_qsf(book);
+	qsf_doc = qofbook_to_qsf(book, params);
 	g_return_if_fail(qsf_is_valid(QSF_SCHEMA_DIR, QSF_OBJECT_SCHEMA, qsf_doc) == TRUE);
 	xmlSaveFormatFileEnc("-", qsf_doc, "UTF-8", 1);
 	fprintf(stdout, "\n");
@@ -795,16 +810,18 @@
 qsf_write_file(QofBackend *be, QofBook *book)
 {
 	QSFBackend *qsf_be;
+	qsf_param *params;
 	char *path;
 
 	qsf_be = (QSFBackend*)be;
+	params = qsf_be->params;
 	/* if fullpath is blank, book_id was set to QOF_STDOUT */
 	if (!qsf_be->fullpath || (*qsf_be->fullpath == '\0')) {
-		write_qsf_to_stdout(book);
+		write_qsf_to_stdout(book, params);
 		return;
 	}
 	path = strdup(qsf_be->fullpath);
-	write_qsf_from_book(path, book);
+	write_qsf_from_book(path, book, params);
 	g_free(path);
 }
 
Index: gnc-trace.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gnc-trace.c,v
retrieving revision 1.2.20.14
retrieving revision 1.2.20.15
diff -Lsrc/engine/gnc-trace.c -Lsrc/engine/gnc-trace.c -u -r1.2.20.14 -r1.2.20.15
--- src/engine/gnc-trace.c
+++ src/engine/gnc-trace.c
@@ -1,5 +1,5 @@
 /* *****************************************************************\
- * gnc-trace.c -- GnuCash error loging and tracing facility         *
+ * gnc-trace.c -- QOF error logging and tracing facility            *
  * Copyright (C) 1997-2003 Linas Vepstas <linas at linas.org>          *
  * Copyright (c) 2005 Neil Williams <linux at codehelp.co.uk>          *
  *                                                                  *
@@ -24,6 +24,14 @@
  *   Author: Linas Vepstas (linas at linas.org)                        *
 \********************************************************************/
 
+/** @addtogroup Trace
+@{ */
+
+/** @file gnc-trace.c
+    @brief QOF error logging facility 
+		@author Neil Williams <linux at codehelp.co.uk>
+*/
+
 #include "config.h"
 
 #include <glib.h>
@@ -44,10 +52,11 @@
 static const int MAX_TRACE_FILENAME = 100;
 static GHashTable *log_table = NULL;
 
-/* uses the enum_as_string macro from QOF
+AS_STRING_FUNC(gncLogLevel, LOG_LEVEL_LIST)  /**< enum_as_string function
+
+uses the enum_as_string macro from QOF
 but the From macro is not required. Lookups
 are done on the string. */
-AS_STRING_FUNC(gncLogLevel, LOG_LEVEL_LIST)
 
 FROM_STRING_FUNC(gncLogLevel, LOG_LEVEL_LIST)
 
@@ -355,5 +364,7 @@
 	return g_hash_table_size(log_table);
 }
 
+/** @} */
+
 /************************* END OF FILE ******************************\
 \********************************************************************/
Index: gnc-trace.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gnc-trace.h,v
retrieving revision 1.3.4.10
retrieving revision 1.3.4.11
diff -Lsrc/engine/gnc-trace.h -Lsrc/engine/gnc-trace.h -u -r1.3.4.10 -r1.3.4.11
--- src/engine/gnc-trace.h
+++ src/engine/gnc-trace.h
@@ -1,6 +1,7 @@
 /********************************************************************\
- * gnc-trace.h -- GnuCash error logging and tracing fcility         *
+ * gnc-trace.h -- QOF error logging and tracing facility            *
  * Copyright (C) 1998-2003 Linas Vepstas <linas at linas.org>          *
+ * Copyright (c) 2005 Neil Williams <linux at codehelp.co.uk>          *
  *                                                                  *
  * This program is free software; you can redistribute it and/or    *
  * modify it under the terms of the GNU General Public License as   *
@@ -26,7 +27,9 @@
     @{ */
 
 /** @file gnc-trace.h 
- *  @brief QOF error logging and tracing facility */
+ *  @brief QOF error logging and tracing facility
+ *  @author Neil Williams <linux at codehelp.co.uk>
+ */
 
 #ifndef GNC_TRACE_H
 #define GNC_TRACE_H
@@ -50,8 +53,18 @@
 
 DEFINE_ENUM (gncLogLevel, LOG_LEVEL_LIST)
 
+/** Convert gncLogLevel to a string.
+
+The macro correlates the enum value and an
+exact copy as a string, removing the need to
+keep two separate lists in sync.
+*/
 AS_STRING_DEC(gncLogLevel, LOG_LEVEL_LIST)
 
+/** Convert the log_string to a gncLogLevel
+
+Only for use as a partner to ::gncLogLevelasString
+*/
 FROM_STRING_DEC(gncLogLevel, LOG_LEVEL_LIST)
 
 #define GNC_TRACE_INDENT_WIDTH 4
Index: qof-be-utils.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qof-be-utils.h,v
retrieving revision 1.3.2.7
retrieving revision 1.3.2.8
diff -Lsrc/engine/qof-be-utils.h -Lsrc/engine/qof-be-utils.h -u -r1.3.2.7 -r1.3.2.8
--- src/engine/qof-be-utils.h
+++ src/engine/qof-be-utils.h
@@ -72,14 +72,15 @@
   } else {                                                          \
      /* We tried and failed to start transaction! */                \
      (inst)->dirty = TRUE;                                          \
-  }
+  }                                                                 \
+  LEAVE (" ");
 
 /** \brief function version of QOF_BEGIN_EDIT
 
 The macro cannot be used in a function that returns a value,
 this function can be used instead.
 */
-void qof_begin_edit(QofInstance *inst);
+gboolean qof_begin_edit(QofInstance *inst);
 
 /**
  * commit_edit helpers
@@ -127,7 +128,7 @@
 The macro cannot be used in a function that returns a value,
 this function can be used instead. Only Part1 is implemented.
 */
-void qof_commit_edit(QofInstance *inst);
+gboolean qof_commit_edit(QofInstance *inst);
 
 /**
  * part2 -- deal with the backend
Index: qofbackend.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofbackend.c,v
retrieving revision 1.2.4.7
retrieving revision 1.2.4.8
diff -Lsrc/engine/qofbackend.c -Lsrc/engine/qofbackend.c -u -r1.2.4.7 -r1.2.4.8
--- src/engine/qofbackend.c
+++ src/engine/qofbackend.c
@@ -1,6 +1,7 @@
 /********************************************************************\
  * qofbackend.c -- utility routines for dealing with the data backend  *
  * Copyright (C) 2000 Linas Vepstas <linas at linas.org>               *
+ * Copyright (C) 2004-5 Neil Williams <linux at codehelp.co.uk>        *
  *                                                                  *
  * This program is free software; you can redistribute it and/or    *
  * modify it under the terms of the GNU General Public License as   *
@@ -28,6 +29,7 @@
 #include <stdarg.h>
 #include <regex.h>
 #include <glib.h>
+#include <gmodule.h>
 #include <dlfcn.h>
 #include <sys/stat.h>
 #include <errno.h>
@@ -356,28 +358,29 @@
 	else { return FALSE; }
 }
 
-void 
+gboolean
 qof_begin_edit(QofInstance *inst)
 {
   QofBackend * be;
 
-  if (!inst) { return; }
-  inst->editlevel++;
-  if (1 < inst->editlevel) return;
+  if (!inst) { return FALSE; }
+  (inst->editlevel)++;
+  if (1 < inst->editlevel) { return FALSE; }
   if (0 >= inst->editlevel) { inst->editlevel = 1; }
   be = qof_book_get_backend (inst->book);
     if (be && qof_backend_begin_exists(be)) {
      qof_backend_run_begin(be, inst);
   } else { inst->dirty = TRUE; }
+  return TRUE;
 }
 
-void qof_commit_edit(QofInstance *inst)
+gboolean qof_commit_edit(QofInstance *inst)
 {
   QofBackend * be;
 
-  if (!inst) return;
-  inst->editlevel--;
-  if (0 < inst->editlevel) { return; }
+  if (!inst) { return FALSE; }
+  (inst->editlevel)--;
+  if (0 < inst->editlevel) { return FALSE; }
   if ((-1 == inst->editlevel) && inst->dirty)
   {
     be = qof_book_get_backend ((inst)->book);
@@ -387,108 +390,37 @@
     inst->editlevel = 0;
   }
   if (0 > inst->editlevel) { inst->editlevel = 0; }
+  return TRUE;
 }
 
-#define STR_DLNAME     "dlname="
-#define STR_LIBDIR     "libdir="
-
 gboolean
 qof_load_backend_library (const char *directory, 
 				const char* filename, const char* init_fcn)
 {
-	FILE *filehandle;
-	void (*initfn) (void);
-	void *dl_hand = NULL;
-#ifndef HAVE_GETLINE
-	char lineptr[1024];
-#else
-	char *lineptr;
-#endif
-	const char * err_str;
-	gchar *dlname, *libdirpath, *tempstr;
-	int errors;
-	guint n, end;
 	struct stat sbuf;
-
-	errors = 0;
-	dlname = NULL;
-	tempstr = NULL;
-	libdirpath = NULL;
-	g_return_val_if_fail((filename || init_fcn), FALSE); 
-  if(directory)
-	{
-		if(!g_str_has_suffix(directory, "/")) {
-			tempstr = g_strconcat(directory, "/", filename, NULL);
-		}
-		else {
-			tempstr = g_strconcat(directory, filename, NULL);
-		}
-		filename = tempstr;
-	}
-	g_return_val_if_fail(g_str_has_suffix (filename, ".la"), FALSE);
-	/* now we have a filename ending in .la, see if we can open it. */
-	n = (guint)strlen(STR_DLNAME);
-	g_return_val_if_fail((stat(filename, &sbuf) == 0), FALSE);
-	filehandle = fopen(filename, "r");
-	g_return_val_if_fail((filehandle), FALSE);
-#ifndef HAVE_GETLINE
-	while (NULL != (fgets(lineptr, sizeof(lineptr), filehandle)))
-#else
-	lineptr = NULL;
-	while (0 < getline(&lineptr, &n, filehandle))
-#endif
-	{
-		n = (guint)strlen(STR_DLNAME);
-		if (strncmp (lineptr, STR_DLNAME, n - 1) == 0)
-		{
-			/* obtain substring from dlname='.*'\n
-			 where .* matches the library .so|.dylib name
-			 allowing for single quotes, if used. */
-			tempstr = g_strdup(lineptr + n);
-			if(tempstr[0] == '\'') { tempstr++; }
-			dlname = g_strndup(tempstr, strlen(tempstr) - 1);
-			end = strlen(dlname);
-			if(dlname[end-1] == '\'') 
-			{ 
-				tempstr = g_strndup(dlname, end - 1);
-				dlname = tempstr;
-			}
-		}
-		/* now get the path, just in case */
-		n = (guint)strlen(STR_LIBDIR);
-		if (strncmp (lineptr, STR_LIBDIR, n - 1) == 0)
-		{
-			tempstr = g_strdup(lineptr + n);
-			if(tempstr[0] == '\'') { tempstr++; }
-			libdirpath = g_strndup(tempstr, strlen(tempstr) - 1);
-			end = strlen(libdirpath);
-			if(libdirpath[end-1] == '\'')
-			{
-				tempstr = g_strndup(libdirpath, end - 1);
-				libdirpath = tempstr;
-			}
-		}
-	}
-	fclose(filehandle);
-	tempstr = g_strconcat(libdirpath, "/", dlname, NULL);
-	dlname = tempstr;
-	g_free(libdirpath);
-	dl_hand = dlopen (dlname, RTLD_LAZY);
-	if (NULL == dl_hand)
-	{
-		err_str = dlerror();
-		g_message ("Can't load backend, %s\n", err_str);
+	gchar *fullpath;
+	typedef void (* backend_init) (void);
+	GModule *backend;
+	backend_init gmod_init;
+	gpointer g;
+
+	g_return_val_if_fail(g_module_supported(), FALSE);
+	fullpath = g_module_build_path(directory, filename);
+	PINFO (" fullpath=%s", fullpath);
+	g_return_val_if_fail((stat(fullpath, &sbuf) == 0), FALSE);
+	backend = g_module_open(fullpath, G_MODULE_BIND_LAZY);
+	if(!backend) { 
+		g_message ("%s: %s\n", PACKAGE, g_module_error ());
 		return FALSE;
 	}
-	initfn = dlsym (dl_hand, init_fcn);
-	if (initfn) { (*initfn)(); }
-	else
+	g = &gmod_init;
+	if (!g_module_symbol (backend, init_fcn, g))
 	{
-		err_str = dlerror();
-		g_message("Can't find %s:%s, %s\n", dlname, init_fcn, err_str);
+		g_message ("%s: %s\n", PACKAGE, g_module_error ());
 		return FALSE;
 	}
-	g_free(dlname);
+	g_module_make_resident(backend);
+	gmod_init();
 	return TRUE;
 }
 
Index: qof.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qof.h,v
retrieving revision 1.2.4.8
retrieving revision 1.2.4.9
diff -Lsrc/engine/qof.h -Lsrc/engine/qof.h -u -r1.2.4.8 -r1.2.4.9
--- src/engine/qof.h
+++ src/engine/qof.h
@@ -96,5 +96,6 @@
 #include "qofchoice.h"
 #include "qof_book_merge.h"
 #include "qof-be-utils.h"
+#include "qofla-dir.h"
 
 #endif /* QOF_H_ */
Index: dialog-chart-export.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome/Attic/dialog-chart-export.c,v
retrieving revision 1.1.2.7
retrieving revision 1.1.2.8
diff -Lsrc/gnome/dialog-chart-export.c -Lsrc/gnome/dialog-chart-export.c -u -r1.1.2.7 -r1.1.2.8
--- src/gnome/dialog-chart-export.c
+++ src/gnome/dialog-chart-export.c
@@ -23,15 +23,13 @@
  */
  
 #include <time.h>
-#include "qofsession.h"
+#include "qof.h"
 #include "AccountP.h"
 #include "Transaction.h"
-#include "qofobject.h"
 #include "dialog-chart-export.h"
 #include "gnc-ui-util.h"
 #include "dialog-utils.h"
-#include "gnc-engine-util.h"
-#include "gnc-event.h"
+#include "gnc-engine.h"
 #include "gnc-file.h"
 
 #define EQUITY_ACCOUNT_NAME  _("Opening Balances")


More information about the gnucash-changes mailing list