summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGian Mario Tagliaretti <gianmt@gnome.org>2009-03-28 22:05:10 +0000
committerGian Mario Tagliaretti <gianmt@src.gnome.org>2009-03-28 22:05:10 +0000
commit96bf175f8217e20ca449d9a5aeb8ea90b5844383 (patch)
tree6b735b73a874162c234ec1cb654a0804240c1470
parent3ed45914ee441d76822c26bf2f34d79fd3c2d7df (diff)
downloadpygobject-96bf175f8217e20ca449d9a5aeb8ea90b5844383.tar.gz
add a couple of convinence functions to convert from/to a python list and
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 svn path=/trunk/; revision=1035
-rw-r--r--ChangeLog17
-rw-r--r--gio/Makefile.am1
-rw-r--r--gio/gdrive.override184
-rw-r--r--gio/gio.defs38
-rw-r--r--gio/gio.override139
-rw-r--r--gio/gvolume.override23
-rw-r--r--gio/pygio-utils.c78
-rw-r--r--gio/pygio-utils.h4
-rw-r--r--tests/test_gio.py18
9 files changed, 349 insertions, 153 deletions
diff --git a/ChangeLog b/ChangeLog
index 17ba604d..77b97594 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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,
+ &notify->callback,
+ &py_flags,
+ &py_cancellable,
+ &notify->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,
+ &notify->callback,
+ &py_cancellable,
+ &notify->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,
- &notify->callback,
- &py_flags,
- &py_cancellable,
- &notify->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,
- &notify->callback,
- &py_cancellable,
- &notify->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))