Commit 61449225 authored by Antoine Cellerier's avatar Antoine Cellerier

XDG Base Directory Specification fix. I wasn't using the XDG_CACHE_HOME...

XDG Base Directory Specification fix. I wasn't using the XDG_CACHE_HOME variable for the cache directory. Thanks to ILEoo for noticing.
parent 3adc5bfc
...@@ -41,7 +41,8 @@ struct libvlc_int_t ...@@ -41,7 +41,8 @@ struct libvlc_int_t
char * psz_homedir; ///< user's home directory char * psz_homedir; ///< user's home directory
char * psz_configdir; ///< user's configuration directory char * psz_configdir; ///< user's configuration directory
char * psz_datadir; ///< user's data/cache directory char * psz_datadir; ///< user's data directory
char * psz_cachedir; ///< user's cache directory
char * psz_configfile; ///< location of config file char * psz_configfile; ///< location of config file
......
...@@ -236,10 +236,10 @@ static void ArtCacheCreateDir( const char *psz_dir ) ...@@ -236,10 +236,10 @@ static void ArtCacheCreateDir( const char *psz_dir )
{ {
while( *psz && *psz != DIR_SEP_CHAR) psz++; while( *psz && *psz != DIR_SEP_CHAR) psz++;
if( !*psz ) break; if( !*psz ) break;
*psz = 0; *psz = 0;
if( !EMPTY_STR( psz_newdir ) ) utf8_mkdir( psz_newdir ); if( !EMPTY_STR( psz_newdir ) ) utf8_mkdir( psz_newdir );
*psz = DIR_SEP_CHAR; *psz = DIR_SEP_CHAR;
psz++; psz++;
} }
utf8_mkdir( psz_dir ); utf8_mkdir( psz_dir );
} }
...@@ -275,7 +275,7 @@ static void __ArtCacheGetDirPath( vlc_object_t *p_obj, ...@@ -275,7 +275,7 @@ static void __ArtCacheGetDirPath( vlc_object_t *p_obj,
snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP
"art" DIR_SEP "artistalbum" DIR_SEP "%s" DIR_SEP "%s", "art" DIR_SEP "artistalbum" DIR_SEP "%s" DIR_SEP "%s",
p_obj->p_libvlc->psz_datadir, p_obj->p_libvlc->psz_cachedir,
psz_artist_sanitized, psz_album_sanitized ); psz_artist_sanitized, psz_album_sanitized );
free( psz_album_sanitized ); free( psz_album_sanitized );
free( psz_artist_sanitized ); free( psz_artist_sanitized );
...@@ -285,7 +285,7 @@ static void __ArtCacheGetDirPath( vlc_object_t *p_obj, ...@@ -285,7 +285,7 @@ static void __ArtCacheGetDirPath( vlc_object_t *p_obj,
char * psz_title_sanitized = ArtCacheGetSanitizedFileName( psz_title ); char * psz_title_sanitized = ArtCacheGetSanitizedFileName( psz_title );
snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP snprintf( psz_dir, MAX_PATH, "%s" DIR_SEP
"art" DIR_SEP "title" DIR_SEP "%s", "art" DIR_SEP "title" DIR_SEP "%s",
p_obj->p_libvlc->psz_datadir, p_obj->p_libvlc->psz_cachedir,
psz_title_sanitized ); psz_title_sanitized );
free( psz_title_sanitized ); free( psz_title_sanitized );
} }
...@@ -417,7 +417,7 @@ int input_DownloadAndCacheArt( playlist_t *p_playlist, input_item_t *p_item ) ...@@ -417,7 +417,7 @@ int input_DownloadAndCacheArt( playlist_t *p_playlist, input_item_t *p_item )
} }
psz_type = strrchr( psz_arturl, '.' ); psz_type = strrchr( psz_arturl, '.' );
if( strlen( psz_type ) > 5 ) if( strlen( psz_type ) > 5 )
psz_type = NULL; /* remove extension if it's > to 4 characters */ psz_type = NULL; /* remove extension if it's > to 4 characters */
/* Warning: psz_title, psz_artist, psz_album may change in ArtCache*() */ /* Warning: psz_title, psz_artist, psz_album may change in ArtCache*() */
......
...@@ -328,6 +328,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] ) ...@@ -328,6 +328,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
p_libvlc->psz_homedir = config_GetHomeDir(); p_libvlc->psz_homedir = config_GetHomeDir();
p_libvlc->psz_configdir = config_GetConfigDir( p_libvlc ); p_libvlc->psz_configdir = config_GetConfigDir( p_libvlc );
p_libvlc->psz_datadir = config_GetUserDataDir( p_libvlc ); p_libvlc->psz_datadir = config_GetUserDataDir( p_libvlc );
p_libvlc->psz_cachedir = config_GetCacheDir( p_libvlc );
p_libvlc->psz_configfile = config_GetCustomConfigFile( p_libvlc ); p_libvlc->psz_configfile = config_GetCustomConfigFile( p_libvlc );
/* Check for plugins cache options */ /* Check for plugins cache options */
...@@ -1054,6 +1055,7 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, vlc_bool_t b_release ) ...@@ -1054,6 +1055,7 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, vlc_bool_t b_release )
FREENULL( p_libvlc->psz_homedir ); FREENULL( p_libvlc->psz_homedir );
FREENULL( p_libvlc->psz_configdir ); FREENULL( p_libvlc->psz_configdir );
FREENULL( p_libvlc->psz_datadir ); FREENULL( p_libvlc->psz_datadir );
FREENULL( p_libvlc->psz_cachedir );
FREENULL( p_libvlc->psz_configfile ); FREENULL( p_libvlc->psz_configfile );
FREENULL( p_libvlc->p_hotkeys ); FREENULL( p_libvlc->p_hotkeys );
......
...@@ -1914,8 +1914,8 @@ char *config_GetConfigDir( libvlc_int_t *p_libvlc ) ...@@ -1914,8 +1914,8 @@ char *config_GetConfigDir( libvlc_int_t *p_libvlc )
} }
/** /**
* Get the user's VLC data and cache directory * Get the user's VLC data directory
* (used for stuff like the modules cache, the album art cache, ...) * (used for stuff like the skins, custom lua modules, ...)
*/ */
char *config_GetUserDataDir( libvlc_int_t *p_libvlc ) char *config_GetUserDataDir( libvlc_int_t *p_libvlc )
{ {
...@@ -1943,6 +1943,36 @@ char *config_GetUserDataDir( libvlc_int_t *p_libvlc ) ...@@ -1943,6 +1943,36 @@ char *config_GetUserDataDir( libvlc_int_t *p_libvlc )
#endif #endif
} }
/**
* Get the user's VLC cache directory
* (used for stuff like the modules cache, the album art cache, ...)
*/
char *config_GetCacheDir( libvlc_int_t *p_libvlc )
{
char *psz_dir;
#if defined(WIN32) || defined(__APPLE__) || defined(SYS_BEOS)
char *psz_parent = config_GetUserDir();
if( !psz_parent ) psz_parent = p_libvlc->psz_homedir;
if( asprintf( &psz_dir, "%s" DIR_SEP CONFIG_DIR, psz_parent ) == -1 )
return NULL;
return psz_dir;
#else
/* XDG Base Directory Specification - Version 0.6 */
char *psz_env = getenv( "XDG_CACHE_HOME" );
if( psz_env )
{
if( asprintf( &psz_dir, "%s/vlc", psz_env ) == -1 )
return NULL;
return psz_dir;
}
psz_env = getenv( "HOME" );
if( !psz_env ) psz_env = p_libvlc->psz_homedir; /* not part of XDG spec but we want a sensible fallback */
if( asprintf( &psz_dir, "%s/.cache/vlc", psz_env ) == -1 )
return NULL;
return psz_dir;
#endif
}
/** /**
* Get the user's configuration file * Get the user's configuration file
*/ */
......
...@@ -42,6 +42,7 @@ int __config_LoadCmdLine ( vlc_object_t *, int *, char *[], vlc_bool_t ); ...@@ -42,6 +42,7 @@ int __config_LoadCmdLine ( vlc_object_t *, int *, char *[], vlc_bool_t );
char *config_GetHomeDir ( void ); char *config_GetHomeDir ( void );
char *config_GetConfigDir ( libvlc_int_t * ); char *config_GetConfigDir ( libvlc_int_t * );
char *config_GetUserDataDir( libvlc_int_t * ); char *config_GetUserDataDir( libvlc_int_t * );
char *config_GetCacheDir ( libvlc_int_t * );
char *config_GetConfigFile ( libvlc_int_t * ); char *config_GetConfigFile ( libvlc_int_t * );
char *config_GetCustomConfigFile( libvlc_int_t * ); char *config_GetCustomConfigFile( libvlc_int_t * );
int __config_LoadConfigFile( vlc_object_t *, const char * ); int __config_LoadConfigFile( vlc_object_t *, const char * );
......
...@@ -1665,7 +1665,7 @@ static char * GetWindowsError( void ) ...@@ -1665,7 +1665,7 @@ static char * GetWindowsError( void )
*****************************************************************************/ *****************************************************************************/
static void CacheLoad( vlc_object_t *p_this ) static void CacheLoad( vlc_object_t *p_this )
{ {
char *psz_filename, *psz_datadir; char *psz_filename, *psz_cachedir;
FILE *file; FILE *file;
int i, j, i_size, i_read; int i, j, i_size, i_read;
char p_cachestring[sizeof(PLUGINSCACHE_DIR COPYRIGHT_MESSAGE)]; char p_cachestring[sizeof(PLUGINSCACHE_DIR COPYRIGHT_MESSAGE)];
...@@ -1675,15 +1675,15 @@ static void CacheLoad( vlc_object_t *p_this ) ...@@ -1675,15 +1675,15 @@ static void CacheLoad( vlc_object_t *p_this )
int32_t i_file_size, i_marker; int32_t i_file_size, i_marker;
libvlc_global_data_t *p_libvlc_global = vlc_global(); libvlc_global_data_t *p_libvlc_global = vlc_global();
psz_datadir = p_this->p_libvlc->psz_datadir; psz_cachedir = p_this->p_libvlc->psz_cachedir;
if( !psz_datadir ) /* XXX: this should never happen */ if( !psz_cachedir ) /* XXX: this should never happen */
{ {
msg_Err( p_this, "Unable to get cache directory" ); msg_Err( p_this, "Unable to get cache directory" );
return; return;
} }
i_size = asprintf( &psz_filename, "%s"DIR_SEP"%s"DIR_SEP"%s", i_size = asprintf( &psz_filename, "%s"DIR_SEP"%s"DIR_SEP"%s",
psz_datadir, PLUGINSCACHE_DIR, CacheName() ); psz_cachedir, PLUGINSCACHE_DIR, CacheName() );
if( i_size <= 0 ) if( i_size <= 0 )
{ {
msg_Err( p_this, "out of memory" ); msg_Err( p_this, "out of memory" );
...@@ -2022,15 +2022,15 @@ static void CacheSave( vlc_object_t *p_this ) ...@@ -2022,15 +2022,15 @@ static void CacheSave( vlc_object_t *p_this )
"# For information about cache directory tags, see:\r\n" "# For information about cache directory tags, see:\r\n"
"# http://www.brynosaurus.com/cachedir/\r\n"; "# http://www.brynosaurus.com/cachedir/\r\n";
char *psz_filename, *psz_datadir; char *psz_filename, *psz_cachedir;
FILE *file; FILE *file;
int i, j, i_cache; int i, j, i_cache;
module_cache_t **pp_cache; module_cache_t **pp_cache;
int32_t i_file_size = 0; int32_t i_file_size = 0;
libvlc_global_data_t *p_libvlc_global = vlc_global(); libvlc_global_data_t *p_libvlc_global = vlc_global();
psz_datadir = p_this->p_libvlc->psz_datadir; psz_cachedir = p_this->p_libvlc->psz_cachedir;
if( !psz_datadir ) /* XXX: this should never happen */ if( !psz_cachedir ) /* XXX: this should never happen */
{ {
msg_Err( p_this, "Unable to get cache directory" ); msg_Err( p_this, "Unable to get cache directory" );
return; return;
...@@ -2038,7 +2038,7 @@ static void CacheSave( vlc_object_t *p_this ) ...@@ -2038,7 +2038,7 @@ static void CacheSave( vlc_object_t *p_this )
psz_filename = psz_filename =
(char *)malloc( sizeof(DIR_SEP PLUGINSCACHE_DIR DIR_SEP ) + (char *)malloc( sizeof(DIR_SEP PLUGINSCACHE_DIR DIR_SEP ) +
strlen(psz_datadir) + strlen(CacheName()) ); strlen(psz_cachedir) + strlen(CacheName()) );
if( !psz_filename ) if( !psz_filename )
{ {
...@@ -2046,7 +2046,7 @@ static void CacheSave( vlc_object_t *p_this ) ...@@ -2046,7 +2046,7 @@ static void CacheSave( vlc_object_t *p_this )
return; return;
} }
sprintf( psz_filename, "%s", psz_datadir ); sprintf( psz_filename, "%s", psz_cachedir );
config_CreateDir( p_this, psz_filename ); config_CreateDir( p_this, psz_filename );
...@@ -2063,7 +2063,7 @@ static void CacheSave( vlc_object_t *p_this ) ...@@ -2063,7 +2063,7 @@ static void CacheSave( vlc_object_t *p_this )
fclose( file ); fclose( file );
} }
sprintf( psz_filename, "%s"DIR_SEP"%s"DIR_SEP"%s", psz_datadir, sprintf( psz_filename, "%s"DIR_SEP"%s"DIR_SEP"%s", psz_cachedir,
PLUGINSCACHE_DIR, CacheName() ); PLUGINSCACHE_DIR, CacheName() );
msg_Dbg( p_this, "saving plugins cache file %s", psz_filename ); msg_Dbg( p_this, "saving plugins cache file %s", psz_filename );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment