add Windows compliant implementation of XDG Base Directory Specification

This commit is contained in:
Björn Schramke
2014-11-11 17:05:48 +01:00
parent 8c06af9722
commit 06e59cb7a7
5 changed files with 161 additions and 5 deletions

View File

@@ -32,7 +32,12 @@ class Foundation_API PathImpl
public: public:
static std::string currentImpl(); static std::string currentImpl();
static std::string homeImpl(); static std::string homeImpl();
static std::string configHomeImpl();
static std::string dataHomeImpl();
static std::string cacheHomeImpl();
static std::string tempHomeImpl();
static std::string tempImpl(); static std::string tempImpl();
static std::string configImpl();
static std::string nullImpl(); static std::string nullImpl();
static std::string systemImpl(); static std::string systemImpl();
static std::string expandImpl(const std::string& path); static std::string expandImpl(const std::string& path);

View File

@@ -32,7 +32,12 @@ class Foundation_API PathImpl
public: public:
static std::string currentImpl(); static std::string currentImpl();
static std::string homeImpl(); static std::string homeImpl();
static std::string configHomeImpl();
static std::string dataHomeImpl();
static std::string cacheHomeImpl();
static std::string tempHomeImpl();
static std::string tempImpl(); static std::string tempImpl();
static std::string configImpl();
static std::string nullImpl(); static std::string nullImpl();
static std::string systemImpl(); static std::string systemImpl();
static std::string expandImpl(const std::string& path); static std::string expandImpl(const std::string& path);

View File

@@ -597,7 +597,7 @@ std::string Path::home()
std::string Path::configHome() std::string Path::configHome()
{ {
#if defined(POCO_OS_FAMILY_UNIX) #if defined(POCO_OS_FAMILY_UNIX) || defined(POCO_OS_FAMILY_WINDOWS)
return PathImpl::configHomeImpl(); return PathImpl::configHomeImpl();
#else #else
return PathImpl::homeImpl(); return PathImpl::homeImpl();
@@ -607,7 +607,7 @@ std::string Path::configHome()
std::string Path::dataHome() std::string Path::dataHome()
{ {
#if defined(POCO_OS_FAMILY_UNIX) #if defined(POCO_OS_FAMILY_UNIX) || defined(POCO_OS_FAMILY_WINDOWS)
return PathImpl::dataHomeImpl(); return PathImpl::dataHomeImpl();
#else #else
return PathImpl::homeImpl(); return PathImpl::homeImpl();
@@ -617,7 +617,7 @@ std::string Path::dataHome()
std::string Path::tempHome() std::string Path::tempHome()
{ {
#if defined(POCO_OS_FAMILY_UNIX) #if defined(POCO_OS_FAMILY_UNIX) || defined(POCO_OS_FAMILY_WINDOWS)
return PathImpl::tempHomeImpl(); return PathImpl::tempHomeImpl();
#else #else
return PathImpl::tempImpl(); return PathImpl::tempImpl();
@@ -627,7 +627,7 @@ std::string Path::tempHome()
std::string Path::cacheHome() std::string Path::cacheHome()
{ {
#if defined(POCO_OS_FAMILY_UNIX) #if defined(POCO_OS_FAMILY_UNIX) || defined(POCO_OS_FAMILY_WINDOWS)
return PathImpl::cacheHomeImpl(); return PathImpl::cacheHomeImpl();
#else #else
return PathImpl::homeImpl(); return PathImpl::homeImpl();
@@ -643,7 +643,7 @@ std::string Path::temp()
std::string Path::config() std::string Path::config()
{ {
#if defined(POCO_OS_FAMILY_UNIX) #if defined(POCO_OS_FAMILY_UNIX) || defined(POCO_OS_FAMILY_WINDOWS)
return PathImpl::configImpl(); return PathImpl::configImpl();
#else #else
return PathImpl::currentImpl(); return PathImpl::currentImpl();

View File

@@ -74,6 +74,59 @@ std::string PathImpl::homeImpl()
} }
std::string PathImpl::configHomeImpl()
{
std::string result;
// if APPDATA environment variable not exist, return home directory instead
try
{
result = EnvironmentImpl::getImpl("APPDATA");
}
catch (NotFoundException&)
{
result = homeImpl();
}
std::string::size_type n = result.size();
if (n > 0 && result[n - 1] != '\\')
result.append("\\");
return result;
}
std::string PathImpl::dataHomeImpl()
{
std::string result;
// if LOCALAPPDATA environment variable not exist, return config home instead
try
{
result = EnvironmentImpl::getImpl("LOCALAPPDATA");
}
catch (NotFoundException&)
{
result = configHomeImpl();
}
std::string::size_type n = result.size();
if (n > 0 && result[n - 1] != '\\')
result.append("\\");
return result;
}
std::string PathImpl::cacheHomeImpl()
{
return tempImpl();
}
std::string PathImpl::tempHomeImpl()
{
return tempImpl();
}
std::string PathImpl::tempImpl() std::string PathImpl::tempImpl()
{ {
char buffer[MAX_PATH]; char buffer[MAX_PATH];
@@ -91,6 +144,26 @@ std::string PathImpl::tempImpl()
} }
std::string PathImpl::configImpl()
{
std::string result;
// if PROGRAMDATA environment variable not exist, return system directory instead
try
{
result = EnvironmentImpl::getImpl("PROGRAMDATA");
}
catch (NotFoundException&)
{
result = systemImpl();
}
std::string::size_type n = result.size();
if (n > 0 && result[n - 1] != '\\')
result.append("\\");
return result;
}
std::string PathImpl::nullImpl() std::string PathImpl::nullImpl()
{ {
return "NUL:"; return "NUL:";

View File

@@ -84,6 +84,59 @@ std::string PathImpl::homeImpl()
} }
std::string PathImpl::configHomeImpl()
{
std::string result;
// if APPDATA environment variable no exist, return home directory instead
try
{
result = EnvironmentImpl::getImpl("APPDATA");
}
catch (NotFoundException&)
{
result = homeImpl();
}
std::string::size_type n = result.size();
if (n > 0 && result[n - 1] != '\\')
result.append("\\");
return result;
}
std::string PathImpl::dataHomeImpl()
{
std::string result;
// if LOCALAPPDATA environment variable no exist, return config home instead
try
{
result = EnvironmentImpl::getImpl("LOCALAPPDATA");
}
catch (NotFoundException&)
{
result = configHomeImpl();
}
std::string::size_type n = result.size();
if (n > 0 && result[n - 1] != '\\')
result.append("\\");
return result;
}
std::string PathImpl::cacheHomeImpl()
{
return tempImpl();
}
std::string PathImpl::tempHomeImpl()
{
return tempImpl();
}
std::string PathImpl::tempImpl() std::string PathImpl::tempImpl()
{ {
Buffer<wchar_t> buffer(MAX_PATH_LEN); Buffer<wchar_t> buffer(MAX_PATH_LEN);
@@ -102,6 +155,26 @@ std::string PathImpl::tempImpl()
} }
std::string PathImpl::configImpl()
{
std::string result;
// if PROGRAMDATA environment variable not exist, return system directory instead
try
{
result = EnvironmentImpl::getImpl("PROGRAMDATA");
}
catch (NotFoundException&)
{
result = systemImpl();
}
std::string::size_type n = result.size();
if (n > 0 && result[n - 1] != '\\')
result.append("\\");
return result;
}
std::string PathImpl::nullImpl() std::string PathImpl::nullImpl()
{ {
return "NUL:"; return "NUL:";