int main (int argc, char const **argv) { gboolean opened_workbook = FALSE; gboolean with_gui; GOIOContext *ioc; WorkbookView *wbv; GSList *wbcgs_to_kill = NULL; GOCmdContext *cc; #ifdef G_OS_WIN32 gboolean has_console; #endif /* No code before here, we need to init threads */ argv = gnm_pre_parse_init (argc, argv); /* * Attempt to disable Ubuntu's funky, non-working scroll * bars. This needs to be done before gtk starts loading * modules. Note: the following call will not replace * an existing setting, so you can run with =1 if you like. */ g_setenv ("LIBOVERLAY_SCROLLBAR", "0", FALSE); #ifdef G_OS_WIN32 has_console = FALSE; { typedef BOOL (CALLBACK* LPFNATTACHCONSOLE)(DWORD); LPFNATTACHCONSOLE MyAttachConsole; HMODULE hmod; if ((hmod = GetModuleHandle("kernel32.dll"))) { MyAttachConsole = (LPFNATTACHCONSOLE) GetProcAddress(hmod, "AttachConsole"); if (MyAttachConsole && MyAttachConsole(ATTACH_PARENT_PROCESS)) { freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); dup2(fileno(stdout), 1); dup2(fileno(stderr), 2); has_console = TRUE; } } } #endif gnumeric_arg_parse (argc, (char **)argv); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); bind_textdomain_codeset (GETTEXT_PACKAGE "-functions", "UTF-8"); with_gui = !func_def_file && !func_state_file && !split_funcdocs; if (with_gui) { gnm_session_init (argv[0]); } gnm_init (); /* These are useful for the build process only. */ if (func_state_file) return gnm_dump_func_defs (func_state_file, 0); if (func_def_file) return gnm_dump_func_defs (func_def_file, 1); if (split_funcdocs) return gnm_dump_func_defs (NULL, 2); if (ext_refs_file) return gnm_dump_func_defs (ext_refs_file, 4); if (with_gui) { go_component_set_default_command_context (cc = cmd_context_stderr_new ()); g_object_unref (cc); cc = g_object_new (GNM_TYPE_IO_CONTEXT_GTK, "show-splash", !gnumeric_no_splash, "show-warnings", !gnumeric_no_warnings, NULL); ioc = GO_IO_CONTEXT (g_object_ref (cc)); handle_paint_events (); pathetic_qt_workaround (); } else { /* TODO: Make this inconsistency go away */ cc = cmd_context_stderr_new (); ioc = go_io_context_new (cc); go_component_set_default_command_context (cc); } /* Keep in sync with .desktop file */ g_set_application_name (_("Gnumeric Spreadsheet")); gnm_plugins_init (GO_CMD_CONTEXT (ioc)); if (startup_files) { int i; for (i = 0; startup_files [i]; i++) ; go_io_context_set_num_files (ioc, i); for (i = 0; startup_files [i] && !initial_workbook_open_complete; i++) { char *uri = go_shell_arg_to_uri (startup_files[i]); if (uri == NULL) { g_warning ("Ignoring invalid URI."); continue; } go_io_context_processing_file (ioc, uri); wbv = workbook_view_new_from_uri (uri, NULL, ioc, NULL); g_free (uri); if (go_io_error_occurred (ioc) || go_io_warning_occurred (ioc)) { go_io_error_display (ioc); go_io_error_clear (ioc); } if (wbv != NULL) { WBCGtk *wbcg; workbook_update_history (wb_view_get_workbook (wbv), GNM_FILE_SAVE_AS_STYLE_SAVE); wbcg = wbc_gtk_new (wbv, NULL, NULL, geometry); geometry = NULL; sheet_update (wb_view_cur_sheet (wbv)); opened_workbook = TRUE; gnm_io_context_gtk_set_transient_for (GNM_IO_CONTEXT_GTK (ioc), wbcg_toplevel (wbcg)); if (immediate_exit_flag) wbcgs_to_kill = g_slist_prepend (wbcgs_to_kill, wbcg); } /* cheesy attempt to keep the ui from freezing during load */ handle_paint_events (); if (gnm_io_context_gtk_get_interrupted (GNM_IO_CONTEXT_GTK (ioc))) break; /* Don't load any more workbooks */ } } g_object_unref (cc); cc = NULL; /* FIXME: Maybe we should quit here if we were asked to open files and failed to do so. */ /* If we were intentionally short circuited exit now */ if (!initial_workbook_open_complete) { initial_workbook_open_complete = TRUE; if (!opened_workbook) { gint n_of_sheets = gnm_conf_get_core_workbook_n_sheet (); wbc_gtk_new (NULL, workbook_new_with_sheets (n_of_sheets), NULL, geometry); } if (immediate_exit_flag) { GSList *l; for (l = wbcgs_to_kill; l; l = l->next) g_idle_add ((GSourceFunc)cb_kill_wbcg, l->data); } g_signal_connect (gnm_app_get_app (), "workbook_removed", G_CALLBACK (cb_workbook_removed), NULL); gnm_io_context_gtk_discharge_splash (GNM_IO_CONTEXT_GTK (ioc)); g_object_unref (ioc); g_idle_add ((GSourceFunc)pathetic_qt_workaround, NULL); gtk_main (); } else { g_object_unref (ioc); g_slist_foreach (wbcgs_to_kill, (GFunc)cb_kill_wbcg, NULL); } g_slist_free (wbcgs_to_kill); gnumeric_arg_shutdown (); store_plugin_state (); gnm_shutdown (); #if defined(G_OS_WIN32) if (has_console) { close(1); close(2); FreeConsole(); } #endif gnm_pre_parse_shutdown (); go_component_set_default_command_context (NULL); /* * This helps finding leaks. We might want it in developent * only. */ if (with_gui && gnm_debug_flag ("close-displays")) { GSList *displays; gdk_flush(); while (g_main_context_iteration (NULL, FALSE)) ;/* nothing */ displays = gdk_display_manager_list_displays (gdk_display_manager_get ()); g_slist_foreach (displays, (GFunc)gdk_display_close, NULL); g_slist_free (displays); } return 0; }
static gboolean feed(ChupaDecomposer *decomposer, ChupaFeeder *feeder, ChupaData *data, GError **error) { GOFileSaver *saver; GOFileOpener *opener = NULL; GOIOContext *io_context; WorkbookView *view = NULL; Workbook *workbook; GODoc *document; GsfInput *source; GsfOutput *output; GInputStream *input; ChupaData *next_data; const gchar *filename; GPrintFunc old_print_error_func; ChupaMetadata *metadata; filename = chupa_data_get_filename(data); source = chupa_data_input_new(data); io_context = go_io_context_new(command_context); old_print_error_func = g_set_printerr_handler(printerr_to_log_delegator); view = wb_view_new_from_input(source, filename, opener, io_context, NULL); g_object_unref(source); g_set_printerr_handler(old_print_error_func); if (go_io_error_occurred(io_context)) { go_io_error_display(io_context); } if (!view) { g_set_error(error, CHUPA_DECOMPOSER_ERROR, CHUPA_DECOMPOSER_ERROR_FEED, "[decomposer][excel][feed][error][%s]" ": failed to create workbook", filename); g_object_unref(io_context); return FALSE; } workbook = wb_view_get_workbook(view); document = wb_view_get_doc(view); saver = find_file_saver(filename, view, workbook, document, error); if (!saver) { g_object_unref(workbook); g_object_unref(io_context); return FALSE; } output = gsf_output_memory_new(); if (!output) { g_set_error(error, CHUPA_DECOMPOSER_ERROR, CHUPA_DECOMPOSER_ERROR_FEED, "[decomposer][excel][feed][%s][error]" ": failed to create output", filename); g_object_unref(workbook); g_object_unref(io_context); return FALSE; } wbv_save_to_output(view, saver, output, io_context); if (go_io_error_occurred(io_context)) { go_io_error_display(io_context); g_object_unref(workbook); g_object_unref(io_context); g_object_unref(output); return FALSE; } metadata = chupa_metadata_new(); chupa_metadata_merge_original_metadata(metadata, chupa_data_get_metadata(data)); collect_metadata(metadata, document); g_object_unref(workbook); g_object_unref(io_context); input = chupa_memory_input_stream_new(GSF_OUTPUT_MEMORY(output)); g_object_unref(output); chupa_metadata_set_content_length(metadata, gsf_output_size(output)); next_data = chupa_data_new(input, metadata); g_object_unref(metadata); g_object_unref(input); chupa_feeder_accepted(feeder, next_data); chupa_data_finished(next_data, NULL); g_object_unref(next_data); return TRUE; }