From cc7c798b275b8ea9992eb82d68177ecfd50e0974 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Mon, 20 Oct 2014 01:27:10 +0300 Subject: [PATCH] Zero-arguments overloads and better error checking for get*dir functions --- source/fs/dir.cpp | 42 +++++++++++++++++++++++++++++++++++++++ source/fs/dir.h | 8 ++++++++ source/fs/unix/dir.cpp | 2 ++ source/fs/windows/dir.cpp | 2 ++ 4 files changed, 54 insertions(+) diff --git a/source/fs/dir.cpp b/source/fs/dir.cpp index c0583cc..ffe5670 100644 --- a/source/fs/dir.cpp +++ b/source/fs/dir.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -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) diff --git a/source/fs/dir.h b/source/fs/dir.h index 74d2d2c..6bd760c 100644 --- a/source/fs/dir.h +++ b/source/fs/dir.h @@ -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 &); diff --git a/source/fs/unix/dir.cpp b/source/fs/unix/dir.cpp index 93aaeab..69e926a 100644 --- a/source/fs/unix/dir.cpp +++ b/source/fs/unix/dir.cpp @@ -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); } diff --git a/source/fs/windows/dir.cpp b/source/fs/windows/dir.cpp index 6adddec..6b63b47 100644 --- a/source/fs/windows/dir.cpp +++ b/source/fs/windows/dir.cpp @@ -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; -- 2.45.2