]> git.sesse.net Git - vlc/commitdiff
config_GetPszChoices: function to retrieve config item choices
authorRémi Denis-Courmont <remi@remlab.net>
Tue, 14 Aug 2012 20:49:33 +0000 (23:49 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Tue, 14 Aug 2012 21:59:37 +0000 (00:59 +0300)
include/vlc_configuration.h
src/config/core.c
src/libvlccore.sym

index fa045938d3cd5e50d8588b2c035faeeb310ebe81..1e687783ec4ddea5c5435c98300601a68841ba00 100644 (file)
@@ -96,6 +96,8 @@ VLC_API float config_GetFloat(vlc_object_t *, const char *) VLC_USED;
 VLC_API void config_PutFloat(vlc_object_t *, const char *, float);
 VLC_API char * config_GetPsz(vlc_object_t *, const char *) VLC_USED VLC_MALLOC;
 VLC_API void config_PutPsz(vlc_object_t *, const char *, const char *);
+VLC_API ssize_t config_GetPszChoices(vlc_object_t *, const char *,
+                                     char ***, char ***) VLC_USED;
 
 VLC_API int config_SaveConfigFile( vlc_object_t * );
 #define config_SaveConfigFile(a) config_SaveConfigFile(VLC_OBJECT(a))
index e4f30b40a16f95549de675d952db6cd16df74f95..29782059fb9c1c608daa56f2197a5a6bc4dbe2fb 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "vlc_configuration.h"
 
+#include <errno.h>
 #include <assert.h>
 
 #include "configuration.h"
@@ -329,6 +330,57 @@ void config_PutFloat( vlc_object_t *p_this,
     vlc_rwlock_unlock (&config_lock);
 }
 
+/**
+ * Determines a list of suggested values for a configuration item.
+ * \param values pointer to a table of value strings [OUT]
+ * \param texts pointer to a table of descriptions strings [OUT]
+ * \return number of choices, or -1 on error
+ * \note the caller is responsible for calling free() on all values, on all
+ * descriptions and on both tables.
+ * In case of error, both pointers are set to NULL.
+ */
+ssize_t config_GetPszChoices (vlc_object_t *obj, const char *name,
+                              char ***restrict values, char ***restrict texts)
+{
+    *values = *texts = NULL;
+
+    module_config_t *cfg = config_FindConfig (obj, name);
+    if (cfg == NULL)
+    {
+        msg_Warn (obj, "option %s does not exist", name);
+        errno = ENOENT;
+        return -1;
+    }
+
+    if (cfg->pf_update_list != NULL)
+    {
+        /* FIXME: not thread-safe */
+        vlc_value_t dummy = { .psz_string = (char *)"" };
+        cfg->pf_update_list (obj, name, dummy, dummy, NULL);
+    }
+
+    size_t count = cfg->i_list;
+    if (count == 0)
+        return 0;
+
+    char **vals = malloc (sizeof (*vals) * count);
+    char **txts = malloc (sizeof (*txts) * count);
+    if (unlikely(vals == NULL || txts == NULL))
+        abort ();
+
+    for (size_t i = 0; i < count; i++)
+    {
+        vals[i] = strdup (cfg->ppsz_list[i]);
+        txts[i] = strdup (cfg->ppsz_list_text[i]);
+        if (unlikely(vals[i] == NULL || txts[i] == NULL))
+            abort ();
+    }
+
+    *values = vals;
+    *texts = txts;
+    return count;
+}
+
 static int confcmp (const void *a, const void *b)
 {
     const module_config_t *const *ca = a, *const *cb = b;
index 36594eaf9c215ae64c89f1b1a9525ff2230b3377..3a1fb9643fdbf53ccfb492604eb92417d9e2672f 100644 (file)
@@ -45,6 +45,7 @@ config_GetFloat
 config_GetUserDir
 config_GetInt
 config_GetPsz
+config_GetPszChoices
 config_GetType
 config_PutFloat
 config_PutInt