New type-safe API for modules listing
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 21 Sep 2008 10:07:28 +0000 (13:07 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 21 Sep 2008 10:30:48 +0000 (13:30 +0300)
module_list_get(): gets the list of modules
module_list_free(): releases the list

include/vlc_modules.h
src/config/cmdline.c
src/config/core.c
src/config/file.c
src/libvlc.c
src/libvlccore.sym

index 9702397..7d96a35 100644 (file)
@@ -44,6 +44,9 @@ VLC_EXPORT( void, module_Put, ( module_t *module ) );
 VLC_EXPORT( module_config_t *, module_GetConfig, ( const module_t *, unsigned * ) );
 VLC_EXPORT( void, module_PutConfig, ( module_config_t * ) );
 
+VLC_EXPORT( void, module_list_free, (module_t **) );
+VLC_EXPORT( module_t **, module_list_get, (size_t *n) );
+
 /* 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. */
index 7860e42..ad5f2ca 100644 (file)
@@ -57,7 +57,6 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
 {
     int i_cmd, i_index, i_opts, i_shortopts, flag, i_verbose = 0;
     module_t *p_parser;
-    vlc_list_t *p_list;
     struct option *p_longopts;
     int i_modules_index;
     const char **argv_copy = NULL;
@@ -85,29 +84,23 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
 #endif
 
     /* List all modules */
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+    module_t **list = module_list_get (NULL);
 
     /*
      * Generate the longopts and shortopts structures used by getopt_long
      */
 
     i_opts = 0;
-    for( i_modules_index = 0; i_modules_index < p_list->i_count;
-         i_modules_index++ )
-    {
-        p_parser = (module_t *)p_list->p_values[i_modules_index].p_object ;
-
+    for (size_t i = 0; (p_parser = list[i]) != NULL; i++)
         /* count the number of exported configuration options (to allocate
          * longopts). We also need to allocate space for two options when
          * dealing with boolean to allow for --foo and --no-foo */
-        i_opts += p_parser->i_config_items
-                     + 2 * p_parser->i_bool_items;
-    }
+        i_opts += p_parser->i_config_items + 2 * p_parser->i_bool_items;
 
     p_longopts = malloc( sizeof(struct option) * (i_opts + 1) );
     if( p_longopts == NULL )
     {
-        vlc_list_release( p_list );
+        module_list_free (list);
         return -1;
     }
 
@@ -115,7 +108,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
     if( psz_shortopts == NULL )
     {
         free( p_longopts );
-        vlc_list_release( p_list );
+        module_list_free (list);
         return -1;
     }
 
@@ -129,7 +122,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
         {
             free( psz_shortopts );
             free( p_longopts );
-            vlc_list_release( p_list );
+            module_list_free (list);
             return -1;
         }
         memcpy( argv_copy, ppsz_argv, *pi_argc * sizeof(char *) );
@@ -144,11 +137,9 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
 
     /* Fill the p_longopts and psz_shortopts structures */
     i_index = 0;
-    for( i_modules_index = 0; i_modules_index < p_list->i_count;
-         i_modules_index++ )
+    for (size_t i = 0; (p_parser = list[i]) != NULL; i++)
     {
         module_config_t *p_item, *p_end;
-        p_parser = (module_t *)p_list->p_values[i_modules_index].p_object ;
 
         if( !p_parser->i_config_items )
             continue;
@@ -226,7 +217,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
     }
 
     /* We don't need the module list anymore */
-    vlc_list_release( p_list );
+    module_list_free( list );
 
     /* Close the longopts and shortopts structures */
     memset( &p_longopts[i_index], 0, sizeof(struct option) );
index 3f6110e..9768e7f 100644 (file)
@@ -409,17 +409,17 @@ void __config_PutFloat( vlc_object_t *p_this,
  *****************************************************************************/
 module_config_t *config_FindConfig( vlc_object_t *p_this, const char *psz_name )
 {
-    vlc_list_t *p_list;
-    int i_index;
+    module_t *p_parser;
 
     if( !psz_name ) return NULL;
 
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+    module_t **list = module_list_get (NULL);
+    if (list == NULL)
+        return NULL;
 
-    for( i_index = 0; i_index < p_list->i_count; i_index++ )
+    for (size_t i = 0; (p_parser = list[i]) != NULL; i++)
     {
         module_config_t *p_item, *p_end;
-        module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object;
 
         if( !p_parser->i_config_items )
             continue;
@@ -435,14 +435,13 @@ module_config_t *config_FindConfig( vlc_object_t *p_this, const char *psz_name )
              || ( p_item->psz_oldname
               && !strcmp( psz_name, p_item->psz_oldname ) ) )
             {
-                vlc_list_release( p_list );
+                module_list_free (list);
                 return p_item;
             }
         }
     }
 
-    vlc_list_release( p_list );
-
+    module_list_free (list);
     return NULL;
 }
 
@@ -536,17 +535,15 @@ void __config_ResetAll( vlc_object_t *p_this )
 {
     libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);
     int i_index;
-    vlc_list_t *p_list;
     module_t *p_module;
+    module_t **list = module_list_get (NULL);
 
     /* Acquire config file lock */
     vlc_mutex_lock( &priv->config_lock );
 
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
 
-    for( i_index = 0; i_index < p_list->i_count; i_index++ )
+    for (size_t j = 0; (p_module = list[j]) != NULL; j++)
     {
-        p_module = (module_t *)p_list->p_values[i_index].p_object ;
         if( p_module->b_submodule ) continue;
 
         for (size_t i = 0; i < p_module->confsize; i++ )
@@ -566,6 +563,6 @@ void __config_ResetAll( vlc_object_t *p_this )
         }
     }
 
-    vlc_list_release( p_list );
+    module_list_free (list);
     vlc_mutex_unlock( &priv->config_lock );
 }
index 4952fcb..d6cc24e 100644 (file)
@@ -158,7 +158,6 @@ static int strtoi (const char *str)
 int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
 {
     libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);
-    vlc_list_t *p_list;
     FILE *file;
 
     file = config_OpenConfigFile (p_this, "rt");
@@ -169,7 +168,7 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
     vlc_mutex_lock( &priv->config_lock );
 
     /* Look for the selected module, if NULL then save everything */
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+    module_t **list = module_list_get (NULL);
 
     /* Look for UTF-8 Byte Order Mark */
     char * (*convert) (const char *) = strdupnull;
@@ -215,9 +214,9 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
             if ((psz_module_name == NULL)
              || (strcmp (psz_module_name, section) == 0))
             {
-                for (int i = 0; i < p_list->i_count; i++)
+                for (int i = 0; list[i]; i++)
                 {
-                    module_t *m = (module_t *)p_list->p_values[i].p_object;
+                    module_t *m = list[i];
 
                     if ((strcmp (section, m->psz_object_name) == 0)
                      && (m->i_config_items > 0)) /* ignore config-less modules */
@@ -317,7 +316,7 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
     }
     fclose (file);
 
-    vlc_list_release( p_list );
+    module_list_free (list);
     if (loc != (locale_t)0)
     {
         uselocale (baseloc);
@@ -416,7 +415,6 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
 {
     libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);
     module_t *p_parser;
-    vlc_list_t *p_list;
     FILE *file;
     char p_line[1024], *p_index2;
     int i_sizebuf = 0;
@@ -460,7 +458,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
     p_bigbuffer[0] = 0;
 
     /* List all available modules */
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+    module_t **list = module_list_get (NULL);
 
     /* backup file into memory, we only need to backup the sections we won't
      * save later on */
@@ -471,10 +469,8 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
         {
 
             /* we found a section, check if we need to do a backup */
-            for( i_index = 0; i_index < p_list->i_count; i_index++ )
+            for( i_index = 0; (p_parser = list[i_index]) != NULL; i_index++ )
             {
-                p_parser = (module_t *)p_list->p_values[i_index].p_object ;
-
                 if( ((p_index2 - &p_line[1])
                        == (int)strlen(p_parser->psz_object_name) )
                     && !memcmp( &p_line[1], p_parser->psz_object_name,
@@ -488,7 +484,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
                 }
             }
 
-            if( i_index == p_list->i_count )
+            if( list[i_index] == NULL )
             {
                 /* we don't have this section in our list so we need to back
                  * it up */
@@ -526,7 +522,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
     file = config_OpenConfigFile (p_this, "wt");
     if( !file )
     {
-        vlc_list_release( p_list );
+        module_list_free (list);
         free( p_bigbuffer );
         vlc_mutex_unlock( &priv->config_lock );
         return -1;
@@ -540,10 +536,9 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
     locale_t baseloc = uselocale (loc);
 
     /* Look for the selected module, if NULL then save everything */
-    for( i_index = 0; i_index < p_list->i_count; i_index++ )
+    for( i_index = 0; (p_parser = list[i_index]) != NULL; i_index++ )
     {
         module_config_t *p_item, *p_end;
-        p_parser = (module_t *)p_list->p_values[i_index].p_object ;
 
         if( psz_module_name && strcmp( psz_module_name,
                                        p_parser->psz_object_name ) )
@@ -644,7 +639,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
         }
     }
 
-    vlc_list_release( p_list );
+    module_list_free (list);
     if (loc != (locale_t)0)
     {
         uselocale (baseloc);
@@ -666,18 +661,17 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
 int config_AutoSaveConfigFile( vlc_object_t *p_this )
 {
     libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);
-    vlc_list_t *p_list;
-    int i_index, i_count;
+    size_t i_index;
+    bool done;
 
     assert( p_this );
 
     /* Check if there's anything to save */
     vlc_mutex_lock( &priv->config_lock );
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
-    i_count = p_list->i_count;
-    for( i_index = 0; i_index < i_count; i_index++ )
+    module_t **list = module_list_get (NULL);
+    for( i_index = 0; list[i_index]; i_index++ )
     {
-        module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object ;
+        module_t *p_parser = list[i_index];
         module_config_t *p_item, *p_end;
 
         if( !p_parser->i_config_items ) continue;
@@ -690,11 +684,11 @@ int config_AutoSaveConfigFile( vlc_object_t *p_this )
         }
         if( p_item < p_end ) break;
     }
-    vlc_list_release( p_list );
+    done = list[i_index] == NULL;
+    module_list_free (list);
     vlc_mutex_unlock( &priv->config_lock );
 
-    if( i_index == i_count ) return VLC_SUCCESS;
-    return SaveConfigFile( p_this, NULL, true );
+    return done ? VLC_SUCCESS : SaveConfigFile( p_this, NULL, true );
 }
 
 int __config_SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name )
index 3a7c407..8b1a202 100644 (file)
@@ -1424,14 +1424,12 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search )
 #else
 #   define OPTION_VALUE_SEP " "
 #endif
-    vlc_list_t *p_list = NULL;
     char psz_spaces_text[PADDING_SPACES+LINE_START+1];
     char psz_spaces_longtext[LINE_START+3];
     char psz_format[sizeof(COLOR_FORMAT_STRING)];
     char psz_format_bool[sizeof(COLOR_FORMAT_STRING_BOOL)];
     char psz_buffer[10000];
     char psz_short[4];
-    int i_index;
     int i_width = ConsoleWidth() - (PADDING_SPACES+LINE_START+1);
     int i_width_description = i_width + PADDING_SPACES - 1;
     bool b_advanced    = config_GetInt( p_this, "advanced" ) > 0;
@@ -1466,7 +1464,9 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search )
     }
 
     /* List all modules */
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+    module_t **list = module_list_get (NULL);
+    if (!list)
+        return;
 
     /* Ugly hack to make sure that the help options always come first
      * (part 1) */
@@ -1474,10 +1474,10 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search )
         Usage( p_this, "help" );
 
     /* Enumerate the config for each module */
-    for( i_index = 0; i_index < p_list->i_count; i_index++ )
+    for (size_t i = 0; list[i]; i++)
     {
         bool b_help_module;
-        module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object;
+        module_t *p_parser = list[i];
         module_config_t *p_item = NULL;
         module_config_t *p_section = NULL;
         module_config_t *p_end = p_parser->p_config + p_parser->confsize;
@@ -1870,7 +1870,7 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search )
     }
 
     /* Release the module list */
-    vlc_list_release( p_list );
+    module_list_free (list);
 }
 
 /*****************************************************************************
@@ -1881,10 +1881,8 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search )
  *****************************************************************************/
 static void ListModules( libvlc_int_t *p_this, bool b_verbose )
 {
-    vlc_list_t *p_list = NULL;
-    module_t *p_parser = NULL;
+    module_t *p_parser;
     char psz_spaces[22];
-    int i_index;
 
     bool b_color = config_GetInt( p_this, "color" ) > 0;
 
@@ -1895,15 +1893,13 @@ static void ListModules( libvlc_int_t *p_this, bool b_verbose )
 #endif
 
     /* List all modules */
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+    module_t **list = module_list_get (NULL);
 
     /* Enumerate each module */
-    for( i_index = 0; i_index < p_list->i_count; i_index++ )
+    for (size_t j = 0; (p_parser = list[j]) != NULL; j++)
     {
         int i;
 
-        p_parser = (module_t *)p_list->p_values[i_index].p_object ;
-
         /* Nasty hack, but right now I'm too tired to think about a nice
          * solution */
         i = 22 - strlen( p_parser->psz_object_name ) - 1;
@@ -1951,8 +1947,7 @@ static void ListModules( libvlc_int_t *p_this, bool b_verbose )
 
         psz_spaces[i] = ' ';
     }
-
-    vlc_list_release( p_list );
+    module_list_free (list);
 
 #ifdef WIN32        /* Pause the console because it's destroyed when we exit */
     PauseConsole();
index 12a9e2e..466adfb 100644 (file)
@@ -212,6 +212,8 @@ __module_GetModulesNamesForCapability
 module_GetName
 module_GetObjName
 module_IsCapable
+module_list_free
+module_list_get
 __module_Need
 module_Put
 module_PutConfig