/* HomeBank -- Free, easy, personal accounting for everyone.
* Copyright (C) 1995-2014 Maxime DOYEN
*
* This file is part of HomeBank.
*
* HomeBank 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.
*
* HomeBank 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, see .
*/
#include "homebank.h"
#include "hb-hbfile.h"
#include "hb-archive.h"
#include "hb-transaction.h"
/****************************************************************************/
/* Debug macros */
/****************************************************************************/
#define MYDEBUG 0
#if MYDEBUG
#define DB(x) (x);
#else
#define DB(x);
#endif
/* our global datas */
extern struct HomeBank *GLOBALS;
extern struct Preferences *PREFS;
gboolean hbfile_file_hasbackup(gchar *filepath)
{
gchar *bakfilepath;
bakfilepath = hb_filename_new_with_extention(GLOBALS->xhb_filepath, "xhb~");
GLOBALS->xhb_hasbak = g_file_test(bakfilepath, G_FILE_TEST_EXISTS);
g_free(bakfilepath);
//todo check here if need to return something
return GLOBALS->xhb_hasbak;
}
/*
static gint hbfile_file_load_xhb(gchar *filepath)
{
}
static void hbfile_file_load_backup_xhb(void)
{
//todo: get from dialog.c, and split between dilaog.c/hbfile.c
}
*/
/*
void hbfile_change_basecurrency(guint32 key)
{
GList *list;
list = g_hash_table_get_values(GLOBALS->h_cur);
while (list != NULL)
{
Currency *entry = list->data;
if(entry->key != GLOBALS->kcur)
entry->rate = 0.0;
list = g_list_next(list);
}
g_list_free(list);
GLOBALS->changes_count++;
GLOBALS->kcur = key;
}
*/
void hbfile_change_owner(gchar *owner)
{
g_free(GLOBALS->owner);
GLOBALS->owner = (owner != NULL) ? owner : NULL;
}
void hbfile_change_filepath(gchar *filepath)
{
g_free(GLOBALS->xhb_filepath);
GLOBALS->xhb_filepath = (filepath != NULL) ? filepath : NULL;
}
void hbfile_sanity_check(void)
{
GList *lxxx, *list;
DB( g_print("\n[hbfile] sanity_check\n") );
list = g_list_first(GLOBALS->ope_list);
while (list != NULL)
{
Transaction *entry = list->data;
da_transaction_consistency(entry);
list = g_list_next(list);
}
list = g_list_first(GLOBALS->arc_list);
while (list != NULL)
{
Archive *entry = list->data;
da_archive_consistency(entry);
list = g_list_next(list);
}
lxxx = list = g_hash_table_get_values(GLOBALS->h_acc);
while (list != NULL)
{
Account *item = list->data;
da_acc_consistency(item);
list = g_list_next(list);
}
g_list_free(lxxx);
lxxx = list = g_hash_table_get_values(GLOBALS->h_pay);
while (list != NULL)
{
Payee *item = list->data;
da_pay_consistency(item);
list = g_list_next(list);
}
g_list_free(lxxx);
lxxx = list = g_hash_table_get_values(GLOBALS->h_cat);
while (list != NULL)
{
Category *item = list->data;
da_cat_consistency(item);
list = g_list_next(list);
}
g_list_free(lxxx);
}
void hbfile_anonymize(void)
{
GList *lxxx, *list;
guint cnt, i;
DB( g_print("\n[hbfile] anonymize\n") );
// owner
hbfile_change_owner(g_strdup("An0nym0us"));
GLOBALS->changes_count++;
GLOBALS->hbfile_is_new = TRUE;
// filename
hbfile_change_filepath(g_build_filename(PREFS->path_hbfile, "anonymized.xhb", NULL));
// accounts
lxxx = list = g_hash_table_get_values(GLOBALS->h_acc);
while (list != NULL)
{
Account *item = list->data;
g_free(item->name);
item->name = g_strdup_printf("account %d", item->key);
g_free(item->number);
item->number = NULL;
g_free(item->bankname);
item->bankname = NULL;
GLOBALS->changes_count++;
list = g_list_next(list);
}
g_list_free(lxxx);
//payees
lxxx = list = g_hash_table_get_values(GLOBALS->h_pay);
while (list != NULL)
{
Payee *item = list->data;
if(item->key != 0)
{
g_free(item->name);
item->name = g_strdup_printf("payee %d", item->key);
GLOBALS->changes_count++;
}
list = g_list_next(list);
}
g_list_free(lxxx);
//categories
lxxx = list = g_hash_table_get_values(GLOBALS->h_cat);
while (list != NULL)
{
Category *item = list->data;
if(item->key != 0)
{
g_free(item->name);
item->name = g_strdup_printf("category %d", item->key);
GLOBALS->changes_count++;
}
list = g_list_next(list);
}
g_list_free(lxxx);
//tags
lxxx = list = g_hash_table_get_values(GLOBALS->h_tag);
while (list != NULL)
{
Tag *item = list->data;
if(item->key != 0)
{
g_free(item->name);
item->name = g_strdup_printf("tag %d", item->key);
GLOBALS->changes_count++;
}
list = g_list_next(list);
}
g_list_free(lxxx);
//assigns
lxxx = list = g_hash_table_get_values(GLOBALS->h_rul);
while (list != NULL)
{
Assign *item = list->data;
if(item->key != 0)
{
g_free(item->name);
item->name = g_strdup_printf("assign %d", item->key);
GLOBALS->changes_count++;
}
list = g_list_next(list);
}
g_list_free(lxxx);
//archives
cnt = 0;
list = g_list_first(GLOBALS->arc_list);
while (list != NULL)
{
Archive *item = list->data;
g_free(item->wording);
item->wording = g_strdup_printf("archive %d", cnt++);
GLOBALS->changes_count++;
//later split anonymize also
list = g_list_next(list);
}
//transaction
list = g_list_first(GLOBALS->ope_list);
while (list != NULL)
{
Transaction *item = list->data;
Split *split;
g_free(item->info);
item->info = NULL;
g_free(item->wording);
item->wording = g_strdup_printf("memo %d", item->date);
GLOBALS->changes_count++;
if(item->flags & OF_SPLIT)
{
for(i=0;isplits[i];
if( split == NULL ) break;
if(split->memo != NULL)
g_free(split->memo);
split->memo = g_strdup_printf("memo %d", i);
GLOBALS->changes_count++;
}
}
list = g_list_next(list);
}
}
void hbfile_cleanup(gboolean file_clear)
{
DB( g_print("\n[hbfile] cleanup\n") );
DB( g_print("- file clear is %d\n", file_clear) );
// Free data storage
//da_cur_destroy();
da_acc_destroy();
da_pay_destroy();
da_cat_destroy();
da_tag_destroy();
da_asg_destroy();
g_hash_table_destroy(GLOBALS->h_memo);
da_archive_destroy(GLOBALS->arc_list);
da_transaction_destroy(GLOBALS->ope_list);
hbfile_change_owner(NULL);
if(file_clear)
hbfile_change_filepath(NULL);
}
void hbfile_setup(gboolean file_clear)
{
DB( g_print("\n[hbfile] setup\n") );
DB( g_print("- file clear is %d\n", file_clear) );
// Allocate data storage
//da_cur_new();
da_acc_new();
da_pay_new();
da_cat_new();
da_tag_new();
da_asg_new();
GLOBALS->h_memo = g_hash_table_new_full(g_str_hash, g_str_equal, (GDestroyNotify)g_free, NULL);
GLOBALS->arc_list = NULL;
GLOBALS->ope_list = NULL;
if(file_clear == TRUE)
{
//todo: maybe translate this also
hbfile_change_filepath(g_build_filename(PREFS->path_hbfile, "untitled.xhb", NULL));
GLOBALS->hbfile_is_new = TRUE;
DB( g_print("- path_hbfile is '%s'\n", PREFS->path_hbfile) );
DB( g_print("- xhb_filepath is '%s'\n", GLOBALS->xhb_filepath) );
}
else
{
GLOBALS->hbfile_is_new = FALSE;
}
hbfile_change_owner(g_strdup(_("Unknown")));
//GLOBALS->kcur = 0;
GLOBALS->vehicle_category = 0;
GLOBALS->auto_smode = 1;
GLOBALS->auto_nbdays = 0;
GLOBALS->auto_weekday = 1;
GLOBALS->changes_count = 0;
GLOBALS->xhb_hasbak = FALSE;
}