Move path information from QDesktopServices (gui) to QStandardPaths (core)
Change-Id: Ic596c21894d83b4dab0c3f5b1aed916ddd590f2f Reviewed-by: Thiago Macieira (Intel) <thiago.macieira@intel.com>
This commit is contained in:
parent
4a788eb831
commit
86558de341
@ -23,6 +23,7 @@ HEADERS += \
|
||||
io/qtemporaryfile.h \
|
||||
io/qresource_p.h \
|
||||
io/qresource_iterator_p.h \
|
||||
io/qstandardpaths.h \
|
||||
io/qurl.h \
|
||||
io/qurltlds_p.h \
|
||||
io/qtldurl_p.h \
|
||||
@ -56,6 +57,7 @@ SOURCES += \
|
||||
io/qtemporaryfile.cpp \
|
||||
io/qresource.cpp \
|
||||
io/qresource_iterator.cpp \
|
||||
io/qstandardpaths.cpp \
|
||||
io/qurl.cpp \
|
||||
io/qsettings.cpp \
|
||||
io/qfsfileengine.cpp \
|
||||
@ -75,6 +77,7 @@ win32 {
|
||||
SOURCES += io/qwindowspipewriter.cpp
|
||||
SOURCES += io/qfilesystemengine_win.cpp
|
||||
SOURCES += io/qfilesystemiterator_win.cpp
|
||||
SOURCES += io/qstandardpaths_win.cpp
|
||||
} else:unix {
|
||||
SOURCES += io/qfsfileengine_unix.cpp
|
||||
symbian {
|
||||
@ -91,6 +94,11 @@ win32 {
|
||||
SOURCES += io/qfilesystemengine_mac.cpp
|
||||
SOURCES += io/qsettings_mac.cpp io/qfilesystemwatcher_fsevents.cpp
|
||||
}
|
||||
macx-*: {
|
||||
SOURCES += io/qstandardpaths_mac.cpp
|
||||
} else {
|
||||
SOURCES += io/qstandardpaths_unix.cpp
|
||||
}
|
||||
|
||||
linux-*:!symbian {
|
||||
SOURCES += \
|
||||
|
114
src/corelib/io/qstandardpaths.cpp
Normal file
114
src/corelib/io/qstandardpaths.cpp
Normal file
@ -0,0 +1,114 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qstandardpaths.h"
|
||||
|
||||
#include <qdir.h>
|
||||
#include <qfileinfo.h>
|
||||
#include <qhash.h>
|
||||
#include <qobject.h>
|
||||
#include <qcoreapplication.h>
|
||||
|
||||
#ifndef QT_NO_STANDARDPATHS
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
/*!
|
||||
\class QStandardPaths
|
||||
\brief The QStandardPaths class provides methods for accessing standard paths.
|
||||
\since 5.0
|
||||
|
||||
This class contains functions to query standard locations on the local
|
||||
filesystem, for common tasks such as user-specific directories or system-wide
|
||||
configuration directories.
|
||||
*/
|
||||
|
||||
/*!
|
||||
\enum QStandardPaths::StandardLocation
|
||||
|
||||
This enum describes the different locations that can be queried using
|
||||
methods such as QStandardPaths::storageLocation and QStandardPaths::displayName.
|
||||
|
||||
\value DesktopLocation Returns the user's desktop directory.
|
||||
\value DocumentsLocation Returns the user's document.
|
||||
\value FontsLocation Returns the user's fonts.
|
||||
\value ApplicationsLocation Returns the user's applications.
|
||||
\value MusicLocation Returns the users music.
|
||||
\value MoviesLocation Returns the user's movies.
|
||||
\value PicturesLocation Returns the user's pictures.
|
||||
\value TempLocation Returns the system's temporary directory.
|
||||
\value HomeLocation Returns the user's home directory.
|
||||
\value DataLocation Returns a directory location where persistent
|
||||
application data can be stored. QCoreApplication::applicationName
|
||||
and QCoreApplication::organizationName should work on all
|
||||
platforms.
|
||||
\value CacheLocation Returns a directory location where user-specific
|
||||
non-essential (cached) data should be written.
|
||||
|
||||
\sa storageLocation() displayName()
|
||||
*/
|
||||
|
||||
/*!
|
||||
\fn QString QStandardPaths::storageLocation(StandardLocation type)
|
||||
|
||||
Returns the default system directory where files of \a type belong, or an empty string
|
||||
if the location cannot be determined.
|
||||
|
||||
\note The storage location returned can be a directory that does not exist; i.e., it
|
||||
may need to be created by the system or the user.
|
||||
|
||||
\note On Symbian OS, ApplicationsLocation always point /sys/bin folder on the same drive
|
||||
with executable. FontsLocation always points to folder on ROM drive. Symbian OS does not
|
||||
have desktop concept, DesktopLocation returns same path as DocumentsLocation.
|
||||
Rest of the standard locations point to folder on same drive with executable, except
|
||||
that if executable is in ROM the folder from C drive is returned.
|
||||
*/
|
||||
|
||||
/*!
|
||||
\fn QString QStandardPaths::displayName(StandardLocation type)
|
||||
|
||||
Returns a localized display name for the given location \a type or
|
||||
an empty QString if no relevant location can be found.
|
||||
*/
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_STANDARDPATHS
|
85
src/corelib/io/qstandardpaths.h
Normal file
85
src/corelib/io/qstandardpaths.h
Normal file
@ -0,0 +1,85 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QSTANDARDPATHS_H
|
||||
#define QSTANDARDPATHS_H
|
||||
|
||||
#include <QtCore/qstring.h>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Core)
|
||||
|
||||
#ifndef QT_NO_STANDARDPATHS
|
||||
|
||||
class QStringList;
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
static QString storageLocation(StandardLocation type);
|
||||
static QString displayName(StandardLocation type);
|
||||
};
|
||||
|
||||
#endif // QT_NO_STANDARDPATHS
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QSTANDARDPATHS_H
|
148
src/corelib/io/qstandardpaths_mac.cpp
Normal file
148
src/corelib/io/qstandardpaths_mac.cpp
Normal file
@ -0,0 +1,148 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QT_NO_DESKTOPSERVICES
|
||||
|
||||
#include "qstandardpaths.h"
|
||||
#include <qdir.h>
|
||||
#include <private/qcore_mac_p.h>
|
||||
#include <qcoreapplication.h>
|
||||
|
||||
#include <ApplicationServices/ApplicationServices.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
/*
|
||||
Translates a QStandardPaths::StandardLocation into the mac equivalent.
|
||||
*/
|
||||
OSType translateLocation(QStandardPaths::StandardLocation type)
|
||||
{
|
||||
switch (type) {
|
||||
case QStandardPaths::DesktopLocation:
|
||||
return kDesktopFolderType;
|
||||
case QStandardPaths::DocumentsLocation:
|
||||
return kDocumentsFolderType;
|
||||
case QStandardPaths::FontsLocation:
|
||||
// There are at least two different font directories on the mac: /Library/Fonts and ~/Library/Fonts.
|
||||
// To select a specific one we have to specify a different first parameter when calling FSFindFolder.
|
||||
return kFontsFolderType;
|
||||
case QStandardPaths::ApplicationsLocation:
|
||||
return kApplicationsFolderType;
|
||||
case QStandardPaths::MusicLocation:
|
||||
return kMusicDocumentsFolderType;
|
||||
case QStandardPaths::MoviesLocation:
|
||||
return kMovieDocumentsFolderType;
|
||||
case QStandardPaths::PicturesLocation:
|
||||
return kPictureDocumentsFolderType;
|
||||
case QStandardPaths::TempLocation:
|
||||
return kTemporaryFolderType;
|
||||
case QStandardPaths::DataLocation:
|
||||
return kApplicationSupportFolderType;
|
||||
case QStandardPaths::CacheLocation:
|
||||
return kCachedDataFolderType;
|
||||
default:
|
||||
return kDesktopFolderType;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Constructs a full unicode path from a FSRef.
|
||||
*/
|
||||
static QString getFullPath(const FSRef &ref)
|
||||
{
|
||||
QByteArray ba(2048, 0);
|
||||
if (FSRefMakePath(&ref, reinterpret_cast<UInt8 *>(ba.data()), ba.size()) == noErr)
|
||||
return QString::fromUtf8(ba).normalized(QString::NormalizationForm_C);
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString QStandardPaths::storageLocation(StandardLocation type)
|
||||
{
|
||||
if (type == HomeLocation)
|
||||
return QDir::homePath();
|
||||
|
||||
if (type == TempLocation)
|
||||
return QDir::tempPath();
|
||||
|
||||
short domain = kOnAppropriateDisk;
|
||||
|
||||
if (type == DataLocation || type == CacheLocation)
|
||||
domain = kUserDomain;
|
||||
|
||||
// http://developer.apple.com/documentation/Carbon/Reference/Folder_Manager/Reference/reference.html
|
||||
FSRef ref;
|
||||
OSErr err = FSFindFolder(domain, translateLocation(type), false, &ref);
|
||||
if (err)
|
||||
return QString();
|
||||
|
||||
QString path = getFullPath(ref);
|
||||
|
||||
if (type == DataLocation || type == CacheLocation) {
|
||||
if (QCoreApplication::organizationName().isEmpty() == false)
|
||||
path += QLatin1Char('/') + QCoreApplication::organizationName();
|
||||
if (QCoreApplication::applicationName().isEmpty() == false)
|
||||
path += QLatin1Char('/') + QCoreApplication::applicationName();
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
QString QStandardPaths::displayName(StandardLocation type)
|
||||
{
|
||||
if (QStandardPaths::HomeLocation == type)
|
||||
return QCoreApplication::translate("QStandardPaths", "Home");
|
||||
|
||||
FSRef ref;
|
||||
OSErr err = FSFindFolder(kOnAppropriateDisk, translateLocation(type), false, &ref);
|
||||
if (err)
|
||||
return QString();
|
||||
|
||||
QCFString displayName;
|
||||
err = LSCopyDisplayNameForRef(&ref, &displayName);
|
||||
if (err)
|
||||
return QString();
|
||||
|
||||
return static_cast<QString>(displayName);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_DESKTOPSERVICES
|
166
src/corelib/io/qstandardpaths_unix.cpp
Normal file
166
src/corelib/io/qstandardpaths_unix.cpp
Normal file
@ -0,0 +1,166 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qstandardpaths.h"
|
||||
#include <qprocess.h>
|
||||
#include <qurl.h>
|
||||
#include <qdir.h>
|
||||
#include <qfile.h>
|
||||
#include <qtextstream.h>
|
||||
#include <qcoreapplication.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef QT_NO_STANDARDPATHS
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QString QStandardPaths::storageLocation(StandardLocation type)
|
||||
{
|
||||
if (type == QStandardPaths::HomeLocation)
|
||||
return QDir::homePath();
|
||||
if (type == QStandardPaths::TempLocation)
|
||||
return QDir::tempPath();
|
||||
|
||||
// http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
|
||||
if (type == QStandardPaths::CacheLocation) {
|
||||
QString xdgCacheHome = QLatin1String(qgetenv("XDG_CACHE_HOME"));
|
||||
if (xdgCacheHome.isEmpty())
|
||||
xdgCacheHome = QDir::homePath() + QLatin1String("/.cache");
|
||||
xdgCacheHome += QLatin1Char('/') + QCoreApplication::organizationName()
|
||||
+ QLatin1Char('/') + QCoreApplication::applicationName();
|
||||
return xdgCacheHome;
|
||||
}
|
||||
|
||||
if (type == QStandardPaths::DataLocation) {
|
||||
QString xdgDataHome = QLatin1String(qgetenv("XDG_DATA_HOME"));
|
||||
if (xdgDataHome.isEmpty())
|
||||
xdgDataHome = QDir::homePath() + QLatin1String("/.local/share");
|
||||
xdgDataHome += QLatin1String("/data/")
|
||||
+ QCoreApplication::organizationName() + QLatin1Char('/')
|
||||
+ QCoreApplication::applicationName();
|
||||
return xdgDataHome;
|
||||
}
|
||||
|
||||
// http://www.freedesktop.org/wiki/Software/xdg-user-dirs
|
||||
QString xdgConfigHome = QLatin1String(qgetenv("XDG_CONFIG_HOME"));
|
||||
if (xdgConfigHome.isEmpty())
|
||||
xdgConfigHome = QDir::homePath() + QLatin1String("/.config");
|
||||
QFile file(xdgConfigHome + QLatin1String("/user-dirs.dirs"));
|
||||
if (file.exists() && 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()) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
default: break;
|
||||
}
|
||||
if (!key.isEmpty() && lines.contains(key)) {
|
||||
QString value = lines[key];
|
||||
// value can start with $HOME
|
||||
if (value.startsWith(QLatin1String("$HOME")))
|
||||
value = QDir::homePath() + value.mid(5);
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
QDir emptyDir;
|
||||
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;
|
||||
|
||||
case FontsLocation:
|
||||
path = QDir::homePath() + QLatin1String("/.fonts");
|
||||
break;
|
||||
|
||||
case MusicLocation:
|
||||
path = QDir::homePath() + QLatin1String("/Music");
|
||||
break;
|
||||
|
||||
case MoviesLocation:
|
||||
path = QDir::homePath() + QLatin1String("/Videos");
|
||||
break;
|
||||
|
||||
case ApplicationsLocation:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
QString QStandardPaths::displayName(StandardLocation type)
|
||||
{
|
||||
Q_UNUSED(type);
|
||||
return QString();
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_STANDARDPATHS
|
167
src/corelib/io/qstandardpaths_win.cpp
Normal file
167
src/corelib/io/qstandardpaths_win.cpp
Normal file
@ -0,0 +1,167 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qstandardpaths.h"
|
||||
|
||||
#include <qsettings.h>
|
||||
#include <qdir.h>
|
||||
#include <private/qsystemlibrary_p.h>
|
||||
#include <qurl.h>
|
||||
#include <qstringlist.h>
|
||||
#include <qprocess.h>
|
||||
#include <qtemporaryfile.h>
|
||||
#include <qcoreapplication.h>
|
||||
|
||||
#include <qt_windows.h>
|
||||
#include <shlobj.h>
|
||||
#if !defined(Q_OS_WINCE)
|
||||
# include <intshcut.h>
|
||||
#else
|
||||
# include <qguifunctions_wince.h>
|
||||
# if !defined(STANDARDSHELL_UI_MODEL)
|
||||
# include <winx.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef CSIDL_MYMUSIC
|
||||
#define CSIDL_MYMUSIC 13
|
||||
#define CSIDL_MYVIDEO 14
|
||||
#endif
|
||||
|
||||
#ifndef QT_NO_STANDARDPATHS
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QString QStandardPaths::storageLocation(StandardLocation type)
|
||||
{
|
||||
QString result;
|
||||
|
||||
#ifndef Q_OS_WINCE
|
||||
QSystemLibrary library(QLatin1String("shell32"));
|
||||
#else
|
||||
QSystemLibrary library(QLatin1String("coredll"));
|
||||
#endif // Q_OS_WINCE
|
||||
typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, LPWSTR, int, BOOL);
|
||||
static GetSpecialFolderPath SHGetSpecialFolderPath =
|
||||
(GetSpecialFolderPath)library.resolve("SHGetSpecialFolderPathW");
|
||||
if (!SHGetSpecialFolderPath)
|
||||
return QString();
|
||||
|
||||
wchar_t path[MAX_PATH];
|
||||
|
||||
switch (type) {
|
||||
case DataLocation:
|
||||
#if defined Q_OS_WINCE
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_APPDATA, FALSE))
|
||||
#else
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_LOCAL_APPDATA, FALSE))
|
||||
#endif
|
||||
result = QString::fromWCharArray(path);
|
||||
if (!QCoreApplication::organizationName().isEmpty())
|
||||
result = result + QLatin1String("\\") + QCoreApplication::organizationName();
|
||||
if (!QCoreApplication::applicationName().isEmpty())
|
||||
result = result + QLatin1String("\\") + QCoreApplication::applicationName();
|
||||
break;
|
||||
|
||||
case DesktopLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_DESKTOPDIRECTORY, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case DocumentsLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_PERSONAL, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case FontsLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_FONTS, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case ApplicationsLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_PROGRAMS, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case MusicLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_MYMUSIC, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case MoviesLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_MYVIDEO, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case PicturesLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_MYPICTURES, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case CacheLocation:
|
||||
// Although Microsoft has a Cache key it is a pointer to IE's cache, not a cache
|
||||
// location for everyone. Most applications seem to be using a
|
||||
// cache directory located in their AppData directory
|
||||
return storageLocation(DataLocation) + QLatin1String("\\cache");
|
||||
|
||||
case QStandardPaths::HomeLocation:
|
||||
result = QDir::homePath();
|
||||
break;
|
||||
|
||||
case QStandardPaths::TempLocation:
|
||||
result = QDir::tempPath();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
QString QStandardPaths::displayName(StandardLocation type)
|
||||
{
|
||||
Q_UNUSED(type);
|
||||
return QString();
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_STANDARDPATHS
|
@ -47,6 +47,7 @@
|
||||
|
||||
#include "qdesktopservices_qpa.cpp"
|
||||
|
||||
#include <qstandardpaths.h>
|
||||
#include <qhash.h>
|
||||
#include <qobject.h>
|
||||
#include <qcoreapplication.h>
|
||||
@ -269,28 +270,21 @@ void QDesktopServices::unsetUrlHandler(const QString &scheme)
|
||||
*/
|
||||
|
||||
/*!
|
||||
\fn QString QDesktopServices::storageLocation(StandardLocation type)
|
||||
\since 4.4
|
||||
|
||||
Returns the default system directory where files of \a type belong, or an empty string
|
||||
if the location cannot be determined.
|
||||
|
||||
\note The storage location returned can be a directory that does not exist; i.e., it
|
||||
may need to be created by the system or the user.
|
||||
|
||||
\note On Symbian OS, ApplicationsLocation always point /sys/bin folder on the same drive
|
||||
with executable. FontsLocation always points to folder on ROM drive. Symbian OS does not
|
||||
have desktop concept, DesktopLocation returns same path as DocumentsLocation.
|
||||
Rest of the standard locations point to folder on same drive with executable, except
|
||||
that if executable is in ROM the folder from C drive is returned.
|
||||
\deprecated Use QStandardPaths::storageLocation()
|
||||
*/
|
||||
QString QDesktopServices::storageLocation(StandardLocation type)
|
||||
{
|
||||
return QStandardPaths::storageLocation(static_cast<QStandardPaths::StandardLocation>(type));
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
\fn QString QDesktopServices::displayName(StandardLocation type)
|
||||
|
||||
Returns a localized display name for the given location \a type or
|
||||
an empty QString if no relevant location can be found.
|
||||
\deprecated Use QStandardPaths::displayName()
|
||||
*/
|
||||
QString QDesktopServices::displayName(StandardLocation type)
|
||||
{
|
||||
return QStandardPaths::displayName(static_cast<QStandardPaths::StandardLocation>(type));
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
|
@ -45,7 +45,6 @@
|
||||
#include <qstringlist.h>
|
||||
#include <qdir.h>
|
||||
#include <qurl.h>
|
||||
#include <qstringlist.h>
|
||||
#include <private/qcore_mac_p.h>
|
||||
#include <qcoreapplication.h>
|
||||
|
||||
@ -123,66 +122,6 @@ static bool openDocument(const QUrl &file)
|
||||
return QProcess::startDetached(QLatin1String("open"), QStringList() << file.toLocalFile());
|
||||
}
|
||||
|
||||
/*
|
||||
Constructs a full unicode path from a FSRef.
|
||||
*/
|
||||
static QString getFullPath(const FSRef &ref)
|
||||
{
|
||||
QByteArray ba(2048, 0);
|
||||
if (FSRefMakePath(&ref, reinterpret_cast<UInt8 *>(ba.data()), ba.size()) == noErr)
|
||||
return QString::fromUtf8(ba).normalized(QString::NormalizationForm_C);
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString QDesktopServices::storageLocation(StandardLocation type)
|
||||
{
|
||||
if (type == HomeLocation)
|
||||
return QDir::homePath();
|
||||
|
||||
if (type == TempLocation)
|
||||
return QDir::tempPath();
|
||||
|
||||
short domain = kOnAppropriateDisk;
|
||||
|
||||
if (type == DataLocation || type == CacheLocation)
|
||||
domain = kUserDomain;
|
||||
|
||||
// http://developer.apple.com/documentation/Carbon/Reference/Folder_Manager/Reference/reference.html
|
||||
FSRef ref;
|
||||
OSErr err = FSFindFolder(domain, translateLocation(type), false, &ref);
|
||||
if (err)
|
||||
return QString();
|
||||
|
||||
QString path = getFullPath(ref);
|
||||
|
||||
if (type == DataLocation || type == CacheLocation) {
|
||||
if (QCoreApplication::organizationName().isEmpty() == false)
|
||||
path += QLatin1Char('/') + QCoreApplication::organizationName();
|
||||
if (QCoreApplication::applicationName().isEmpty() == false)
|
||||
path += QLatin1Char('/') + QCoreApplication::applicationName();
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
QString QDesktopServices::displayName(StandardLocation type)
|
||||
{
|
||||
if (QDesktopServices::HomeLocation == type)
|
||||
return QObject::tr("Home");
|
||||
|
||||
FSRef ref;
|
||||
OSErr err = FSFindFolder(kOnAppropriateDisk, translateLocation(type), false, &ref);
|
||||
if (err)
|
||||
return QString();
|
||||
|
||||
QCFString displayName;
|
||||
err = LSCopyDisplayNameForRef(&ref, &displayName);
|
||||
if (err)
|
||||
return QString();
|
||||
|
||||
return static_cast<QString>(displayName);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_DESKTOPSERVICES
|
||||
|
@ -39,8 +39,7 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <qcoreapplication.h>
|
||||
#include <qdir.h>
|
||||
#include <qdebug.h>
|
||||
#include <qurl.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
@ -59,36 +58,4 @@ static bool openDocument(const QUrl &file)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
QString QDesktopServices::storageLocation(StandardLocation type)
|
||||
{
|
||||
if (type == DataLocation) {
|
||||
QString qwsDataHome = QLatin1String(qgetenv("QWS_DATA_HOME"));
|
||||
if (qwsDataHome.isEmpty())
|
||||
qwsDataHome = QDir::homePath() + QLatin1String("/.qws/share");
|
||||
qwsDataHome += QLatin1String("/data/")
|
||||
+ QCoreApplication::organizationName() + QLatin1Char('/')
|
||||
+ QCoreApplication::applicationName();
|
||||
return qwsDataHome;
|
||||
}
|
||||
if (type == QDesktopServices::CacheLocation) {
|
||||
QString qwsCacheHome = QLatin1String(qgetenv("QWS_CACHE_HOME"));
|
||||
if (qwsCacheHome.isEmpty())
|
||||
qwsCacheHome = QDir::homePath() + QLatin1String("/.qws/cache/");
|
||||
qwsCacheHome += QCoreApplication::organizationName() + QLatin1Char('/')
|
||||
+ QCoreApplication::applicationName();
|
||||
return qwsCacheHome;
|
||||
}
|
||||
|
||||
qWarning("QDesktopServices::storageLocation %d not implemented", type);
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString QDesktopServices::displayName(StandardLocation type)
|
||||
{
|
||||
Q_UNUSED(type);
|
||||
qWarning("QDesktopServices::displayName not implemented");
|
||||
return QString();
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -327,130 +327,5 @@ static bool openDocument(const QUrl &file)
|
||||
|
||||
#endif //USE_SCHEMEHANDLER
|
||||
|
||||
// Common functions to all implementations
|
||||
|
||||
static TDriveUnit exeDrive()
|
||||
{
|
||||
RProcess me;
|
||||
TFileName processFileName = me.FileName();
|
||||
TDriveUnit drive(processFileName);
|
||||
return drive;
|
||||
}
|
||||
|
||||
static TDriveUnit writableExeDrive()
|
||||
{
|
||||
TDriveUnit drive = exeDrive();
|
||||
if (drive.operator TInt() == EDriveZ)
|
||||
return TDriveUnit(EDriveC);
|
||||
return drive;
|
||||
}
|
||||
|
||||
static TPtrC writableDataRoot()
|
||||
{
|
||||
TDriveUnit drive = exeDrive();
|
||||
switch (drive.operator TInt()){
|
||||
case EDriveC:
|
||||
return PathInfo::PhoneMemoryRootPath();
|
||||
break;
|
||||
case EDriveE:
|
||||
return PathInfo::MemoryCardRootPath();
|
||||
break;
|
||||
case EDriveZ:
|
||||
// It is not possible to write on ROM drive ->
|
||||
// return phone mem root path instead
|
||||
return PathInfo::PhoneMemoryRootPath();
|
||||
break;
|
||||
default:
|
||||
return PathInfo::PhoneMemoryRootPath();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
QString QDesktopServices::storageLocation(StandardLocation type)
|
||||
{
|
||||
TFileName path;
|
||||
|
||||
switch (type) {
|
||||
case DesktopLocation:
|
||||
qWarning("No desktop concept in Symbian OS");
|
||||
// But lets still use some feasible default
|
||||
path.Append(writableDataRoot());
|
||||
break;
|
||||
case DocumentsLocation:
|
||||
path.Append(writableDataRoot());
|
||||
break;
|
||||
case FontsLocation:
|
||||
path.Append(KFontsDir);
|
||||
break;
|
||||
case ApplicationsLocation:
|
||||
path.Append(exeDrive().Name());
|
||||
path.Append(KSysBin);
|
||||
break;
|
||||
case MusicLocation:
|
||||
path.Append(writableDataRoot());
|
||||
path.Append(PathInfo::SoundsPath());
|
||||
break;
|
||||
case MoviesLocation:
|
||||
path.Append(writableDataRoot());
|
||||
path.Append(PathInfo::VideosPath());
|
||||
break;
|
||||
case PicturesLocation:
|
||||
path.Append(writableDataRoot());
|
||||
path.Append(PathInfo::ImagesPath());
|
||||
break;
|
||||
case TempLocation:
|
||||
return QDir::tempPath();
|
||||
break;
|
||||
case HomeLocation:
|
||||
path.Append(writableDataRoot());
|
||||
//return QDir::homePath(); break;
|
||||
break;
|
||||
case DataLocation:
|
||||
qt_s60GetRFs().PrivatePath(path);
|
||||
path.Insert(0, writableExeDrive().Name());
|
||||
break;
|
||||
case CacheLocation:
|
||||
qt_s60GetRFs().PrivatePath(path);
|
||||
path.Insert(0, writableExeDrive().Name());
|
||||
path.Append(KCacheSubDir);
|
||||
break;
|
||||
default:
|
||||
// Lets use feasible default
|
||||
path.Append(writableDataRoot());
|
||||
break;
|
||||
}
|
||||
|
||||
// Convert to cross-platform format and clean the path
|
||||
QString nativePath = QString::fromUtf16(path.Ptr(), path.Length());
|
||||
QString qtPath = QDir::fromNativeSeparators(nativePath);
|
||||
qtPath = QDir::cleanPath(qtPath);
|
||||
|
||||
// Note: The storage location returned can be a directory that does not exist;
|
||||
// i.e., it may need to be created by the system or the user.
|
||||
return qtPath;
|
||||
}
|
||||
|
||||
typedef QString (*LocalizerFunc)(QString&);
|
||||
|
||||
static QString defaultLocalizedDirectoryName(QString&)
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString QDesktopServices::displayName(StandardLocation type)
|
||||
{
|
||||
static LocalizerFunc ptrLocalizerFunc = NULL;
|
||||
|
||||
if (!ptrLocalizerFunc) {
|
||||
ptrLocalizerFunc = reinterpret_cast<LocalizerFunc>
|
||||
(qt_resolveS60PluginFunc(S60Plugin_LocalizedDirectoryName));
|
||||
if (!ptrLocalizerFunc)
|
||||
ptrLocalizerFunc = &defaultLocalizedDirectoryName;
|
||||
}
|
||||
|
||||
QString rawPath = storageLocation(type);
|
||||
return ptrLocalizerFunc(rawPath);
|
||||
}
|
||||
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -172,92 +172,6 @@ static bool launchWebBrowser(const QUrl &url)
|
||||
return (returnValue > 32);
|
||||
}
|
||||
|
||||
QString QDesktopServices::storageLocation(StandardLocation type)
|
||||
{
|
||||
QString result;
|
||||
|
||||
#ifndef Q_OS_WINCE
|
||||
QSystemLibrary library(QLatin1String("shell32"));
|
||||
#else
|
||||
QSystemLibrary library(QLatin1String("coredll"));
|
||||
#endif // Q_OS_WINCE
|
||||
typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, LPWSTR, int, BOOL);
|
||||
static GetSpecialFolderPath SHGetSpecialFolderPath =
|
||||
(GetSpecialFolderPath)library.resolve("SHGetSpecialFolderPathW");
|
||||
if (!SHGetSpecialFolderPath)
|
||||
return QString();
|
||||
|
||||
wchar_t path[MAX_PATH];
|
||||
|
||||
switch (type) {
|
||||
case DataLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_LOCAL_APPDATA, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
if (!QCoreApplication::organizationName().isEmpty())
|
||||
result = result + QLatin1String("\\") + QCoreApplication::organizationName();
|
||||
if (!QCoreApplication::applicationName().isEmpty())
|
||||
result = result + QLatin1String("\\") + QCoreApplication::applicationName();
|
||||
break;
|
||||
|
||||
case DesktopLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_DESKTOPDIRECTORY, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case DocumentsLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_PERSONAL, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case FontsLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_FONTS, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case ApplicationsLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_PROGRAMS, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case MusicLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_MYMUSIC, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case MoviesLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_MYVIDEO, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case PicturesLocation:
|
||||
if (SHGetSpecialFolderPath(0, path, CSIDL_MYPICTURES, FALSE))
|
||||
result = QString::fromWCharArray(path);
|
||||
break;
|
||||
|
||||
case CacheLocation:
|
||||
// Although Microsoft has a Cache key it is a pointer to IE's cache, not a cache
|
||||
// location for everyone. Most applications seem to be using a
|
||||
// cache directory located in their AppData directory
|
||||
return storageLocation(DataLocation) + QLatin1String("\\cache");
|
||||
|
||||
case QDesktopServices::HomeLocation:
|
||||
return QDir::homePath(); break;
|
||||
|
||||
case QDesktopServices::TempLocation:
|
||||
return QDir::tempPath(); break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
QString QDesktopServices::displayName(StandardLocation type)
|
||||
{
|
||||
Q_UNUSED(type);
|
||||
return QString();
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_DESKTOPSERVICES
|
||||
|
@ -126,117 +126,6 @@ static bool launchWebBrowser(const QUrl &url)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
QString QDesktopServices::storageLocation(StandardLocation type)
|
||||
{
|
||||
if (type == QDesktopServices::HomeLocation)
|
||||
return QDir::homePath();
|
||||
if (type == QDesktopServices::TempLocation)
|
||||
return QDir::tempPath();
|
||||
|
||||
// http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
|
||||
if (type == QDesktopServices::CacheLocation) {
|
||||
QString xdgCacheHome = QLatin1String(qgetenv("XDG_CACHE_HOME"));
|
||||
if (xdgCacheHome.isEmpty())
|
||||
xdgCacheHome = QDir::homePath() + QLatin1String("/.cache");
|
||||
xdgCacheHome += QLatin1Char('/') + QCoreApplication::organizationName()
|
||||
+ QLatin1Char('/') + QCoreApplication::applicationName();
|
||||
return xdgCacheHome;
|
||||
}
|
||||
|
||||
if (type == QDesktopServices::DataLocation) {
|
||||
QString xdgDataHome = QLatin1String(qgetenv("XDG_DATA_HOME"));
|
||||
if (xdgDataHome.isEmpty())
|
||||
xdgDataHome = QDir::homePath() + QLatin1String("/.local/share");
|
||||
xdgDataHome += QLatin1String("/data/")
|
||||
+ QCoreApplication::organizationName() + QLatin1Char('/')
|
||||
+ QCoreApplication::applicationName();
|
||||
return xdgDataHome;
|
||||
}
|
||||
|
||||
// http://www.freedesktop.org/wiki/Software/xdg-user-dirs
|
||||
QString xdgConfigHome = QLatin1String(qgetenv("XDG_CONFIG_HOME"));
|
||||
if (xdgConfigHome.isEmpty())
|
||||
xdgConfigHome = QDir::homePath() + QLatin1String("/.config");
|
||||
QFile file(xdgConfigHome + QLatin1String("/user-dirs.dirs"));
|
||||
if (file.exists() && 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()) {
|
||||
QString line = stream.readLine();
|
||||
if (exp.indexIn(line) != -1) {
|
||||
QStringList lst = exp.capturedTexts();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
default: break;
|
||||
}
|
||||
if (!key.isEmpty() && lines.contains(key)) {
|
||||
QString value = lines[key];
|
||||
// value can start with $HOME
|
||||
if (value.startsWith(QLatin1String("$HOME")))
|
||||
value = QDir::homePath() + value.mid(5);
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
QDir emptyDir;
|
||||
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;
|
||||
|
||||
case FontsLocation:
|
||||
path = QDir::homePath() + QLatin1String("/.fonts");
|
||||
break;
|
||||
|
||||
case MusicLocation:
|
||||
path = QDir::homePath() + QLatin1String("/Music");
|
||||
break;
|
||||
|
||||
case MoviesLocation:
|
||||
path = QDir::homePath() + QLatin1String("/Videos");
|
||||
break;
|
||||
|
||||
case ApplicationsLocation:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
QString QDesktopServices::displayName(StandardLocation type)
|
||||
{
|
||||
Q_UNUSED(type);
|
||||
return QString();
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_DESKTOPSERVICES
|
||||
|
Loading…
Reference in New Issue
Block a user