Files
cantata/3rdparty/solid-lite/xdgbasedirs.cpp
2017-11-27 22:36:53 +00:00

136 lines
4.6 KiB
C++

/***************************************************************************
* Copyright (C) 2007 by Kevin Krammer <kevin.krammer@gmx.at> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Library General Public License as *
* published by the Free Software Foundation; either version 2 of the *
* License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
/*
* This file was copied to solid from [akonadi]/libs/xdgbasedirs.cpp and slimmed down.
* See xdgbasedirs_p.h for notes about slimming down.
*/
#include "xdgbasedirs_p.h"
#include <QDir>
#include <QFileInfo>
static QStringList splitPathList( const QString &pathList )
{
return pathList.split( QLatin1Char( ':' ) );
}
class XdgBaseDirsSingleton
{
public:
QString homePath( const char *variable, const char *defaultSubDir );
QStringList systemPathList( const char *variable, const char *defaultDirList );
public:
QString mConfigHome;
QString mDataHome;
QStringList mConfigDirs;
QStringList mDataDirs;
};
Q_GLOBAL_STATIC( XdgBaseDirsSingleton, instance )
QString Solid::XdgBaseDirs::homePath( const char *resource )
{
if ( qstrncmp( "data", resource, 4 ) == 0 ) {
if ( instance()->mDataHome.isEmpty() ) {
instance()->mDataHome = instance()->homePath( "XDG_DATA_HOME", ".local/share" );
}
return instance()->mDataHome;
} else if ( qstrncmp( "config", resource, 6 ) == 0 ) {
if ( instance()->mConfigHome.isEmpty() ) {
instance()->mConfigHome = instance()->homePath( "XDG_CONFIG_HOME", ".config" );
}
return instance()->mConfigHome;
}
return QString();
}
QStringList Solid::XdgBaseDirs::systemPathList( const char *resource )
{
if ( qstrncmp( "data", resource, 4 ) == 0 ) {
if ( instance()->mDataDirs.isEmpty() ) {
instance()->mDataDirs = instance()->systemPathList( "XDG_DATA_DIRS", "/usr/local/share:/usr/share" );
}
return instance()->mDataDirs;
} else if ( qstrncmp( "config", resource, 6 ) == 0 ) {
if ( instance()->mConfigDirs.isEmpty() ) {
instance()->mConfigDirs = instance()->systemPathList( "XDG_CONFIG_DIRS", "/etc/xdg" );
}
return instance()->mConfigDirs;
}
return QStringList();
}
QString Solid::XdgBaseDirs::findResourceFile( const char *resource, const QString &relPath )
{
const QString fullPath = homePath( resource ) + QLatin1Char( '/' ) + relPath;
QFileInfo fileInfo( fullPath );
if ( fileInfo.exists() && fileInfo.isFile() && fileInfo.isReadable() ) {
return fullPath;
}
const QStringList pathList = systemPathList( resource );
for ( const QString &path: pathList ) {
fileInfo = QFileInfo( path + QLatin1Char('/' ) + relPath );
if ( fileInfo.exists() && fileInfo.isFile() && fileInfo.isReadable() ) {
return fileInfo.absoluteFilePath();
}
}
return QString();
}
QString XdgBaseDirsSingleton::homePath( const char *variable, const char *defaultSubDir )
{
const QByteArray env = qgetenv( variable );
QString xdgPath;
if ( env.isEmpty() ) {
xdgPath = QDir::homePath() + QLatin1Char( '/' ) + QLatin1String( defaultSubDir );
} else if ( env.startsWith( '/' ) ) {
xdgPath = QString::fromLocal8Bit( env );
} else {
xdgPath = QDir::homePath() + QLatin1Char( '/' ) + QString::fromLocal8Bit( env );
}
return xdgPath;
}
QStringList XdgBaseDirsSingleton::systemPathList( const char *variable, const char *defaultDirList )
{
const QByteArray env = qgetenv( variable );
QString xdgDirList;
if ( env.isEmpty() ) {
xdgDirList = QLatin1String( defaultDirList );
} else {
xdgDirList = QString::fromLocal8Bit( env );
}
return splitPathList( xdgDirList );
}