diff options
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | gio/Makefile.am | 1 | ||||
-rw-r--r-- | gio/gdrive.override | 184 | ||||
-rw-r--r-- | gio/gio.defs | 38 | ||||
-rw-r--r-- | gio/gio.override | 139 | ||||
-rw-r--r-- | gio/gvolume.override | 23 | ||||
-rw-r--r-- | gio/pygio-utils.c | 78 | ||||
-rw-r--r-- | gio/pygio-utils.h | 4 | ||||
-rw-r--r-- | tests/test_gio.py | 18 |
9 files changed, 349 insertions, 153 deletions
@@ -1,3 +1,20 @@ +2009-03-28 Gian Mario Tagliaretti <gianmt@gnome.org> + + * gio/pygio-utils.[hc]: (strv_to_pylist) (pylist_to_strv) add a couple + of convinence functions to convert from/to a python list and an array + of strings. + + * gio/Makefile.am + * gio/gdrive.override: + * gio/gio.override: Strip GDrive overrides and + wrap g_drive_enumerate_identifiers + + * tests/test_gio.py: + * gio/gvolume.override: wrap g_volume_enumerate_identifiers + + * gio/gio.defs: add missing g_drive_get_identifier and + g_drive_enumerate_identifiers + 2009-03-22 Mark Lee <marklee@svn.gnome.org> Bug 559001 – Allow setting pytype wrapper class diff --git a/gio/Makefile.am b/gio/Makefile.am index a90eedbb..d47dda97 100644 --- a/gio/Makefile.am +++ b/gio/Makefile.am @@ -38,6 +38,7 @@ GIO_OVERRIDES = \ gio.override \ gappinfo.override \ gapplaunchcontext.override \ + gdrive.override \ gfile.override \ gfileattribute.override \ gfileenumerator.override \ diff --git a/gio/gdrive.override b/gio/gdrive.override new file mode 100644 index 00000000..4fb8a1e0 --- /dev/null +++ b/gio/gdrive.override @@ -0,0 +1,184 @@ +/* -*- Mode: C; c-basic-offset: 4 -*- + * pygobject - Python bindings for GObject + * Copyright (C) 2008 Johan Dahlin + * Copyright (C) 2009 Gian Mario Tagliaretti + * + * gicon.override: module overrides for GIcon and related types + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +%% +override g_drive_get_volumes noargs +static PyObject * +_wrap_g_drive_get_volumes (PyGObject *self) +{ + GList *list, *l; + PyObject *ret; + + pyg_begin_allow_threads; + + list = g_drive_get_volumes (G_DRIVE (self->obj)); + + pyg_end_allow_threads; + + ret = PyList_New(0); + for (l = list; l; l = l->next) { + GVolume *volume = l->data; + PyObject *item = pygobject_new((GObject *)volume); + PyList_Append(ret, item); + Py_DECREF(item); + g_object_unref(volume); + } + g_list_free(list); + + return ret; +} +%% +override g_drive_eject kwargs +static PyObject * +_wrap_g_drive_eject(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "callback", "flags", "cancellable", "user_data", NULL }; + PyGIONotify *notify; + PyObject *py_flags = NULL; + GMountUnmountFlags flags = G_MOUNT_UNMOUNT_NONE; + PyGObject *py_cancellable = NULL; + GCancellable *cancellable; + + notify = pygio_notify_new(); + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "O|OOO:gio.Drive.eject", + kwlist, + ¬ify->callback, + &py_flags, + &py_cancellable, + ¬ify->data)) + goto error; + + if (!pygio_notify_callback_is_valid(notify)) + goto error; + + if (py_flags && pyg_flags_get_value(G_TYPE_MOUNT_UNMOUNT_FLAGS, + py_flags, (gpointer) &flags)) + goto error; + + if (!pygio_check_cancellable(py_cancellable, &cancellable)) + goto error; + + pygio_notify_reference_callback(notify); + + g_drive_eject(G_DRIVE(self->obj), + flags, + cancellable, + (GAsyncReadyCallback) async_result_callback_marshal, + notify); + + Py_INCREF(Py_None); + return Py_None; + + error: + pygio_notify_free(notify); + return NULL; +} +%% +override g_drive_poll_for_media kwargs +static PyObject * +_wrap_g_drive_poll_for_media(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "callback", "cancellable", "user_data", NULL }; + PyGIONotify *notify; + PyGObject *py_cancellable = NULL; + GCancellable *cancellable; + + notify = pygio_notify_new(); + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "O|OO:gio.Drive.eject", + kwlist, + ¬ify->callback, + &py_cancellable, + ¬ify->data)) + goto error; + + if (!pygio_notify_callback_is_valid(notify)) + goto error; + + if (!pygio_check_cancellable(py_cancellable, &cancellable)) + goto error; + + pygio_notify_reference_callback(notify); + + pyg_begin_allow_threads; + + g_drive_poll_for_media(G_DRIVE(self->obj), + cancellable, + (GAsyncReadyCallback) async_result_callback_marshal, + notify); + + pyg_end_allow_threads; + + Py_INCREF(Py_None); + return Py_None; + + error: + pygio_notify_free(notify); + return NULL; +} +%% +override-slot GDrive.tp_repr +static PyObject * +_wrap_g_drive_tp_repr(PyGObject *self) +{ + char *name = g_drive_get_name(G_DRIVE(self->obj)); + gchar *representation; + PyObject *result; + + if (name) { + representation = g_strdup_printf("<%s at %p: %s>", self->ob_type->tp_name, self, name); + g_free(name); + } + else + representation = g_strdup_printf("<%s at %p: UNKNOWN NAME>", self->ob_type->tp_name, self); + + result = PyString_FromString(representation); + g_free(representation); + return result; +} +%% +override g_drive_enumerate_identifiers noargs +static PyObject * +_wrap_g_drive_enumerate_identifiers (PyGObject *self) +{ + char **ids; + PyObject *ret; + + pyg_begin_allow_threads; + + ids = g_drive_enumerate_identifiers(G_DRIVE (self->obj)); + + pyg_end_allow_threads; + + if (ids && ids[0] != NULL) { + ret = strv_to_pylist(ids); + g_strfreev (ids); + } else { + ret = Py_None; + Py_INCREF(ret); + } + return ret; +} diff --git a/gio/gio.defs b/gio/gio.defs index 93f3fa85..a4e136c9 100644 --- a/gio/gio.defs +++ b/gio/gio.defs @@ -954,7 +954,7 @@ ) ;; -;; wrapped in gio.override +;; wrapped in gdrive.override ;; (define-method get_volumes (of-object "GDrive") @@ -993,15 +993,10 @@ ) ;; -;; wrapped in gio.override +;; wrapped in gdrive.override ;; (define-method eject (of-object "GDrive") - (docstring - "D.eject(callback, [flags, [cancellable, [user_data]]]) -> start ejecting\n" - "Asynchronously ejects a drive. When the operation is finished, callback\n" - "will be called. You can then call gio.Drive.eject_finish to obtain the\n" - "result of the operation.") (c-name "g_drive_eject") (return-type "none") (parameters @@ -1023,16 +1018,10 @@ ) ;; -;; wrapped in gio.override +;; wrapped in gdrive.override ;; (define-method poll_for_media (of-object "GDrive") - (docstring - "D.poll_for_media(callback, [cancellable, [user_data]]) -> start polling\n" - "Asynchronously polls drive to see if media has been inserted or removed.\n" - "When the operation is finished, callback will be called. You can then\n" - "call gio.Drive.poll_for_media_finish to obtain the result of the\n" - "operation.") (c-name "g_drive_poll_for_media") (return-type "none") (parameters @@ -1052,6 +1041,24 @@ ) ) +(define-method get_identifier + (of-object "GDrive") + (c-name "g_drive_get_identifier") + (return-type "char*") + (parameters + '("const-char*" "kind") + ) +) + +;; +;; wrapped in gdrive.override +;; +(define-method enumerate_identifiers + (of-object "GDrive") + (c-name "g_drive_enumerate_identifiers") + (return-type "char**") +) + ;; From gdummyfile.h @@ -5196,6 +5203,9 @@ ) ) +;; +;; wrapped in gvolume.override +;; (define-method enumerate_identifiers (of-object "GVolume") (c-name "g_volume_enumerate_identifiers") diff --git a/gio/gio.override b/gio/gio.override index e074d743..b5aac28c 100644 --- a/gio/gio.override +++ b/gio/gio.override @@ -202,6 +202,7 @@ async_result_callback_marshal(GObject *source_object, include gappinfo.override gapplaunchcontext.override + gdrive.override gfile.override gfileattribute.override gfileenumerator.override @@ -233,144 +234,6 @@ ignore-glob g_io_module* g_io_scheduler_* %% -override g_drive_get_volumes noargs -static PyObject * -_wrap_g_drive_get_volumes (PyGObject *self) -{ - GList *list, *l; - PyObject *ret; - - pyg_begin_allow_threads; - - list = g_drive_get_volumes (G_DRIVE (self->obj)); - - pyg_end_allow_threads; - - ret = PyList_New(0); - for (l = list; l; l = l->next) { - GVolume *volume = l->data; - PyObject *item = pygobject_new((GObject *)volume); - PyList_Append(ret, item); - Py_DECREF(item); - g_object_unref(volume); - } - g_list_free(list); - - return ret; -} -%% -override g_drive_eject kwargs -static PyObject * -_wrap_g_drive_eject(PyGObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "callback", "flags", "cancellable", "user_data", NULL }; - PyGIONotify *notify; - PyObject *py_flags = NULL; - GMountUnmountFlags flags = G_MOUNT_UNMOUNT_NONE; - PyGObject *py_cancellable = NULL; - GCancellable *cancellable; - - notify = pygio_notify_new(); - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "O|OOO:gio.Drive.eject", - kwlist, - ¬ify->callback, - &py_flags, - &py_cancellable, - ¬ify->data)) - goto error; - - if (!pygio_notify_callback_is_valid(notify)) - goto error; - - if (py_flags && pyg_flags_get_value(G_TYPE_MOUNT_UNMOUNT_FLAGS, - py_flags, (gpointer) &flags)) - goto error; - - if (!pygio_check_cancellable(py_cancellable, &cancellable)) - goto error; - - pygio_notify_reference_callback(notify); - - g_drive_eject(G_DRIVE(self->obj), - flags, - cancellable, - (GAsyncReadyCallback) async_result_callback_marshal, - notify); - - Py_INCREF(Py_None); - return Py_None; - - error: - pygio_notify_free(notify); - return NULL; -} -%% -override g_drive_poll_for_media kwargs -static PyObject * -_wrap_g_drive_poll_for_media(PyGObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "callback", "cancellable", "user_data", NULL }; - PyGIONotify *notify; - PyGObject *py_cancellable = NULL; - GCancellable *cancellable; - - notify = pygio_notify_new(); - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "O|OO:gio.Drive.eject", - kwlist, - ¬ify->callback, - &py_cancellable, - ¬ify->data)) - goto error; - - if (!pygio_notify_callback_is_valid(notify)) - goto error; - - if (!pygio_check_cancellable(py_cancellable, &cancellable)) - goto error; - - pygio_notify_reference_callback(notify); - - pyg_begin_allow_threads; - - g_drive_poll_for_media(G_DRIVE(self->obj), - cancellable, - (GAsyncReadyCallback) async_result_callback_marshal, - notify); - - pyg_end_allow_threads; - - Py_INCREF(Py_None); - return Py_None; - - error: - pygio_notify_free(notify); - return NULL; -} -%% -override-slot GDrive.tp_repr -static PyObject * -_wrap_g_drive_tp_repr(PyGObject *self) -{ - char *name = g_drive_get_name(G_DRIVE(self->obj)); - gchar *representation; - PyObject *result; - - if (name) { - representation = g_strdup_printf("<%s at %p: %s>", self->ob_type->tp_name, self, name); - g_free(name); - } - else - representation = g_strdup_printf("<%s at %p: UNKNOWN NAME>", self->ob_type->tp_name, self); - - result = PyString_FromString(representation); - g_free(representation); - return result; -} -%% override g_app_info_get_all noargs static PyObject * _wrap_g_app_info_get_all (PyGObject *self) diff --git a/gio/gvolume.override b/gio/gvolume.override index fcdbb9f3..38f38d33 100644 --- a/gio/gvolume.override +++ b/gio/gvolume.override @@ -145,3 +145,26 @@ _wrap_g_volume_tp_repr(PyGObject *self) g_free(representation); return result; } +%% +override g_volume_enumerate_identifiers noargs +static PyObject * +_wrap_g_volume_enumerate_identifiers (PyGObject *self) +{ + char **ids; + PyObject *ret; + + pyg_begin_allow_threads; + + ids = g_volume_enumerate_identifiers(G_VOLUME (self->obj)); + + pyg_end_allow_threads; + + if (ids && ids[0] != NULL) { + ret = strv_to_pylist(ids); + g_strfreev (ids); + } else { + ret = Py_None; + Py_INCREF(ret); + } + return ret; +} diff --git a/gio/pygio-utils.c b/gio/pygio-utils.c index 313b1471..4c3d0bff 100644 --- a/gio/pygio-utils.c +++ b/gio/pygio-utils.c @@ -128,3 +128,81 @@ pygio_pylist_to_uri_glist(PyObject *pyfile_list) return file_list; } + +/** + * strv_to_pylist: + * @strv: array of strings + * + * Returns: A python list of strings + */ +PyObject * +strv_to_pylist (char **strv) +{ + gsize len, i; + PyObject *list; + + len = strv ? g_strv_length (strv) : 0; + list = PyList_New (len); + + for (i = 0; i < len; i++) + PyList_SetItem (list, i, PyString_FromString (strv[i])); + + return list; +} + +/** + * pylist_to_strv: + * @strvp: a pointer to an array where return strings. + * + * Returns: TRUE if the list of strings could be converted, FALSE otherwise. + */ +gboolean +pylist_to_strv (PyObject *list, + char ***strvp) +{ + int i, len; + char **ret; + + *strvp = NULL; + + if (list == Py_None) + return TRUE; + + if (!PySequence_Check (list)) + { + PyErr_Format (PyExc_TypeError, "argument must be a list or tuple of strings"); + return FALSE; + } + + if ((len = PySequence_Size (list)) < 0) + return FALSE; + + ret = g_new (char*, len + 1); + for (i = 0; i <= len; ++i) + ret[i] = NULL; + + for (i = 0; i < len; ++i) + { + PyObject *item = PySequence_GetItem (list, i); + + if (!item) + { + g_strfreev (ret); + return FALSE; + } + + if (!PyString_Check (item)) + { + Py_DECREF (item); + g_strfreev (ret); + PyErr_Format (PyExc_TypeError, "argument must be a list of strings"); + return FALSE; + } + + ret[i] = g_strdup (PyString_AsString (item)); + Py_DECREF (item); + } + + *strvp = ret; + return TRUE; +} diff --git a/gio/pygio-utils.h b/gio/pygio-utils.h index 4836e597..b8794ea2 100644 --- a/gio/pygio-utils.h +++ b/gio/pygio-utils.h @@ -42,4 +42,8 @@ GList* pygio_pylist_to_gfile_glist(PyObject *pycontext); GList* pygio_pylist_to_uri_glist(PyObject *pycontext); +PyObject* strv_to_pylist (char **strv); + +gboolean pylist_to_strv (PyObject *list, char ***strvp); + #endif /* __PYGIO_UTILS_H__ */ diff --git a/tests/test_gio.py b/tests/test_gio.py index a9b273ba..e308a2a1 100644 --- a/tests/test_gio.py +++ b/tests/test_gio.py @@ -381,7 +381,8 @@ class TestFile(unittest.TestCase): self.assertEqual(info.type, gio.FILE_ATTRIBUTE_TYPE_UINT64) self.assertEqual(info.name, "time::modified") self.assertEqual(info.flags, - gio.FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED) + gio.FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED | + gio.FILE_ATTRIBUTE_INFO_COPY_WITH_FILE) def testQueryWritableNamespaces(self): infolist = self.file.query_writable_namespaces() @@ -842,3 +843,18 @@ class TestVfs(unittest.TestCase): def testGetSupportedURISchemes(self): result = self.vfs.get_supported_uri_schemes() self.failUnless(type(result), []) + +class TestVolume(unittest.TestCase): + def setUp(self): + self.monitor = gio.volume_monitor_get() + + def testVolumeEnumerate(self): + volumes = self.monitor.get_volumes() + self.failUnless(isinstance(volumes, list)) + for v in volumes: + if v is not None: + ids = v.enumerate_identifiers() + self.failUnless(isinstance(ids, list)) + for id in ids: + if id is not None: + self.failUnless(isinstance(id, str)) |