Commit e7abe37c authored by gbazin's avatar gbazin

* include/*,src/*: New plugins cache feature for faster load times.

   This is still experimental so isn't enabled by default (use --plugins-cache).
   There are also a few issues that aren't dealt with yet:
     - translation of module strings.
     - config options callbacks and actions.
     - a few memory leaks.
     - and likely other things ;)
   You can easily reset the plugins cache with --reset-plugins-cache.
parent cda63044
...@@ -55,6 +55,17 @@ struct module_bank_t ...@@ -55,6 +55,17 @@ struct module_bank_t
VLC_COMMON_MEMBERS VLC_COMMON_MEMBERS
module_symbols_t symbols; module_symbols_t symbols;
/* Plugins cache */
vlc_bool_t b_cache;
vlc_bool_t b_cache_dirty;
vlc_bool_t b_cache_delete;
int i_cache;
module_cache_t **pp_cache;
int i_loaded_cache;
module_cache_t **pp_loaded_cache;
}; };
/***************************************************************************** /*****************************************************************************
...@@ -104,6 +115,7 @@ struct module_t ...@@ -104,6 +115,7 @@ struct module_t
char * psz_filename; /* Module filename */ char * psz_filename; /* Module filename */
vlc_bool_t b_builtin; /* Set to true if the module is built in */ vlc_bool_t b_builtin; /* Set to true if the module is built in */
vlc_bool_t b_loaded; /* Set to true if the dll is loaded */
/* /*
* Symbol table we send to the module so that it can access vlc symbols * Symbol table we send to the module so that it can access vlc symbols
...@@ -111,6 +123,21 @@ struct module_t ...@@ -111,6 +123,21 @@ struct module_t
module_symbols_t *p_symbols; module_symbols_t *p_symbols;
}; };
/*****************************************************************************
* Module cache description structure
*****************************************************************************/
struct module_cache_t
{
/* Mandatory cache entry header */
char *psz_file;
int64_t i_time;
int64_t i_size;
vlc_bool_t b_junk;
/* Optional extra data */
module_t *p_module;
};
/***************************************************************************** /*****************************************************************************
* Exported functions. * Exported functions.
*****************************************************************************/ *****************************************************************************/
......
...@@ -199,6 +199,7 @@ typedef struct module_bank_t module_bank_t; ...@@ -199,6 +199,7 @@ typedef struct module_bank_t module_bank_t;
typedef struct module_t module_t; typedef struct module_t module_t;
typedef struct module_config_t module_config_t; typedef struct module_config_t module_config_t;
typedef struct module_symbols_t module_symbols_t; typedef struct module_symbols_t module_symbols_t;
typedef struct module_cache_t module_cache_t;
/* Interface */ /* Interface */
typedef struct intf_thread_t intf_thread_t; typedef struct intf_thread_t intf_thread_t;
......
...@@ -58,6 +58,7 @@ ...@@ -58,6 +58,7 @@
# define CONFIG_DIR ".vlc" # define CONFIG_DIR ".vlc"
#endif #endif
#define CONFIG_FILE "vlcrc" #define CONFIG_FILE "vlcrc"
#define PLUGINSCACHE_FILE "vlcplugins"
/***************************************************************************** /*****************************************************************************
* Interface configuration * Interface configuration
......
...@@ -340,6 +340,12 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) ...@@ -340,6 +340,12 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
p_vlc->psz_homedir = config_GetHomeDir(); p_vlc->psz_homedir = config_GetHomeDir();
p_vlc->psz_configfile = config_GetPsz( p_vlc, "config" ); p_vlc->psz_configfile = config_GetPsz( p_vlc, "config" );
/* Check for plugins cache options */
if( config_GetInt( p_vlc, "reset-plugins-cache" ) )
{
libvlc.p_module_bank->b_cache_delete = VLC_TRUE;
}
/* Hack: remove the help module here */ /* Hack: remove the help module here */
vlc_object_detach( p_help_module ); vlc_object_detach( p_help_module );
/* End hack */ /* End hack */
...@@ -729,6 +735,11 @@ int VLC_Destroy( int i_object ) ...@@ -729,6 +735,11 @@ int VLC_Destroy( int i_object )
p_vlc->p_memcpy_module = NULL; p_vlc->p_memcpy_module = NULL;
} }
/*
* XXX: Free module bank !
*/
module_EndBank( p_vlc );
if( p_vlc->psz_homedir ) if( p_vlc->psz_homedir )
{ {
free( p_vlc->psz_homedir ); free( p_vlc->psz_homedir );
...@@ -747,11 +758,6 @@ int VLC_Destroy( int i_object ) ...@@ -747,11 +758,6 @@ int VLC_Destroy( int i_object )
p_vlc->p_hotkeys = NULL; p_vlc->p_hotkeys = NULL;
} }
/*
* XXX: Free module bank !
*/
/*module_EndBank( p_vlc );*/
/* /*
* System specific cleaning code * System specific cleaning code
*/ */
......
...@@ -86,16 +86,6 @@ static char *ppsz_language_text[] = ...@@ -86,16 +86,6 @@ static char *ppsz_language_text[] =
"show all the available options, including those that most users should " \ "show all the available options, including those that most users should " \
"never touch.") "never touch.")
#define INTF_PATH_TEXT N_("Interface default search path")
#define INTF_PATH_LONGTEXT N_( \
"This option allows you to set the default path that the interface will " \
"open when looking for a file.")
#define PLUGIN_PATH_TEXT N_("Modules search path")
#define PLUGIN_PATH_LONGTEXT N_( \
"This option allows you to specify an additional path for VLC to look " \
"for its modules.")
#define AOUT_CAT_LONGTEXT N_( \ #define AOUT_CAT_LONGTEXT N_( \
"These options allow you to modify the behavior of the audio " \ "These options allow you to modify the behavior of the audio " \
"subsystem, and to add audio filters which can be used for " \ "subsystem, and to add audio filters which can be used for " \
...@@ -586,10 +576,20 @@ static char *ppsz_align_descriptions[] = ...@@ -586,10 +576,20 @@ static char *ppsz_align_descriptions[] =
"priorities. You can use it to tune VLC priority against other " \ "priorities. You can use it to tune VLC priority against other " \
"programs, or against other VLC instances.") "programs, or against other VLC instances.")
#define MINIMIZE_THREADS_TXT N_("Minimize number of threads") #define MINIMIZE_THREADS_TEXT N_("Minimize number of threads")
#define MINIMIZE_THREADS_LONGTXT N_( \ #define MINIMIZE_THREADS_LONGTEXT N_( \
"This option minimizes the number of threads needed to run VLC") "This option minimizes the number of threads needed to run VLC")
#define PLUGIN_PATH_TEXT N_("Modules search path")
#define PLUGIN_PATH_LONGTEXT N_( \
"This option allows you to specify an additional path for VLC to look " \
"for its modules.")
#define PLUGINS_CACHE_TEXT N_("Use a plugins cache")
#define PLUGINS_CACHE_LONGTEXT N_( \
"This option allows you to use a plugins cache which will greatly " \
"improve the start time of VLC.")
#define ONEINSTANCE_TEXT N_("Allow only one running instance") #define ONEINSTANCE_TEXT N_("Allow only one running instance")
#define ONEINSTANCE_LONGTEXT N_( \ #define ONEINSTANCE_LONGTEXT N_( \
"Allowing only one running instance of VLC can sometimes be useful, " \ "Allowing only one running instance of VLC can sometimes be useful, " \
...@@ -767,10 +767,6 @@ vlc_module_begin(); ...@@ -767,10 +767,6 @@ vlc_module_begin();
add_bool( "color", 0, NULL, COLOR_TEXT, COLOR_LONGTEXT, VLC_TRUE ); add_bool( "color", 0, NULL, COLOR_TEXT, COLOR_LONGTEXT, VLC_TRUE );
add_bool( "advanced", 0, NULL, ADVANCED_TEXT, add_bool( "advanced", 0, NULL, ADVANCED_TEXT,
ADVANCED_LONGTEXT, VLC_FALSE ); ADVANCED_LONGTEXT, VLC_FALSE );
add_directory( "search-path", NULL, NULL, INTF_PATH_TEXT,
INTF_PATH_LONGTEXT, VLC_TRUE );
add_directory( "plugin-path", NULL, NULL,
PLUGIN_PATH_TEXT, PLUGIN_PATH_LONGTEXT, VLC_TRUE );
/* Audio options */ /* Audio options */
add_category_hint( N_("Audio"), AOUT_CAT_LONGTEXT , VLC_FALSE ); add_category_hint( N_("Audio"), AOUT_CAT_LONGTEXT , VLC_FALSE );
...@@ -956,25 +952,38 @@ vlc_module_begin(); ...@@ -956,25 +952,38 @@ vlc_module_begin();
/* Misc options */ /* Misc options */
add_category_hint( N_("Miscellaneous"), MISC_CAT_LONGTEXT, VLC_TRUE ); add_category_hint( N_("Miscellaneous"), MISC_CAT_LONGTEXT, VLC_TRUE );
add_module( "memcpy", "memcpy", NULL, NULL, MEMCPY_TEXT, MEMCPY_LONGTEXT, VLC_TRUE ); add_module( "memcpy", "memcpy", NULL, NULL, MEMCPY_TEXT,
add_module( "access", "access", NULL, NULL, ACCESS_TEXT, ACCESS_LONGTEXT, VLC_TRUE ); MEMCPY_LONGTEXT, VLC_TRUE );
add_module( "demux", "demux", NULL, NULL, DEMUX_TEXT, DEMUX_LONGTEXT, VLC_TRUE ); add_module( "access", "access", NULL, NULL, ACCESS_TEXT,
ACCESS_LONGTEXT, VLC_TRUE );
add_bool( "minimize-threads", 0, NULL, MINIMIZE_THREADS_TXT, MINIMIZE_THREADS_LONGTXT, VLC_TRUE ); add_module( "demux", "demux", NULL, NULL, DEMUX_TEXT,
DEMUX_LONGTEXT, VLC_TRUE );
add_bool( "minimize-threads", 0, NULL, MINIMIZE_THREADS_TEXT,
MINIMIZE_THREADS_LONGTEXT, VLC_TRUE );
add_directory( "plugin-path", NULL, NULL, PLUGIN_PATH_TEXT,
PLUGIN_PATH_LONGTEXT, VLC_TRUE );
add_bool( "plugins-cache", 0, NULL, PLUGINS_CACHE_TEXT,
PLUGINS_CACHE_LONGTEXT, VLC_TRUE );
#if !defined(SYS_DARWIN) && !defined(SYS_BEOS) && defined(PTHREAD_COND_T_IN_PTHREAD_H) #if !defined(SYS_DARWIN) && !defined(SYS_BEOS) && defined(PTHREAD_COND_T_IN_PTHREAD_H)
add_bool( "rt-priority", 0, NULL, RT_PRIORITY_TEXT, RT_PRIORITY_LONGTEXT, VLC_TRUE ); add_bool( "rt-priority", 0, NULL, RT_PRIORITY_TEXT,
RT_PRIORITY_LONGTEXT, VLC_TRUE );
#endif #endif
#if !defined(SYS_BEOS) && defined(PTHREAD_COND_T_IN_PTHREAD_H) #if !defined(SYS_BEOS) && defined(PTHREAD_COND_T_IN_PTHREAD_H)
add_integer( "rt-offset", 0, NULL, RT_OFFSET_TEXT, RT_OFFSET_LONGTEXT, VLC_TRUE ); add_integer( "rt-offset", 0, NULL, RT_OFFSET_TEXT,
RT_OFFSET_LONGTEXT, VLC_TRUE );
#endif #endif
#if defined(WIN32) #if defined(WIN32)
add_bool( "one-instance", 0, NULL, ONEINSTANCE_TEXT, ONEINSTANCE_LONGTEXT, VLC_TRUE ); add_bool( "one-instance", 0, NULL, ONEINSTANCE_TEXT,
add_bool( "high-priority", 0, NULL, HPRIORITY_TEXT, HPRIORITY_LONGTEXT, VLC_TRUE ); ONEINSTANCE_LONGTEXT, VLC_TRUE );
add_bool( "fast-mutex", 0, NULL, FAST_MUTEX_TEXT, FAST_MUTEX_LONGTEXT, VLC_TRUE ); add_bool( "high-priority", 0, NULL, HPRIORITY_TEXT,
add_integer( "win9x-cv-method", 1, NULL, WIN9X_CV_TEXT, WIN9X_CV_LONGTEXT, VLC_TRUE ); HPRIORITY_LONGTEXT, VLC_TRUE );
add_bool( "fast-mutex", 0, NULL, FAST_MUTEX_TEXT,
FAST_MUTEX_LONGTEXT, VLC_TRUE );
add_integer( "win9x-cv-method", 1, NULL, WIN9X_CV_TEXT,
WIN9X_CV_LONGTEXT, VLC_TRUE );
#endif #endif
/* Hotkey options*/ /* Hotkey options*/
...@@ -1108,6 +1117,8 @@ static module_config_t p_help_config[] = ...@@ -1108,6 +1117,8 @@ static module_config_t p_help_config[] =
N_("reset the current config to the default values") }, N_("reset the current config to the default values") },
{ CONFIG_ITEM_STRING, NULL, "config", '\0', { CONFIG_ITEM_STRING, NULL, "config", '\0',
N_("use alternate config file") }, N_("use alternate config file") },
{ CONFIG_ITEM_BOOL, NULL, "reset-plugins-cache", '\0',
N_("resets the current plugins cache") },
{ CONFIG_ITEM_BOOL, NULL, "version", '\0', { CONFIG_ITEM_BOOL, NULL, "version", '\0',
N_("print version information") }, N_("print version information") },
{ CONFIG_HINT_END, NULL, NULL, '\0', NULL } { CONFIG_HINT_END, NULL, NULL, '\0', NULL }
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
* configuration.c management of the modules configuration * configuration.c management of the modules configuration
***************************************************************************** *****************************************************************************
* Copyright (C) 2001-2004 VideoLAN * Copyright (C) 2001-2004 VideoLAN
* $Id: configuration.c,v 1.76 2004/01/29 17:04:01 gbazin Exp $ * $Id$
* *
* Authors: Gildas Bazin <gbazin@netcourrier.com> * Authors: Gildas Bazin <gbazin@videolan.org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -909,6 +909,45 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name ) ...@@ -909,6 +909,45 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
return 0; return 0;
} }
/*****************************************************************************
* config_CreateConfigDir: Create configuration directory if it doesn't exist.
*****************************************************************************/
int config_CreateDir( vlc_object_t *p_this, char *psz_dirname )
{
if( !psz_dirname && !*psz_dirname ) return -1;
#if defined( UNDER_CE )
{
wchar_t psz_new[ MAX_PATH ];
MultiByteToWideChar( CP_ACP, 0, psz_dirname, -1, psz_new, MAX_PATH );
if( CreateDirectory( psz_new, NULL ) )
{
msg_Err( p_this, "could not create %s", psz_filename );
}
}
#elif defined( HAVE_ERRNO_H )
# if defined( WIN32 )
if( mkdir( psz_dirname ) && errno != EEXIST )
# else
if( mkdir( psz_dirname, 0755 ) && errno != EEXIST )
# endif
{
msg_Err( p_this, "could not create %s (%s)",
psz_dirname, strerror(errno) );
}
#else
if( mkdir( psz_dirname ) )
{
msg_Err( p_this, "could not create %s", psz_dirname );
}
#endif
return 0;
}
/***************************************************************************** /*****************************************************************************
* config_SaveConfigFile: Save a module's config options. * config_SaveConfigFile: Save a module's config options.
***************************************************************************** *****************************************************************************
...@@ -967,35 +1006,7 @@ int __config_SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name ) ...@@ -967,35 +1006,7 @@ int __config_SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name )
return -1; return -1;
} }
#if defined( UNDER_CE ) config_CreateDir( p_this, psz_filename );
{
wchar_t psz_new[ MAX_PATH ];
MultiByteToWideChar( CP_ACP, 0, psz_filename, -1, psz_new,
MAX_PATH );
if( CreateDirectory( psz_new, NULL ) )
{
msg_Err( p_this, "could not create %s", psz_filename );
}
}
#elif defined( HAVE_ERRNO_H )
# if defined( WIN32 )
if( mkdir( psz_filename ) && errno != EEXIST )
# else
if( mkdir( psz_filename, 0755 ) && errno != EEXIST )
# endif
{
msg_Err( p_this, "could not create %s (%s)",
psz_filename, strerror(errno) );
}
#else
if( mkdir( psz_filename ) )
{
msg_Err( p_this, "could not create %s", psz_filename );
}
#endif
strcat( psz_filename, "/" CONFIG_FILE ); strcat( psz_filename, "/" CONFIG_FILE );
} }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
* Authors: Sam Hocevar <sam@zoy.org> * Authors: Sam Hocevar <sam@zoy.org>
* Ethan C. Baldridge <BaldridgeE@cadmus.com> * Ethan C. Baldridge <BaldridgeE@cadmus.com>
* Hans-Peter Jansen <hpj@urpla.net> * Hans-Peter Jansen <hpj@urpla.net>
* Gildas Bazin <gbazin@videolan.org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -133,9 +134,10 @@ ...@@ -133,9 +134,10 @@
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
#ifdef HAVE_DYNAMIC_PLUGINS #ifdef HAVE_DYNAMIC_PLUGINS
static void AllocateAllPlugins ( vlc_object_t * ); static void AllocateAllPlugins ( vlc_object_t * );
static void AllocatePluginDir ( vlc_object_t *, const MYCHAR *, int ); static void AllocatePluginDir ( vlc_object_t *, const char *, int );
static int AllocatePluginFile ( vlc_object_t *, MYCHAR * ); static int AllocatePluginFile ( vlc_object_t *, char *, int64_t, int64_t );
static module_t * AllocatePlugin( vlc_object_t *, char * );
#endif #endif
static int AllocateBuiltinModule( vlc_object_t *, int ( * ) ( module_t * ) ); static int AllocateBuiltinModule( vlc_object_t *, int ( * ) ( module_t * ) );
static int DeleteModule ( module_t * ); static int DeleteModule ( module_t * );
...@@ -143,8 +145,16 @@ static int DeleteModule ( module_t * ); ...@@ -143,8 +145,16 @@ static int DeleteModule ( module_t * );
static void DupModule ( module_t * ); static void DupModule ( module_t * );
static void UndupModule ( module_t * ); static void UndupModule ( module_t * );
static int CallEntry ( module_t * ); static int CallEntry ( module_t * );
static int LoadModule ( vlc_object_t *, char *, module_handle_t * );
static void CloseModule ( module_handle_t ); static void CloseModule ( module_handle_t );
static void * GetSymbol ( module_handle_t, const char * ); static void * GetSymbol ( module_handle_t, const char * );
static void CacheLoad ( vlc_object_t * );
static void CacheLoadConfig ( module_t *, FILE * );
static void CacheSave ( vlc_object_t * );
static void CacheSaveConfig ( module_t *, FILE * );
static void CacheMerge ( vlc_object_t *, module_t *, module_t * );
static module_cache_t * CacheFind( vlc_object_t *, char *, int64_t, int64_t );
#if defined(HAVE_DL_WINDOWS) #if defined(HAVE_DL_WINDOWS)
static char * GetWindowsError ( void ); static char * GetWindowsError ( void );
#endif #endif
...@@ -162,6 +172,10 @@ void __module_InitBank( vlc_object_t *p_this ) ...@@ -162,6 +172,10 @@ void __module_InitBank( vlc_object_t *p_this )
p_bank = vlc_object_create( p_this, sizeof(module_bank_t) ); p_bank = vlc_object_create( p_this, sizeof(module_bank_t) );
p_bank->psz_object_name = "module bank"; p_bank->psz_object_name = "module bank";
p_bank->i_cache = p_bank->i_loaded_cache = 0;
p_bank->pp_cache = p_bank->pp_loaded_cache = 0;
p_bank->b_cache = p_bank->b_cache_dirty =
p_bank->b_cache_delete = VLC_FALSE;
/* /*
* Store the symbols to be exported * Store the symbols to be exported
...@@ -199,6 +213,10 @@ void __module_EndBank( vlc_object_t *p_this ) ...@@ -199,6 +213,10 @@ void __module_EndBank( vlc_object_t *p_this )
{ {
module_t * p_next; module_t * p_next;
#ifdef HAVE_DYNAMIC_PLUGINS
if( p_this->p_libvlc->p_module_bank->b_cache ) CacheSave( p_this );
#endif
vlc_object_detach( p_this->p_libvlc->p_module_bank ); vlc_object_detach( p_this->p_libvlc->p_module_bank );
while( p_this->p_libvlc->p_module_bank->i_children ) while( p_this->p_libvlc->p_module_bank->i_children )
...@@ -255,6 +273,13 @@ void __module_LoadPlugins( vlc_object_t * p_this ) ...@@ -255,6 +273,13 @@ void __module_LoadPlugins( vlc_object_t * p_this )
{ {
#ifdef HAVE_DYNAMIC_PLUGINS #ifdef HAVE_DYNAMIC_PLUGINS
msg_Dbg( p_this, "checking plugin modules" ); msg_Dbg( p_this, "checking plugin modules" );
if( config_GetInt( p_this, "plugins-cache" ) )
p_this->p_libvlc->p_module_bank->b_cache = VLC_TRUE;
if( p_this->p_libvlc->p_module_bank->b_cache ||
p_this->p_libvlc->p_module_bank->b_cache_delete ) CacheLoad( p_this );
AllocateAllPlugins( p_this ); AllocateAllPlugins( p_this );
#endif #endif
} }
...@@ -516,6 +541,23 @@ module_t * __module_Need( vlc_object_t *p_this, const char *psz_capability, ...@@ -516,6 +541,23 @@ module_t * __module_Need( vlc_object_t *p_this, const char *psz_capability,
p_tmp = p_first; p_tmp = p_first;
while( p_tmp != NULL ) while( p_tmp != NULL )
{ {
#ifdef HAVE_DYNAMIC_PLUGINS
/* Make sure the module is loaded in mem */
module_t *p_module = p_tmp->p_module->b_submodule ?
(module_t *)p_tmp->p_module->p_parent : p_tmp->p_module;
if( !p_module->b_builtin && !p_module->b_loaded )
{
module_t *p_new_module =
AllocatePlugin( p_this, p_module->psz_filename );
if( p_new_module )
{
CacheMerge( p_this, p_module, p_new_module );
vlc_object_attach( p_new_module, p_module );
DeleteModule( p_new_module );
}
}
#endif
if( p_tmp->p_module->pf_activate if( p_tmp->p_module->pf_activate
&& p_tmp->p_module->pf_activate( p_this ) == VLC_SUCCESS ) && p_tmp->p_module->pf_activate( p_this ) == VLC_SUCCESS )
{ {
...@@ -614,13 +656,9 @@ static void AllocateAllPlugins( vlc_object_t *p_this ) ...@@ -614,13 +656,9 @@ static void AllocateAllPlugins( vlc_object_t *p_this )
char ** ppsz_path = path; char ** ppsz_path = path;
char * psz_fullpath; char * psz_fullpath;
#if defined( UNDER_CE )
wchar_t psz_dir[MAX_PATH];
#endif
/* If the user provided a plugin path, we add it to the list */ /* If the user provided a plugin path, we add it to the list */
path[ sizeof(path)/sizeof(char*) - 2 ] = config_GetPsz( p_this, path[ sizeof(path)/sizeof(char*) - 2 ] =
"plugin-path" ); config_GetPsz( p_this, "plugin-path" );
for( ; *ppsz_path != NULL ; ppsz_path++ ) for( ; *ppsz_path != NULL ; ppsz_path++ )
{ {
...@@ -659,12 +697,7 @@ static void AllocateAllPlugins( vlc_object_t *p_this ) ...@@ -659,12 +697,7 @@ static void AllocateAllPlugins( vlc_object_t *p_this )
msg_Dbg( p_this, "recursively browsing `%s'", psz_fullpath ); msg_Dbg( p_this, "recursively browsing `%s'", psz_fullpath );
/* Don't go deeper than 5 subdirectories */ /* Don't go deeper than 5 subdirectories */
#if defined( UNDER_CE )
MultiByteToWideChar( CP_ACP, 0, psz_fullpath, -1, psz_dir, MAX_PATH );
AllocatePluginDir( p_this, psz_dir, 5 );
#else
AllocatePluginDir( p_this, psz_fullpath, 5 ); AllocatePluginDir( p_this, psz_fullpath, 5 );
#endif
free( psz_fullpath ); free( psz_fullpath );
} }
...@@ -678,12 +711,13 @@ static void AllocateAllPlugins( vlc_object_t *p_this ) ...@@ -678,12 +711,13 @@ static void AllocateAllPlugins( vlc_object_t *p_this )
/***************************************************************************** /*****************************************************************************
* AllocatePluginDir: recursively parse a directory to look for plugins * AllocatePluginDir: recursively parse a directory to look for plugins
*****************************************************************************/ *****************************************************************************/
static void AllocatePluginDir( vlc_object_t *p_this, const MYCHAR *psz_dir, static void AllocatePluginDir( vlc_object_t *p_this, const char *psz_dir,
int i_maxdepth ) int i_maxdepth )
{ {
#if defined( UNDER_CE ) || defined( _MSC_VER ) #if defined( UNDER_CE ) || defined( _MSC_VER )
#ifdef UNDER_CE #ifdef UNDER_CE
MYCHAR psz_path[MAX_PATH + 256]; MYCHAR psz_path[MAX_PATH + 256];
wchar_t psz_wdir[MAX_PATH];
#else #else
char psz_path[MAX_PATH + 256]; char psz_path[MAX_PATH + 256];
#endif #endif
...@@ -693,9 +727,9 @@ static void AllocatePluginDir( vlc_object_t *p_this, const MYCHAR *psz_dir, ...@@ -693,9 +727,9 @@ static void AllocatePluginDir( vlc_object_t *p_this, const MYCHAR *psz_dir,
#else #else
int i_dirlen; int i_dirlen;
DIR * dir; DIR * dir;
char * psz_file;
struct dirent * file; struct dirent * file;
#endif #endif
char * psz_file;
if( p_this->p_vlc->b_die || i_maxdepth < 0 ) if( p_this->p_vlc->b_die || i_maxdepth < 0 )
{ {
...@@ -703,7 +737,9 @@ static void AllocatePluginDir( vlc_object_t *p_this, const MYCHAR *psz_dir, ...@@ -703,7 +737,9 @@ static void AllocatePluginDir( vlc_object_t *p_this, const MYCHAR *psz_dir,
} }
#if defined( UNDER_CE ) || defined( _MSC_VER ) #if defined( UNDER_CE ) || defined( _MSC_VER )
rc = GetFileAttributes( psz_dir ); MultiByteToWideChar( CP_ACP, 0, psz_dir, -1, psz_wdir, MAX_PATH );
rc = GetFileAttributes( psz_wdir );
if( !(rc & FILE_ATTRIBUTE_DIRECTORY) ) if( !(rc & FILE_ATTRIBUTE_DIRECTORY) )
{ {
/* Not a directory */ /* Not a directory */
...@@ -754,7 +790,16 @@ static void AllocatePluginDir( vlc_object_t *p_this, const MYCHAR *psz_dir, ...@@ -754,7 +790,16 @@ static void AllocatePluginDir( vlc_object_t *p_this, const MYCHAR *psz_dir,
LIBEXT, strlen( LIBEXT ) ) ) LIBEXT, strlen( LIBEXT ) ) )
#endif #endif
{ {
AllocatePluginFile( p_this, psz_path ); #ifdef UNDER_CE
char psz_filename[MAX_PATH];
WideCharToMultiByte( CP_ACP, WC_DEFAULTCHAR, psz_path, -1,
psz_filename, MAX_PATH, NULL, NULL );
psz_file = psz_filename;
#else
psz_file = psz_path;
#endif
AllocatePluginFile( p_this, psz_file, 0, 0 );
} }
} }