diff options
| author | Johan Dahlin <johan@gnome.org> | 2008-01-19 18:55:51 +0000 |
|---|---|---|
| committer | Johan Dahlin <johan@src.gnome.org> | 2008-01-19 18:55:51 +0000 |
| commit | bdb049a85bd76db64f75752a95c500920456f547 (patch) | |
| tree | 5b844edc06ef06664e88c05d4bfdce311a90855c /gio | |
| parent | 79bce1671d93093f8bbe26ef09f0a556d7d6e9ff (diff) | |
| download | pygobject-bdb049a85bd76db64f75752a95c500920456f547.tar.gz pygobject-bdb049a85bd76db64f75752a95c500920456f547.tar.xz pygobject-bdb049a85bd76db64f75752a95c500920456f547.zip | |
New marshaller for async results (_wrap_g_input_stream_read_async): Impl.
2008-01-19 Johan Dahlin <johan@gnome.org>
* gio/gio.override (async_result_callback_marshal): New marshaller
for async results
(_wrap_g_input_stream_read_async): Impl.
* gio/gio-types.defs: Add SimpleAsyncRequest
* gio/giomodule.c: Register enums/constants
svn path=/trunk/; revision=735
Diffstat (limited to 'gio')
| -rw-r--r-- | gio/gio-types.defs | 7 | ||||
| -rw-r--r-- | gio/gio.override | 105 | ||||
| -rw-r--r-- | gio/giomodule.c | 1 |
3 files changed, 110 insertions, 3 deletions
diff --git a/gio/gio-types.defs b/gio/gio-types.defs index c78cb3c..006d6fb 100644 --- a/gio/gio-types.defs +++ b/gio/gio-types.defs @@ -171,6 +171,13 @@ (gtype-id "G_TYPE_FILE_OUTPUT_STREAM") ) +(define-object SimpleAsyncResult + (in-module "gio") + (parent "GObject") + (c-name "GSimpleAsyncResult") + (gtype-id "G_TYPE_SIMPLE_ASYNC_RESULT") +) + (define-object Vfs (in-module "gio") (parent "GObject") diff --git a/gio/gio.override b/gio/gio.override index 88b313a..11cbbaa 100644 --- a/gio/gio.override +++ b/gio/gio.override @@ -5,7 +5,46 @@ headers #include <pygobject.h> #include <gio/gio.h> -#DEFINE BUFSIZE +#define BUFSIZE 8192 + +typedef struct { + PyObject *callback; + PyObject *data; +} PyGAsyncRequestNotify; + +static void +async_result_callback_marshal(GObject *source_object, + GAsyncResult *result, + PyGAsyncRequestNotify *notify) +{ + PyObject *ret; + PyGILState_STATE state; + + state = pyg_gil_state_ensure(); + + if (notify->data) + ret = PyEval_CallFunction(notify->callback, "(OOO)", + pygobject_new(source_object), + pygobject_new((GObject *)result), + notify->data); + else + ret = PyObject_CallFunction(notify->callback, "(OO)", + pygobject_new(source_object), + pygobject_new((GObject *)result)); + + if (ret == NULL) { + PyErr_Print(); + PyErr_Clear(); + } + + Py_XDECREF(ret); + + Py_DECREF(notify->callback); + Py_XDECREF(notify->data); + g_slice_free(PyGAsyncRequestNotify, notify); + + pyg_gil_state_release(state); +} %% modulename gio @@ -96,8 +135,8 @@ _wrap_g_input_stream_read(PyGObject *self, PyObject *args, PyObject *kwargs) "|iO!:InputStream.read", kwlist, &count, &PyGCancellable_Type, &pycancellable)) - return NULL; - + return NULL; + buffersize = BUFSIZE; cancellable = pycancellable ? G_CANCELLABLE(pycancellable->obj) : NULL; @@ -149,3 +188,63 @@ _wrap_g_input_stream_read(PyGObject *self, PyObject *args, PyObject *kwargs) return v; } +%% +override g_input_stream_read_async kwargs +static PyObject * +_wrap_g_input_stream_read_async(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "count", "io_priority", "cancellable", "callback", + "user_data", NULL }; + long count = -1; + int io_priority = G_PRIORITY_DEFAULT; + PyGObject *pycancellable = NULL; + PyObject *buffer; + GCancellable *cancellable; + PyGAsyncRequestNotify *notify; + + notify = g_slice_new0(PyGAsyncRequestNotify); + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "iiOO|O:InputStream.read_async", + kwlist, &count, + &io_priority, + &pycancellable, + ¬ify->callback, + ¬ify->data)) + { + g_slice_free(PyGAsyncRequestNotify, notify); + return NULL; + } + + if ((PyObject*)pycancellable == Py_None) + cancellable = NULL; + else if (pygobject_check(pycancellable, &PyGCancellable_Type)) + cancellable = G_CANCELLABLE(pycancellable->obj); + else + { + PyErr_SetString(PyExc_TypeError, "cancellable should be a gio.Cancellable"); + return NULL; + } + + if (!PyCallable_Check(notify->callback)) + { + PyErr_SetString(PyExc_TypeError, "callback argument not callable"); + g_slice_free(PyGAsyncRequestNotify, notify); + return NULL; + } + + buffer = PyString_FromStringAndSize((char *)NULL, count); + if (buffer == NULL) + return NULL; + + g_input_stream_read_async(G_INPUT_STREAM(self->obj), + PyString_AS_STRING((PyStringObject *)buffer), + count, + io_priority, + cancellable, + (GAsyncReadyCallback)async_result_callback_marshal, + notify); + + Py_INCREF(Py_None); + return Py_None; +} diff --git a/gio/giomodule.c b/gio/giomodule.c index 626553d..0cd1403 100644 --- a/gio/giomodule.c +++ b/gio/giomodule.c @@ -47,6 +47,7 @@ init_gio(void) init_pygobject(); pygio_register_classes(d); + pygio_add_constants(m, "G_"); } |
