static void gplp_func_exec_action (GOPluginService *service, GnmAction const *action, WorkbookControl *wbc, GOErrorInfo **ret_error) { ServiceLoaderDataUI *loader_data; PyObject *fn, *ret; g_return_if_fail (_PyGObject_API != NULL); GO_INIT_RET_ERROR_INFO (ret_error); loader_data = g_object_get_data (G_OBJECT (service), "loader_data"); SWITCH_TO_PLUGIN (go_plugin_service_get_plugin (service)); fn = PyDict_GetItemString (loader_data->ui_actions, action->id); if (fn == NULL) { *ret_error = go_error_info_new_printf (_("Unknown action: %s"), action->id); return; } else if (!PyCallable_Check (fn)) { *ret_error = go_error_info_new_printf ( _("Not a valid function for action: %s"), action->id); return; } ret = PyObject_CallFunction (fn, (char *) "N", py_new_Gui_object (WBC_GTK (wbc))); if (ret == NULL) { *ret_error = go_error_info_new_str (py_exc_to_string ()); PyErr_Clear (); } else { Py_DECREF (ret); } }
static FILE * gnumeric_fopen_error_info (const char *file_name, const char *mode, GOErrorInfo **ret_error) { FILE *f; g_return_val_if_fail (file_name != NULL, NULL); g_return_val_if_fail (mode != NULL, NULL); g_return_val_if_fail (ret_error != NULL, NULL); *ret_error = NULL; f = g_fopen (file_name, mode); if (f == NULL) { if (strchr (mode, 'w') != NULL && strchr (mode, 'r') == NULL) { *ret_error = go_error_info_new_printf ( _("Error while opening file \"%s\" for writing."), file_name); } else { *ret_error = go_error_info_new_printf ( _("Error while opening file \"%s\" for reading."), file_name); } go_error_info_add_details (*ret_error, go_error_info_new_from_errno ()); } return f; }
static void gplp_load_service_file_opener (GOPluginLoader *loader, GOPluginService *service, GOErrorInfo **ret_error) { printf("gplp_load_service_file_opener(start)\n"); GnmPythonPluginLoader *loader_python = GNM_PYTHON_PLUGIN_LOADER (loader); gchar *func_name_file_probe, *func_name_file_open; PyObject *python_func_file_probe, *python_func_file_open; g_return_if_fail (GO_IS_PLUGIN_SERVICE_FILE_OPENER (service)); GO_INIT_RET_ERROR_INFO (ret_error); gnm_py_interpreter_switch_to (loader_python->py_interpreter_info); gnm_py_interpreter_load(loader_python->py_interpreter_info); func_name_file_probe = g_strconcat ( go_plugin_service_get_id (service), "_file_probe", NULL); python_func_file_probe = PyDict_GetItemString (loader_python->main_module_dict, func_name_file_probe); gnm_python_clear_error_if_needed (loader_python->py_object); func_name_file_open = g_strconcat ( go_plugin_service_get_id (service), "_file_open", NULL); python_func_file_open = PyDict_GetItemString (loader_python->main_module_dict, func_name_file_open); gnm_python_clear_error_if_needed (loader_python->py_object); if (python_func_file_open != NULL) { GOPluginServiceFileOpenerCallbacks *cbs; ServiceLoaderDataFileOpener *loader_data; cbs = go_plugin_service_get_cbs (service); cbs->plugin_func_file_probe = gplp_func_file_probe; cbs->plugin_func_file_open = gplp_func_file_open; loader_data = g_new (ServiceLoaderDataFileOpener, 1); loader_data->python_func_file_probe = python_func_file_probe; loader_data->python_func_file_open = python_func_file_open; if (python_func_file_probe != NULL) Py_INCREF (loader_data->python_func_file_probe); Py_INCREF (loader_data->python_func_file_open); g_object_set_data_full (G_OBJECT (service), "loader_data", loader_data, (GDestroyNotify) gplp_loader_data_opener_free); } else { *ret_error = go_error_info_new_printf ( _("Python file \"%s\" has invalid format."), loader_python->module_name); go_error_info_add_details (*ret_error, go_error_info_new_printf ( _("File doesn't contain \"%s\" function."), func_name_file_open)); } g_free (func_name_file_probe); g_free (func_name_file_open); gnm_py_interpreter_save(loader_python->py_interpreter_info); }
static void gplp_load_service_function_group (GOPluginLoader *loader, GOPluginService *service, GOErrorInfo **ret_error) { printf("gplp_load_service_function_group(start)\n"); GnmPythonPluginLoader *loader_python = GNM_PYTHON_PLUGIN_LOADER (loader); gchar *fn_info_dict_name; PyObject *python_fn_info_dict; g_return_if_fail (IS_GNM_PLUGIN_SERVICE_FUNCTION_GROUP (service)); GO_INIT_RET_ERROR_INFO (ret_error); gnm_py_interpreter_switch_to (loader_python->py_interpreter_info); gnm_py_interpreter_load(loader_python->py_interpreter_info); fn_info_dict_name = g_strconcat ( go_plugin_service_get_id (service), "_functions", NULL); python_fn_info_dict = PyDict_GetItemString (loader_python->main_module_dict, fn_info_dict_name); gnm_python_clear_error_if_needed (loader_python->py_object); if (python_fn_info_dict != NULL && PyDict_Check (python_fn_info_dict)) { PluginServiceFunctionGroupCallbacks *cbs; ServiceLoaderDataFunctionGroup *loader_data; cbs = go_plugin_service_get_cbs (service); cbs->func_desc_load = &gplp_func_desc_load; loader_data = g_new (ServiceLoaderDataFunctionGroup, 1); loader_data->python_fn_info_dict = (PyObject *) python_fn_info_dict; Py_INCREF (loader_data->python_fn_info_dict); g_object_set_data_full (G_OBJECT (service), "loader_data", loader_data, (GDestroyNotify) gplp_loader_data_fngroup_free); } else { *ret_error = go_error_info_new_printf ( _("Python file \"%s\" has invalid format."), loader_python->module_name); if (python_fn_info_dict == NULL) { go_error_info_add_details (*ret_error, go_error_info_new_printf ( _("File doesn't contain \"%s\" dictionary."), fn_info_dict_name)); } else if (!PyDict_Check (python_fn_info_dict)) { go_error_info_add_details (*ret_error, go_error_info_new_printf ( _("Object \"%s\" is not a dictionary."), fn_info_dict_name)); } } g_free (fn_info_dict_name); gnm_py_interpreter_save(loader_python->py_interpreter_info); printf("gplp_load_service_function_group(end)\n"); }
static void gplp_load_service_ui (GOPluginLoader *loader, GOPluginService *service, GOErrorInfo **ret_error) { GnmPythonPluginLoader *loader_python = GNM_PYTHON_PLUGIN_LOADER (loader); gchar *ui_action_names; PyObject *ui_actions; g_return_if_fail (IS_GNM_PLUGIN_SERVICE_UI (service)); GO_INIT_RET_ERROR_INFO (ret_error); gnm_py_interpreter_switch_to (loader_python->py_interpreter_info); gnm_py_interpreter_load(loader_python->py_interpreter_info); ui_action_names = g_strconcat (go_plugin_service_get_id (service), "_ui_actions", NULL); ui_actions = PyDict_GetItemString (loader_python->main_module_dict, ui_action_names); gnm_python_clear_error_if_needed (loader_python->py_object); if (ui_actions != NULL && PyDict_Check (ui_actions)) { PluginServiceUICallbacks *cbs; ServiceLoaderDataUI *loader_data; cbs = go_plugin_service_get_cbs (service); cbs->plugin_func_exec_action = gplp_func_exec_action; loader_data = g_new (ServiceLoaderDataUI, 1); loader_data->ui_actions = ui_actions; Py_INCREF (loader_data->ui_actions); g_object_set_data_full (G_OBJECT (service), "loader_data", loader_data, (GDestroyNotify) gplp_loader_data_ui_free); } else { *ret_error = go_error_info_new_printf ( _("Python file \"%s\" has invalid format."), loader_python->module_name); if (ui_actions == NULL) { go_error_info_add_details (*ret_error, go_error_info_new_printf ( _("File doesn't contain \"%s\" dictionary."), ui_action_names)); } else if (!PyDict_Check (ui_actions)) { go_error_info_add_details (*ret_error, go_error_info_new_printf ( _("Object \"%s\" is not a dictionary."), ui_action_names)); } } g_free (ui_action_names); gnm_py_interpreter_save(loader_python->py_interpreter_info); }
static void gplp_load_base (GOPluginLoader *loader, GOErrorInfo **ret_error) { char *argv[] = { (char*)"", NULL, NULL, NULL }; char const *arg; int argc; arg = go_plugin_get_dir_name (go_plugin_loader_get_plugin (loader)); argv[1] = g_strconcat ("-I", arg, NULL); argv[2] = g_build_filename (arg, "perl_func.pl", NULL); argc = 2; if (g_file_test (argv[2], G_FILE_TEST_EXISTS)) { PERL_SYS_INIT3 (&argc, (char ***)&argv, NULL); gnm_perl_interp = perl_alloc (); perl_construct (gnm_perl_interp); perl_parse (gnm_perl_interp, xs_init, 3, argv, NULL); my_perl = gnm_perl_interp; init_help_consts (); #ifdef PERL_EXIT_DESTRUCT_END PL_exit_flags |= PERL_EXIT_DESTRUCT_END; #endif } else { *ret_error = go_error_info_new_printf ( _("perl_func.pl doesn't exist.")); } g_free (argv[1]); g_free (argv[2]); }
static void dif_parse_sheet (DifInputContext *ctxt) { GnmLocale *locale = gnm_push_C_locale (); if (!dif_parse_header (ctxt)) { go_io_error_info_set (ctxt->io_context, go_error_info_new_printf ( _("Unexpected end of file at line %d while reading header."), ctxt->line_no)); } else if (!dif_parse_data(ctxt)) { go_io_error_info_set (ctxt->io_context, go_error_info_new_printf ( _("Unexpected end of file at line %d while reading data."), ctxt->line_no)); } gnm_pop_C_locale (locale); }
GOPluginService * go_plugin_service_new (GOPlugin *plugin, xmlNode *tree, GOErrorInfo **ret_error) { GOPluginService *service = NULL; char *type_str; GOErrorInfo *service_error = NULL; GOPluginServiceCreate ctor; g_return_val_if_fail (GO_IS_PLUGIN (plugin), NULL); g_return_val_if_fail (tree != NULL, NULL); g_return_val_if_fail (strcmp (tree->name, "service") == 0, NULL); GO_INIT_RET_ERROR_INFO (ret_error); type_str = go_xml_node_get_cstr (tree, "type"); if (type_str == NULL) { *ret_error = go_error_info_new_str (_("No \"type\" attribute on \"service\" element.")); return NULL; } ctor = g_hash_table_lookup (services, type_str); if (ctor == NULL) { *ret_error = go_error_info_new_printf (_("Unknown service type: %s."), type_str); xmlFree (type_str); return NULL; } xmlFree (type_str); service = g_object_new (ctor(), NULL); service->plugin = plugin; service->id = xml2c (go_xml_node_get_cstr (tree, "id")); if (service->id == NULL) service->id = xmlStrdup ("default"); if (GO_PLUGIN_SERVICE_GET_CLASS (service)->read_xml != NULL) { GO_PLUGIN_SERVICE_GET_CLASS (service)->read_xml (service, tree, &service_error); if (service_error != NULL) { *ret_error = go_error_info_new_str_with_details ( _("Error reading service information."), service_error); g_object_unref (service); service = NULL; } } return service; }
static void gplp_load_base (GOPluginLoader *loader, GOErrorInfo **ret_error) { static gchar const *python_file_extensions[] = {"py", "pyc", "pyo", NULL}; GnmPythonPluginLoader *loader_python = GNM_PYTHON_PLUGIN_LOADER (loader); gchar const **file_ext; GnmPython *py_object; GnmPyInterpreter *py_interpreter_info; gchar *full_module_file_name = NULL; FILE *f; GOPlugin *plugin = go_plugin_loader_get_plugin (loader); GOErrorInfo *open_error = NULL; PyObject *modules, *main_module, *main_module_dict; GO_INIT_RET_ERROR_INFO (ret_error); g_object_set_data (G_OBJECT (plugin), "python-loader", loader); py_object = gnm_python_object_get (ret_error); if (py_object == NULL) return; /* gnm_python_object_get sets ret_error */ py_interpreter_info = gnm_python_new_interpreter (py_object, plugin); if (py_interpreter_info == NULL) { *ret_error = go_error_info_new_str (_("Cannot create new Python interpreter.")); gnm_python_clear_error_if_needed (py_object); g_object_unref (py_object); return; } for (file_ext = python_file_extensions; *file_ext != NULL; file_ext++) { gchar *file_name = g_strconcat ( loader_python->module_name, ".", *file_ext, NULL); gchar *path = g_build_filename ( go_plugin_get_dir_name (plugin), file_name, NULL); g_free (file_name); if (g_file_test (path, G_FILE_TEST_EXISTS)) { full_module_file_name = path; break; } else g_free (path); } if (full_module_file_name == NULL) { *ret_error = go_error_info_new_printf ( _("Module \"%s\" doesn't exist."), loader_python->module_name); gnm_python_destroy_interpreter (py_object, py_interpreter_info); g_object_unref (py_object); return; } f = gnumeric_fopen_error_info (full_module_file_name, "r", &open_error); g_free (full_module_file_name); if (f == NULL) { *ret_error = open_error; gnm_python_destroy_interpreter (py_object, py_interpreter_info); g_object_unref (py_object); return; } if (PyRun_SimpleFile (f, loader_python->module_name) != 0) { (void) fclose (f); *ret_error = go_error_info_new_printf ( _("Execution of module \"%s\" failed."), loader_python->module_name); gnm_python_destroy_interpreter (py_object, py_interpreter_info); g_object_unref (py_object); return; } (void) fclose (f); modules = PyImport_GetModuleDict (); g_return_if_fail (modules != NULL); main_module = PyDict_GetItemString (modules, (char *) "__main__"); g_return_if_fail (main_module != NULL); main_module_dict = PyModule_GetDict (main_module); g_return_if_fail (main_module_dict != NULL); loader_python->py_object = py_object; loader_python->py_interpreter_info = py_interpreter_info; loader_python->main_module = main_module; loader_python->main_module_dict = main_module_dict; }