[Gnucash-changes] Add QofBackendOption to compress QSF

Neil Williams codehelp at cvs.gnucash.org
Sat Oct 1 13:55:04 EDT 2005


Log Message:
-----------
Add QofBackendOption to compress QSF

Tags:
----
gnucash-gnome2-dev

Modified Files:
--------------
    gnucash/src/backend/qsf:
        qsf-backend.c

Revision Data
-------------
Index: qsf-backend.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/qsf/Attic/qsf-backend.c,v
retrieving revision 1.1.2.18
retrieving revision 1.1.2.19
diff -Lsrc/backend/qsf/qsf-backend.c -Lsrc/backend/qsf/qsf-backend.c -u -r1.1.2.18 -r1.1.2.19
--- src/backend/qsf/qsf-backend.c
+++ src/backend/qsf/qsf-backend.c
@@ -24,33 +24,50 @@
 
 #define _GNU_SOURCE
 
+#include "qof-backend-qsf.h"
 #include "qsf-xml.h"
 #include "qsf-dir.h"
-#include "qof-backend-qsf.h"
 #include <errno.h>
 #include <sys/stat.h>
 
 #define QSF_TYPE_BINARY "binary"
 #define QSF_TYPE_GLIST "glist"
 #define QSF_TYPE_FRAME "frame"
+#define QSF_COMPRESS "compression_level"
 
-static int module = MOD_BACKEND;
+static QofLogModule log_module = QOF_MOD_QSF;
+static int use_gz_level = 0;
+
+static void option_cb (QofBackendOption *option, gpointer data)
+{
+	if(0 == safe_strcmp(QSF_COMPRESS, option->option_name)) {
+		use_gz_level = *(gint*)option->value;
+	}
+}
 
 static void
 qsf_load_config(QofBackend *be, KvpFrame *config)
 {
-
+  qof_backend_option_foreach(config, option_cb, NULL);
 }
 
 static KvpFrame*
 qsf_get_config(QofBackend *be)
 {
+	QofBackendOption *option;
+
 	if(!be) { return NULL; }
-	if(!kvp_frame_is_empty(be->backend_configuration)) {
-		kvp_frame_delete(be->backend_configuration);
-		be->backend_configuration = kvp_frame_new();
-	}
-	return be->backend_configuration;
+	qof_backend_prepare_frame(be);
+	option = g_new0(QofBackendOption, 1);
+	option->option_name = QSF_COMPRESS;
+	option->description = _("Level of compression to use: 0 for none, 9 for highest.");
+	option->tooltip = _("QOF can compress QSF XML files using gzip. "
+		"Note that compression is not used when outputting to STDOUT.");
+	option->type = KVP_TYPE_GINT64;
+	option->value = (gpointer)&use_gz_level;
+	qof_backend_prepare_option(be, option);
+	g_free(option);
+	return qof_backend_complete_frame(be);
 }
 
 struct QSFBackend_s 
@@ -738,22 +755,26 @@
 }
 
 static void
-write_qsf_from_book(FILE *out, QofBook *book)
+write_qsf_from_book(const char *path, QofBook *book)
 {
 	xmlDocPtr qsf_doc;
 	gint write_result;
 	QofBackend *be;
 
+	be = qof_book_get_backend(book);
 	qsf_doc = qofbook_to_qsf(book);
 	write_result = 0;
+	if((use_gz_level > 0) && (use_gz_level <= 9)) 
+	{
+		xmlSetDocCompressMode(qsf_doc, use_gz_level); 
+	}
 	g_return_if_fail(qsf_is_valid(QSF_SCHEMA_DIR, QSF_OBJECT_SCHEMA, qsf_doc) == TRUE);
-	write_result = xmlDocFormatDump(out, qsf_doc, 1);
-	if(write_result < 0) {
-		be = qof_book_get_backend(book);
+	write_result = xmlSaveFormatFileEnc(path, qsf_doc, "UTF-8", 1);
+	if(write_result < 0) 
+	{
 		qof_backend_set_error(be, ERR_FILEIO_WRITE_ERROR);
 		return;
 	}
-	fprintf(out, "\n");
 	xmlFreeDoc(qsf_doc);
 }
 
@@ -764,16 +785,16 @@
 
 	qsf_doc = qofbook_to_qsf(book);
 	g_return_if_fail(qsf_is_valid(QSF_SCHEMA_DIR, QSF_OBJECT_SCHEMA, qsf_doc) == TRUE);
-	xmlDocFormatDump(stdout, qsf_doc, 1);
+	xmlSaveFormatFileEnc("-", qsf_doc, "UTF-8", 1);
 	fprintf(stdout, "\n");
 	xmlFreeDoc(qsf_doc);
+	LEAVE (" ");
 }
 
 void
 qsf_write_file(QofBackend *be, QofBook *book)
 {
 	QSFBackend *qsf_be;
-	FILE *out;
 	char *path;
 
 	qsf_be = (QSFBackend*)be;
@@ -783,14 +804,8 @@
 		return;
 	}
 	path = strdup(qsf_be->fullpath);
-	out = fopen(path, "w");
-	if (!out) {
-		qof_backend_set_error(be, ERR_FILEIO_WRITE_ERROR);
-		return;
-	}
-	write_qsf_from_book(out, book);
+	write_qsf_from_book(path, book);
 	g_free(path);
-	fclose(out);
 }
 
 /* QofBackend routine to load from file - needs a map.
@@ -1135,6 +1150,7 @@
 qsf_provider_init(void)
 {
 	QofBackendProvider *prov;
+
 	#ifdef ENABLE_NLS
 	setlocale (LC_ALL, "");
 	bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
@@ -1147,7 +1163,6 @@
 	prov->partial_book_supported = TRUE;
 	prov->backend_new = qsf_backend_new;
 	prov->check_data_type = qsf_determine_file_type;
-	prov->provider_config = "qsf-backend-v0.1.xml";
 	prov->provider_free = qsf_provider_free;
 	qof_backend_register_provider (prov);
 }


More information about the gnucash-changes mailing list