[maemo-commits] [maemo-commits] r8987 - in projects/haf/branches/maemo-af-desktop/python-hildon-desktop: . pythonloader
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Mon Jan 8 20:33:03 EET 2007
- Previous message: [maemo-commits] r8986 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . src
- Next message: [maemo-commits] r8988 - projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: moimart
Date: 2007-01-08 20:33:02 +0200 (Mon, 08 Jan 2007)
New Revision: 8987
Added:
projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/
projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/Makefile.am
projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/hd-plugin-loader-python.c
projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/hd-plugin-loader-python.h
Modified:
projects/haf/branches/maemo-af-desktop/python-hildon-desktop/ChangeLog
projects/haf/branches/maemo-af-desktop/python-hildon-desktop/configure.ac
Log:
* configure.ac: Added pythonloader
* pythonloader/hd-plugin-loader-python.[ch]:
- python loader module for python
* pythonloader/Makefile.am: to build pythonloader
* ChangeLog updated.
Modified: projects/haf/branches/maemo-af-desktop/python-hildon-desktop/ChangeLog
===================================================================
--- projects/haf/branches/maemo-af-desktop/python-hildon-desktop/ChangeLog 2007-01-08 18:11:30 UTC (rev 8986)
+++ projects/haf/branches/maemo-af-desktop/python-hildon-desktop/ChangeLog 2007-01-08 18:33:02 UTC (rev 8987)
@@ -1,5 +1,12 @@
-200i7-01-08 Lucas Rocha <lucas.rocha at nokia.com>
+2007-01-08 Moises Martinez <moises.martinez at nokia.com>
+ * configure.ac: Added pythonloader
+ * pythonloader/hd-plugin-loader-python.[ch]:
+ - python loader module for python
+ * pythonloader/Makefile.am: to build pythonloader
+
+2007-01-08 Lucas Rocha <lucas.rocha at nokia.com>
+
* libhildondesktop/hildondesktopmodule.c: export enums and constants
to bindings also.
Modified: projects/haf/branches/maemo-af-desktop/python-hildon-desktop/configure.ac
===================================================================
--- projects/haf/branches/maemo-af-desktop/python-hildon-desktop/configure.ac 2007-01-08 18:11:30 UTC (rev 8986)
+++ projects/haf/branches/maemo-af-desktop/python-hildon-desktop/configure.ac 2007-01-08 18:33:02 UTC (rev 8987)
@@ -30,9 +30,18 @@
AC_SUBST(LIBHILDONDESKTOP_LIBS)
AC_SUBST(LIBHILDONDESKTOP_CFLAGS)
+PKG_CHECK_MODULES(HILDONDESKTOP, hildon-desktop >= 0.1)
+AC_SUBST(HILDONDESKTOP_CFLAGS)
+
hildondesktopincludedir=`pkg-config libhildondesktop --variable=includedir`
AC_SUBST(hildondesktopincludedir)
+hildonpluginloaderpathlib=`pkg-config hildon-desktop --variable=hildonpluginloaderpathlib`
+AC_SUBST(hildonpluginloaderpathlib)
+
+#FIXME
+hildondesktoplibdir=$(libdir)/hildon-desktop
+
#++++++++
# Python
#++++++++
@@ -116,6 +125,7 @@
Makefile
python-hildon-desktop.pc
libhildondesktop/Makefile
+pythonloader/Makefile
])
AC_OUTPUT
Added: projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/Makefile.am
===================================================================
--- projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/Makefile.am 2007-01-08 18:11:30 UTC (rev 8986)
+++ projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/Makefile.am 2007-01-08 18:33:02 UTC (rev 8987)
@@ -0,0 +1,26 @@
+EXTRA_DIST = .empty
+
+INCLUDES = \
+ $(HILDONDESKTOP_CFLAGS) \
+ $(LIBHILDONDESKTOP_CFLAGS) \
+ $(PYTHON_CFLAGS) \
+ $(PYGTK_CFLAGS) \
+ $(PYGOBJECT_CFLAGS) \
+ -DHD_DESKTOP_MODULE_PATH=\"$(hildondesktoplibdir)\"
+
+lib_LTLIBRARIES = libpythonpluginloader.la
+
+libpythonpluginloader_la_SOURCES = \
+ hd-plugin-loader-python.c \
+ hd-plugin-loader-python.h
+
+libpythonpluginloader_la_LIBADD = \
+ $(LIBHILDONDESKTOP_LIBS) \
+ $(PYTHON_LIB_LOC) \
+ $(PYTHON_LIBS) \
+ $(PYGTK_LIBS) \
+ $(PYGOBJECT_LIBS)
+
+libpythonpluginloaderlibinstdir=$(hildonpluginloaderpathlib)
+
+CLEANFILES = *~
Added: projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/hd-plugin-loader-python.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/hd-plugin-loader-python.c 2007-01-08 18:11:30 UTC (rev 8986)
+++ projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/hd-plugin-loader-python.c 2007-01-08 18:33:02 UTC (rev 8987)
@@ -0,0 +1,324 @@
+/*
+ * This file is part of hildon-desktop
+ *
+ * Copyright (C) 2006 Nokia Corporation.
+ *
+ * Author: Lucas Rocha <lucas.rocha at nokia.com>
+ * Contact: Karoliina Salminen <karoliina.t.salminen at nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <Python.h>
+#include <pygobject.h>
+#include <pygtk/pygtk.h>
+
+#include <libhildondesktop/hildon-desktop-plugin.h>
+
+#include "hd-plugin-loader-python.h"
+#include <hildon-desktop/hd-config.h>
+
+#define HD_PLUGIN_LOADER_PYTHON_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HD_TYPE_PLUGIN_LOADER_PYTHON, HDPluginLoaderPythonPrivate))
+
+G_DEFINE_TYPE (HDPluginLoaderPython, hd_plugin_loader_python, HD_TYPE_PLUGIN_LOADER);
+
+struct _HDPluginLoaderPythonPrivate
+{
+ gboolean initialised;
+};
+
+static void
+hd_plugin_loader_python_destroy_plugin (GtkObject *object, gpointer user_data)
+{
+ PyObject *pModule, *pObject;
+
+ pObject = (PyObject *) g_object_get_data (G_OBJECT (object), "object");
+ pModule = (PyObject *) g_object_get_data (G_OBJECT (object), "module");
+
+ Py_DECREF (pObject);
+ Py_DECREF (pModule);
+
+ PyGC_Collect();
+}
+
+static GList *
+hd_plugin_loader_python_open_module (HDPluginLoaderPython *loader,
+ GError **error)
+{
+ HDPluginLoaderPythonPrivate *priv;
+ PyObject *pModules, *pModule, *pReload, *pDict, *pFunc, *pList;
+ GKeyFile *keyfile;
+ GList *objects = NULL;
+ GError *keyfile_error = NULL;
+ gchar *module_file = NULL;
+ gchar *module_name = NULL;
+
+ g_return_val_if_fail (HD_IS_PLUGIN_LOADER_PYTHON (loader), NULL);
+
+ priv = loader->priv;
+
+ keyfile = hd_plugin_loader_get_key_file (HD_PLUGIN_LOADER (loader));
+
+ module_file = g_key_file_get_string (keyfile,
+ HD_PLUGIN_CONFIG_GROUP,
+ HD_PLUGIN_CONFIG_KEY_PATH,
+ &keyfile_error);
+
+ if (keyfile_error)
+ {
+ g_propagate_error (error, keyfile_error);
+
+ return NULL;
+ }
+
+ if (g_path_is_absolute (module_file))
+ {
+ module_name = g_path_get_basename (module_file);
+
+ g_free (module_file);
+ }
+ else
+ {
+ module_name = module_file;
+ }
+
+ 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);
+ }
+ }
+
+ if (pModule != NULL)
+ {
+ pDict = PyModule_GetDict (pModule);
+
+ pFunc = PyDict_GetItemString (pDict, "hd_plugin_get_objects");
+
+ if (pFunc != NULL && PyCallable_Check (pFunc))
+ {
+ pList = PyObject_CallObject (pFunc, NULL);
+
+ if (pList != NULL && PyList_Check (pList))
+ {
+ int i;
+
+ for (i = 0; i < PyList_Size (pList); i++)
+ {
+ PyObject *pObject = PyList_GetItem (pList, i);
+
+ /* FIXME: add type checking here */
+ if (pObject != NULL)
+ {
+ GObject *object = g_object_ref(((PyGObject *) pObject)->obj);
+
+ g_signal_connect (G_OBJECT (object),
+ "destroy",
+ G_CALLBACK (hd_plugin_loader_python_destroy_plugin),
+ NULL);
+
+ /* Increase reference count of the module for each "extra"
+ plugin instance so that when no more plugin instances exist
+ the module is unloaded correctly. */
+ Py_INCREF (pModule);
+
+ g_object_set_data (object, "object", pObject);
+ g_object_set_data (object, "module", pModule);
+
+ objects = g_list_append (objects, object);
+ }
+ }
+
+ Py_DECREF(pList);
+ }
+ else
+ {
+ Py_XDECREF (pList);
+ Py_DECREF (pModule);
+
+ PyErr_Print ();
+ PyErr_Clear ();
+
+ g_warning ("Failed to call hd_plugin_get_objects in python module");
+
+ return NULL;
+ }
+ }
+ else
+ {
+ if (PyErr_Occurred ())
+ {
+ PyErr_Print ();
+ PyErr_Clear ();
+ }
+
+ g_warning ("Cannot find function \"%s\"", "hd_plugin_get_objects");
+ }
+ }
+ else
+ {
+ PyErr_Print ();
+ PyErr_Clear ();
+
+ g_warning ("Failed to load \"%s\"", module_name);
+ }
+
+ g_free (module_name);
+
+ return objects;
+}
+
+static GList *
+hd_plugin_loader_python_load (HDPluginLoader *loader, GError **error)
+{
+ GList *objects = NULL;
+ GKeyFile *keyfile;
+ GError *local_error = NULL;
+
+ g_return_val_if_fail (loader, NULL);
+
+ keyfile = hd_plugin_loader_get_key_file (loader);
+
+ if (!keyfile)
+ {
+ g_set_error (error,
+ hd_plugin_loader_error_quark (),
+ HD_PLUGIN_LOADER_ERROR_KEYFILE,
+ "A keyfile required to load plugins");
+
+ return NULL;
+ }
+
+ objects =
+ hd_plugin_loader_python_open_module (HD_PLUGIN_LOADER_PYTHON (loader),
+ &local_error);
+
+ if (local_error)
+ {
+ g_propagate_error (error, local_error);
+
+ if (objects)
+ {
+ g_list_foreach (objects, (GFunc) gtk_widget_destroy, NULL);
+ g_list_free (objects);
+ }
+
+ return NULL;
+ }
+
+ return objects;
+}
+
+static void
+hd_plugin_loader_python_finalize (GObject *loader)
+{
+ HDPluginLoaderPythonPrivate *priv;
+
+ g_return_if_fail (loader != NULL);
+ g_return_if_fail (HD_IS_PLUGIN_LOADER_PYTHON (loader));
+
+ priv = HD_PLUGIN_LOADER_PYTHON (loader)->priv;
+
+ if (priv->initialised)
+ {
+ Py_Finalize ();
+ }
+
+ G_OBJECT_CLASS (hd_plugin_loader_python_parent_class)->finalize (loader);
+}
+
+static void
+hd_plugin_loader_python_init (HDPluginLoaderPython *loader)
+{
+ PyObject *pPath, *pStr;
+
+ loader->priv = HD_PLUGIN_LOADER_PYTHON_GET_PRIVATE (loader);
+
+ Py_Initialize ();
+ loader->priv->initialised = TRUE;
+
+ init_pygobject ();
+ init_pygtk ();
+
+ pStr = PyString_FromString (HD_DESKTOP_MODULE_PATH);
+ pPath = PySys_GetObject ("path");
+ PyList_Append (pPath, pStr);
+}
+
+static void
+hd_plugin_loader_python_class_init (HDPluginLoaderPythonClass *class)
+{
+ GObjectClass *object_class;
+ HDPluginLoaderClass *loader_class;
+
+ object_class = G_OBJECT_CLASS (class);
+ loader_class = HD_PLUGIN_LOADER_CLASS (class);
+
+ object_class->finalize = hd_plugin_loader_python_finalize;
+
+ loader_class->load = hd_plugin_loader_python_load;
+
+ g_type_class_add_private (object_class, sizeof (HDPluginLoaderPythonPrivate));
+}
+
+G_MODULE_EXPORT gchar *
+hd_plugin_loader_module_type (void)
+{
+ return "python"; /*FIXME: clean me up*/
+}
+
+G_MODULE_EXPORT HDPluginLoader *
+hd_plugin_loader_module_get_instance (void)
+{
+ return g_object_new (HD_TYPE_PLUGIN_LOADER_PYTHON,NULL);
+}
+
+
Added: projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/hd-plugin-loader-python.h
===================================================================
--- projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/hd-plugin-loader-python.h 2007-01-08 18:11:30 UTC (rev 8986)
+++ projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader/hd-plugin-loader-python.h 2007-01-08 18:33:02 UTC (rev 8987)
@@ -0,0 +1,65 @@
+/*
+ * This file is part of hildon-desktop
+ *
+ * Copyright (C) 2006 Nokia Corporation.
+ *
+ * Author: Lucas Rocha <lucas.rocha at nokia.com>
+ * Contact: Karoliina Salminen <karoliina.t.salminen at nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#ifndef __HD_PLUGIN_LOADER_PYTHON_H__
+#define __HD_PLUGIN_LOADER_PYTHON_H__
+
+#include <hildon-desktop/hd-plugin-loader.h>
+
+G_BEGIN_DECLS
+
+typedef struct _HDPluginLoaderPython HDPluginLoaderPython;
+typedef struct _HDPluginLoaderPythonClass HDPluginLoaderPythonClass;
+typedef struct _HDPluginLoaderPythonPrivate HDPluginLoaderPythonPrivate;
+
+#define HD_TYPE_PLUGIN_LOADER_PYTHON (hd_plugin_loader_python_get_type ())
+#define HD_PLUGIN_LOADER_PYTHON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), HD_TYPE_PLUGIN_LOADER_PYTHON, HDPluginLoaderPython))
+#define HD_IS_PLUGIN_LOADER_PYTHON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HD_TYPE_PLUGIN_LOADER_PYTHON))
+#define HD_PLUGIN_LOADER_PYTHON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), HD_TYPE_PLUGIN_LOADER_PYTHON_CLASS, HDPluginLoaderPythonClass))
+#define HD_IS_PLUGIN_LOADER_PYTHON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), HD_TYPE_PLUGIN_LOADER_PYTHON_CLASS))
+#define HD_PLUGIN_LOADER_PYTHON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), HD_TYPE_PLUGIN_LOADER_PYTHON, HDPluginLoaderPythonClass))
+
+struct _HDPluginLoaderPython
+{
+ HDPluginLoader parent;
+
+ HDPluginLoaderPythonPrivate *priv;
+};
+
+struct _HDPluginLoaderPythonClass
+{
+ HDPluginLoaderClass parent_class;
+};
+
+GType hd_plugin_loader_python_get_type (void);
+
+G_MODULE_EXPORT gchar *
+hd_plugin_loader_module_type (void);
+
+G_MODULE_EXPORT HDPluginLoader *
+hd_plugin_loader_module_get_instance (void);
+
+G_END_DECLS
+
+#endif
- Previous message: [maemo-commits] r8986 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . src
- Next message: [maemo-commits] r8988 - projects/haf/branches/maemo-af-desktop/python-hildon-desktop/pythonloader
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
