]> git.sesse.net Git - vlc/blobdiff - src/modules/modules.c
services_discovery: no need to attach to events twice
[vlc] / src / modules / modules.c
index 142e88a7dd530f0acb5243d89c54359d1ab68edc..b648861ec2812ec289b3382bbbf2754c7ccf0309 100644 (file)
@@ -49,6 +49,9 @@
 #ifdef HAVE_UNISTD_H
 #   include <unistd.h>
 #endif
+#ifdef ENABLE_NLS
+# include <libintl.h>
+#endif
 
 #include "config/configuration.h"
 
@@ -197,7 +200,7 @@ void module_EndBank( vlc_object_t *p_this, bool b_plugins )
  * \param p_this vlc object structure
  * \return nothing
  */
-void module_LoadPlugins( vlc_object_t * p_this, bool b_cache_delete )
+void module_LoadPlugins( vlc_object_t * p_this )
 {
     module_bank_t *p_bank = p_module_bank;
 
@@ -210,11 +213,7 @@ void module_LoadPlugins( vlc_object_t * p_this, bool b_cache_delete )
         msg_Dbg( p_this, "checking plugin modules" );
         p_module_bank->b_cache = var_InheritBool( p_this, "plugins-cache" );
 
-        if( p_module_bank->b_cache || b_cache_delete )
-            CacheLoad( p_this, p_module_bank, b_cache_delete );
         AllocateAllPlugins( p_this, p_module_bank );
-        if( p_module_bank->b_cache )
-            CacheSave( p_this, p_bank );
         config_UnsortConfig ();
         config_SortConfig ();
     }
@@ -293,6 +292,24 @@ int module_get_score( const module_t *m )
     return m->i_score;
 }
 
+/**
+ * Translate a string using the module's text domain
+ *
+ * \param m the module
+ * \param str the American English ASCII string to localize
+ * \return the gettext-translated string
+ */
+const char *module_gettext (const module_t *m, const char *str)
+{
+#ifdef ENABLE_NLS
+    const char *domain = m->domain ? m->domain : PACKAGE_NAME;
+    return dgettext (domain, str);
+#else
+    (void)m;
+    return str;
+#endif
+}
+
 module_t *module_hold (module_t *m)
 {
     vlc_hold (&m->vlc_gc_data);
@@ -815,6 +832,7 @@ static void AllocateAllPlugins( vlc_object_t *p_this, module_bank_t *p_bank )
     int count,i;
     char * path;
     vlc_array_t *arraypaths = vlc_array_new();
+    const bool b_reset = var_InheritBool( p_this, "reset-plugins-cache" );
 
     /* Contruct the special search path for system that have a relocatable
      * executable. Set it to <vlc path>/modules and <vlc path>/plugins. */
@@ -845,11 +863,19 @@ static void AllocateAllPlugins( vlc_object_t *p_this, module_bank_t *p_bank )
         if( !path )
             continue;
 
+        size_t offset = p_module_bank->i_loaded_cache;
+        if( b_reset )
+            CacheDelete( p_this, path );
+        else
+            CacheLoad( p_this, p_module_bank, path );
+
         msg_Dbg( p_this, "recursively browsing `%s'", path );
 
         /* Don't go deeper than 5 subdirectories */
         AllocatePluginDir( p_this, p_bank, path, 5 );
 
+        CacheSave( p_this, path, p_module_bank->pp_loaded_cache + offset,
+                   p_module_bank->i_loaded_cache - offset );
         free( path );
     }
 
@@ -939,6 +965,10 @@ static int AllocatePluginFile( vlc_object_t * p_this, module_bank_t *p_bank,
         p_module = p_cache_entry->p_module;
         p_module->b_loaded = false;
 
+        /* If plugin-path contains duplicate entries... */
+        if( p_module->next != NULL )
+            return 0; /* already taken care of that one */
+
         /* For now we force loading if the module's config contains
          * callbacks or actions.
          * Could be optimized by adding an API call.*/
@@ -956,6 +986,9 @@ static int AllocatePluginFile( vlc_object_t * p_this, module_bank_t *p_bank,
     if( p_module == NULL )
         return -1;
 
+    /* We have not already scanned and inserted this module */
+    assert( p_module->next == NULL );
+
     /* Everything worked fine !
      * The module is ready to be added to the list. */
     p_module->b_builtin = false;
@@ -964,6 +997,7 @@ static int AllocatePluginFile( vlc_object_t * p_this, module_bank_t *p_bank,
                 p_module->psz_object_name, p_module->psz_longname ); */
     p_module->next = p_bank->head;
     p_bank->head = p_module;
+    assert( p_module->next != NULL ); /* Insertion done */
 
     if( !p_module_bank->b_cache )
         return 0;
@@ -1055,6 +1089,7 @@ static void DupModule( module_t *p_module )
     p_module->psz_longname = strdup( p_module->psz_longname );
     p_module->psz_help = p_module->psz_help ? strdup( p_module->psz_help )
                                             : NULL;
+    p_module->domain = p_module->domain ? strdup( p_module->domain ) : NULL;
 
     for (module_t *subm = p_module->submodule; subm; subm = subm->next)
         DupModule (subm);
@@ -1081,6 +1116,7 @@ static void UndupModule( module_t *p_module )
     FREENULL( p_module->psz_shortname );
     free( p_module->psz_longname );
     FREENULL( p_module->psz_help );
+    free( p_module->domain );
 }
 
 #endif /* HAVE_DYNAMIC_PLUGINS */