modules/modules.c: Implement and Expose GetModulesNamesForCapability.
authorPierre d'Herbemont <pdherbemont@videolan.org>
Fri, 24 Aug 2007 23:30:00 +0000 (23:30 +0000)
committerPierre d'Herbemont <pdherbemont@videolan.org>
Fri, 24 Aug 2007 23:30:00 +0000 (23:30 +0000)
include/vlc_modules.h
src/modules/modules.c

index d93289d..ccecc3f 100644 (file)
@@ -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) );
index 49c179d..46b7ed1 100644 (file)
@@ -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.