pygobject r1035 - in trunk: . gio tests



Author: gianmt
Date: Sat Mar 28 22:05:10 2009
New Revision: 1035
URL: http://svn.gnome.org/viewvc/pygobject?rev=1035&view=rev

Log:
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



Added:
   trunk/gio/gdrive.override
Modified:
   trunk/ChangeLog
   trunk/gio/Makefile.am
   trunk/gio/gio.defs
   trunk/gio/gio.override
   trunk/gio/gvolume.override
   trunk/gio/pygio-utils.c
   trunk/gio/pygio-utils.h
   trunk/tests/test_gio.py

Modified: trunk/gio/Makefile.am
==============================================================================
--- trunk/gio/Makefile.am	(original)
+++ trunk/gio/Makefile.am	Sat Mar 28 22:05:10 2009
@@ -38,6 +38,7 @@
 	gio.override			\
 	gappinfo.override		\
 	gapplaunchcontext.override 	\
+        gdrive.override			\
 	gfile.override			\
 	gfileattribute.override		\
 	gfileenumerator.override	\

Added: trunk/gio/gdrive.override
==============================================================================
--- (empty file)
+++ trunk/gio/gdrive.override	Sat Mar 28 22:05:10 2009
@@ -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;
+}

Modified: trunk/gio/gio.defs
==============================================================================
--- trunk/gio/gio.defs	(original)
+++ trunk/gio/gio.defs	Sat Mar 28 22:05:10 2009
@@ -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")

Modified: trunk/gio/gio.override
==============================================================================
--- trunk/gio/gio.override	(original)
+++ trunk/gio/gio.override	Sat Mar 28 22:05:10 2009
@@ -202,6 +202,7 @@
 include
   gappinfo.override
   gapplaunchcontext.override
+  gdrive.override
   gfile.override
   gfileattribute.override
   gfileenumerator.override
@@ -233,144 +234,6 @@
   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)

Modified: trunk/gio/gvolume.override
==============================================================================
--- trunk/gio/gvolume.override	(original)
+++ trunk/gio/gvolume.override	Sat Mar 28 22:05:10 2009
@@ -145,3 +145,26 @@
     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;
+}

Modified: trunk/gio/pygio-utils.c
==============================================================================
--- trunk/gio/pygio-utils.c	(original)
+++ trunk/gio/pygio-utils.c	Sat Mar 28 22:05:10 2009
@@ -128,3 +128,81 @@
 
     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;
+}

Modified: trunk/gio/pygio-utils.h
==============================================================================
--- trunk/gio/pygio-utils.h	(original)
+++ trunk/gio/pygio-utils.h	Sat Mar 28 22:05:10 2009
@@ -42,4 +42,8 @@
 
 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__ */

Modified: trunk/tests/test_gio.py
==============================================================================
--- trunk/tests/test_gio.py	(original)
+++ trunk/tests/test_gio.py	Sat Mar 28 22:05:10 2009
@@ -381,7 +381,8 @@
                 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 @@
     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))



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]