summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2008-07-26 10:46:49 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-07-26 10:46:49 +0000
commita0a89623f6ab41d78dcb8a9602387aca6657225a (patch)
tree3b2793322e00e219bbd051d5a06dae1272eab99a
parent31c7971dcad9d8e02cb59fe603bc6d83bf035666 (diff)
downloadpygobject-a0a89623f6ab41d78dcb8a9602387aca6657225a.tar.gz
Add a new API for registering exceptions for a GError domain. Register a
2008-07-26 Johan Dahlin <johan@gnome.org> * examples/gio/directory-async.py: * gio/Makefile.am: * gio/giomodule.c (init_gio): * glib/pyglib.c (pyglib_error_check), (pyglib_register_exception_for_domain): * glib/pyglib.h: * tests/test_gio.py: Add a new API for registering exceptions for a GError domain. Register a new exception for G_IO_ERROR, update tests and examples to use the new exception. svn path=/trunk/; revision=863
-rw-r--r--ChangeLog13
-rw-r--r--examples/gio/directory-async.py6
-rw-r--r--gio/Makefile.am3
-rw-r--r--gio/giomodule.c6
-rw-r--r--glib/pyglib.c45
-rw-r--r--glib/pyglib.h2
-rw-r--r--tests/test_gio.py17
7 files changed, 77 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 6979eeb8..8e581119 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
2008-07-26 Johan Dahlin <johan@gnome.org>
+ * examples/gio/directory-async.py:
+ * gio/Makefile.am:
+ * gio/giomodule.c (init_gio):
+ * glib/pyglib.c (pyglib_error_check),
+ (pyglib_register_exception_for_domain):
+ * glib/pyglib.h:
+ * tests/test_gio.py:
+ Add a new API for registering exceptions for a GError domain.
+ Register a new exception for G_IO_ERROR, update tests
+ and examples to use the new exception.
+
+2008-07-26 Johan Dahlin <johan@gnome.org>
+
* glib/pygoptioncontext.c (pyg_option_context_set_main_group),
(pyg_option_context_add_group):
Send in a PyObject instead of a PyGOptionGroup object.
diff --git a/examples/gio/directory-async.py b/examples/gio/directory-async.py
index 117adbc1..d6599a0e 100644
--- a/examples/gio/directory-async.py
+++ b/examples/gio/directory-async.py
@@ -1,6 +1,6 @@
import sys
-import gobject
+import glib
import gio
def next_files_done(enumerator, result):
@@ -11,7 +11,7 @@ def next_files_done(enumerator, result):
def enumerate_children_done(gfile, result):
try:
enumerator = gfile.enumerate_children_finish(result)
- except gobject.GError, e:
+ except gio.Error, e:
print 'ERROR:', e
loop.quit()
return
@@ -26,5 +26,5 @@ gfile = gio.File(uri)
gfile.enumerate_children_async(
"standard::name", enumerate_children_done)
-loop = gobject.MainLoop()
+loop = glib.MainLoop()
loop.run()
diff --git a/gio/Makefile.am b/gio/Makefile.am
index 61a2cda7..12badd27 100644
--- a/gio/Makefile.am
+++ b/gio/Makefile.am
@@ -6,6 +6,7 @@ INCLUDES = \
$(PYTHON_INCLUDES) \
$(PYGOBJECT_CFLAGS) \
$(GIO_CFLAGS) \
+ -I$(top_srcdir)/glib \
-I$(top_srcdir)/gobject
# defs files
@@ -49,7 +50,7 @@ EXTRA_DIST += $(GIO_DEFS) $(GIO_OVERRIDES)
gio.c: $(GIO_DEFS) $(GIO_OVERRIDES)
_gio_la_CFLAGS = $(GIO_CFLAGS)
_gio_la_LDFLAGS = $(common_ldflags) -export-symbols-regex init_gio
-_gio_la_LIBADD = $(GIO_LIBS)
+_gio_la_LIBADD = $(GIO_LIBS) $(top_builddir)/glib/libpyglib-2.0.la
_gio_la_SOURCES = \
giomodule.c \
pygio-utils.c \
diff --git a/gio/giomodule.c b/gio/giomodule.c
index 35603f84..4da69cee 100644
--- a/gio/giomodule.c
+++ b/gio/giomodule.c
@@ -23,6 +23,7 @@
# include "config.h"
#endif
#include <Python.h>
+#include <pyglib.h>
#include <pygobject.h>
#include <gio/gio.h>
@@ -43,7 +44,7 @@ init_gio(void)
{
PyObject *m, *d;
PyObject *tuple;
-
+ PyObject *e;
/* perform any initialisation required by the library here */
m = Py_InitModule("gio._gio", pygio_functions);
@@ -55,6 +56,9 @@ init_gio(void)
pygio_add_constants(m, "G_IO_");
PyModule_AddStringConstant(m, "ERROR", g_quark_to_string(G_IO_ERROR));
+ e = pyglib_register_exception_for_domain("gio.Error", G_IO_ERROR);
+ PyDict_SetItemString(d, "Error", e);
+ Py_DECREF(e);
/* pygio version */
tuple = Py_BuildValue ("(iii)",
diff --git a/glib/pyglib.c b/glib/pyglib.c
index f101ec17..ac9a45b2 100644
--- a/glib/pyglib.c
+++ b/glib/pyglib.c
@@ -33,6 +33,7 @@
static struct _PyGLib_Functions *_PyGLib_API;
static int pyglib_thread_state_tls_key;
+static PyObject *exception_table = NULL;
static PyTypeObject *_PyGMainContext_Type;
#define PyGMainContext_Type (*_PyGMainContext_Type)
@@ -216,6 +217,7 @@ gboolean
pyglib_error_check(GError **error)
{
PyGILState_STATE state;
+ PyObject *exc_type;
PyObject *exc_instance;
PyObject *d;
@@ -225,9 +227,17 @@ pyglib_error_check(GError **error)
return FALSE;
state = pyglib_gil_state_ensure();
-
- exc_instance = PyObject_CallFunction(_PyGLib_API->gerror_exception, "z",
- (*error)->message);
+
+ exc_type = _PyGLib_API->gerror_exception;
+ if (exception_table != NULL)
+ {
+ PyObject *item;
+ item = PyDict_GetItem(exception_table, PyInt_FromLong((*error)->domain));
+ if (item != NULL)
+ exc_type = item;
+ }
+
+ exc_instance = PyObject_CallFunction(exc_type, "z", (*error)->message);
PyObject_SetAttrString(exc_instance, "domain",
d=PyString_FromString(g_quark_to_string((*error)->domain)));
Py_DECREF(d);
@@ -328,6 +338,35 @@ bad_gerror:
}
/**
+ * pyglib_register_exception_for_domain:
+ * @name: name of the exception
+ * @error_domain: error domain
+ *
+ * Registers a new glib.GError exception subclass called #name for
+ * a specific #domain. This exception will be raised when a GError
+ * of the same domain is passed in to pyglib_error_check().
+ *
+ * Returns: the new exception
+ */
+PyObject *
+pyglib_register_exception_for_domain(gchar *name,
+ gint error_domain)
+{
+ PyObject *exception;
+
+ exception = PyErr_NewException(name, _PyGLib_API->gerror_exception, NULL);
+
+ if (exception_table == NULL)
+ exception_table = PyDict_New();
+
+ PyDict_SetItem(exception_table,
+ PyInt_FromLong(error_domain),
+ exception);
+
+ return exception;
+}
+
+/**
* pyglib_main_context_new:
* @context: a GMainContext.
*
diff --git a/glib/pyglib.h b/glib/pyglib.h
index dcc8f8aa..384b60d7 100644
--- a/glib/pyglib.h
+++ b/glib/pyglib.h
@@ -37,6 +37,8 @@ void pyglib_gil_state_release(PyGILState_STATE state);
gboolean pyglib_enable_threads(void);
gboolean pyglib_error_check(GError **error);
gboolean pyglib_gerror_exception_check(GError **error);
+PyObject *pyglib_register_exception_for_domain(gchar *name,
+ gint error_domain);
gboolean pyglib_threads_enabled(void);
PyObject * pyglib_main_context_new(GMainContext *context);
void pyglib_set_thread_block_funcs(PyGLibThreadBlockFunc block_threads_func,
diff --git a/tests/test_gio.py b/tests/test_gio.py
index 128494f6..92ffb479 100644
--- a/tests/test_gio.py
+++ b/tests/test_gio.py
@@ -103,18 +103,21 @@ class TestFile(unittest.TestCase):
try:
try:
retval = gfile.mount_enclosing_volume_finish(result)
- except glib.GError, e:
+ except gio.Error, e:
# If we run the tests too fast
- if (e.domain == gio.ERROR and
- e.code == gio.ERROR_ALREADY_MOUNTED):
+ if e.code == gio.ERROR_ALREADY_MOUNTED:
print ('WARNING: testfile is already mounted, '
- 'skipping test')
+ 'skipping test')
loop.quit()
return
raise
self.failUnless(retval)
finally:
- mount = gfile.find_enclosing_mount()
+ try:
+ mount = gfile.find_enclosing_mount()
+ except gio.Error:
+ loop.quit()
+ return
mount.unmount(unmount_done)
mount_operation = gio.MountOperation()
@@ -239,7 +242,7 @@ class TestInputStream(unittest.TestCase):
self.count += 1
if self.count == 1:
return
- self.assertRaises(glib.GError, stream.read_finish, result)
+ self.assertRaises(gio.Error, stream.read_finish, result)
finally:
loop.quit()
@@ -311,7 +314,7 @@ class TestOutputStream(unittest.TestCase):
def callback(stream, result):
self.assertEquals(result.get_op_res_gssize(), 0)
try:
- self.assertRaises(glib.GError, stream.write_finish, result)
+ self.assertRaises(gio.Error, stream.write_finish, result)
finally:
loop.quit()