diff options
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | gio/ginputstream.override | 34 | ||||
-rw-r--r-- | gio/gio.defs | 3 | ||||
-rw-r--r-- | gio/goutputstream.override | 25 | ||||
-rw-r--r-- | tests/test_gio.py | 26 |
5 files changed, 103 insertions, 1 deletions
@@ -1,5 +1,21 @@ 2008-08-12 Paul Pogonyshev <pogonyshev@gmx.net> + Bug 547354 – wrap a few memory stream methods + + * gio/ginputstream.override (_wrap_g_memory_input_stream_add_data): + New function. + + * gio/gio.defs (gio.MemoryOutputStream.get_contents): Rename from + get_data() to avoid name clash. + + * gio/goutputstream.override (_wrap_g_memory_output_stream_new) + (_wrap_g_memory_output_stream_get_data): New functions. + + * tests/test_gio.py (TestMemoryInputStream) + (TestMemoryOutputStream): New test cases. + +2008-08-12 Paul Pogonyshev <pogonyshev@gmx.net> + * gio/gio.override: Ignore `g_io_module*' and `g_io_scheduler_*'. 2008-08-11 Paul Pogonyshev <pogonyshev@gmx.net> diff --git a/gio/ginputstream.override b/gio/ginputstream.override index 267ae019..e5791f96 100644 --- a/gio/ginputstream.override +++ b/gio/ginputstream.override @@ -285,5 +285,39 @@ _wrap_g_input_stream_close_async(PyGObject *self, Py_INCREF(Py_None); return Py_None; } +%% +override g_memory_input_stream_add_data kwargs +static PyObject * +_wrap_g_memory_input_stream_add_data(PyGObject *self, + PyObject *args, + PyObject *kwargs) +{ + static char *kwlist[] = { "data", NULL }; + PyObject *data; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:gio.MemoryInputStream.add_data", + kwlist, &data)) + return NULL; + + if (data != Py_None) { + char *copy; + int length; + + if (!PyString_Check(data)) { + PyErr_SetString(PyExc_TypeError, "data must be a string or None"); + return NULL; + } + + length = PyString_Size(data); + copy = g_malloc(length); + memcpy(copy, PyString_AsString(data), length); + + g_memory_input_stream_add_data(G_MEMORY_INPUT_STREAM(self->obj), + copy, length, (GDestroyNotify) g_free); + } + + Py_INCREF(Py_None); + return Py_None; +} /* GInputStream.read_all: No ArgType for void* */ /* GInputStream.skip_async: No ArgType for GAsyncReadyCallback */ diff --git a/gio/gio.defs b/gio/gio.defs index 434b7486..aa5c8b01 100644 --- a/gio/gio.defs +++ b/gio/gio.defs @@ -3667,7 +3667,8 @@ ) ) -(define-method get_data +;; Note: name clash with gobject.GObject.get_data; renamed. +(define-method get_contents (of-object "GMemoryOutputStream") (c-name "g_memory_output_stream_get_data") (return-type "gpointer") diff --git a/gio/goutputstream.override b/gio/goutputstream.override index 3bcf3ce8..03a5da7f 100644 --- a/gio/goutputstream.override +++ b/gio/goutputstream.override @@ -156,6 +156,31 @@ _wrap_g_output_stream_close_async(PyGObject *self, Py_INCREF(Py_None); return Py_None; } +%% +override g_memory_output_stream_new noargs +static int +_wrap_g_memory_output_stream_new(PyGObject *self) +{ + self->obj = (GObject *)g_memory_output_stream_new(NULL, 0, g_realloc, g_free); + + if (!self->obj) { + PyErr_SetString(PyExc_RuntimeError, "could not create gio.MemoryOutputStream object"); + return -1; + } + + pygobject_register_wrapper((PyObject *)self); + return 0; +} +%% +override g_memory_output_stream_get_data noargs +static PyObject * +_wrap_g_memory_output_stream_get_data(PyGObject *self) +{ + GMemoryOutputStream *stream = G_MEMORY_OUTPUT_STREAM(self->obj); + return PyString_FromStringAndSize(g_memory_output_stream_get_data(stream), + g_seekable_tell(G_SEEKABLE(stream))); +} + /* GOutputStream.write_all: No ArgType for const-void* */ /* GOutputStream.splice_async: No ArgType for GAsyncReadyCallback */ /* GOutputStream.flush_async: No ArgType for GAsyncReadyCallback */ diff --git a/tests/test_gio.py b/tests/test_gio.py index 7500e58b..2fb5c3a2 100644 --- a/tests/test_gio.py +++ b/tests/test_gio.py @@ -545,6 +545,20 @@ class TestInputStream(unittest.TestCase): loop.run() +class TestMemoryInputStream(unittest.TestCase): + def setUp(self): + self.stream = gio.MemoryInputStream() + + def test_add_data(self): + self.stream.add_data('foobar') + self.assertEquals('foobar', self.stream.read()) + + self.stream.add_data('ham ') + self.stream.add_data(None) + self.stream.add_data('spam') + self.assertEquals('ham spam', self.stream.read()) + + class TestOutputStream(unittest.TestCase): def setUp(self): self._f = open("outputstream.txt", "w") @@ -614,6 +628,18 @@ class TestOutputStream(unittest.TestCase): loop.run() +class TestMemoryOutputStream(unittest.TestCase): + def setUp(self): + self.stream = gio.MemoryOutputStream() + + def test_get_contents(self): + self.stream.write('foobar') + self.assertEquals('foobar', self.stream.get_contents()) + + self.stream.write('baz') + self.assertEquals('foobarbaz', self.stream.get_contents()) + + class TestVolumeMonitor(unittest.TestCase): def setUp(self): self.monitor = gio.volume_monitor_get() |