summaryrefslogtreecommitdiffstats
path: root/gio
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2008-01-19 18:55:51 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-01-19 18:55:51 +0000
commitbdb049a85bd76db64f75752a95c500920456f547 (patch)
tree5b844edc06ef06664e88c05d4bfdce311a90855c /gio
parent79bce1671d93093f8bbe26ef09f0a556d7d6e9ff (diff)
downloadpygobject-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.defs7
-rw-r--r--gio/gio.override105
-rw-r--r--gio/giomodule.c1
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,
+ &notify->callback,
+ &notify->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_");
}