[vlc-commits] config_GetPszChoices: function to retrieve config item choices
Rémi Denis-Courmont
git at videolan.org
Tue Aug 14 23:59:41 CEST 2012
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Aug 14 23:49:33 2012 +0300| [dd7d05eb0c335f03302cf3424dd3d4b08ce6e337] | committer: Rémi Denis-Courmont
config_GetPszChoices: function to retrieve config item choices
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=dd7d05eb0c335f03302cf3424dd3d4b08ce6e337
---
include/vlc_configuration.h | 2 ++
src/config/core.c | 52 +++++++++++++++++++++++++++++++++++++++++++
src/libvlccore.sym | 1 +
3 files changed, 55 insertions(+)
diff --git a/include/vlc_configuration.h b/include/vlc_configuration.h
index fa045938..1e68778 100644
--- a/include/vlc_configuration.h
+++ b/include/vlc_configuration.h
@@ -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))
diff --git a/src/config/core.c b/src/config/core.c
index e4f30b4..2978205 100644
--- a/src/config/core.c
+++ b/src/config/core.c
@@ -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;
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 36594ea..3a1fb96 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -45,6 +45,7 @@ config_GetFloat
config_GetUserDir
config_GetInt
config_GetPsz
+config_GetPszChoices
config_GetType
config_PutFloat
config_PutInt
More information about the vlc-commits
mailing list