]> git.sesse.net Git - vlc/blobdiff - src/config/file.c
Remove libvlc->psz_homedir and use config_GetHomeDir() instead
[vlc] / src / config / file.c
index 26b68552e6831a43eb91b80f178193f231b45bd8..c77c2bfe423d5200e0c7871a95e9e7d87cd86be7 100644 (file)
@@ -33,6 +33,7 @@
 #include <errno.h>                                                  /* errno */
 #include <assert.h>
 #include <limits.h>
+#include <locale.h>
 
 #include "configuration.h"
 #include "modules/modules.h"
@@ -44,14 +45,28 @@ static inline char *strdupnull (const char *src)
     return src ? strdup (src) : NULL;
 }
 
+/**
+ * Get the user's configuration file
+ */
+static char *config_GetConfigFile( void )
+{
+    char *psz_dir = config_GetUserConfDir();
+    char *psz_configfile;
+
+    if( asprintf( &psz_configfile, "%s" DIR_SEP CONFIG_FILE, psz_dir ) == -1 )
+        psz_configfile = NULL;
+    free( psz_dir );
+    return psz_configfile;
+}
+
 static FILE *config_OpenConfigFile( vlc_object_t *p_obj, const char *mode )
 {
-    char *psz_filename = p_obj->p_libvlc->psz_configfile;
+    char *psz_filename = libvlc_priv (p_obj->p_libvlc)->psz_configfile;
     FILE *p_stream;
 
     if( !psz_filename )
     {
-        psz_filename = config_GetConfigFile( p_obj->p_libvlc );
+        psz_filename = config_GetConfigFile();
     }
 
     msg_Dbg( p_obj, "opening config file (%s)", psz_filename );
@@ -70,7 +85,7 @@ static FILE *config_OpenConfigFile( vlc_object_t *p_obj, const char *mode )
          * Specification configs */
         char *psz_old;
         if( asprintf( &psz_old, "%s" DIR_SEP CONFIG_DIR DIR_SEP CONFIG_FILE,
-                  p_obj->p_libvlc->psz_homedir ) != -1 )
+                      config_GetHomeDir() ) != -1 )
         {
             p_stream = utf8_fopen( psz_old, mode );
             if( p_stream )
@@ -81,19 +96,18 @@ static FILE *config_OpenConfigFile( vlc_object_t *p_obj, const char *mode )
                           "VLC will now use %s.", psz_old, psz_filename );
                 char *psz_readme;
                 if( asprintf(&psz_readme,"%s"DIR_SEP CONFIG_DIR DIR_SEP"README",
-                              p_obj->p_libvlc->psz_homedir ) != -1 )
+                              config_GetHomeDir() ) != -1 )
                 {
                     FILE *p_readme = utf8_fopen( psz_readme, "wt" );
                     if( p_readme )
                     {
-                        fputs( "The VLC media player configuration folder has "
-                               "moved to comply with the XDG Base "
-                               "Directory Specification version 0.6. Your "
-                               "configuration has been copied to the new "
-                               "location (", p_readme );
-                        fputs( p_obj->p_libvlc->psz_configdir, p_readme );
-                        fputs( "). You can delete this directory and "
-                               "all its contents.", p_readme );
+                        fprintf( p_readme, "The VLC media player "
+                                 "configuration folder has moved to comply\n"
+                                 "with the XDG Base Directory Specification "
+                                 "version 0.6. Your\nconfiguration has been "
+                                 "copied to the new location:\n%s\nYou can "
+                                 "delete this directory and all its contents.",
+                                  psz_filename);
                         fclose( p_readme );
                     }
                     free( psz_readme );
@@ -105,7 +119,7 @@ static FILE *config_OpenConfigFile( vlc_object_t *p_obj, const char *mode )
 #endif
     else if( p_stream != NULL )
     {
-        p_obj->p_libvlc->psz_configfile = psz_filename;
+        libvlc_priv (p_obj->p_libvlc)->psz_configfile = psz_filename;
     }
 
     return p_stream;
@@ -168,6 +182,10 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
     char line[1024], section[1022];
     section[0] = '\0';
 
+    /* Ensure consistent number formatting... */
+    locale_t loc = newlocale (LC_NUMERIC_MASK, "C", NULL);
+    locale_t baseloc = uselocale (loc);
+
     while (fgets (line, 1024, file) != NULL)
     {
         /* Ignore comments and empty lines */
@@ -259,7 +277,7 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
                 case CONFIG_ITEM_FLOAT:
                     if( !*psz_option_value )
                         break;                    /* ignore empty option */
-                    p_item->value.f = (float)i18n_atof( psz_option_value);
+                    p_item->value.f = (float)atof (psz_option_value);
                     p_item->saved.f = p_item->value.f;
                     break;
 
@@ -296,6 +314,11 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
     fclose (file);
 
     vlc_list_release( p_list );
+    if (loc != (locale_t)0)
+    {
+        uselocale (baseloc);
+        freelocale (loc);
+    }
 
     vlc_mutex_unlock( &priv->config_lock );
     return 0;
@@ -400,9 +423,9 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
     /* Acquire config file lock */
     vlc_mutex_lock( &priv->config_lock );
 
-    if( p_this->p_libvlc->psz_configfile == NULL )
+    if( libvlc_priv (p_this->p_libvlc)->psz_configfile == NULL )
     {
-        const char *psz_configdir = p_this->p_libvlc->psz_configdir;
+        char *psz_configdir = config_GetUserConfDir();
         if( !psz_configdir ) /* XXX: This should never happen */
         {
             msg_Err( p_this, "no configuration directory defined" );
@@ -411,6 +434,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
         }
 
         config_CreateDir( p_this, psz_configdir );
+        free( psz_configdir );
     }
 
     file = config_OpenConfigFile( p_this, "rt" );
@@ -507,6 +531,10 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
     fprintf( file, "\xEF\xBB\xBF###\n###  " COPYRIGHT_MESSAGE "\n###\n\n"
        "###\n### lines beginning with a '#' character are comments\n###\n\n" );
 
+    /* Ensure consistent number formatting... */
+    locale_t loc = newlocale (LC_NUMERIC_MASK, "C", NULL);
+    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++ )
     {
@@ -613,6 +641,11 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
     }
 
     vlc_list_release( p_list );
+    if (loc != (locale_t)0)
+    {
+        uselocale (baseloc);
+        freelocale (loc);
+    }
 
     /*
      * Restore old settings from the config in file
@@ -665,18 +698,6 @@ int __config_SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name )
     return SaveConfigFile( p_this, psz_module_name, false );
 }
 
-/**
- * Get the user's configuration file
- */
-char *config_GetConfigFile( libvlc_int_t *p_libvlc )
-{
-    char *psz_configfile;
-    if( asprintf( &psz_configfile, "%s" DIR_SEP CONFIG_FILE,
-                  p_libvlc->psz_configdir ) == -1 )
-        return NULL;
-    return psz_configfile;
-}
-
 /**
  * Get the user's configuration file when given with the --config option
  */
@@ -689,7 +710,7 @@ char *config_GetCustomConfigFile( libvlc_int_t *p_libvlc )
         {
             /* This is incomplete: we should also support the ~cmassiot/ syntax */
             char *psz_buf;
-            if( asprintf( &psz_buf, "%s/%s", p_libvlc->psz_homedir,
+            if( asprintf( &psz_buf, "%s/%s", config_GetHomeDir(),
                           psz_configfile + 2 ) == -1 )
             {
                 free( psz_configfile );