aboutsummaryrefslogtreecommitdiffstats
path: root/src/ephy-python-extension.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ephy-python-extension.c')
-rw-r--r--src/ephy-python-extension.c339
1 files changed, 0 insertions, 339 deletions
diff --git a/src/ephy-python-extension.c b/src/ephy-python-extension.c
deleted file mode 100644
index b0aeb0857..000000000
--- a/src/ephy-python-extension.c
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Copyright © 2003 Marco Pesenti Gritti
- * Copyright © 2003 Christian Persch
- * Copyright © 2004, 2005 Adam Hooper
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "Python.h"
-
-#include "config.h"
-
-#include "ephy-python-extension.h"
-#include "ephy-python.h"
-
-#define NO_IMPORT_PYGOBJECT
-#include <pygobject.h>
-
-#include "ephy-extension.h"
-#include "ephy-window.h"
-#include "ephy-file-helpers.h"
-#include "ephy-debug.h"
-
-static void ephy_python_extension_iface_init (EphyExtensionIface *iface);
-
-#define EPHY_PYTHON_EXTENSION_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_PYTHON_EXTENSION, EphyPythonExtensionPrivate))
-
-struct _EphyPythonExtensionPrivate
-{
- char *filename;
- PyObject *module;
-};
-
-enum
-{
- PROP_0,
- PROP_FILENAME
-};
-
-static int
-set_python_search_path (const char *filename)
-{
- char *dirname;
- char *dot_dir;
- int ret = 2;
- PyObject *sys_path;
- PyObject *pValue;
-
- sys_path = PySys_GetObject ("path");
-
- /* Systems extensions dir */
- pValue = PyString_FromString (EXTENSIONS_DIR);
- PyList_Insert (sys_path, 0, pValue);
- Py_DECREF (pValue);
-
- /* Home dir */
- dot_dir = g_strconcat (ephy_dot_dir (), "/extensions", NULL);
- pValue = PyString_FromString (dot_dir);
- PyList_Insert (sys_path, 0, pValue);
- Py_DECREF (pValue);
- g_free (dot_dir);
-
- /* Absolute path specified in .xml file */
- dirname = g_path_get_dirname (filename);
- if (g_path_is_absolute (dirname))
- {
- pValue = PyString_FromString (dirname);
- PyList_Insert (sys_path, 0, pValue);
- Py_DECREF (pValue);
- ret++;
- }
- g_free (dirname);
-
- return ret;
-}
-
-static void
-unset_python_search_path (int num_dirs)
-{
- PyObject *sys_path = PySys_GetObject ("path");
-
- PySequence_DelSlice (sys_path, 0, num_dirs);
-}
-
-static void
-ephy_python_extension_init (EphyPythonExtension *extension)
-{
- LOG ("EphyPythonExtension initialising");
-
- extension->priv = EPHY_PYTHON_EXTENSION_GET_PRIVATE (extension);
-}
-
-static void
-call_python_func (EphyExtension *extension,
- const char *func_name,
- EphyWindow *window,
- EphyEmbed *embed) /* HACK: tab may be NULL */
-{
- PyObject *pDict, *pFunc;
- PyObject *pArgs, *pValue, *pEmbed = NULL, *pWindow;
- EphyPythonExtension *py_ext;
-
- py_ext = EPHY_PYTHON_EXTENSION (extension);
-
- /* Happens if the module load fails, e.g. python couldn't
- * parse it, so be quiet about it, we will have already warned */
- if (py_ext->priv->module == NULL)
- {
- return;
- }
-
- pDict = PyModule_GetDict (py_ext->priv->module);
- pFunc = PyDict_GetItemString (pDict, func_name);
-
- if (pFunc && PyCallable_Check (pFunc))
- {
- pArgs = PyTuple_New (embed == NULL ? 1 : 2);
-
- pWindow = pygobject_new (G_OBJECT (window));
- PyTuple_SetItem (pArgs, 0, pWindow);
-
- if (embed != NULL)
- {
- pEmbed = pygobject_new (G_OBJECT (embed));
- PyTuple_SetItem (pArgs, 1, pEmbed);
- }
-
- pValue = PyObject_CallObject (pFunc, pArgs);
- if (pValue == NULL)
- {
- PyErr_Print ();
- PyErr_Clear ();
- g_warning ("Python code for '%s' failed to execute",
- func_name);
- }
- Py_XDECREF (pValue);
- Py_DECREF (pArgs);
- }
- else
- {
- if (PyErr_Occurred ())
- {
- PyErr_Print ();
- PyErr_Clear ();
- }
- }
-}
-
-static void
-impl_attach_tab (EphyExtension *extension,
- EphyWindow *window,
- EphyEmbed *embed)
-{
- call_python_func (extension, "attach_tab", window, embed);
-}
-
-static void
-impl_detach_tab (EphyExtension *extension,
- EphyWindow *window,
- EphyEmbed *embed)
-{
- call_python_func (extension, "detach_tab", window, embed);
-
- ephy_python_schedule_gc ();
-}
-
-static void
-impl_attach_window (EphyExtension *extension,
- EphyWindow *window)
-{
- call_python_func (extension, "attach_window", window, NULL);
-}
-
-static void
-impl_detach_window (EphyExtension *extension,
- EphyWindow *window)
-{
- call_python_func (extension, "detach_window", window, NULL);
-
- ephy_python_schedule_gc ();
-}
-
-static void
-ephy_python_extension_iface_init (EphyExtensionIface *iface)
-{
- iface->attach_tab = impl_attach_tab;
- iface->detach_tab = impl_detach_tab;
- iface->attach_window = impl_attach_window;
- iface->detach_window = impl_detach_window;
-}
-
-G_DEFINE_TYPE_WITH_CODE (EphyPythonExtension, ephy_python_extension, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (EPHY_TYPE_EXTENSION,
- ephy_python_extension_iface_init))
-
-static GObject *
-ephy_python_extension_constructor (GType type,
- guint n_construct_properties,
- GObjectConstructParam *construct_params)
-{
- GObject *object;
- EphyPythonExtension *ext;
- char *module_name; /* filename minus optional ".py" */
- /* Note: could equally be a directory */
- PyObject *pModules, *pModule, *pReload;
-
- int num_temp_paths;
-
- object = G_OBJECT_CLASS (ephy_python_extension_parent_class)->constructor (type,
- n_construct_properties,
- construct_params);
-
- ext = EPHY_PYTHON_EXTENSION (object);
-
- module_name = g_path_get_basename (ext->priv->filename);
-
- num_temp_paths = set_python_search_path (ext->priv->filename);
-
- pModules = PySys_GetObject ("modules");
- g_assert (pModules != NULL);
-
- pModule = PyDict_GetItemString (pModules, module_name);
-
- if (pModule == NULL)
- {
- pModule = PyImport_ImportModule (module_name);
-
- if (pModule == NULL)
- {
- PyErr_Print ();
- PyErr_Clear ();
- g_warning ("Could not initialize Python module '%s'",
- module_name);
- }
- }
- else
- {
- pReload = PyImport_ReloadModule (pModule);
-
- if (pReload == NULL)
- {
- PyErr_Print ();
- PyErr_Clear ();
- g_warning ("Could not reload Python module '%s'\n"
- "Falling back to previous version",
- module_name);
- }
- else
- {
- Py_DECREF (pReload);
- }
- }
-
- unset_python_search_path (num_temp_paths);
-
- ext->priv->module = pModule;
-
- g_free (module_name);
-
- return object;
-}
-
-static void
-ephy_python_extension_finalize (GObject *object)
-{
- EphyPythonExtension *extension =
- EPHY_PYTHON_EXTENSION (object);
-
- LOG ("EphyPythonExtension finalizing");
-
- g_free (extension->priv->filename);
- Py_XDECREF (extension->priv->module);
-
- G_OBJECT_CLASS (ephy_python_extension_parent_class)->finalize (object);
-}
-
-static void
-ephy_python_extension_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- /* no readable properties */
- g_return_if_reached ();
-}
-
-static void
-ephy_python_extension_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- EphyPythonExtension *ext = EPHY_PYTHON_EXTENSION (object);
-
- switch (prop_id)
- {
- case PROP_FILENAME:
- ext->priv->filename = g_value_dup_string (value);
- break;
- default:
- g_return_if_reached ();
- }
-}
-
-static void
-ephy_python_extension_class_init (EphyPythonExtensionClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->finalize = ephy_python_extension_finalize;
- object_class->constructor = ephy_python_extension_constructor;
- object_class->get_property = ephy_python_extension_get_property;
- object_class->set_property = ephy_python_extension_set_property;
-
- g_object_class_install_property
- (object_class,
- PROP_FILENAME,
- g_param_spec_string ("filename",
- "Filename",
- "Filename",
- NULL,
- G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_CONSTRUCT_ONLY));
-
- g_type_class_add_private (object_class, sizeof (EphyPythonExtensionPrivate));
-}
-