[glib/gsettings: 52/327] Add functions to deal with string arrays



commit de8edf103b05ed691dac5d8168ec4510482ecf5e
Author: Ryan Lortie <desrt desrt ca>
Date:   Sun May 3 00:02:12 2009 -0400

    Add functions to deal with string arrays
    
      - g_variant_new_strv ()
      - g_variant_get_strv ()
      - g_variant_dup_strv ()

 docs/reference/glib/glib-sections.txt |    3 +
 glib/gvariant-util.c                  |  120 +++++++++++++++++++++++++++++++++
 glib/gvariant.h                       |    6 ++
 3 files changed, 129 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt
index d093990..18c350a 100644
--- a/docs/reference/glib/glib-sections.txt
+++ b/docs/reference/glib/glib-sections.txt
@@ -2762,6 +2762,7 @@ g_variant_is_object_path
 g_variant_new_signature
 g_variant_is_signature
 g_variant_new_variant
+g_variant_new_strv
 
 <SUBSECTION>
 g_variant_get_boolean
@@ -2776,6 +2777,8 @@ g_variant_get_double
 g_variant_get_string
 g_variant_dup_string
 g_variant_get_variant
+g_variant_get_strv
+g_variant_dup_strv
 
 <SUBSECTION>
 g_variant_n_children
diff --git a/glib/gvariant-util.c b/glib/gvariant-util.c
index 8db4e93..aa86c1f 100644
--- a/glib/gvariant-util.c
+++ b/glib/gvariant-util.c
@@ -1763,5 +1763,125 @@ g_variant_deep_copy (GVariant *value)
   }
 }
 
+/**
+ * g_variant_new_strv:
+ * @strv: an array of strings
+ * @length: the length of @strv, or -1
+ * @returns: a new floating #GVariant instance
+ *
+ * Constructs an array of strings #GVariant from the given array of
+ * strings.
+ *
+ * If @length is not -1 then it gives the maximum length of @strv.  In
+ * any case, a %NULL pointer in @strv is taken as a terminator.
+ **/
+GVariant *
+g_variant_new_strv (const gchar * const *strv,
+                    gint                 length)
+{
+  GVariantBuilder *builder;
+
+  builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY,
+                                   G_VARIANT_TYPE ("as"));
+  while (length-- && *strv)
+    g_variant_builder_add (builder, "s", *strv++);
+
+  return g_variant_builder_end (builder);
+}
+
+/**
+ * g_variant_get_strv:
+ * @value: an array of strings #GVariant
+ * @length: the length of the result, or %NULL
+ * @returns: an array of constant strings
+ *
+ * Gets the contents of an array of strings #GVariant.  This call
+ * makes a shallow copy; the return result should be released with
+ * g_free(), but the individual strings must not be modified.
+ *
+ * If @length is non-%NULL then the number of elements in the result
+ * is stored there.  In any case, the resulting array will be
+ * %NULL-terminated.
+ *
+ * For an empty array, @length will be set to 0 and a pointer to a
+ * %NULL pointer will be returned.
+ **/
+const gchar **
+g_variant_get_strv (GVariant *value,
+                    gint     *length)
+{
+  const gchar **result;
+  gint my_length;
+  gint i;
+
+  g_return_val_if_fail (g_variant_matches (value, G_VARIANT_TYPE ("as")),
+                        NULL);
+
+  g_variant_flatten (value);
+
+  my_length = g_variant_n_children (value);
+  result = g_new (const gchar *, my_length + 1);
+
+  if (length)
+    *length = my_length;
+
+  for (i = 0; i < my_length; i++)
+    {
+      GVariant *child = g_variant_get_child (value, i);
+      result[i] = g_variant_get_string (child, NULL);
+      g_variant_unref (child);
+    }
+  result[i] = NULL;
+
+  return result;
+}
+
+/**
+ * g_variant_dup_strv:
+ * @value: an array of strings #GVariant
+ * @length: the length of the result, or %NULL
+ * @returns: an array of constant strings
+ *
+ * Gets the contents of an array of strings #GVariant.  This call
+ * makes a deep copy; the return result should be released with
+ * g_strfreev().
+ *
+ * If @length is non-%NULL then the number of elements in the result
+ * is stored there.  In any case, the resulting array will be
+ * %NULL-terminated.
+ *
+ * For an empty array, @length will be set to 0 and a pointer to a
+ * %NULL pointer will be returned.
+ **/
+gchar **
+g_variant_dup_strv (GVariant *value,
+                    gint     *length)
+{
+  gchar **result;
+  gint my_length;
+  gint i;
+
+  g_return_val_if_fail (g_variant_matches (value, G_VARIANT_TYPE ("as")),
+                        NULL);
+
+  g_variant_flatten (value);
+
+  my_length = g_variant_n_children (value);
+  result = g_new (gchar *, my_length + 1);
+
+  if (length)
+    *length = my_length;
+
+  for (i = 0; i < my_length; i++)
+    {
+      GVariant *child = g_variant_get_child (value, i);
+      result[i] = g_variant_dup_string (child, NULL);
+      g_variant_unref (child);
+    }
+  result[i] = NULL;
+
+  return result;
+}
+
 #define _gvariant_util_c_
 #include "galiasdef.c"
diff --git a/glib/gvariant.h b/glib/gvariant.h
index 0054e78..9356bf1 100644
--- a/glib/gvariant.h
+++ b/glib/gvariant.h
@@ -73,6 +73,8 @@ gboolean                        g_variant_is_object_path                (const g
 GVariant                       *g_variant_new_signature                 (const gchar          *string);
 gboolean                        g_variant_is_signature                  (const gchar          *string);
 GVariant                       *g_variant_new_variant                   (GVariant             *value);
+GVariant                       *g_variant_new_strv                      (const gchar * const  *strv,
+                                                                         gint                  length);
 
 /* deconstructors */
 gboolean                        g_variant_get_boolean                   (GVariant             *value);
@@ -88,6 +90,10 @@ const gchar                    *g_variant_get_string                    (GVarian
                                                                          gsize                *length);
 gchar                          *g_variant_dup_string                    (GVariant             *value,
                                                                          gsize                *length);
+const gchar **                  g_variant_get_strv                      (GVariant             *value,
+                                                                         gint                 *length);
+gchar **                        g_variant_dup_strv                      (GVariant             *value,
+                                                                         gint                 *length);
 GVariant                       *g_variant_get_variant                   (GVariant             *value);
 gconstpointer                   g_variant_get_fixed                     (GVariant             *value,
                                                                          gsize                 size);



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