vlc | branch: master | Rémi Denis-Courmont <[email protected]> | 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 _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
