gfileenumerator: Add a g_file_enumerator_get_child method
authorJasper St. Pierre <jstpierre@mecheye.net>
Wed, 12 Dec 2012 09:49:28 +0000 (04:49 -0500)
committerJasper St. Pierre <jstpierre@mecheye.net>
Fri, 14 Dec 2012 02:38:18 +0000 (21:38 -0500)
This is a new convenience method designed to simplify some use
cases of GFileEnumerator, by making it easy to get the next file
from a file enumerator.

https://bugzilla.gnome.org/show_bug.cgi?id=690083

docs/reference/gio/gio-sections.txt
gio/gfileenumerator.c
gio/gfileenumerator.h
gio/gio.symbols
gio/tests/live-g-file.c

index 81f613c..a39f55f 100644 (file)
@@ -213,6 +213,7 @@ g_file_enumerator_is_closed
 g_file_enumerator_has_pending
 g_file_enumerator_set_pending
 g_file_enumerator_get_container
+g_file_enumerator_get_child
 <SUBSECTION Standard>
 GFileEnumeratorClass
 G_FILE_ENUMERATOR
index d8f622b..6a8065b 100644 (file)
@@ -589,6 +589,37 @@ g_file_enumerator_get_container (GFileEnumerator *enumerator)
   return enumerator->priv->container;
 }
 
+/**
+ * g_file_enumerator_get_child:
+ * @enumerator: a #GFileEnumerator
+ * @info: a #GFileInfo gotten from g_file_enumerator_next_file()
+ *   or the async equivalents.
+ *
+ * Return a new #GFile which refers to the file named by @info in the source
+ * directory of @enumerator.  This function is primarily intended to be used
+ * inside loops with g_file_enumerator_next_file().
+ *
+ * This is a convenience method that's equivalent to:
+ * |[
+ *   gchar *name = g_file_info_get_name (info);
+ *   GFile *child = g_file_get_child (g_file_enumerator_get_container (enumr),
+ *                                    name);
+ * ]|
+ *
+ * Returns: (transfer full): a #GFile for the #GFileInfo passed it.
+ *
+ * Since: 2.36
+ */
+GFile *
+g_file_enumerator_get_child (GFileEnumerator *enumerator,
+                             GFileInfo       *info)
+{
+  g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), NULL);
+
+  return g_file_get_child (enumerator->priv->container,
+                           g_file_info_get_name (info));
+}
+
 typedef struct {
   int                num_files;
   GList             *files;
index 9cd2f3e..9fcec12 100644 (file)
@@ -126,6 +126,9 @@ gboolean   g_file_enumerator_has_pending       (GFileEnumerator      *enumerator
 void       g_file_enumerator_set_pending       (GFileEnumerator      *enumerator,
                                                gboolean              pending);
 GFile *    g_file_enumerator_get_container     (GFileEnumerator *enumerator);
+GLIB_AVAILABLE_IN_2_36
+GFile *    g_file_enumerator_get_child         (GFileEnumerator *enumerator,
+                                                GFileInfo       *info);
 
 G_END_DECLS
 
index b148333..3096755 100644 (file)
@@ -384,6 +384,7 @@ g_file_enumerator_close_finish
 g_file_enumerator_is_closed
 g_file_enumerator_has_pending
 g_file_enumerator_set_pending
+g_file_enumerator_get_child
 g_file_enumerator_get_container
 g_file_icon_get_type
 g_file_icon_new
index c104a9c..a9a9c03 100644 (file)
@@ -513,7 +513,7 @@ traverse_recurse_dirs (GFile * parent, GFile * root)
   info = g_file_enumerator_next_file (enumerator, NULL, &error);
   while ((info) && (!error))
     {
-      descend = g_file_get_child (parent, g_file_info_get_name (info));
+      descend = g_file_enumerator_get_child (enumerator, info);
       g_assert (descend != NULL);
       relative_path = g_file_get_relative_path (root, descend);
       g_assert (relative_path != NULL);
@@ -1159,7 +1159,7 @@ cleanup_dir_recurse (GFile *parent, GFile *root)
   info = g_file_enumerator_next_file (enumerator, NULL, &error);
   while ((info) && (!error))
     {
-      descend = g_file_get_child (parent, g_file_info_get_name (info));
+      descend = g_file_enumerator_get_child (enumerator, info);
       g_assert (descend != NULL);
       relative_path = g_file_get_relative_path (root, descend);
       g_assert (relative_path != NULL);