void stf_shutdown (void) { go_file_saver_unregister (go_file_saver_for_id ("Gnumeric_stf:stf_assistant")); go_file_saver_unregister (go_file_saver_for_id ("Gnumeric_stf:stf_csv")); go_file_opener_unregister (go_file_opener_for_id ("Gnumeric_stf:stf_csvtab")); go_file_opener_unregister (go_file_opener_for_id ("Gnumeric_stf:stf_assistant")); }
/* * stf_read_workbook: * @fo: file opener * @enc: encoding of file * @context: command context * @book: workbook * @input: file to read from+convert * * Main routine, handles importing a file including all dialog mumbo-jumbo */ static void stf_read_workbook (G_GNUC_UNUSED GOFileOpener const *fo, gchar const *enc, GOIOContext *context, GoView *view, GsfInput *input) { DialogStfResult_t *dialogresult = NULL; char *name, *nameutf8 = NULL; char *data = NULL; size_t data_len; WorkbookView *wbv = GNM_WORKBOOK_VIEW (view); if (!GNM_IS_WBC_GTK (context->impl)) { go_io_error_string (context, _("This importer can only be used with a GUI.")); return; } name = g_path_get_basename (gsf_input_name (input)); nameutf8 = g_filename_to_utf8 (name, -1, NULL, NULL, NULL); g_free (name); if (!nameutf8) { g_warning ("Failed to convert filename to UTF-8. This shouldn't happen here."); goto out; } data = stf_preparse (context, input, &data_len); if (!data) goto out; dialogresult = stf_dialog (WBC_GTK (context->impl), enc, FALSE, NULL, FALSE, nameutf8, data, data_len); if (dialogresult != NULL) { Workbook *book = wb_view_get_workbook (wbv); int cols = dialogresult->colcount, rows = dialogresult->rowcount; Sheet *sheet; gnm_sheet_suggest_size (&cols, &rows); sheet = sheet_new (book, nameutf8, cols, rows); workbook_sheet_attach (book, sheet); if (stf_store_results (dialogresult, sheet, 0, 0)) { workbook_recalc_all (book); resize_columns (sheet); workbook_set_saveinfo (book, GO_FILE_FL_WRITE_ONLY, go_file_saver_for_id ("Gnumeric_stf:stf_assistant")); } else { /* the user has cancelled */ /* the caller should notice that we have no sheets */ workbook_sheet_delete (sheet); } } out: g_free (nameutf8); g_free (data); if (dialogresult != NULL) stf_dialog_result_free (dialogresult); }
static GOFileSaver * find_file_saver(const gchar *filename, WorkbookView *view, Workbook *workbook, GODoc *document, GError **error) { GOFileSaver *saver = NULL; const gchar saver_id[] = "Gnumeric_stf:stf_assistant"; GString *saver_options; gint i, n_sheets; GError *local_error = NULL; saver = go_file_saver_for_id(saver_id); if (!saver) { g_set_error(error, CHUPA_DECOMPOSER_ERROR, CHUPA_DECOMPOSER_ERROR_FEED, "[decomposer][excel][feed][error][saver][create][%s]" ": file saver doesn't found: <%s>", filename, saver_id); return NULL; } saver_options = g_string_new("eol=unix separator='\t'"); n_sheets = workbook_sheet_count(workbook); for (i = 0; i < n_sheets; i++) { Sheet *sheet; GnmRange total_range; sheet = workbook_sheet_by_index(workbook, i); total_range = sheet_get_extent(sheet, TRUE); if (sheet_is_region_empty(sheet, &total_range)) { chupa_debug("[decomposer][excel][feed][saver][sheet][ignore][%s]" ": ignore empty sheet: <%s>(%d)", filename, sheet->name_quoted, i); continue; } g_string_append_printf(saver_options, " sheet=%s", sheet->name_quoted); chupa_debug("[decomposer][excel][feed][saver][sheet][use][%s]: <%s>(%d)", filename, sheet->name_quoted, i); } if (go_file_saver_set_export_options(saver, document, saver_options->str, &local_error)) { g_set_error(error, CHUPA_DECOMPOSER_ERROR, CHUPA_DECOMPOSER_ERROR_FEED, "[decomposer][excel][feed][error][saver][option][%s]" ": <%s>(%s): <%s>(%s:%d)", filename, saver_id, saver_options->str, local_error->message, g_quark_to_string(local_error->domain), local_error->code); g_error_free(local_error); saver = NULL; } g_string_free(saver_options, TRUE); return saver; }
void sylk_file_open (GOFileOpener const *fo, GOIOContext *io_context, WorkbookView *wb_view, GsfInput *input) { SylkReader state; char const *input_name; char *name = NULL; int i; GnmLocale *locale; memset (&state, 0, sizeof (state)); state.io_context = io_context; state.input = (GsfInputTextline *) gsf_input_textline_new (input); state.converter = g_iconv_open ("UTF-8", "ISO-8859-1"); state.finished = FALSE; state.line_no = 0; state.pp.wb = wb_view_get_workbook (wb_view); if (NULL == (input_name = gsf_input_name (input)) || NULL == (name = g_path_get_basename (input_name)) || '\0' == *name) { g_free (name); name = g_strdup ("Sheet"); } state.pp.sheet = sheet_new (state.pp.wb, name, 256, 65536); workbook_sheet_attach (state.pp.wb, state.pp.sheet); g_free (name); state.pp.eval.col = state.pp.eval.row = 1; state.convs = gnm_conventions_xls_r1c1; state.formats = g_ptr_array_new (); state.fonts = g_ptr_array_new (); locale = gnm_push_C_locale (); sylk_parse_sheet (&state); gnm_pop_C_locale (locale); workbook_set_saveinfo (state.pp.wb, GO_FILE_FL_AUTO, go_file_saver_for_id ("Gnumeric_sylk:sylk")); for (i = state.fonts->len ; i-- > 0 ; ) gnm_style_unref (g_ptr_array_index (state.fonts, i)); g_ptr_array_free (state.fonts, TRUE); for (i = state.formats->len ; i-- > 0 ; ) go_format_unref (g_ptr_array_index (state.formats, i)); g_ptr_array_free (state.formats, TRUE); gsf_iconv_close (state.converter); g_object_unref (G_OBJECT (state.input)); }
void dif_file_open (GOFileOpener const *fo, GOIOContext *io_context, WorkbookView *wbv, GsfInput *input) { Workbook *wb = wb_view_get_workbook (wbv); DifInputContext *ctxt = dif_input_context_new (io_context, wb, input); workbook_set_saveinfo (wb, GO_FILE_FL_MANUAL_REMEMBER, go_file_saver_for_id ("Gnumeric_dif:dif")); if (ctxt != NULL) { dif_parse_sheet (ctxt); if (go_io_error_occurred (io_context)) go_io_error_push (io_context, go_error_info_new_str (_("Error while reading DIF file."))); dif_input_context_destroy (ctxt); } else if (!go_io_error_occurred (io_context)) go_io_error_unknown (io_context); }
int gnumeric_save(GnumericWorkbookPtr workbook, const char *fname, const char *format) { WorkbookView *wbv = (WorkbookView *)workbook; int res = 0; GOFileSaver *fs = NULL; if (format!=NULL) { fs = go_file_saver_for_id(format); if (fs == NULL) { fs = go_file_saver_for_file_name (format); if (fs == NULL) { res = 1; g_printerr (_("Unknown exporter '%s'.\n"), format); return 1; } } } if (fs==NULL) { fs = go_file_saver_for_file_name (fname); if (fs == NULL) { res = 2; g_printerr (_("Unable to guess exporter to use for '%s'.\n" "Try --list-exporters to see a list of possibilities.\n"), fname); return 1; } } //g_print ("Using exporter %s\n", //go_file_saver_get_id (fs)); if (go_file_saver_get_save_scope (fs) != GO_FILE_SAVE_WORKBOOK) { g_printerr (_("Selected exporter (%s) does not support saving multiple sheets in one file.\n" "Only the current sheet will be saved.\n"), go_file_saver_get_id (fs)); } char *outfile = go_filename_to_uri (fname); if (fname[0]=='-') { res = !wb_view_save_as (wbv, fs, "fd://1", cc); } else { res = !wb_view_save_as (wbv, fs, outfile, cc); } g_free (outfile); return 0; }
/* * stf_read_workbook_auto_csvtab: * @fo: file opener * @enc: optional encoding * @context: command context * @book: workbook * @input: file to read from+convert * * Attempt to auto-detect CSV or tab-delimited file */ static void stf_read_workbook_auto_csvtab (G_GNUC_UNUSED GOFileOpener const *fo, gchar const *enc, GOIOContext *context, GoView *view, GsfInput *input) { Sheet *sheet; Workbook *book; char *name; char *data; GString *utf8data; size_t data_len; StfParseOptions_t *po; const char *gsfname; int cols, rows, i; GStringChunk *lines_chunk; GPtrArray *lines; WorkbookView *wbv = GNM_WORKBOOK_VIEW (view); g_return_if_fail (context != NULL); g_return_if_fail (wbv != NULL); book = wb_view_get_workbook (wbv); data = stf_preparse (context, input, &data_len); if (!data) return; enc = go_guess_encoding (data, data_len, enc, &utf8data, NULL); g_free (data); if (!enc) { go_cmd_context_error_import (GO_CMD_CONTEXT (context), _("That file is not in the given encoding.")); return; } clear_stray_NULs (context, utf8data); /* * Try to get the filename we're reading from. This is not a * great way. */ gsfname = gsf_input_name (input); { const char *ext = gsf_extension_pointer (gsfname); gboolean iscsv = ext && strcasecmp (ext, "csv") == 0; if (iscsv) po = stf_parse_options_guess_csv (utf8data->str); else po = stf_parse_options_guess (utf8data->str); } lines_chunk = g_string_chunk_new (100 * 1024); lines = stf_parse_general (po, lines_chunk, utf8data->str, utf8data->str + utf8data->len); rows = lines->len; cols = 0; for (i = 0; i < rows; i++) { GPtrArray *line = g_ptr_array_index (lines, i); cols = MAX (cols, (int)line->len); } gnm_sheet_suggest_size (&cols, &rows); stf_parse_general_free (lines); g_string_chunk_free (lines_chunk); name = g_path_get_basename (gsfname); sheet = sheet_new (book, name, cols, rows); g_free (name); workbook_sheet_attach (book, sheet); if (stf_parse_sheet (po, utf8data->str, NULL, sheet, 0, 0)) { gboolean is_csv; workbook_recalc_all (book); resize_columns (sheet); if (po->cols_exceeded || po->rows_exceeded) { stf_warning (context, _("Some data did not fit on the " "sheet and was dropped.")); } is_csv = po->sep.chr && po->sep.chr[0] == ','; workbook_set_saveinfo (book, GO_FILE_FL_WRITE_ONLY, go_file_saver_for_id (is_csv ? "Gnumeric_stf:stf_csv" : "Gnumeric_stf:stf_assistant")); } else { workbook_sheet_delete (sheet); go_cmd_context_error_import (GO_CMD_CONTEXT (context), _("Parse error while trying to parse data into sheet")); } stf_parse_options_free (po); g_string_free (utf8data, TRUE); }