Zero-arguments overloads and better error checking for get*dir functions
authorMikko Rasa <tdb@tdb.fi>
Sun, 19 Oct 2014 22:27:10 +0000 (01:27 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 19 Oct 2014 22:27:10 +0000 (01:27 +0300)
source/fs/dir.cpp
source/fs/dir.h
source/fs/unix/dir.cpp
source/fs/windows/dir.cpp

index c0583cc5ca6fd9011065ed24d89e2d788e2cdcd8..ffe56708bffeb85552839e6867663470b9b0a418 100644 (file)
@@ -1,6 +1,7 @@
 #include <cstdlib>
 #include <unistd.h>
 #include <dirent.h>
+#include <msp/core/application.h>
 #include <msp/core/systemerror.h>
 #include <msp/strings/regex.h>
 #include <msp/strings/utils.h>
@@ -135,8 +136,19 @@ Path getcwd()
        return ::getcwd(buf, sizeof(buf));
 }
 
+Path get_user_data_dir()
+{
+       const string &name = Application::get_name();
+       if(name.empty())
+               throw logic_error("application name not known");
+       return get_user_data_dir();
+}
+
 Path get_sys_conf_dir(const string &argv0)
 {
+       if(argv0.empty())
+               throw invalid_argument("get_sys_conf_dir");
+
        Path dir = get_bin_dir(argv0);
 
        if(dir[-1]=="bin" || dir[-1]=="sbin")
@@ -150,8 +162,19 @@ Path get_sys_conf_dir(const string &argv0)
                return dir;
 }
 
+Path get_sys_conf_dir()
+{
+       const char *argv0 = Application::get_argv0();
+       if(!argv0)
+               throw logic_error("no startup command");
+       return get_sys_conf_dir(argv0);
+}
+
 Path get_sys_data_dir(const string &argv0, const string &appname)
 {
+       if(argv0.empty() || appname.empty())
+               throw invalid_argument("get_sys_data_dir");
+
        Path dir = get_bin_dir(argv0);
 
        if(dir[-1]=="bin" || dir[-1]=="sbin")
@@ -162,8 +185,19 @@ Path get_sys_data_dir(const string &argv0, const string &appname)
                return dir;
 }
 
+Path get_sys_data_dir()
+{
+       const char *argv0 = Application::get_argv0();
+       if(!argv0)
+               throw logic_error("no startup command");
+       return get_sys_data_dir(argv0, Application::get_name());
+}
+
 Path get_sys_lib_dir(const string &argv0, const string &appname)
 {
+       if(argv0.empty() || appname.empty())
+               throw invalid_argument("get_sys_data_dir");
+
        Path dir = get_bin_dir(argv0);
 
        if(dir[-1]=="bin" || dir[-1]=="sbin")
@@ -172,6 +206,14 @@ Path get_sys_lib_dir(const string &argv0, const string &appname)
                return dir;
 }
 
+Path get_sys_lib_dir()
+{
+       const char *argv0 = Application::get_argv0();
+       if(!argv0)
+               throw logic_error("no startup command");
+       return get_sys_lib_dir(argv0, Application::get_name());
+}
+
 void chdir(const Path &path)
 {
        if(::chdir(path.str().c_str())==-1)
index 74d2d2cd6339b0118747779b9c660f03e06361e3..6bd760ced68be0ea6bdd57934d2cce925a32e70d 100644 (file)
@@ -43,15 +43,23 @@ Path get_home_dir();
 /// Returns a directory suitable for storing user-specific data
 Path get_user_data_dir(const std::string &appname);
 
+Path get_user_data_dir();
+
 /// Returns a directory containing system-wide configuration
 Path get_sys_conf_dir(const std::string &argv0);
 
+Path get_sys_conf_dir();
+
 /// Returns a directory containing immutable system-wide data
 Path get_sys_data_dir(const std::string &argv0, const std::string &appname);
 
+Path get_sys_data_dir();
+
 /// Returns a directory containing system-wide architecture-specific files
 Path get_sys_lib_dir(const std::string &argv0, const std::string &appname);
 
+Path get_sys_lib_dir();
+
 /// Changes the current working directory
 void chdir(const Path &);
 
index 93aaeab5c73339e668af52e2f077e36839b98bbe..69e926adf189e7087f3772b546248ad80079bd2a 100644 (file)
@@ -31,6 +31,8 @@ Path get_home_dir()
 
 Path get_user_data_dir(const string &appname)
 {
+       if(appname.empty())
+               throw invalid_argument("get_user_data_dir");
        return get_home_dir()/("."+appname);
 }
 
index 6adddeca788a99e73aae2d7289b65721dba77045..6b63b471d5bc939fe11a78ccbc668cdb02573c8c 100644 (file)
@@ -29,6 +29,8 @@ Path get_home_dir()
 
 Path get_user_data_dir(const string &appname)
 {
+       if(appname.empty())
+               throw invalid_argument("get_user_data_dir");
        char datadir[MAX_PATH];
        if(SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, 0, datadir)==S_OK)
                return Path(datadir)/appname;