[Gnucash-changes] Completing the Chart of Accounts QSF Export.
Neil Williams
codehelp at cvs.gnucash.org
Sat Mar 26 12:39:55 EST 2005
Log Message:
-----------
Completing the Chart of Accounts QSF Export.
Support for multiple references per entity.
Use string values for enum types in Account.
Tags:
----
gnucash-gnome2-dev
Modified Files:
--------------
gnucash:
ChangeLog
gnucash/src/backend/qsf:
qsf-backend.c
gnucash/src/business/business-gnome:
gnc-plugin-business.c
gnucash/src/engine:
Account.c
Account.h
Transaction.c
Transaction.h
qofclass.c
qofsession.c
gnucash/src/gnome:
dialog-chart-export.c
Revision Data
-------------
Index: ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/ChangeLog,v
retrieving revision 1.1487.2.184
retrieving revision 1.1487.2.185
diff -LChangeLog -LChangeLog -u -r1.1487.2.184 -r1.1487.2.185
--- ChangeLog
+++ ChangeLog
@@ -1,3 +1,20 @@
+2005-03-25 Neil Williams <linux at codehelp.co.uk>
+ * src/backend/qsf/qsf-backend.c: Support for
+ multiple references in the same entity.
+ * src/business/business-gnome/gnc-plugin-business.c:
+ Typo in employee export collection.
+ * src/engine/Account.c:
+ * src/engine/Account.h: qofAccountGetTypeString
+ and qofAccountSetType to use string values for
+ enum types in QOF.
+ * src/engine/Transaction.c:
+ * src/engine/Transaction.h: qofSplitSetParentTrans
+ and qofSplitSetAccount QOF reference QofSetterFunc.
+ * src/engine/qofclass.c: Fixing reference identification.
+ * src/engine/qofsession.c: Removing debug calls. Minor fix.
+ * src/gnome/dialog-chart-export.c: Adding references to
+ generated Transaction and Splits in Chart of Accounts export.
+
2005-03-21 Neil Williams <linux at codehelp.co.uk>
* src/backend/qsf/qsf-backend.c:
* src/backend/qsf/qsf-xml.c:
Index: Transaction.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Transaction.h,v
retrieving revision 1.141.4.8
retrieving revision 1.141.4.9
diff -Lsrc/engine/Transaction.h -Lsrc/engine/Transaction.h -u -r1.141.4.8 -r1.141.4.9
--- src/engine/Transaction.h
+++ src/engine/Transaction.h
@@ -921,6 +921,10 @@
#define RECONCILED_MATCH_TYPE "reconciled-match"
+/* QOF only */
+void qofSplitSetParentTrans(Split *s, QofEntity *ent);
+void qofSplitSetAccount(Split *s, QofEntity *ent);
+
/** deprecated rouitines */
#define xaccSplitGetGUID(X) qof_entity_get_guid(QOF_ENTITY(X))
#define xaccSplitReturnGUID(X) (X ? *(qof_entity_get_guid(QOF_ENTITY(X))) : *(guid_null()))
Index: Transaction.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Transaction.c,v
retrieving revision 1.261.4.7
retrieving revision 1.261.4.8
diff -Lsrc/engine/Transaction.c -Lsrc/engine/Transaction.c -u -r1.261.4.7 -r1.261.4.8
--- src/engine/Transaction.c
+++ src/engine/Transaction.c
@@ -3221,7 +3221,7 @@
mark_clean: NULL,
foreach: qof_collection_foreach,
printable: (const char* (*)(gpointer)) xaccSplitGetMemo,
- version_cmp: NULL,
+ version_cmp: (int (*)(gpointer, gpointer)) qof_instance_version_cmp,
};
static gpointer
@@ -3249,6 +3249,26 @@
return obj;
}
+void
+qofSplitSetParentTrans(Split *s, QofEntity *ent)
+{
+ Transaction *trans;
+
+ trans = (Transaction*)ent;
+ g_return_if_fail(trans != NULL);
+ xaccTransAppendSplit(trans, s);
+}
+
+void
+qofSplitSetAccount(Split *s, QofEntity *ent)
+{
+ Account *acc;
+
+ acc = (Account*)ent;
+ g_return_if_fail(acc != NULL);
+ xaccAccountInsertSplit(acc, s);
+}
+
gboolean xaccSplitRegister (void)
{
static const QofParam params[] = {
@@ -3257,29 +3277,23 @@
/* d-* are depricated query params, should not be used in new
* queries, should be removed from old queries. */
- { "d-share-amount", QOF_TYPE_DOUBLE,
- (QofAccessFunc)DxaccSplitGetShareAmount, NULL },
+ { "d-share-amount", QOF_TYPE_DOUBLE, (QofAccessFunc)DxaccSplitGetShareAmount, NULL },
{ "d-share-int64", QOF_TYPE_INT64, (QofAccessFunc)qof_entity_get_guid, NULL },
{ SPLIT_BALANCE, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccSplitGetBalance, NULL },
- { SPLIT_CLEARED_BALANCE, QOF_TYPE_NUMERIC,
- (QofAccessFunc)xaccSplitGetClearedBalance, NULL },
- { SPLIT_RECONCILED_BALANCE, QOF_TYPE_NUMERIC,
- (QofAccessFunc)xaccSplitGetReconciledBalance, NULL },
+ { SPLIT_CLEARED_BALANCE, QOF_TYPE_NUMERIC,(QofAccessFunc)xaccSplitGetClearedBalance, NULL },
+ { SPLIT_RECONCILED_BALANCE, QOF_TYPE_NUMERIC,(QofAccessFunc)xaccSplitGetReconciledBalance, NULL },
{ SPLIT_MEMO, QOF_TYPE_STRING, (QofAccessFunc)xaccSplitGetMemo, (QofSetterFunc)xaccSplitSetMemo },
{ SPLIT_ACTION, QOF_TYPE_STRING, (QofAccessFunc)xaccSplitGetAction, (QofSetterFunc)xaccSplitSetAction },
{ SPLIT_RECONCILE, QOF_TYPE_CHAR, (QofAccessFunc)xaccSplitGetReconcile, (QofSetterFunc)xaccSplitSetReconcile },
{ SPLIT_AMOUNT, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccSplitGetAmount, (QofSetterFunc)xaccSplitSetAmount },
- { SPLIT_SHARE_PRICE, QOF_TYPE_NUMERIC,
- (QofAccessFunc)xaccSplitGetSharePrice, (QofSetterFunc)xaccSplitSetSharePrice },
+ { SPLIT_SHARE_PRICE, QOF_TYPE_NUMERIC,(QofAccessFunc)xaccSplitGetSharePrice, (QofSetterFunc)xaccSplitSetSharePrice },
{ SPLIT_VALUE, QOF_TYPE_DEBCRED, (QofAccessFunc)xaccSplitGetValue, (QofSetterFunc)xaccSplitSetValue },
{ SPLIT_TYPE, QOF_TYPE_STRING, (QofAccessFunc)xaccSplitGetType, NULL },
- { SPLIT_VOIDED_AMOUNT, QOF_TYPE_NUMERIC,
- (QofAccessFunc)xaccSplitVoidFormerAmount, NULL },
- { SPLIT_VOIDED_VALUE, QOF_TYPE_NUMERIC,
- (QofAccessFunc)xaccSplitVoidFormerValue, NULL },
+ { SPLIT_VOIDED_AMOUNT, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccSplitVoidFormerAmount, NULL },
+ { SPLIT_VOIDED_VALUE, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccSplitVoidFormerValue, NULL },
{ SPLIT_LOT, GNC_ID_LOT, (QofAccessFunc)xaccSplitGetLot, NULL },
- { SPLIT_TRANS, GNC_ID_TRANS, (QofAccessFunc)xaccSplitGetParent, NULL },
- { SPLIT_ACCOUNT, GNC_ID_ACCOUNT, (QofAccessFunc)xaccSplitGetAccount, NULL },
+ { SPLIT_TRANS, GNC_ID_TRANS, (QofAccessFunc)xaccSplitGetParent, (QofSetterFunc)qofSplitSetParentTrans },
+ { SPLIT_ACCOUNT, GNC_ID_ACCOUNT, (QofAccessFunc)xaccSplitGetAccount, (QofSetterFunc)qofSplitSetAccount },
{ SPLIT_ACCOUNT_GUID, QOF_TYPE_GUID, split_account_guid_getter, NULL },
/* these are no-ops to register the parameter names (for sorting) but
they return an allocated object which getters cannot do. */
@@ -3338,15 +3352,15 @@
{ TRANS_DATE_DUE, QOF_TYPE_DATE, (QofAccessFunc)xaccTransRetDateDueTS, (QofSetterFunc)xaccTransSetDateDueTS },
{ TRANS_IMBALANCE, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccTransGetImbalance,NULL },
{ TRANS_NOTES, QOF_TYPE_STRING, (QofAccessFunc)xaccTransGetNotes, (QofSetterFunc)xaccTransSetNotes },
- { TRANS_IS_BALANCED, QOF_TYPE_BOOLEAN, (QofAccessFunc)trans_is_balanced_p,NULL },
+ { TRANS_IS_BALANCED, QOF_TYPE_BOOLEAN, (QofAccessFunc)trans_is_balanced_p, NULL },
{ TRANS_TYPE, QOF_TYPE_CHAR, (QofAccessFunc)xaccTransGetTxnType, (QofSetterFunc)xaccTransSetTxnType },
{ TRANS_VOID_STATUS, QOF_TYPE_BOOLEAN, (QofAccessFunc)xaccTransGetVoidStatus,NULL },
{ TRANS_VOID_REASON, QOF_TYPE_STRING, (QofAccessFunc)xaccTransGetVoidReason,NULL },
- { TRANS_VOID_TIME, QOF_TYPE_DATE, (QofAccessFunc)xaccTransGetVoidTime,NULL },
- { TRANS_SPLITLIST, GNC_ID_SPLIT, (QofAccessFunc)xaccTransGetSplitList,NULL },
- { TRANS_KVP, QOF_TYPE_KVP, (QofAccessFunc)qof_instance_get_slots,NULL },
- { QOF_PARAM_BOOK, QOF_ID_BOOK, (QofAccessFunc)qof_instance_get_book,NULL },
- { QOF_PARAM_GUID, QOF_TYPE_GUID, (QofAccessFunc)qof_entity_get_guid,NULL },
+ { TRANS_VOID_TIME, QOF_TYPE_DATE, (QofAccessFunc)xaccTransGetVoidTime, NULL },
+ { TRANS_SPLITLIST, GNC_ID_SPLIT, (QofAccessFunc)xaccTransGetSplitList, NULL },
+ { TRANS_KVP, QOF_TYPE_KVP, (QofAccessFunc)qof_instance_get_slots, NULL },
+ { QOF_PARAM_BOOK, QOF_ID_BOOK, (QofAccessFunc)qof_instance_get_book, NULL },
+ { QOF_PARAM_GUID, QOF_TYPE_GUID, (QofAccessFunc)qof_entity_get_guid, NULL },
{ NULL },
};
Index: Account.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Account.c,v
retrieving revision 1.222.4.10
retrieving revision 1.222.4.11
diff -Lsrc/engine/Account.c -Lsrc/engine/Account.c -u -r1.222.4.10 -r1.222.4.11
--- src/engine/Account.c
+++ src/engine/Account.c
@@ -1470,6 +1470,22 @@
return (acc->type);
}
+const char*
+qofAccountGetTypeString (Account *acc)
+{
+ if(!acc) { return NULL; }
+ return (xaccAccountTypeEnumAsString(acc->type));
+}
+
+void
+qofAccountSetType (Account *acc, const char *type_string)
+{
+ GNCAccountType type;
+
+ type = xaccAccountStringToEnum(type_string);
+ xaccAccountSetType(acc, type);
+}
+
const char *
xaccAccountGetName (Account *acc)
{
@@ -2877,12 +2893,12 @@
{ ACCOUNT_BALANCE_, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccAccountGetBalance, NULL },
{ ACCOUNT_CLEARED_, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccAccountGetClearedBalance, NULL },
{ ACCOUNT_RECONCILED_, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccAccountGetReconciledBalance, NULL },
- { ACCOUNT_TYPE_, QOF_TYPE_INT32, (QofAccessFunc)xaccAccountGetType, (QofSetterFunc)xaccAccountSetType },
- { ACCOUNT_FUTURE_MINIMUM_, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccAccountGetProjectedMinimumBalance, NULL },
+ { ACCOUNT_TYPE_, QOF_TYPE_STRING, (QofAccessFunc)qofAccountGetTypeString, (QofSetterFunc)qofAccountSetType },
+ { ACCOUNT_FUTURE_MINIMUM_,QOF_TYPE_NUMERIC, (QofAccessFunc)xaccAccountGetProjectedMinimumBalance, NULL },
{ ACCOUNT_TAX_RELATED, QOF_TYPE_BOOLEAN, (QofAccessFunc)xaccAccountGetTaxRelated, (QofSetterFunc) xaccAccountSetTaxRelated },
- { ACCOUNT_SCU, QOF_TYPE_INT32, (QofAccessFunc)xaccAccountGetCommoditySCU, (QofSetterFunc)xaccAccountSetCommoditySCU },
+ { ACCOUNT_SCU, QOF_TYPE_INT32, (QofAccessFunc)xaccAccountGetCommoditySCU,(QofSetterFunc)xaccAccountSetCommoditySCU },
{ ACCOUNT_NSCU, QOF_TYPE_BOOLEAN, (QofAccessFunc)xaccAccountGetNonStdSCU, (QofSetterFunc)xaccAccountSetNonStdSCU },
- { ACCOUNT_PARENT, GNC_ID_ACCOUNT, (QofAccessFunc)xaccAccountGetParentAccount, (QofSetterFunc)qofAccountSetParent },
+ { ACCOUNT_PARENT, GNC_ID_ACCOUNT, (QofAccessFunc)xaccAccountGetParentAccount,(QofSetterFunc)qofAccountSetParent },
{ QOF_PARAM_BOOK, QOF_ID_BOOK, (QofAccessFunc)qof_instance_get_book, NULL },
{ QOF_PARAM_GUID, QOF_TYPE_GUID, (QofAccessFunc)qof_instance_get_guid, NULL },
{ ACCOUNT_KVP, QOF_TYPE_KVP, (QofAccessFunc)qof_instance_get_slots, NULL },
Index: qofsession.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofsession.c,v
retrieving revision 1.2.4.13
retrieving revision 1.2.4.14
diff -Lsrc/engine/qofsession.c -Lsrc/engine/qofsession.c -u -r1.2.4.13 -r1.2.4.14
--- src/engine/qofsession.c
+++ src/engine/qofsession.c
@@ -335,21 +335,28 @@
return FALSE;
}
+static void
+qof_book_set_partial(QofBook *book)
+{
+ gboolean partial;
+
+ partial = (gboolean)qof_book_get_data(book, PARTIAL_QOFBOOK);
+ if(!partial) {
+ qof_book_set_data(book, PARTIAL_QOFBOOK, (gboolean*)TRUE);
+ }
+}
+
void
qof_session_update_reference_list(QofSession *session, QofEntityReference *reference)
{
QofBook *book;
GList *book_ref_list;
- gboolean partial;
book = qof_session_get_book(session);
book_ref_list = (GList*)qof_book_get_data(book, ENTITYREFERENCE);
book_ref_list = g_list_append(book_ref_list, reference);
qof_book_set_data(book, ENTITYREFERENCE, book_ref_list);
- partial = (gboolean)qof_book_get_data(book, PARTIAL_QOFBOOK);
- if(!partial) {
- qof_book_set_data(book, PARTIAL_QOFBOOK, (gboolean*)TRUE);
- }
+ qof_book_set_partial(book);
}
static void
@@ -371,6 +378,7 @@
{
QofEntityReference *reference;
QofEntity *ref_ent;
+ QofParam *copy_param;
const GUID *cm_guid;
char cm_sa[GUID_ENCODING_LENGTH + 1];
gchar *cm_string;
@@ -381,7 +389,10 @@
reference->type = g_strdup(ent->e_type);
reference->ref_guid = g_new(GUID, 1);
reference->ent_guid = &ent->guid;
- reference->param = param;
+ copy_param = g_new0(QofParam, 1);
+ copy_param->param_name = g_strdup(param->param_name);
+ copy_param->param_type = g_strdup(param->param_type);
+ reference->param = copy_param;
cm_guid = qof_entity_get_guid(ref_ent);
guid_to_string_buff(cm_guid, cm_sa);
cm_string = g_strdup(cm_sa);
@@ -433,7 +444,6 @@
registered_type = FALSE;
cm_param = (QofParam*) data;
g_return_if_fail(cm_param != NULL);
- ENTER (" cm_param->param_type=%s\tname=%s", cm_param->param_type, cm_param->param_name);
if(safe_strcmp(cm_param->param_type, QOF_TYPE_STRING) == 0) {
cm_string = g_strdup(cm_param->param_getfcn(importEnt, cm_param));
string_setter = (void(*)(QofEntity*, const char*))cm_param->param_setfcn;
@@ -512,7 +522,6 @@
context->error = FALSE;
}
if(registered_type == FALSE) {
- PINFO (" cm_param type=%s", cm_param->param_type);
referenceEnt = cm_param->param_getfcn(importEnt, cm_param);
reference = qof_entity_get_reference_from(importEnt, cm_param);
if(reference) {
@@ -620,6 +629,7 @@
qecd.param_list = NULL;
book = qof_session_get_book(new_session);
qecd.new_session = new_session;
+ qof_book_set_partial(book);
qecd.error = FALSE;
inst = (QofInstance*)qof_object_new_instance(original->e_type, book);
qecd.to = &inst->entity;
@@ -644,6 +654,7 @@
gnc_engine_suspend_events();
qecd.param_list = NULL;
qecd.new_session = new_session;
+ qof_book_set_partial(qof_session_get_book(qecd.new_session));
qecd.error = FALSE;
for(e=entity_list; e; e=e->next)
{
@@ -665,6 +676,7 @@
gnc_engine_suspend_events();
qecd.param_list = NULL;
qecd.new_session = new_session;
+ qof_book_set_partial(qof_session_get_book(qecd.new_session));
qecd.error = FALSE;
qof_collection_foreach(entity_coll, qof_entity_coll_foreach, &qecd);
if(qecd.error == TRUE) return FALSE;
Index: qofclass.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofclass.c,v
retrieving revision 1.1.6.3
retrieving revision 1.1.6.4
diff -Lsrc/engine/qofclass.c -Lsrc/engine/qofclass.c -u -r1.1.6.3 -r1.1.6.4
--- src/engine/qofclass.c
+++ src/engine/qofclass.c
@@ -250,12 +250,18 @@
g_hash_table_foreach (param_ht, param_foreach_cb, &iter);
}
+struct param_ref_list
+{
+ GList *ref_list;
+};
+
static void
find_reference_param(QofParam *param, gpointer user_data)
{
- GList *ref_list;
+ struct param_ref_list *b;
- ref_list = (GList*)user_data;
+ b = (struct param_ref_list*)user_data;
+ if((param->param_getfcn == NULL)||(param->param_setfcn == NULL)) { return; }
if(0 == safe_strcmp(param->param_type, QOF_TYPE_STRING)) { return; }
if(0 == safe_strcmp(param->param_type, QOF_TYPE_NUMERIC)) { return; }
if(0 == safe_strcmp(param->param_type, QOF_TYPE_DATE)) { return; }
@@ -266,16 +272,22 @@
if(0 == safe_strcmp(param->param_type, QOF_TYPE_INT64)) { return; }
if(0 == safe_strcmp(param->param_type, QOF_TYPE_DOUBLE)) { return; }
if(0 == safe_strcmp(param->param_type, QOF_TYPE_KVP)) { return; }
- ref_list = g_list_append(ref_list, param);
+ if(0 == safe_strcmp(param->param_type, QOF_TYPE_BOOLEAN)) { return; }
+ if(0 == safe_strcmp(param->param_type, QOF_ID_BOOK)) { return; }
+ b->ref_list = g_list_append(b->ref_list, param);
}
GList*
qof_class_get_referenceList(QofIdTypeConst type)
{
GList *ref_list;
+ struct param_ref_list b;
ref_list = NULL;
- qof_class_param_foreach(type, find_reference_param, ref_list);
+ b.ref_list = NULL;
+ qof_class_param_foreach(type, find_reference_param, &b);
+ ref_list = g_list_copy(b.ref_list);
+ g_list_free(b.ref_list);
return ref_list;
}
Index: Account.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Account.h,v
retrieving revision 1.110.4.9
retrieving revision 1.110.4.10
diff -Lsrc/engine/Account.h -Lsrc/engine/Account.h -u -r1.110.4.9 -r1.110.4.10
--- src/engine/Account.h
+++ src/engine/Account.h
@@ -227,6 +227,8 @@
*/
void qofAccountSetParent (Account *, QofEntity *);
+const char* qofAccountGetTypeString (Account *acc);
+void qofAccountSetType (Account *acc, const char *type_string);
/** Get the account's name */
const char * xaccAccountGetName (Account *account);
Index: gnc-plugin-business.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/business/business-gnome/Attic/gnc-plugin-business.c,v
retrieving revision 1.1.2.5
retrieving revision 1.1.2.6
diff -Lsrc/business/business-gnome/gnc-plugin-business.c -Lsrc/business/business-gnome/gnc-plugin-business.c -u -r1.1.2.5 -r1.1.2.6
--- src/business/business-gnome/gnc-plugin-business.c
+++ src/business/business-gnome/gnc-plugin-business.c
@@ -737,7 +737,7 @@
{
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (qsffilechooser));
qof_session_begin(chart_session, filename, TRUE, TRUE);
- coll = qof_book_get_collection(book, GNC_ID_INVOICE);
+ coll = qof_book_get_collection(book, GNC_ID_EMPLOYEE);
success = qof_entity_copy_coll(chart_session, coll);
if(success)
{
Index: qsf-backend.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/qsf/Attic/qsf-backend.c,v
retrieving revision 1.1.2.5
retrieving revision 1.1.2.6
diff -Lsrc/backend/qsf/qsf-backend.c -Lsrc/backend/qsf/qsf-backend.c -u -r1.1.2.5 -r1.1.2.6
--- src/backend/qsf/qsf-backend.c
+++ src/backend/qsf/qsf-backend.c
@@ -132,10 +132,15 @@
qsf_session_end( QofBackend *be)
{
QSFBackend *qsf_be;
+ GList *book_ref_list;
+ QofBook *book;
qsf_be = (QSFBackend*)be;
g_return_if_fail(qsf_be != NULL);
-
+ book = qsf_be->params->book;
+ book_ref_list = (GList*)qof_book_get_data(book, ENTITYREFERENCE);
+ g_list_free(book_ref_list);
+ qof_book_set_data(book, PARTIAL_QOFBOOK, (gboolean*)FALSE);
qsf_free_params(qsf_be->params);
g_free(qsf_be->fullpath);
qsf_be->fullpath = NULL;
@@ -392,13 +397,14 @@
const QofEntityReference *aa;
const QofEntityReference *bb;
- aa = (QofEntityReference*)a;
+ aa = (QofEntityReference*) a;
bb = (QofEntityReference*) b;
- g_return_val_if_fail((aa != NULL), 1);
+ if(aa == NULL) { return 1; }
g_return_val_if_fail((bb != NULL), 1);
g_return_val_if_fail((aa->type != NULL), 1);
if((0 == guid_compare(bb->ent_guid, aa->ent_guid))
- &&(0 == safe_strcmp(bb->type, aa->type)))
+ &&(0 == safe_strcmp(bb->type, aa->type))
+ &&(0 == safe_strcmp(bb->param->param_name, aa->param->param_name)))
{
return 0;
}
@@ -422,6 +428,46 @@
return ent_ref;
}
+static void
+reference_list_lookup(gpointer data, gpointer user_data)
+{
+ QofEntity *ent;
+ QofParam *ref_param;
+ QofEntityReference *reference, *starter;
+ qsf_param *params;
+ xmlNodePtr node, object_node;
+ xmlNsPtr ns;
+ GList *copy_list;
+ gchar qsf_guid[GUID_ENCODING_LENGTH + 1], *ref_name;
+
+ params = (qsf_param*)user_data;
+ ref_param = (QofParam*)data;
+ object_node = params->output_node;
+ ent = params->qsf_ent;
+ ns = params->qsf_ns;
+ starter = g_new(QofEntityReference, 1);
+ starter->ent_guid = qof_entity_get_guid(ent);
+ starter->type = g_strdup(ent->e_type);
+ starter->param = ref_param;
+ starter->ref_guid = NULL;
+ copy_list = g_list_copy(params->referenceList);
+ reference = qof_reference_lookup(copy_list, starter);
+ g_free(starter);
+ if(reference != NULL) {
+ if((ref_param->param_getfcn == NULL)||(ref_param->param_setfcn == NULL))
+ {
+ return;
+ }
+ ref_name = g_strdup(reference->param->param_name);
+ node = xmlAddChild(object_node, xmlNewNode(ns, QOF_TYPE_GUID));
+ guid_to_string_buff(reference->ref_guid, qsf_guid);
+ xmlNodeAddContent(node, qsf_guid);
+ xmlNewProp(node, QSF_OBJECT_TYPE ,ref_name);
+ g_free(ref_name);
+ }
+}
+
+
/*=====================================
Convert QofEntity to QSF XML node
qof_param holds the parameter sequence.
@@ -429,12 +475,12 @@
static void
qsf_entity_foreach(QofEntity *ent, gpointer data)
{
- QofEntityReference *reference, *starter;
qsf_param *params;
GSList *param_list, *supported;
+ GList *ref;
xmlNodePtr node, object_node;
xmlNsPtr ns;
- gchar *string_buffer, qsf_guid[GUID_ENCODING_LENGTH + 1], *ref_name;
+ gchar *string_buffer;
GString *buffer;
QofParam *qof_param;
KvpFrame *qsf_kvp;
@@ -469,35 +515,15 @@
xmlNewProp(node, QSF_OBJECT_TYPE , QOF_PARAM_GUID);
own_guid = TRUE;
}
- PINFO (" own_guid=%d ent->e_type=%s qof_param->param_name=%s",
- own_guid, ent->e_type, qof_param->param_name);
-/* if((qof_param->param_setfcn != NULL) && (qof_param->param_getfcn != NULL))
- {*/
- starter = g_new(QofEntityReference, 1);
- starter->ent_guid = qof_entity_get_guid(ent);
- /* Reading ent->e_type can seg fault if the above check on get() and set() is removed. */
- /* Some entities seem to be invalid artefacts. Why? */
- starter->type = g_strdup(ent->e_type);
- starter->param = qof_param;
- starter->ref_guid = NULL;
- reference = qof_reference_lookup(params->referenceList, starter);
- g_free(starter);
- if(reference != NULL) {
- ref_name = g_strdup(reference->param->param_name);
- node = xmlAddChild(object_node, xmlNewNode(ns, QOF_TYPE_GUID));
- guid_to_string_buff(reference->ref_guid, qsf_guid);
- PINFO ("reference found=%s %s %s", ref_name, qsf_guid, reference->type);
- xmlNodeAddContent(node, qsf_guid);
- xmlNewProp(node, QSF_OBJECT_TYPE ,ref_name);
- g_free(ref_name);
+ params->qsf_ent = ent;
+ params->output_node = object_node;
+ ref = qof_class_get_referenceList(ent->e_type);
+ if(ref != NULL) {
+ g_list_foreach(ref, reference_list_lookup, params);
}
- param_list = g_slist_next(param_list);
- continue;
-/* }*/
}
if(0 == safe_strcmp(qof_param->param_type, QOF_TYPE_KVP))
{
- /** Special KVP handling - the book_merge function doesn't render KVP */
qsf_kvp = kvp_frame_copy(qof_param->param_getfcn(ent,qof_param));
params->qof_param = qof_param;
params->output_node = object_node;
@@ -775,7 +801,6 @@
qsf_ent = params->qsf_ent;
targetBook = params->book;
obj_type = xmlGetProp(node->parent, QSF_OBJECT_TYPE);
- ENTER (" ");
if(0 == safe_strcasecmp(obj_type, parameter_name)) { return; }
cm_setter = qof_class_get_parameter_setter(obj_type, parameter_name);
cm_param = qof_class_get_parameter(obj_type, parameter_name);
Index: dialog-chart-export.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome/Attic/dialog-chart-export.c,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -Lsrc/gnome/dialog-chart-export.c -Lsrc/gnome/dialog-chart-export.c -u -r1.1.2.2 -r1.1.2.3
--- src/gnome/dialog-chart-export.c
+++ src/gnome/dialog-chart-export.c
@@ -103,6 +103,8 @@
QofCollection *coll;
const GUID *guid;
time_t trans_time;
+ GList *ref;
+ QofEntityReference *ent_ref;
g_return_if_fail(user_data != NULL);
data = (chart_data*)user_data;
@@ -110,6 +112,7 @@
data->param_ref_list = NULL;
guid = qof_entity_get_guid(ent);
acc_ent = (Account*)ent;
+ ref = NULL;
equity_account = data->equity_account;
g_return_if_fail(equity_account != NULL);
balance = xaccAccountGetBalanceAsOfDate(acc_ent, data->chart_time_t);
@@ -131,12 +134,21 @@
xaccTransSetDateSecs (trans, trans_time);
xaccTransSetDateEnteredSecs (trans, trans_time);
xaccTransSetDescription (trans, OPENING_BALANCE_DESC);
+ /* User account split */
split = xaccMallocSplit (book);
xaccTransAppendSplit (trans, split);
xaccAccountInsertSplit (acc_ent, split);
xaccSplitSetAmount (split, balance);
xaccSplitSetValue (split, balance);
+ ref = qof_class_get_referenceList(GNC_ID_SPLIT);
+ while(ref != NULL) {
+ ent_ref = qof_entity_get_reference_from((QofEntity*)split, ref->data);
+ qof_session_update_reference_list(data->chart_session, ent_ref);
+ ref = g_list_next(ref);
+ }
+ g_list_free(ref);
balance = gnc_numeric_neg (balance);
+ /* Equity account split */
split = xaccMallocSplit (book);
xaccTransAppendSplit (trans, split);
xaccAccountInsertSplit (equity_account, split);
@@ -145,6 +157,20 @@
xaccTransCommitEdit (trans);
xaccAccountCommitEdit (equity_account);
xaccAccountCommitEdit (acc_ent);
+ ref = qof_class_get_referenceList(GNC_ID_TRANS);
+ while(ref != NULL) {
+ ent_ref = qof_entity_get_reference_from((QofEntity*)trans, ref->data);
+ qof_session_update_reference_list(data->chart_session, ent_ref);
+ ref = g_list_next(ref);
+ }
+ g_list_free(ref);
+ ref = qof_class_get_referenceList(GNC_ID_SPLIT);
+ while(ref != NULL) {
+ ent_ref = qof_entity_get_reference_from((QofEntity*)split, ref->data);
+ qof_session_update_reference_list(data->chart_session, ent_ref);
+ ref = g_list_next(ref);
+ }
+ g_list_free(ref);
}
static GtkWidget *
More information about the gnucash-changes
mailing list