Browse Source

Support for wide strings in obtaining Windows env vars

default_compile_flags
vector-of-bool 4 years ago
parent
commit
0e53c86840
1 changed files with 31 additions and 11 deletions
  1. +31
    -11
      src/dds/util/paths.win.cpp

+ 31
- 11
src/dds/util/paths.win.cpp View File

#include <cassert> #include <cassert>
#include <cstdlib> #include <cstdlib>


#include <windows.h>

using namespace dds; using namespace dds;


namespace {

std::wstring
getenv_wstr(std::wstring varname, std::wstring default_val, std::size_t size_hint = 256) {
std::wstring ret;
ret.resize(size_hint);
while (true) {
auto real_len
= ::GetEnvironmentVariableW(varname.data(), ret.data(), static_cast<DWORD>(ret.size()));
if (real_len == 0 && ::GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
// Environment variable is not defined
return default_val;
} else if (real_len > size_hint) {
// Try again, with a larger buffer
ret.resize(real_len);
continue;
} else {
// Got it!
ret.resize(real_len);
return ret;
}
}
}

} // namespace

fs::path dds::user_home_dir() { fs::path dds::user_home_dir() {
static auto ret = []() -> fs::path { static auto ret = []() -> fs::path {
auto userprofile_env = std::getenv("USERPROFILE");
if (!userprofile_env) {
dds_log(warn, "No USERPROFILE environment variable set!");
return "/";
}
std::wstring userprofile_env = getenv_wstr(L"UserProfile", L"/");
return fs::absolute(fs::path(userprofile_env)); return fs::absolute(fs::path(userprofile_env));
}(); }();
return ret; return ret;
namespace { namespace {


fs::path appdatalocal_dir() { fs::path appdatalocal_dir() {
auto env = std::getenv("LocalAppData");
assert(env);

static auto env = getenv_wstr(L"LocalAppData", L"/");
return fs::absolute(fs::path(env)); return fs::absolute(fs::path(env));
} }


fs::path appdata_dir() { fs::path appdata_dir() {
auto env = std::getenv("AppData");
assert(env);

static auto env = getenv_wstr(L"AppData", L"/");
return fs::absolute(fs::path(env)); return fs::absolute(fs::path(env));
} }



Loading…
Cancel
Save