From: Pierre d'Herbemont Date: Fri, 24 Aug 2007 23:30:00 +0000 (+0000) Subject: modules/modules.c: Implement and Expose GetModulesNamesForCapability. X-Git-Tag: 0.9.0-test0~6152 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=dcfc9361fa16189369b634d58b71b8e7c8a8a904;p=vlc modules/modules.c: Implement and Expose GetModulesNamesForCapability. --- diff --git a/include/vlc_modules.h b/include/vlc_modules.h index d93289d8b0..ccecc3f8e5 100644 --- a/include/vlc_modules.h +++ b/include/vlc_modules.h @@ -113,6 +113,14 @@ VLC_EXPORT( vlc_bool_t, __module_Exists, ( vlc_object_t *, const char * ) ); #define module_FindName(a,b) __module_FindName(VLC_OBJECT(a),b) VLC_EXPORT( module_t *, __module_FindName, ( vlc_object_t *, const char * ) ); +/* Return a NULL terminated array with the names of the modules that have a + * certain capability. + * Free after uses both the string and the table. */ + #define module_GetModulesNamesForCapability(a,b) \ + __module_GetModulesNamesForCapability(VLC_OBJECT(a),b) +VLC_EXPORT(char **, __module_GetModulesNamesForCapability, + ( vlc_object_t *p_this, const char * psz_capability ) ); + VLC_EXPORT( module_t *, vlc_module_create, ( vlc_object_t * ) ); VLC_EXPORT( module_t *, vlc_submodule_create, ( module_t * ) ); VLC_EXPORT( int, vlc_module_set, (module_t *module, int propid, void *value) ); diff --git a/src/modules/modules.c b/src/modules/modules.c index 49c179dca3..46b7ed1409 100644 --- a/src/modules/modules.c +++ b/src/modules/modules.c @@ -808,6 +808,42 @@ vlc_bool_t __module_Exists( vlc_object_t *p_this, const char * psz_name ) } } +/***************************************************************************** + * module_GetModuleNamesForCapability: Return a NULL terminated array with the + * names of the modules that have a certain capability. + * Free after uses both the string and the table. + *****************************************************************************/ +char ** __module_GetModulesNamesForCapability( vlc_object_t *p_this, + const char * psz_capability ) +{ + vlc_list_t *p_list; + int i, count = 0; + char ** psz_ret; + + /* Do it in two passes */ + p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + for( i = 0 ; i < p_list->i_count; i++) + { + module_t *p_module = ((module_t *) p_list->p_values[i].p_object); + const char *psz_module_capability = p_module->psz_capability; + if( psz_module_capability && !strcmp( psz_module_capability, psz_capability ) ) + count++; + } + psz_ret = malloc( sizeof(char**) * (count+1) ); + for( i = 0 ; i < p_list->i_count; i++) + { + module_t *p_module = ((module_t *) p_list->p_values[i].p_object); + const char *psz_module_capability = p_module->psz_capability; + if( psz_module_capability && !strcmp( psz_module_capability, psz_capability ) ) + psz_ret[i] = strdup( p_module->psz_object_name ); + } + psz_ret[count] = NULL; + + vlc_list_release( p_list ); + + return psz_ret; +} + /***************************************************************************** * Following functions are local.