static void python_plugin_execute (const gchar *filename, PlannerWindow *window, GHashTable *scripts) { PlannerPythonEnv *env; FILE *fp; PyObject *pModule; PyObject *py_object; env = planner_python_env_new (filename); pModule = PyRun_String ("import pygtk\n" "pygtk.require('2.0')\n" "import gtk\n" "import planner\n", Py_file_input, env->globals, env->globals); if (!pModule) { PyErr_Print (); planner_python_env_free (env); return; } pModule = PyImport_ImportModuleEx ("plannerui", env->globals, env->globals, Py_None); if (!pModule) { PyErr_Print (); planner_python_env_free (env); return; } py_object = pygobject_new (G_OBJECT (window)); PyDict_SetItemString (env->globals, "window", py_object); Py_DECREF (py_object); py_object = pygobject_new (G_OBJECT (planner_window_get_application (window))); PyDict_SetItemString (env->globals, "application", py_object); Py_DECREF (py_object); fp = fopen (filename,"r"); if (fp) { if (PyRun_File (fp, (gchar *) filename, Py_file_input, env->globals, env->globals) == NULL) { PyErr_Print (); } fclose (fp); g_hash_table_insert (scripts, env->filename, env); } else { planner_python_env_free (env); /* FIXME: do the free */ g_warning ("Could not open python script: %s", filename); } }
static gboolean sql_plugin_retrieve_db_values (PlannerPlugin *plugin, const gchar *title, gchar **server, gchar **port, gchar **database, gchar **login, gchar **password) { PlannerApplication *application; gchar *filename; GladeXML *gui; GtkWidget *dialog; gchar *str; gint response; GtkWidget *server_entry; GtkWidget *db_entry; GtkWidget *user_entry; GtkWidget *password_entry; gboolean ret; application = planner_window_get_application (plugin->main_window); filename = mrp_paths_get_glade_dir ("sql.glade"); gui = glade_xml_new (filename, "open_dialog" , NULL); g_free (filename); dialog = glade_xml_get_widget (gui, "open_dialog"); gtk_window_set_title (GTK_WINDOW (dialog), title); server_entry = glade_xml_get_widget (gui, "server_entry"); db_entry = glade_xml_get_widget (gui, "db_entry"); user_entry = glade_xml_get_widget (gui, "user_entry"); password_entry = glade_xml_get_widget (gui, "password_entry"); str = planner_conf_get_string (CONF_SERVER, NULL); if (str) { gtk_entry_set_text (GTK_ENTRY (server_entry), str); g_free (str); } str = planner_conf_get_string (CONF_DATABASE, NULL); if (str) { gtk_entry_set_text (GTK_ENTRY (db_entry), str); g_free (str); } str = planner_conf_get_string (CONF_USERNAME, NULL); if (str) { gtk_entry_set_text (GTK_ENTRY (user_entry), str); g_free (str); } g_object_unref (gui); response = gtk_dialog_run (GTK_DIALOG (dialog)); switch (response) { case GTK_RESPONSE_OK: *server = strdup_null_if_empty (gtk_entry_get_text (GTK_ENTRY (server_entry))); *port = NULL; *database = strdup_null_if_empty (gtk_entry_get_text (GTK_ENTRY (db_entry))); *login = strdup_null_if_empty (gtk_entry_get_text (GTK_ENTRY (user_entry))); *password = strdup_null_if_empty (gtk_entry_get_text (GTK_ENTRY (password_entry))); planner_conf_set_string (CONF_SERVER, *server ? *server : "", NULL); planner_conf_set_string (CONF_DATABASE, *database ? *database : "", NULL); planner_conf_set_string (CONF_USERNAME, *login ? *login : "", NULL); ret = TRUE; break; default: ret = FALSE; break; } gtk_widget_destroy (dialog); return ret; }
static void sql_plugin_open (GtkAction *action, gpointer user_data) { PlannerPlugin *plugin = user_data; PlannerApplication *application; GtkWidget *window; MrpProject *project; gchar *server = NULL; gchar *port = NULL; gchar *database = NULL; gchar *login = NULL; gchar *password = NULL; gint project_id = -1; gchar *uri = NULL; GError *error = NULL; if (!sql_plugin_retrieve_db_values (plugin, _("Open from Database"), &server, &port, &database, &login, &password)) { return; } project_id = sql_plugin_retrieve_project_id (plugin, server, port, database, login, password); if (project_id == -1) { goto fail; } /* Note: The project can change or disappear between the call above and * below. We handle that case though. */ uri = create_sql_uri (server, port, database, login, password, project_id); project = planner_window_get_project (plugin->main_window); window = GTK_WIDGET (plugin->main_window); application = planner_window_get_application (plugin->main_window); if (mrp_project_is_empty (project)) { GObject *object = G_OBJECT (window); if (!mrp_project_load (project, uri, &error)) { show_error_dialog (plugin, error->message); g_clear_error (&error); goto fail; } /* Note: Those aren't used for anything right now. */ g_object_set_data_full (object, SERVER, server, g_free); g_object_set_data_full (object, DATABASE, database, g_free); g_object_set_data_full (object, LOGIN, login, g_free); g_object_set_data_full (object, PASSWORD, password, g_free); g_free (uri); return; } else { GObject *object; window = planner_application_new_window (application); project = planner_window_get_project (PLANNER_WINDOW (window)); object = G_OBJECT (window); /* We must get the new plugin object for the new window, * otherwise we'll pass the wrong window around... a bit * hackish. */ plugin = g_object_get_data (G_OBJECT (window), "sql-plugin"); if (!mrp_project_load (project, uri, &error)) { g_warning ("Error: %s", error->message); g_clear_error (&error); gtk_widget_destroy (window); goto fail; } g_object_set_data_full (object, SERVER, server, g_free); g_object_set_data_full (object, DATABASE, database, g_free); g_object_set_data_full (object, LOGIN, login, g_free); g_object_set_data_full (object, PASSWORD, password, g_free); g_free (uri); gtk_widget_show_all (window); return; } fail: g_free (server); g_free (port); g_free (database); g_free (login); g_free (password); g_free (uri); }