void gnc_clear_current_session() { if (current_session) { xaccLogDisable(); qof_session_destroy(current_session); xaccLogEnable(); current_session = NULL; } }
static void gxi_session_destroy (GncXmlImportData *data) { if (data->session) { xaccLogDisable (); qof_session_destroy (data->session); xaccLogEnable (); data->session = NULL; } }
static gboolean gxi_parse_file (GncXmlImportData *data) { QofSession *session = NULL; QofBook *book; QofBackend *backend; QofBackendError io_err = ERR_BACKEND_NO_ERR; gchar *message = NULL; gboolean success = FALSE; if (data->n_unassigned || data->n_impossible) goto cleanup_parse_file; /* fill subst hash table with byte sequence substitutions */ data->subst = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); g_hash_table_foreach (data->ambiguous_ht, (GHFunc) subst_insert_amb, data); g_hash_table_foreach (data->unique, (GHFunc) subst_insert_unique, data); if (!data->subst) goto cleanup_parse_file; /* create a temporary QofSession */ gxi_session_destroy (data); session = qof_session_new (); data->session = session; qof_session_begin (session, data->filename, TRUE, FALSE, FALSE); io_err = qof_session_get_error (session); if (io_err != ERR_BACKEND_NO_ERR) { message = _("The file could not be reopened."); goto cleanup_parse_file; } xaccLogDisable (); gxi_update_progress_bar (_("Reading file..."), 0.0); qof_session_load (session, gxi_update_progress_bar); gxi_update_progress_bar (NULL, -1.0); xaccLogEnable (); io_err = qof_session_get_error (session); if (io_err == ERR_BACKEND_NO_ERR) { /* loaded sucessfully now. strange, but ok */ success = TRUE; goto cleanup_parse_file; } else if (io_err != ERR_FILEIO_NO_ENCODING) { /* another error, cannot handle this here */ message = _("The file could not be reopened."); goto cleanup_parse_file; } qof_session_pop_error (session); book = qof_session_get_book (session); backend = qof_book_get_backend (book); gxi_update_progress_bar (_("Parsing file..."), 0.0); success = gnc_xml2_parse_with_subst (backend, book, data->subst); gxi_update_progress_bar (NULL, -1.0); if (success) data->session = session; else message = _("There was an error parsing the file."); cleanup_parse_file: if (data->subst) { g_hash_table_destroy (data->subst); data->subst = NULL; } if (message) { gnc_error_dialog (data->assistant, "%s", message); } if (!success) gxi_session_destroy (data); return success; }
void gnc_file_log_replay (void) { char *selected_filename; char *default_dir; char read_buf[256]; char *read_retval; GtkFileFilter *filter; FILE *log_file; char * record_start_str = "===== START"; /* NOTE: This string must match src/engine/TransLog.cpp (sans newline) */ char * expected_header_orig = "mod\ttrans_guid\tsplit_guid\ttime_now\t" "date_entered\tdate_posted\tacc_guid\tacc_name\tnum\tdescription\t" "notes\tmemo\taction\treconciled\tamount\tvalue\tdate_reconciled"; static char *expected_header = NULL; /* Use g_strdup_printf so we don't get accidental tab -> space conversion */ if (!expected_header) expected_header = g_strdup(expected_header_orig); qof_log_set_level(GNC_MOD_IMPORT, QOF_LOG_DEBUG); ENTER(" "); /* Don't log the log replay. This would only result in redundant logs */ xaccLogDisable(); default_dir = gnc_get_default_directory(GCONF_SECTION); filter = gtk_file_filter_new(); gtk_file_filter_set_name(filter, "*.log"); gtk_file_filter_add_pattern(filter, "*.[Ll][Oo][Gg]"); selected_filename = gnc_file_dialog(_("Select a .log file to replay"), g_list_prepend(NULL, filter), default_dir, GNC_FILE_DIALOG_OPEN); g_free(default_dir); if (selected_filename != NULL) { /* Remember the directory as the default. */ default_dir = g_path_get_dirname(selected_filename); gnc_set_default_directory(GCONF_SECTION, default_dir); g_free(default_dir); /*strncpy(file,selected_filename, 255);*/ DEBUG("Filename found: %s", selected_filename); if (xaccFileIsCurrentLog(selected_filename)) { g_warning("Cannot open the current log file: %s", selected_filename); gnc_error_dialog(NULL, /* Translators: %s is the file name. */ _("Cannot open the current log file: %s"), selected_filename); } else { DEBUG("Opening selected file"); log_file = g_fopen(selected_filename, "r"); if (!log_file || ferror(log_file) != 0) { int err = errno; perror("File open failed"); gnc_error_dialog(NULL, /* Translation note: * First argument is the filename, * second argument is the error. */ _("Failed to open log file: %s: %s"), selected_filename, strerror(err)); } else { if ((read_retval = fgets(read_buf, sizeof(read_buf), log_file)) == NULL) { DEBUG("Read error or EOF"); gnc_info_dialog(NULL, "%s", _("The log file you selected was empty.")); } else { if (strncmp(expected_header, read_buf, strlen(expected_header)) != 0) { PERR("File header not recognised:\n%s", read_buf); PERR("Expected:\n%s", expected_header); gnc_error_dialog(NULL, "%s", _("The log file you selected cannot be read. " "The file header was not recognized.")); } else { do { read_retval = fgets(read_buf, sizeof(read_buf), log_file); /*DEBUG("Chunk read: %s",read_retval);*/ if (strncmp(record_start_str, read_buf, strlen(record_start_str)) == 0) /* If a record started */ { process_trans_record(log_file); } } while (feof(log_file) == 0); } } fclose(log_file); } } g_free(selected_filename); } /* Start logging again */ xaccLogEnable(); LEAVE(""); }