X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Fhb-xml.c;fp=src%2Fhb-xml.c;h=ae3ea9b6635321de51c6416dae674d4b71733442;hp=c55db990e29686e604b2033b1dd9e39fcb0b280d;hb=a6c6b0df5492c2160ed97e3a376bdb2fe7c5ebc4;hpb=cd13d9691c46c2b2d6d459e9e6a76bed1c21b7a6 diff --git a/src/hb-xml.c b/src/hb-xml.c index c55db99..ae3ea9b 100644 --- a/src/hb-xml.c +++ b/src/hb-xml.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2018 Maxime DOYEN + * Copyright (C) 1995-2019 Maxime DOYEN * * This file is part of HomeBank. * @@ -355,6 +355,27 @@ GList *lst_acc, *lnk_acc; } +static void homebank_upgrade_to_v13(void) +{ +GList *tmplist; +guint32 newkey; + + DB( g_print("\n[hb-xml] homebank_upgrade_to_v13\n") ); + + //#1008629 assign a key to each archive + newkey = 1; + tmplist = g_list_first(GLOBALS->arc_list); + while (tmplist != NULL) + { + Archive *item = tmplist->data; + + item->key = newkey++; + tmplist = g_list_next(tmplist); + } + +} + + // lower v0.6 : we must assume categories/payee exists // and strong link to xfer // #632496 @@ -405,14 +426,14 @@ GList *lrul, *list; cat = da_cat_get(entry->kcat); if(cat == NULL) { - DB( g_print(" !! fixing cat for rul: %d is unknow\n", entry->kcat) ); + DB( g_print(" !! fixing cat for rul: %d is unknown\n", entry->kcat) ); entry->kcat = 0; } pay = da_pay_get(entry->kpay); if(pay == NULL) { - DB( g_print(" !! fixing pay for rul: %d is unknow\n", entry->kpay) ); + DB( g_print(" !! fixing pay for rul: %d is unknown\n", entry->kpay) ); entry->kpay = 0; } @@ -449,6 +470,7 @@ gint i; else if(!strcmp (attribute_names[i], "cheque1" )) { entry->cheque1 = atoi(attribute_values[i]); } else if(!strcmp (attribute_names[i], "cheque2" )) { entry->cheque2 = atoi(attribute_values[i]); } else if(!strcmp (attribute_names[i], "notes" )) { if(strcmp(attribute_values[i],"(null)") && attribute_values[i] != NULL) entry->notes = g_strdup(attribute_values[i]); } + else if(!strcmp (attribute_names[i], "tpl" )) { entry->karc = atoi(attribute_values[i]); } } //all attribute loaded: append @@ -592,7 +614,7 @@ gint i; } -static void homebank_load_xml_tag(ParseContext *ctx, const gchar **attribute_names, const gchar **attribute_values) +/*static void homebank_load_xml_tag(ParseContext *ctx, const gchar **attribute_names, const gchar **attribute_values) { Tag *entry = da_tag_malloc(); gint i; @@ -608,7 +630,7 @@ gint i; //all attribute loaded: append da_tag_insert(entry); -} +}*/ static void homebank_load_xml_fav(ParseContext *ctx, const gchar **attribute_names, const gchar **attribute_values) @@ -624,8 +646,8 @@ gint i; { //DB( g_print(" att='%s' val='%s'\n", attribute_names[i], attribute_values[i]) ); - - if(!strcmp (attribute_names[i], "amount" )) { entry->amount = g_ascii_strtod(attribute_values[i], NULL); } + if(!strcmp (attribute_names[i], "key" )) { entry->key = atoi(attribute_values[i]); } + else if(!strcmp (attribute_names[i], "amount" )) { entry->amount = g_ascii_strtod(attribute_values[i], NULL); } else if(!strcmp (attribute_names[i], "account" )) { entry->kacc = atoi(attribute_values[i]); } else if(!strcmp (attribute_names[i], "dst_account")) { entry->kxferacc = atoi(attribute_values[i]); } else if(!strcmp (attribute_names[i], "paymode" )) { entry->paymode = atoi(attribute_values[i]); } @@ -634,13 +656,13 @@ gint i; else if(!strcmp (attribute_names[i], "payee" )) { entry->kpay = atoi(attribute_values[i]); } else if(!strcmp (attribute_names[i], "category" )) { entry->kcat = atoi(attribute_values[i]); } else if(!strcmp (attribute_names[i], "wording" )) { if(strcmp(attribute_values[i],"(null)") && attribute_values[i] != NULL) entry->memo = g_strdup(attribute_values[i]); } - - - - - - - + else if(!strcmp (attribute_names[i], "tags" )) + { + if(attribute_values[i] != NULL && strlen(attribute_values[i]) > 0 && strcmp(attribute_values[i],"(null)") != 0 ) + { + entry->tags = tags_parse(attribute_values[i]); + } + } else if(!strcmp (attribute_names[i], "nextdate" )) { entry->nextdate = atoi(attribute_values[i]); } else if(!strcmp (attribute_names[i], "every" )) { entry->every = atoi(attribute_values[i]); } else if(!strcmp (attribute_names[i], "unit" )) { entry->unit = atoi(attribute_values[i]); } @@ -655,6 +677,7 @@ gint i; if(split == TRUE) { + entry->splits = da_split_new (); if (da_splits_parse(entry->splits, scat, samt, smem) > 0) { entry->flags |= OF_SPLIT; //Flag that Splits are active @@ -662,7 +685,8 @@ gint i; } //all attribute loaded: append - GLOBALS->arc_list = g_list_append(GLOBALS->arc_list, entry); + //GLOBALS->arc_list = g_list_append(GLOBALS->arc_list, entry); + da_archive_append(entry); } @@ -694,7 +718,7 @@ gint i; { if(attribute_values[i] != NULL && strlen(attribute_values[i]) > 0 && strcmp(attribute_values[i],"(null)") != 0 ) { - transaction_tags_parse(entry, attribute_values[i]); + entry->tags = tags_parse(attribute_values[i]); } } else if(!strcmp (attribute_names[i], "kxfer" )) { entry->kxfer = atoi(attribute_values[i]); } @@ -709,6 +733,7 @@ gint i; if(split == TRUE) { + entry->splits = da_split_new (); if (da_splits_parse(entry->splits, scat, samt, smem) > 0) { entry->flags |= OF_SPLIT; //Flag that Splits are active @@ -734,7 +759,7 @@ start_element_handler (GMarkupParseContext *context, ParseContext *ctx = user_data; //GtkUIManager *self = ctx->self; - //DB( g_print("** start element: %s\n", element_name) ); + //DB( g_print("** start element: '%s'\n", element_name) ); switch(element_name[0]) { @@ -764,6 +789,15 @@ ParseContext *ctx = user_data; } break; + + + + + + + + + case 'c': { if(!strcmp (element_name, "cat")) @@ -777,14 +811,16 @@ ParseContext *ctx = user_data; } break; - case 't': + //TODO: < 5.2 misstyped here, should be tag without a s + //commented > 5.2 useless not loaded, but no side effect + /*case 't': { if(!strcmp (element_name, "tags")) { homebank_load_xml_tag(ctx, attribute_names, attribute_values); } } - break; + break;*/ case 'f': { @@ -880,9 +916,12 @@ gboolean rc; retval = XML_OK; if (!g_file_get_contents (filename, &buffer, &length, &error)) { - //g_message ("%s", error->message); - retval = XML_IO_ERROR; - g_error_free (error); + if(error) + { + g_warning("unable to load file %s: %s", filename, error->message); + g_error_free(error); + retval = XML_IO_ERROR; + } } else { @@ -916,15 +955,22 @@ gboolean rc; rc = g_markup_parse_context_parse (context, buffer, length, &error); if( error ) + { g_print("failed: %s\n", error->message); + g_error_free (error); + } + if( rc == FALSE ) { error = NULL; g_markup_parse_context_end_parse(context, &error); if( error ) + { g_print("failed: %s\n", error->message); + g_error_free (error); + } } g_markup_parse_context_free (context); @@ -991,6 +1037,15 @@ gboolean rc; { homebank_upgrade_to_v12_7(); } + if( ctx.file_version < 1.3 ) // <= 5.2 + { + hbfile_sanity_check(); + homebank_upgrade_to_v13(); + } + if( ctx.data_version <= 50203 ) + { + hbfile_sanity_check(); + } // next ? @@ -1011,7 +1066,7 @@ static void hb_xml_append_txt(GString *gstring, gchar *attrname, gchar *value) if(value != NULL && *value != 0) { gchar *escaped = g_markup_escape_text(value, -1); - g_string_append_printf(gstring, "%s=\"%s\" ", attrname, escaped); + g_string_append_printf(gstring, " %s=\"%s\"", attrname, escaped); g_free(escaped); } } @@ -1084,14 +1139,14 @@ static void hb_xml_append_txt_crlf(GString *gstring, gchar *attrname, gchar *val length = strlen (value); escaped = g_string_sized_new (length); append_escaped_text (escaped, value, length); - g_string_append_printf(gstring, "%s=\"%s\" ", attrname, escaped->str); + g_string_append_printf(gstring, " %s=\"%s\"", attrname, escaped->str); g_string_free (escaped, TRUE); } } static void hb_xml_append_int0(GString *gstring, gchar *attrname, guint32 value) { - g_string_append_printf(gstring, "%s=\"%d\" ", attrname, value); + g_string_append_printf(gstring, " %s=\"%d\"", attrname, value); } static void hb_xml_append_int(GString *gstring, gchar *attrname, guint32 value) @@ -1108,7 +1163,7 @@ char buf[G_ASCII_DTOSTR_BUF_SIZE]; //we must use this, as fprintf use locale decimal settings and not '.' g_ascii_dtostr (buf, sizeof (buf), amount); - g_string_append_printf(gstring, "%s=\"%s\" ", attrname, buf); + g_string_append_printf(gstring, " %s=\"%s\"", attrname, buf); } @@ -1129,7 +1184,7 @@ GError *error = NULL; node = g_string_sized_new(255); - g_string_assign(node, "kcur); @@ -1212,7 +1267,7 @@ GError *error = NULL; item->flags &= ~(AF_ADDED|AF_CHANGED); //delete flag - g_string_assign(node, "key); hb_xml_append_int(node, "flags", item->flags); @@ -1228,6 +1283,8 @@ GError *error = NULL; hb_xml_append_int(node, "cheque1", item->cheque1); hb_xml_append_int(node, "cheque2", item->cheque2); hb_xml_append_txt_crlf(node, "notes", item->notes); + hb_xml_append_int(node, "tpl", item->karc); + g_string_append(node, "/>\n"); @@ -1266,7 +1323,7 @@ GError *error = NULL; if(item->key != 0) { - g_string_assign(node, "key); hb_xml_append_txt(node, "name", item->name); @@ -1313,7 +1370,7 @@ GError *error = NULL; if(item->key != 0) { - g_string_assign(node, "key); hb_xml_append_int(node, "parent", item->parent); @@ -1324,7 +1381,7 @@ GError *error = NULL; { if(item->budget[i] != 0) { - g_string_append_printf(node,"b%d=\"%s\" ", i, g_ascii_dtostr (buf, sizeof (buf), item->budget[i])); + g_string_append_printf(node," b%d=\"%s\"", i, g_ascii_dtostr (buf, sizeof (buf), item->budget[i])); } } @@ -1350,7 +1407,7 @@ GError *error = NULL; /* ** XML tag save */ -static gint homebank_save_xml_tag(GIOChannel *io) +/*static gint homebank_save_xml_tag(GIOChannel *io) { GList *ltag, *list; gchar *tmpstr; @@ -1383,7 +1440,7 @@ GError *error = NULL; } g_list_free(ltag); return retval; -} +}*/ /* @@ -1403,7 +1460,7 @@ GError *error = NULL; { Assign *item = list->data; - g_string_assign(node, "key); hb_xml_append_int(node, "flags" , item->flags); @@ -1440,6 +1497,7 @@ static gint homebank_save_xml_arc(GIOChannel *io) { GList *list; GString *node; +gchar *tagstr; gint retval = XML_OK; GError *error = NULL; @@ -1450,8 +1508,11 @@ GError *error = NULL; { Archive *item = list->data; - g_string_assign(node, "tags); + + g_string_assign(node, "key); hb_xml_append_amt(node, "amount", item->amount); hb_xml_append_int(node, "account", item->kacc); hb_xml_append_int(node, "dst_account", item->kxferacc); @@ -1460,7 +1521,8 @@ GError *error = NULL; hb_xml_append_int(node, "flags", item->flags); hb_xml_append_int(node, "payee", item->kpay); hb_xml_append_int(node, "category", item->kcat); - hb_xml_append_txt(node, "wording", item->memo); + hb_xml_append_txt(node, "wording", item->memo); + hb_xml_append_txt(node, "tags", tagstr); hb_xml_append_int(node, "nextdate", item->nextdate); hb_xml_append_int(node, "every", item->every); hb_xml_append_int(node, "unit", item->unit); @@ -1468,17 +1530,17 @@ GError *error = NULL; hb_xml_append_int(node, "weekend", item->weekend); hb_xml_append_int(node, "gap", item->daygap); - if(da_splits_count(item->splits) > 0) + if(da_splits_length(item->splits) > 0) { - gchar *cats, *amounts, *memos; + gchar *cats, *amounts, *memos; da_splits_tostring(item->splits, &cats, &amounts, &memos); - g_string_append_printf(node, "scat=\"%s\" ", cats); - g_string_append_printf(node, "samt=\"%s\" ", amounts); + g_string_append_printf(node, " scat=\"%s\"", cats); + g_string_append_printf(node, " samt=\"%s\"", amounts); //fix #1173910 gchar *escaped = g_markup_escape_text(memos, -1); - g_string_append_printf(node, "smem=\"%s\" ", escaped); + g_string_append_printf(node, " smem=\"%s\"", escaped); g_free(escaped); g_free(cats); @@ -1487,6 +1549,8 @@ GError *error = NULL; } g_string_append(node, "/>\n"); + + g_free(tagstr); error = NULL; g_io_channel_write_chars(io, node->str, -1, NULL, &error); @@ -1529,9 +1593,9 @@ GError *error = NULL; Transaction *item = list->data; item->flags &= ~(OF_AUTO|OF_ADDED|OF_CHANGED); //delete flag - tagstr = transaction_tags_tostring(item); + tagstr = tags_tostring(item->tags); - g_string_assign(node, "date); hb_xml_append_amt(node, "amount", item->amount); @@ -1547,17 +1611,17 @@ GError *error = NULL; hb_xml_append_txt(node, "tags", tagstr); hb_xml_append_int(node, "kxfer", item->kxfer); - if(da_splits_count(item->splits) > 0) + if(da_splits_length(item->splits) > 0) { gchar *cats, *amounts, *memos; da_splits_tostring(item->splits, &cats, &amounts, &memos); - g_string_append_printf(node, "scat=\"%s\" ", cats); - g_string_append_printf(node, "samt=\"%s\" ", amounts); + g_string_append_printf(node, " scat=\"%s\"", cats); + g_string_append_printf(node, " samt=\"%s\"", amounts); //fix #1173910 gchar *escaped = g_markup_escape_text(memos, -1); - g_string_append_printf(node, "smem=\"%s\" ", escaped); + g_string_append_printf(node, " smem=\"%s\"", escaped); g_free(escaped); g_free(cats); @@ -1601,38 +1665,34 @@ gint retval = XML_OK; GError *error = NULL; io = g_io_channel_new_file(filename, "w", &error); - if(io == NULL) + if(error) { - g_message("file error on: %s", filename); - retval = XML_IO_ERROR; - - if(error) - g_print("failed: %s\n", error->message); - + g_warning("unable to save file %s: %s", filename, error->message); g_error_free(error); + return(XML_IO_ERROR); } - else - { - g_io_channel_write_chars(io, "\n", -1, NULL, NULL); - outstr = g_strdup_printf("\n", g_ascii_dtostr (buf1, sizeof (buf1), FILE_VERSION), HB_VERSION_NUM); - g_io_channel_write_chars(io, outstr, -1, NULL, NULL); - g_free(outstr); + g_io_channel_write_chars(io, "\n", -1, NULL, NULL); - retval = homebank_save_xml_prop(io); - retval = homebank_save_xml_cur(io); - retval = homebank_save_xml_acc(io); - retval = homebank_save_xml_pay(io); - retval = homebank_save_xml_cat(io); - retval = homebank_save_xml_tag(io); - retval = homebank_save_xml_asg(io); - retval = homebank_save_xml_arc(io); - retval = homebank_save_xml_ope(io); + outstr = g_strdup_printf("\n", g_ascii_dtostr (buf1, sizeof (buf1), FILE_VERSION), HB_VERSION_NUM); + g_io_channel_write_chars(io, outstr, -1, NULL, NULL); + g_free(outstr); - g_io_channel_write_chars(io, "\n", -1, NULL, NULL); + retval = homebank_save_xml_prop(io); + retval = homebank_save_xml_cur(io); + retval = homebank_save_xml_acc(io); + retval = homebank_save_xml_pay(io); + retval = homebank_save_xml_cat(io); + //retval = homebank_save_xml_tag(io); + retval = homebank_save_xml_asg(io); + retval = homebank_save_xml_arc(io); + + retval = homebank_save_xml_ope(io); + + g_io_channel_write_chars(io, "\n", -1, NULL, NULL); + + g_io_channel_unref (io); - g_io_channel_unref (io); - } return retval; }