mirror of
https://bitbucket.org/smil3y/katie.git
synced 2025-02-24 19:02:59 +00:00
QStandardPaths cleanup
Signed-off-by: Ivailo Monev <xakepa10@laimg.moc>
This commit is contained in:
parent
f2806e5133
commit
dfab8f5fb3
3 changed files with 350 additions and 369 deletions
|
@ -222,15 +222,15 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
|
||||
/*!
|
||||
\fn QStringList QStandardPaths::standardLocations(StandardLocation type)
|
||||
\fn QStringList QStandardPaths::standardLocations(StandardLocation type)
|
||||
|
||||
Returns all the directories where files of \a type belong.
|
||||
Returns all the directories where files of \a type belong.
|
||||
|
||||
The list of directories is sorted from high to low priority, starting with
|
||||
writableLocation() if it can be determined. This list is empty if no locations
|
||||
for \a type are defined.
|
||||
The list of directories is sorted from high to low priority, starting with
|
||||
writableLocation() if it can be determined. This list is empty if no locations
|
||||
for \a type are defined.
|
||||
|
||||
\sa writableLocation()
|
||||
\sa writableLocation()
|
||||
*/
|
||||
|
||||
/*!
|
||||
|
@ -246,117 +246,111 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
static bool existsAsSpecified(const QString &path, QStandardPaths::LocateOptions options)
|
||||
{
|
||||
if (options & QStandardPaths::LocateDirectory) {
|
||||
return QDir(path).exists();
|
||||
}
|
||||
return QFileInfo(path).isFile();
|
||||
if (options & QStandardPaths::LocateDirectory) {
|
||||
return QDir(path).exists();
|
||||
}
|
||||
return QFileInfo(path).isFile();
|
||||
}
|
||||
|
||||
/*!
|
||||
Tries to find a file or directory called \a fileName in the standard locations
|
||||
for \a type.
|
||||
Tries to find a file or directory called \a fileName in the standard locations
|
||||
for \a type.
|
||||
|
||||
The full path to the first file or directory (depending on \a options) found is returned.
|
||||
If no such file or directory can be found, an empty string is returned.
|
||||
The full path to the first file or directory (depending on \a options) found is returned.
|
||||
If no such file or directory can be found, an empty string is returned.
|
||||
*/
|
||||
QString QStandardPaths::locate(StandardLocation type, const QString &fileName, LocateOptions options)
|
||||
{
|
||||
const QStringList &dirs = standardLocations(type);
|
||||
for (QStringList::const_iterator dir = dirs.constBegin(); dir != dirs.constEnd(); ++dir) {
|
||||
const QString path = *dir + QLatin1Char('/') + fileName;
|
||||
if (existsAsSpecified(path, options)) {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
return QString();
|
||||
foreach (const QString &dir, standardLocations(type)) {
|
||||
const QString path = dir + QLatin1Char('/') + fileName;
|
||||
if (existsAsSpecified(path, options)) {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
|
||||
/*!
|
||||
Tries to find all files or directories called \a fileName in the standard locations
|
||||
for \a type.
|
||||
Tries to find all files or directories called \a fileName in the standard locations
|
||||
for \a type.
|
||||
|
||||
The \a options flag allows to specify whether to look for files or directories.
|
||||
The \a options flag allows to specify whether to look for files or directories.
|
||||
|
||||
Returns the list of all the files that were found.
|
||||
Returns the list of all the files that were found.
|
||||
*/
|
||||
QStringList QStandardPaths::locateAll(StandardLocation type, const QString &fileName, LocateOptions options)
|
||||
{
|
||||
const QStringList &dirs = standardLocations(type);
|
||||
QStringList result;
|
||||
for (QStringList::const_iterator dir = dirs.constBegin(); dir != dirs.constEnd(); ++dir) {
|
||||
const QString path = *dir + QLatin1Char('/') + fileName;
|
||||
if (existsAsSpecified(path, options)) {
|
||||
result.append(path);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
QStringList result;
|
||||
foreach (const QString &dir, standardLocations(type)) {
|
||||
const QString path = dir + QLatin1Char('/') + fileName;
|
||||
if (existsAsSpecified(path, options)) {
|
||||
result.append(path);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static QString checkExecutable(const QString &path)
|
||||
{
|
||||
const QFileInfo info(path);
|
||||
if (info.isFile() && info.isExecutable()) {
|
||||
return QDir::cleanPath(path);
|
||||
}
|
||||
return QString();
|
||||
const QFileInfo info(path);
|
||||
if (info.isFile() && info.isExecutable()) {
|
||||
return QDir::cleanPath(path);
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
|
||||
static inline QString searchExecutable(const QStringList &searchPaths,
|
||||
const QString &executableName)
|
||||
{
|
||||
const QDir currentDir = QDir::current();
|
||||
foreach (const QString & searchPath, searchPaths) {
|
||||
const QString candidate = currentDir.absoluteFilePath(searchPath + QLatin1Char('/') + executableName);
|
||||
const QString absPath = checkExecutable(candidate);
|
||||
if (!absPath.isEmpty()) {
|
||||
return absPath;
|
||||
}
|
||||
}
|
||||
return QString();
|
||||
const QDir currentDir = QDir::current();
|
||||
foreach (const QString &searchPath, searchPaths) {
|
||||
const QString candidate = currentDir.absoluteFilePath(searchPath + QLatin1Char('/') + executableName);
|
||||
const QString absPath = checkExecutable(candidate);
|
||||
if (!absPath.isEmpty()) {
|
||||
return absPath;
|
||||
}
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
|
||||
/*!
|
||||
Finds the executable named \a executableName in the paths specified by \a paths,
|
||||
or the system paths if \a paths is empty.
|
||||
Finds the executable named \a executableName in the paths specified by \a paths,
|
||||
or the system paths if \a paths is empty.
|
||||
|
||||
On most operating systems the system path is determined by the PATH environment variable.
|
||||
On most operating systems the system path is determined by the PATH environment variable.
|
||||
|
||||
The directories where to search for the executable can be set in the \a paths argument.
|
||||
To search in both your own paths and the system paths, call findExecutable twice, once with
|
||||
\a paths set and once with \a paths empty.
|
||||
The directories where to search for the executable can be set in the \a paths argument.
|
||||
To search in both your own paths and the system paths, call findExecutable twice, once with
|
||||
\a paths set and once with \a paths empty.
|
||||
|
||||
Symlinks are not resolved, in order to preserve behavior for the case of executables
|
||||
whose behavior depends on the name they are invoked with.
|
||||
Symlinks are not resolved, in order to preserve behavior for the case of executables
|
||||
whose behavior depends on the name they are invoked with.
|
||||
|
||||
\note On Windows, the usual executable extensions (from the PATHEXT environment variable)
|
||||
are automatically appended, so that for instance findExecutable("foo") will find foo.exe
|
||||
or foo.bat if present.
|
||||
|
||||
Returns the absolute file path to the executable, or an empty string if not found.
|
||||
Returns the absolute file path to the executable, or an empty string if not found.
|
||||
*/
|
||||
QString QStandardPaths::findExecutable(const QString &executableName, const QStringList &paths)
|
||||
{
|
||||
if (QFileInfo(executableName).isAbsolute()) {
|
||||
return checkExecutable(executableName);
|
||||
}
|
||||
if (QFileInfo(executableName).isAbsolute()) {
|
||||
return checkExecutable(executableName);
|
||||
}
|
||||
|
||||
QStringList searchPaths = paths;
|
||||
if (paths.isEmpty()) {
|
||||
const QByteArray pEnv = qgetenv("PATH");
|
||||
const QLatin1Char pathSep(':');
|
||||
// Remove trailing slashes, which occur on Windows.
|
||||
const QStringList rawPaths = QString::fromLocal8Bit(pEnv.constData()).split(pathSep, QString::SkipEmptyParts);
|
||||
searchPaths.reserve(rawPaths.size());
|
||||
foreach (const QString & rawPath, rawPaths) {
|
||||
QString cleanPath = QDir::cleanPath(rawPath);
|
||||
if (cleanPath.size() > 1 && cleanPath.endsWith(QLatin1Char('/'))) {
|
||||
cleanPath.truncate(cleanPath.size() - 1);
|
||||
}
|
||||
searchPaths.push_back(cleanPath);
|
||||
}
|
||||
}
|
||||
QStringList searchPaths = paths;
|
||||
if (paths.isEmpty()) {
|
||||
const QByteArray pEnv = qgetenv("PATH");
|
||||
const QLatin1Char pathSep(':');
|
||||
// Remove trailing slashes, which occur on Windows.
|
||||
const QStringList rawPaths = QString::fromLocal8Bit(pEnv.constData()).split(pathSep, QString::SkipEmptyParts);
|
||||
searchPaths.reserve(rawPaths.size());
|
||||
foreach (const QString & rawPath, rawPaths) {
|
||||
QString cleanPath = QDir::cleanPath(rawPath);
|
||||
if (cleanPath.size() > 1 && cleanPath.endsWith(QLatin1Char('/'))) {
|
||||
cleanPath.truncate(cleanPath.size() - 1);
|
||||
}
|
||||
searchPaths.push_back(cleanPath);
|
||||
}
|
||||
}
|
||||
|
||||
return searchExecutable(searchPaths, executableName);
|
||||
return searchExecutable(searchPaths, executableName);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -368,42 +362,42 @@ QString QStandardPaths::findExecutable(const QString &executableName, const QStr
|
|||
|
||||
QString QStandardPaths::displayName(StandardLocation type)
|
||||
{
|
||||
switch (type) {
|
||||
case DesktopLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Desktop");
|
||||
case DocumentsLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Documents");
|
||||
case FontsLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Fonts");
|
||||
case ApplicationsLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Applications");
|
||||
case MusicLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Music");
|
||||
case MoviesLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Movies");
|
||||
case PicturesLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Pictures");
|
||||
case TempLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Temporary Directory");
|
||||
case HomeLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Home");
|
||||
case DataLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Application Data");
|
||||
case CacheLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Cache");
|
||||
case GenericDataLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Shared Data");
|
||||
case RuntimeLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Runtime");
|
||||
case ConfigLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Configuration");
|
||||
case GenericConfigLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Shared Configuration");
|
||||
case GenericCacheLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Shared Cache");
|
||||
case DownloadLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Download");
|
||||
}
|
||||
switch (type) {
|
||||
case DesktopLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Desktop");
|
||||
case DocumentsLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Documents");
|
||||
case FontsLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Fonts");
|
||||
case ApplicationsLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Applications");
|
||||
case MusicLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Music");
|
||||
case MoviesLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Movies");
|
||||
case PicturesLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Pictures");
|
||||
case TempLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Temporary Directory");
|
||||
case HomeLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Home");
|
||||
case DataLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Application Data");
|
||||
case CacheLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Cache");
|
||||
case GenericDataLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Shared Data");
|
||||
case RuntimeLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Runtime");
|
||||
case ConfigLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Configuration");
|
||||
case GenericConfigLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Shared Configuration");
|
||||
case GenericCacheLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Shared Cache");
|
||||
case DownloadLocation:
|
||||
return QCoreApplication::translate("QStandardPaths", "Download");
|
||||
}
|
||||
// not reached
|
||||
return QString();
|
||||
}
|
||||
|
|
|
@ -35,46 +35,46 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
class Q_CORE_EXPORT QStandardPaths
|
||||
{
|
||||
public:
|
||||
// Do not re-order, must match QDesktopServices
|
||||
enum StandardLocation {
|
||||
DesktopLocation,
|
||||
DocumentsLocation,
|
||||
FontsLocation,
|
||||
ApplicationsLocation,
|
||||
MusicLocation,
|
||||
MoviesLocation,
|
||||
PicturesLocation,
|
||||
TempLocation,
|
||||
HomeLocation,
|
||||
DataLocation,
|
||||
CacheLocation,
|
||||
GenericDataLocation,
|
||||
RuntimeLocation,
|
||||
ConfigLocation,
|
||||
DownloadLocation,
|
||||
GenericCacheLocation,
|
||||
GenericConfigLocation
|
||||
};
|
||||
public:
|
||||
// Do not re-order, must match QDesktopServices
|
||||
enum StandardLocation {
|
||||
DesktopLocation,
|
||||
DocumentsLocation,
|
||||
FontsLocation,
|
||||
ApplicationsLocation,
|
||||
MusicLocation,
|
||||
MoviesLocation,
|
||||
PicturesLocation,
|
||||
TempLocation,
|
||||
HomeLocation,
|
||||
DataLocation,
|
||||
CacheLocation,
|
||||
GenericDataLocation,
|
||||
RuntimeLocation,
|
||||
ConfigLocation,
|
||||
DownloadLocation,
|
||||
GenericCacheLocation,
|
||||
GenericConfigLocation
|
||||
};
|
||||
|
||||
static QString writableLocation(StandardLocation type);
|
||||
static QStringList standardLocations(StandardLocation type);
|
||||
static QString writableLocation(StandardLocation type);
|
||||
static QStringList standardLocations(StandardLocation type);
|
||||
|
||||
enum LocateOption {
|
||||
LocateFile = 0x0,
|
||||
LocateDirectory = 0x1
|
||||
};
|
||||
typedef QFlags<LocateOption> LocateOptions;
|
||||
enum LocateOption {
|
||||
LocateFile = 0x0,
|
||||
LocateDirectory = 0x1
|
||||
};
|
||||
typedef QFlags<LocateOption> LocateOptions;
|
||||
|
||||
static QString locate(StandardLocation type, const QString &fileName, LocateOptions options = LocateFile);
|
||||
static QStringList locateAll(StandardLocation type, const QString &fileName, LocateOptions options = LocateFile);
|
||||
static QString displayName(StandardLocation type);
|
||||
static QString locate(StandardLocation type, const QString &fileName, LocateOptions options = LocateFile);
|
||||
static QStringList locateAll(StandardLocation type, const QString &fileName, LocateOptions options = LocateFile);
|
||||
static QString displayName(StandardLocation type);
|
||||
|
||||
static QString findExecutable(const QString &executableName, const QStringList &paths = QStringList());
|
||||
static QString findExecutable(const QString &executableName, const QStringList &paths = QStringList());
|
||||
|
||||
static void enableTestMode(bool testMode);
|
||||
static void setTestModeEnabled(bool testMode);
|
||||
static bool isTestModeEnabled();
|
||||
static void enableTestMode(bool testMode);
|
||||
static void setTestModeEnabled(bool testMode);
|
||||
static bool isTestModeEnabled();
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(QStandardPaths)
|
||||
|
|
|
@ -41,243 +41,230 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
static void appendOrganizationAndApp(QString &path)
|
||||
{
|
||||
const QString org = QCoreApplication::organizationName();
|
||||
const QString org = QCoreApplication::organizationName();
|
||||
|
||||
if (!org.isEmpty()) {
|
||||
path += QLatin1Char('/') + org;
|
||||
}
|
||||
const QString appName = QCoreApplication::applicationName();
|
||||
if (!org.isEmpty()) {
|
||||
path += QLatin1Char('/') + org;
|
||||
}
|
||||
const QString appName = QCoreApplication::applicationName();
|
||||
|
||||
if (!appName.isEmpty()) {
|
||||
path += QLatin1Char('/') + appName;
|
||||
}
|
||||
if (!appName.isEmpty()) {
|
||||
path += QLatin1Char('/') + appName;
|
||||
}
|
||||
}
|
||||
|
||||
QString QStandardPaths::writableLocation(StandardLocation type)
|
||||
{
|
||||
switch (type) {
|
||||
case HomeLocation:
|
||||
return QDir::homePath();
|
||||
case TempLocation:
|
||||
return QDir::tempPath();
|
||||
case CacheLocation:
|
||||
case GenericCacheLocation: {
|
||||
// http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
|
||||
QString xdgCacheHome = QFile::decodeName(qgetenv("XDG_CACHE_HOME"));
|
||||
if (xdgCacheHome.isEmpty()) {
|
||||
xdgCacheHome = QDir::homePath() + QLatin1String("/.cache");
|
||||
}
|
||||
if (type == QStandardPaths::CacheLocation) {
|
||||
appendOrganizationAndApp(xdgCacheHome);
|
||||
}
|
||||
return xdgCacheHome;
|
||||
}
|
||||
case DataLocation:
|
||||
case GenericDataLocation: {
|
||||
QString xdgDataHome = QFile::decodeName(qgetenv("XDG_DATA_HOME"));
|
||||
if (xdgDataHome.isEmpty()) {
|
||||
xdgDataHome = QDir::homePath() + QLatin1String("/.local/share");
|
||||
}
|
||||
if (type == QStandardPaths::DataLocation) {
|
||||
appendOrganizationAndApp(xdgDataHome);
|
||||
}
|
||||
return xdgDataHome;
|
||||
}
|
||||
case ConfigLocation:
|
||||
case GenericConfigLocation: {
|
||||
// http://standards.freedesktop.org/basedir-spec/latest/
|
||||
QString xdgConfigHome = QFile::decodeName(qgetenv("XDG_CONFIG_HOME"));
|
||||
if (xdgConfigHome.isEmpty()) {
|
||||
xdgConfigHome = QDir::homePath() + QLatin1String("/.config");
|
||||
}
|
||||
return xdgConfigHome;
|
||||
}
|
||||
case RuntimeLocation: {
|
||||
const uid_t myUid = geteuid();
|
||||
// http://standards.freedesktop.org/basedir-spec/latest/
|
||||
QString xdgRuntimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR"));
|
||||
if (xdgRuntimeDir.isEmpty()) {
|
||||
const QString userName = QFileSystemEngine::resolveUserName(myUid);
|
||||
xdgRuntimeDir = QDir::tempPath() + QLatin1String("/runtime-") + userName;
|
||||
QDir dir(xdgRuntimeDir);
|
||||
if (!dir.exists()) {
|
||||
if (!QDir().mkdir(xdgRuntimeDir)) {
|
||||
qWarning("QStandardPaths: error creating runtime directory %s: %s", qPrintable(xdgRuntimeDir),
|
||||
qPrintable(qt_error_string(errno)));
|
||||
return QString();
|
||||
}
|
||||
switch (type) {
|
||||
case DesktopLocation:
|
||||
return QDir::homePath() + QLatin1String("/Desktop");
|
||||
case DocumentsLocation:
|
||||
return QDir::homePath() + QLatin1String("/Documents");
|
||||
case PicturesLocation:
|
||||
return QDir::homePath() + QLatin1String("/Pictures");
|
||||
case FontsLocation:
|
||||
return QDir::homePath() + QLatin1String("/.fonts");
|
||||
case MusicLocation:
|
||||
return QDir::homePath() + QLatin1String("/Music");
|
||||
case MoviesLocation:
|
||||
return QDir::homePath() + QLatin1String("/Videos");
|
||||
case DownloadLocation:
|
||||
return QDir::homePath() + QLatin1String("/Downloads");
|
||||
case ApplicationsLocation:
|
||||
return writableLocation(GenericDataLocation) + QLatin1String("/applications");
|
||||
case HomeLocation:
|
||||
return QDir::homePath();
|
||||
case TempLocation:
|
||||
return QDir::tempPath();
|
||||
case CacheLocation:
|
||||
case GenericCacheLocation: {
|
||||
// http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
|
||||
QString xdgCacheHome = QFile::decodeName(qgetenv("XDG_CACHE_HOME"));
|
||||
if (xdgCacheHome.isEmpty()) {
|
||||
xdgCacheHome = QDir::homePath() + QLatin1String("/.cache");
|
||||
}
|
||||
qWarning("QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '%s'", qPrintable(xdgRuntimeDir));
|
||||
}
|
||||
// "The directory MUST be owned by the user"
|
||||
QFileInfo fileInfo(xdgRuntimeDir);
|
||||
if (fileInfo.ownerId() != myUid) {
|
||||
qWarning("QStandardPaths: wrong ownership on runtime directory %s, %d instead of %d", qPrintable(xdgRuntimeDir),
|
||||
fileInfo.ownerId(), myUid);
|
||||
return QString();
|
||||
}
|
||||
// "and he MUST be the only one having read and write access to it. Its Unix access mode MUST be 0700."
|
||||
QFile file(xdgRuntimeDir);
|
||||
const QFile::Permissions wantedPerms = QFile::ReadUser | QFile::WriteUser | QFile::ExeUser;
|
||||
if (file.permissions() != wantedPerms && !file.setPermissions(wantedPerms)) {
|
||||
qWarning("QStandardPaths: wrong permissions on runtime directory %s", qPrintable(xdgRuntimeDir));
|
||||
return QString();
|
||||
}
|
||||
return xdgRuntimeDir;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// http://www.freedesktop.org/wiki/Software/xdg-user-dirs
|
||||
QString xdgConfigHome = QFile::decodeName(qgetenv("XDG_CONFIG_HOME"));
|
||||
if (xdgConfigHome.isEmpty()) {
|
||||
xdgConfigHome = QDir::homePath() + QLatin1String("/.config");
|
||||
}
|
||||
QFile file(xdgConfigHome + QLatin1String("/user-dirs.dirs"));
|
||||
if (file.open(QIODevice::ReadOnly)) {
|
||||
QHash<QString, QString> lines;
|
||||
QTextStream stream(&file);
|
||||
// Only look for lines like: XDG_DESKTOP_DIR="$HOME/Desktop"
|
||||
QRegExp exp(QLatin1String("^XDG_(.*)_DIR=(.*)$"));
|
||||
while (!stream.atEnd()) {
|
||||
const QString &line = stream.readLine();
|
||||
if (exp.indexIn(line) != -1) {
|
||||
const QStringList lst = exp.capturedTexts();
|
||||
const QString key = lst.at(1);
|
||||
QString value = lst.at(2);
|
||||
if (value.length() > 2
|
||||
&& value.startsWith(QLatin1Char('\"'))
|
||||
&& value.endsWith(QLatin1Char('\"'))) {
|
||||
value = value.mid(1, value.length() - 2);
|
||||
if (type == QStandardPaths::CacheLocation) {
|
||||
appendOrganizationAndApp(xdgCacheHome);
|
||||
}
|
||||
// Store the key and value: "DESKTOP", "$HOME/Desktop"
|
||||
lines[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
QString key;
|
||||
switch (type) {
|
||||
case DesktopLocation:
|
||||
key = QLatin1String("DESKTOP");
|
||||
break;
|
||||
case DocumentsLocation:
|
||||
key = QLatin1String("DOCUMENTS");
|
||||
break;
|
||||
case PicturesLocation:
|
||||
key = QLatin1String("PICTURES");
|
||||
break;
|
||||
case MusicLocation:
|
||||
key = QLatin1String("MUSIC");
|
||||
break;
|
||||
case MoviesLocation:
|
||||
key = QLatin1String("VIDEOS");
|
||||
break;
|
||||
case DownloadLocation:
|
||||
key = QLatin1String("DOWNLOAD");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (!key.isEmpty()) {
|
||||
QString value = lines.value(key);
|
||||
if (!value.isEmpty()) {
|
||||
// value can start with $HOME
|
||||
if (value.startsWith(QLatin1String("$HOME"))) {
|
||||
value = QDir::homePath() + value.mid(5);
|
||||
return xdgCacheHome;
|
||||
}
|
||||
case DataLocation:
|
||||
case GenericDataLocation: {
|
||||
QString xdgDataHome = QFile::decodeName(qgetenv("XDG_DATA_HOME"));
|
||||
if (xdgDataHome.isEmpty()) {
|
||||
xdgDataHome = QDir::homePath() + QLatin1String("/.local/share");
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (type == QStandardPaths::DataLocation) {
|
||||
appendOrganizationAndApp(xdgDataHome);
|
||||
}
|
||||
return xdgDataHome;
|
||||
}
|
||||
case ConfigLocation:
|
||||
case GenericConfigLocation: {
|
||||
// http://standards.freedesktop.org/basedir-spec/latest/
|
||||
QString xdgConfigHome = QFile::decodeName(qgetenv("XDG_CONFIG_HOME"));
|
||||
if (xdgConfigHome.isEmpty()) {
|
||||
xdgConfigHome = QDir::homePath() + QLatin1String("/.config");
|
||||
}
|
||||
return xdgConfigHome;
|
||||
}
|
||||
case RuntimeLocation: {
|
||||
const uid_t myUid = geteuid();
|
||||
// http://standards.freedesktop.org/basedir-spec/latest/
|
||||
QString xdgRuntimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR"));
|
||||
if (xdgRuntimeDir.isEmpty()) {
|
||||
const QString userName = QFileSystemEngine::resolveUserName(myUid);
|
||||
xdgRuntimeDir = QDir::tempPath() + QLatin1String("/runtime-") + userName;
|
||||
QDir dir(xdgRuntimeDir);
|
||||
if (!dir.exists() && !QDir().mkdir(xdgRuntimeDir)) {
|
||||
qWarning("QStandardPaths: error creating runtime directory %s: %s", qPrintable(xdgRuntimeDir),
|
||||
qPrintable(qt_error_string(errno)));
|
||||
return QString();
|
||||
}
|
||||
qWarning("QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '%s'", qPrintable(xdgRuntimeDir));
|
||||
}
|
||||
// "The directory MUST be owned by the user"
|
||||
QFileInfo fileInfo(xdgRuntimeDir);
|
||||
if (fileInfo.ownerId() != myUid) {
|
||||
qWarning("QStandardPaths: wrong ownership on runtime directory %s, %d instead of %d", qPrintable(xdgRuntimeDir),
|
||||
fileInfo.ownerId(), myUid);
|
||||
return QString();
|
||||
}
|
||||
// "and he MUST be the only one having read and write access to it. Its Unix access mode MUST be 0700."
|
||||
QFile file(xdgRuntimeDir);
|
||||
const QFile::Permissions wantedPerms = QFile::ReadUser | QFile::WriteUser | QFile::ExeUser;
|
||||
if (file.permissions() != wantedPerms && !file.setPermissions(wantedPerms)) {
|
||||
qWarning("QStandardPaths: wrong permissions on runtime directory %s", qPrintable(xdgRuntimeDir));
|
||||
return QString();
|
||||
}
|
||||
return xdgRuntimeDir;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
QString path;
|
||||
switch (type) {
|
||||
case DesktopLocation:
|
||||
path = QDir::homePath() + QLatin1String("/Desktop");
|
||||
break;
|
||||
case DocumentsLocation:
|
||||
path = QDir::homePath() + QLatin1String("/Documents");
|
||||
break;
|
||||
case PicturesLocation:
|
||||
path = QDir::homePath() + QLatin1String("/Pictures");
|
||||
break;
|
||||
// http://www.freedesktop.org/wiki/Software/xdg-user-dirs
|
||||
QString xdgConfigHome = QFile::decodeName(qgetenv("XDG_CONFIG_HOME"));
|
||||
if (xdgConfigHome.isEmpty()) {
|
||||
xdgConfigHome = QDir::homePath() + QLatin1String("/.config");
|
||||
}
|
||||
QFile file(xdgConfigHome + QLatin1String("/user-dirs.dirs"));
|
||||
if (file.open(QIODevice::ReadOnly)) {
|
||||
QHash<QString, QString> lines;
|
||||
QTextStream stream(&file);
|
||||
// Only look for lines like: XDG_DESKTOP_DIR="$HOME/Desktop"
|
||||
QRegExp exp(QLatin1String("^XDG_(.*)_DIR=(.*)$"));
|
||||
while (!stream.atEnd()) {
|
||||
const QString &line = stream.readLine();
|
||||
if (exp.indexIn(line) != -1) {
|
||||
const QStringList lst = exp.capturedTexts();
|
||||
const QString key = lst.at(1);
|
||||
QString value = lst.at(2);
|
||||
if (value.length() > 2
|
||||
&& value.startsWith(QLatin1Char('\"'))
|
||||
&& value.endsWith(QLatin1Char('\"'))) {
|
||||
value = value.mid(1, value.length() - 2);
|
||||
}
|
||||
// Store the key and value: "DESKTOP", "$HOME/Desktop"
|
||||
lines[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
case FontsLocation:
|
||||
path = QDir::homePath() + QLatin1String("/.fonts");
|
||||
break;
|
||||
QString key;
|
||||
switch (type) {
|
||||
case DesktopLocation: {
|
||||
key = QLatin1String("DESKTOP");
|
||||
break;
|
||||
}
|
||||
case DocumentsLocation: {
|
||||
key = QLatin1String("DOCUMENTS");
|
||||
break;
|
||||
}
|
||||
case PicturesLocation: {
|
||||
key = QLatin1String("PICTURES");
|
||||
break;
|
||||
}
|
||||
case MusicLocation: {
|
||||
key = QLatin1String("MUSIC");
|
||||
break;
|
||||
}
|
||||
case MoviesLocation: {
|
||||
key = QLatin1String("VIDEOS");
|
||||
break;
|
||||
}
|
||||
case DownloadLocation: {
|
||||
key = QLatin1String("DOWNLOAD");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (!key.isEmpty()) {
|
||||
QString value = lines.value(key);
|
||||
if (!value.isEmpty()) {
|
||||
// value can start with $HOME
|
||||
if (value.startsWith(QLatin1String("$HOME"))) {
|
||||
value = QDir::homePath() + value.mid(5);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case MusicLocation:
|
||||
path = QDir::homePath() + QLatin1String("/Music");
|
||||
break;
|
||||
|
||||
case MoviesLocation:
|
||||
path = QDir::homePath() + QLatin1String("/Videos");
|
||||
break;
|
||||
case DownloadLocation:
|
||||
path = QDir::homePath() + QLatin1String("/Downloads");
|
||||
break;
|
||||
case ApplicationsLocation:
|
||||
path = writableLocation(GenericDataLocation) + QLatin1String("/applications");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return path;
|
||||
return QString();
|
||||
}
|
||||
|
||||
static QStringList xdgDataDirs()
|
||||
{
|
||||
QStringList dirs;
|
||||
// http://standards.freedesktop.org/basedir-spec/latest/
|
||||
QString xdgDataDirsEnv = QFile::decodeName(qgetenv("XDG_DATA_DIRS"));
|
||||
if (xdgDataDirsEnv.isEmpty()) {
|
||||
dirs.append(QString::fromLatin1("/usr/local/share"));
|
||||
dirs.append(QString::fromLatin1("/usr/share"));
|
||||
} else {
|
||||
dirs = xdgDataDirsEnv.split(QLatin1Char(':'));
|
||||
}
|
||||
return dirs;
|
||||
// http://standards.freedesktop.org/basedir-spec/latest/
|
||||
QString xdgDataDirsEnv = QFile::decodeName(qgetenv("XDG_DATA_DIRS"));
|
||||
if (xdgDataDirsEnv.isEmpty()) {
|
||||
QStringList dirs;
|
||||
dirs.append(QString::fromLatin1("/usr/local/share"));
|
||||
dirs.append(QString::fromLatin1("/usr/share"));
|
||||
return dirs;
|
||||
}
|
||||
return xdgDataDirsEnv.split(QLatin1Char(':'));
|
||||
}
|
||||
|
||||
QStringList QStandardPaths::standardLocations(StandardLocation type)
|
||||
{
|
||||
QStringList dirs;
|
||||
switch (type) {
|
||||
case ConfigLocation:
|
||||
case GenericConfigLocation: {
|
||||
// http://standards.freedesktop.org/basedir-spec/latest/
|
||||
const QString xdgConfigDirs = QFile::decodeName(qgetenv("XDG_CONFIG_DIRS"));
|
||||
if (xdgConfigDirs.isEmpty()) {
|
||||
dirs.append(QString::fromLatin1("/etc/xdg"));
|
||||
} else {
|
||||
dirs = xdgConfigDirs.split(QLatin1Char(':'));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GenericDataLocation:
|
||||
dirs = xdgDataDirs();
|
||||
break;
|
||||
case ApplicationsLocation:
|
||||
dirs = xdgDataDirs();
|
||||
for (int i = 0; i < dirs.count(); ++i) {
|
||||
dirs[i].append(QLatin1String("/applications"));
|
||||
}
|
||||
break;
|
||||
case DataLocation:
|
||||
dirs = xdgDataDirs();
|
||||
for (int i = 0; i < dirs.count(); ++i) {
|
||||
appendOrganizationAndApp(dirs[i]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
const QString localDir = writableLocation(type);
|
||||
dirs.prepend(localDir);
|
||||
return dirs;
|
||||
QStringList dirs;
|
||||
switch (type) {
|
||||
case ConfigLocation:
|
||||
case GenericConfigLocation: {
|
||||
// http://standards.freedesktop.org/basedir-spec/latest/
|
||||
const QString xdgConfigDirs = QFile::decodeName(qgetenv("XDG_CONFIG_DIRS"));
|
||||
if (xdgConfigDirs.isEmpty()) {
|
||||
dirs.append(QString::fromLatin1("/etc/xdg"));
|
||||
} else {
|
||||
dirs = xdgConfigDirs.split(QLatin1Char(':'));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GenericDataLocation: {
|
||||
dirs = xdgDataDirs();
|
||||
break;
|
||||
}
|
||||
case ApplicationsLocation: {
|
||||
dirs = xdgDataDirs();
|
||||
for (int i = 0; i < dirs.count(); ++i) {
|
||||
dirs[i].append(QLatin1String("/applications"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DataLocation: {
|
||||
dirs = xdgDataDirs();
|
||||
for (int i = 0; i < dirs.count(); ++i) {
|
||||
appendOrganizationAndApp(dirs[i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
dirs.prepend(writableLocation(type));
|
||||
return dirs;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
Loading…
Add table
Reference in a new issue