Author: shadowmaster
Date: Mon Jul 28 20:09:35 2008
New Revision: 28249

URL: http://svn.gna.org/viewcvs/wesnoth?rev=28249&view=rev
Log:
* Did several optimizations to the preferences dir search/setup routines

Modified:
    trunk/src/filesystem.cpp
    trunk/src/filesystem.hpp

Modified: trunk/src/filesystem.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/filesystem.cpp?rev=28249&r1=28248&r2=28249&view=diff
==============================================================================
--- trunk/src/filesystem.cpp (original)
+++ trunk/src/filesystem.cpp Mon Jul 28 20:09:35 2008
@@ -63,6 +63,7 @@
 
 #define DBG_FS LOG_STREAM(debug, filesystem)
 #define LOG_FS LOG_STREAM(info, filesystem)
+#define WRN_FS LOG_STREAM(warn, filesystem)
 #define ERR_FS LOG_STREAM(err, filesystem)
 
 namespace {
@@ -404,26 +405,37 @@
        }
 }
 
-std::string get_user_data_dir()
+bool create_directory_if_missing(const std::string& dirname)
+{
+       if(is_directory(dirname)) {
+               DBG_FS << "directory " << dirname << " exists, not creating\n";
+               return true;
+       } else if(file_exists(dirname)) {
+               ERR_FS << "cannot create directory " << dirname << "; file 
exists\n";
+               return false;
+       }
+       DBG_FS << "creating missing directory " << dirname << '\n';
+       return make_directory(dirname);
+}
+
+#ifndef PREFERENCES_DIR
+#define PREFERENCES_DIR ".wesnoth"
+#endif
+
+std::string setup_user_data_dir()
 {
 #ifdef _WIN32
-
-       static bool inited_dirs = false;
-
-       if(!inited_dirs) {
-               _mkdir("userdata");
-               _mkdir("userdata/editor");
-               _mkdir("userdata/editor/maps");
-               _mkdir("userdata/data");
-               _mkdir("userdata/data/ais");
-               _mkdir("userdata/data/campaigns");
-               _mkdir("userdata/data/multiplayer");
-               _mkdir("userdata/data/maps");
-               _mkdir("userdata/data/maps/multiplayer");
-               _mkdir("userdata/data/units");
-               _mkdir("userdata/saves");
-               inited_dirs = true;
-       }
+       _mkdir("userdata");
+       _mkdir("userdata/editor");
+       _mkdir("userdata/editor/maps");
+       _mkdir("userdata/data");
+       _mkdir("userdata/data/ais");
+       _mkdir("userdata/data/campaigns");
+       _mkdir("userdata/data/multiplayer");
+       _mkdir("userdata/data/maps");
+       _mkdir("userdata/data/maps/multiplayer");
+       _mkdir("userdata/data/units");
+       _mkdir("userdata/saves");
 
        char buf[256];
        const char* const res = getcwd(buf,sizeof(buf));
@@ -443,9 +455,22 @@
                } else {
                        be_path.SetTo("/boot/home/config/settings/wesnoth");
                }
-               tpath = be_path;
-               tpath.Append("editor/maps");
-               create_directory(tpath.Path(), 0775);
+       #define BEOS_CREATE_PREFERENCES_SUBDIR(subdir) \
+                       tpath = be_path;                       \
+                       tpath.Append(subdir);                  \
+                       create_directory(tpath.Path(), 0775);
+
+               BEOS_CREATE_PREFERENCES_SUBDIR("editor");
+               BEOS_CREATE_PREFERENCES_SUBDIR("editor/maps");
+               BEOS_CREATE_PREFERENCES_SUBDIR("data");
+               BEOS_CREATE_PREFERENCES_SUBDIR("data/ais");
+               BEOS_CREATE_PREFERENCES_SUBDIR("data/campaigns");
+               BEOS_CREATE_PREFERENCES_SUBDIR("data/multiplayer");
+               BEOS_CREATE_PREFERENCES_SUBDIR("data/maps");
+               BEOS_CREATE_PREFERENCES_SUBDIR("data/maps/multiplayer");
+               BEOS_CREATE_PREFERENCES_SUBDIR("data/units");
+               BEOS_CREATE_PREFERENCES_SUBDIR("saves");
+       #undef BEOS_CREATE_PREFERENCES_SUBDIR
        }
        return be_path.Path();
 #else
@@ -462,44 +487,44 @@
 
        const std::string home(home_str);
 
-#ifndef PREFERENCES_DIR
-#define PREFERENCES_DIR ".wesnoth"
-#endif
-
 #ifndef __AMIGAOS4__
        const std::string dir_path = home + std::string("/") + PREFERENCES_DIR;
 #else
        const std::string dir_path = home + PREFERENCES_DIR;
 #endif
-       DIR* dir = opendir(dir_path.c_str());
+
+       const bool res = create_directory_if_missing(dir_path);
+       // probe read permissions (if we could make the directory)
+       DIR* const dir = res ? opendir(dir_path.c_str()) : NULL;
        if(dir == NULL) {
-               const int res = mkdir(dir_path.c_str(),AccessMode);
-
-               // Also create the maps directory
-               mkdir((dir_path + "/editor").c_str(),AccessMode);
-               mkdir((dir_path + "/editor/maps").c_str(),AccessMode);
-               mkdir((dir_path + "/data").c_str(),AccessMode);
-               mkdir((dir_path + "/data/ais").c_str(),AccessMode);
-               mkdir((dir_path + "/data/campaigns").c_str(),AccessMode);
-               mkdir((dir_path + "/data/multiplayer").c_str(),AccessMode);
-               mkdir((dir_path + "/data/maps").c_str(),AccessMode);
-               mkdir((dir_path + "/data/maps/multiplayer").c_str(),AccessMode);
-               mkdir((dir_path + "/data/units").c_str(),AccessMode);
-               mkdir((dir_path + "/saves").c_str(),AccessMode);
-               if(res == 0) {
-                       dir = opendir(dir_path.c_str());
-               } else {
-                       ERR_FS << "could not open or create directory: " << 
dir_path << '\n';
-               }
-       }
-
-       if(dir == NULL)
+               ERR_FS << "could not open or create preferences directory at " 
<< dir_path << '\n';
                return "";
-
+       }
        closedir(dir);
 
+       // Create user data and add-on directories
+       create_directory_if_missing(dir_path + "/editor");
+       create_directory_if_missing(dir_path + "/editor/maps");
+       create_directory_if_missing(dir_path + "/data");
+       create_directory_if_missing(dir_path + "/data/ais");
+       create_directory_if_missing(dir_path + "/data/campaigns");
+       create_directory_if_missing(dir_path + "/data/multiplayer");
+       create_directory_if_missing(dir_path + "/data/maps");
+       create_directory_if_missing(dir_path + "/data/maps/multiplayer");
+       create_directory_if_missing(dir_path + "/data/units");
+       create_directory_if_missing(dir_path + "/saves");
+
        return dir_path;
 #endif
+}
+
+const std::string& get_user_data_dir()
+{
+       // ensure setup gets called only once per session
+       // FIXME: this is okay and optimized, but how should we react
+       // if the user deletes a dir while we are running?
+       static std::string const user_data_dir = setup_user_data_dir();
+       return user_data_dir;
 }
 
 static std::string read_stream(std::istream& s)

Modified: trunk/src/filesystem.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/filesystem.hpp?rev=28249&r1=28248&r2=28249&view=diff
==============================================================================
--- trunk/src/filesystem.hpp (original)
+++ trunk/src/filesystem.hpp Mon Jul 28 20:09:35 2008
@@ -76,7 +76,7 @@
 //! maximum 1000 files then start always giving 999
 std::string get_next_filename(const std::string& name, const std::string& 
extension);
 std::string get_upload_dir();
-std::string get_user_data_dir();
+const std::string& get_user_data_dir();
 
 std::string get_cwd();
 
@@ -93,6 +93,12 @@
 void write_file(const std::string& fname, const std::string& data);
 
 std::string read_map(const std::string& name);
+
+//! Creates a directory if it does not exist already.
+//! @param dirname Path to directory. All parents should exist.
+//! @return True if the directory exists or could be successfully
+//!         created; false otherwise.
+bool create_directory_if_missing(const std::string& dirname);
 
 //! Returns true if the given file is a directory.
 bool is_directory(const std::string& fname);


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to