Fix config file location on Mac and automatically migrate.
This commit is contained in:
parent
04bbf73cff
commit
3a19bb9d46
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "albumcoverloader.h"
|
#include "albumcoverloader.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
@ -43,8 +44,7 @@ AlbumCoverLoader::AlbumCoverLoader(QObject* parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
QString AlbumCoverLoader::ImageCacheDir() {
|
QString AlbumCoverLoader::ImageCacheDir() {
|
||||||
return QString("%1/.config/%2/albumcovers/")
|
return Utilities::GetConfigPath(Utilities::ALBUM_COVERS);
|
||||||
.arg(QDir::homePath(), QCoreApplication::organizationName());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlbumCoverLoader::Clear() {
|
void AlbumCoverLoader::Clear() {
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "database.h"
|
#include "database.h"
|
||||||
#include "scopedtransaction.h"
|
#include "scopedtransaction.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
@ -333,7 +334,7 @@ Database::Database(QObject* parent, const QString& database_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
directory_ = QDir::toNativeSeparators(
|
directory_ = QDir::toNativeSeparators(
|
||||||
QDir::homePath() + "/.config/" + QCoreApplication::organizationName());
|
Utilities::GetConfigPath(Utilities::ROOT));
|
||||||
|
|
||||||
attached_databases_["jamendo"] = AttachedDatabase(
|
attached_databases_["jamendo"] = AttachedDatabase(
|
||||||
directory_ + "/jamendo.db", ":/schema/jamendo.sql");
|
directory_ + "/jamendo.db", ":/schema/jamendo.sql");
|
||||||
|
|
|
@ -24,6 +24,8 @@ QString GetBundlePath();
|
||||||
QString GetResourcesPath();
|
QString GetResourcesPath();
|
||||||
QString GetApplicationSupportPath();
|
QString GetApplicationSupportPath();
|
||||||
|
|
||||||
|
bool MigrateLegacyConfigFiles();
|
||||||
|
|
||||||
} // namespace mac
|
} // namespace mac
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -22,7 +22,10 @@
|
||||||
|
|
||||||
#import <Foundation/NSAutoreleasePool.h>
|
#import <Foundation/NSAutoreleasePool.h>
|
||||||
#import <Foundation/NSBundle.h>
|
#import <Foundation/NSBundle.h>
|
||||||
|
#import <Foundation/NSError.h>
|
||||||
|
#import <Foundation/NSFileManager.h>
|
||||||
#import <Foundation/NSPathUtilities.h>
|
#import <Foundation/NSPathUtilities.h>
|
||||||
|
#import <Foundation/NSThread.h>
|
||||||
#import <Foundation/NSTimer.h>
|
#import <Foundation/NSTimer.h>
|
||||||
#import <Foundation/NSURL.h>
|
#import <Foundation/NSURL.h>
|
||||||
#import <AppKit/NSNibDeclarations.h>
|
#import <AppKit/NSNibDeclarations.h>
|
||||||
|
@ -34,9 +37,12 @@
|
||||||
#include "globalshortcuts.h"
|
#include "globalshortcuts.h"
|
||||||
#include "mac_startup.h"
|
#include "mac_startup.h"
|
||||||
#include "macglobalshortcutbackend.h"
|
#include "macglobalshortcutbackend.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
|
#include <QDir>
|
||||||
#include <QEvent>
|
#include <QEvent>
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
|
||||||
|
@ -203,15 +209,45 @@ QString GetResourcesPath() {
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GetApplicationSupportPath() {
|
QString GetApplicationSupportPath() {
|
||||||
|
NSAutoreleasePool* pool = [NSAutoreleasePool alloc];
|
||||||
|
[pool init];
|
||||||
NSArray* paths = NSSearchPathForDirectoriesInDomains(
|
NSArray* paths = NSSearchPathForDirectoriesInDomains(
|
||||||
NSApplicationSupportDirectory,
|
NSApplicationSupportDirectory,
|
||||||
NSUserDomainMask,
|
NSUserDomainMask,
|
||||||
YES);
|
YES);
|
||||||
|
QString ret;
|
||||||
if ([paths count] > 0) {
|
if ([paths count] > 0) {
|
||||||
NSString* user_path = [paths objectAtIndex:0];
|
NSString* user_path = [paths objectAtIndex:0];
|
||||||
return QString::fromUtf8([user_path UTF8String]);
|
ret = QString::fromUtf8([user_path UTF8String]);
|
||||||
|
} else {
|
||||||
|
ret = "~/Library/Application Support";
|
||||||
}
|
}
|
||||||
return "~/Library/Application Support";
|
[pool drain];
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MigrateLegacyConfigFiles() {
|
||||||
|
QString old_config_dir = QString("%1/.config/%2").arg(
|
||||||
|
QDir::homePath(), QCoreApplication::organizationName());
|
||||||
|
if (!QFile::exists(old_config_dir)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
QString new_config_dir = Utilities::GetConfigPath(Utilities::ROOT);
|
||||||
|
|
||||||
|
qDebug() << "Move from:" << old_config_dir
|
||||||
|
<< "to:" << new_config_dir;
|
||||||
|
|
||||||
|
NSFileManager* file_manager = [[NSFileManager alloc] init];
|
||||||
|
NSError* error;
|
||||||
|
bool ret = [file_manager moveItemAtPath:
|
||||||
|
[NSString stringWithUTF8String: old_config_dir.toUtf8().constData()]
|
||||||
|
toPath:[NSString stringWithUTF8String: new_config_dir.toUtf8().constData()]
|
||||||
|
error: &error];
|
||||||
|
if (!ret) {
|
||||||
|
qWarning() << [[error localizedDescription] UTF8String];
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace mac
|
} // namespace mac
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
#include <QNetworkDiskCache>
|
#include <QNetworkDiskCache>
|
||||||
|
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
QMutex ThreadSafeNetworkDiskCache::sMutex;
|
QMutex ThreadSafeNetworkDiskCache::sMutex;
|
||||||
QNetworkDiskCache* ThreadSafeNetworkDiskCache::sCache = NULL;
|
QNetworkDiskCache* ThreadSafeNetworkDiskCache::sCache = NULL;
|
||||||
|
|
||||||
|
@ -30,8 +32,7 @@ ThreadSafeNetworkDiskCache::ThreadSafeNetworkDiskCache(QObject* parent) {
|
||||||
QMutexLocker l(&sMutex);
|
QMutexLocker l(&sMutex);
|
||||||
if (!sCache) {
|
if (!sCache) {
|
||||||
sCache = new QNetworkDiskCache;
|
sCache = new QNetworkDiskCache;
|
||||||
sCache->setCacheDirectory(QString("%1/.config/%2/networkcache/")
|
sCache->setCacheDirectory(Utilities::GetConfigPath(Utilities::NETWORK_CACHE));
|
||||||
.arg(QDir::homePath(), QCoreApplication::organizationName()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
|
#include <QtGlobal>
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
@ -30,6 +31,10 @@
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef Q_OS_DARWIN
|
||||||
|
# include "core/mac_startup.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <boost/scoped_array.hpp>
|
#include <boost/scoped_array.hpp>
|
||||||
|
|
||||||
namespace Utilities {
|
namespace Utilities {
|
||||||
|
@ -194,7 +199,34 @@ QString ColorToRgba(const QColor& c) {
|
||||||
.arg(c.red()).arg(c.green()).arg(c.blue()).arg(c.alpha());
|
.arg(c.red()).arg(c.green()).arg(c.blue()).arg(c.alpha());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
QString GetConfigPath(ConfigPath config) {
|
||||||
|
switch (config) {
|
||||||
|
case ROOT: {
|
||||||
|
#ifdef Q_OS_DARWIN
|
||||||
|
return mac::GetApplicationSupportPath() + "/" + QCoreApplication::organizationName();
|
||||||
|
#else
|
||||||
|
return QString("%1/.config/%2").arg(QDir::homePath(), QCoreApplication::organizationName());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ALBUM_COVERS:
|
||||||
|
return GetConfigPath(ROOT) + "/albumcovers";
|
||||||
|
|
||||||
|
case NETWORK_CACHE:
|
||||||
|
return GetConfigPath(ROOT) + "/networkcache";
|
||||||
|
|
||||||
|
case GSTREAMER_REGISTRY:
|
||||||
|
return GetConfigPath(ROOT) +
|
||||||
|
QString("/gst-registry-%1-bin").arg(QCoreApplication::applicationVersion());
|
||||||
|
|
||||||
|
default:
|
||||||
|
qFatal("%s", Q_FUNC_INFO);
|
||||||
|
return QString::null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Utilities
|
||||||
|
|
||||||
|
|
||||||
ScopedWCharArray::ScopedWCharArray(const QString& str)
|
ScopedWCharArray::ScopedWCharArray(const QString& str)
|
||||||
|
|
|
@ -40,6 +40,15 @@ namespace Utilities {
|
||||||
QString MakeTempDir();
|
QString MakeTempDir();
|
||||||
void RemoveRecursive(const QString& path);
|
void RemoveRecursive(const QString& path);
|
||||||
bool Copy(QIODevice* source, QIODevice* destination);
|
bool Copy(QIODevice* source, QIODevice* destination);
|
||||||
|
|
||||||
|
|
||||||
|
enum ConfigPath {
|
||||||
|
ROOT,
|
||||||
|
ALBUM_COVERS,
|
||||||
|
NETWORK_CACHE,
|
||||||
|
GSTREAMER_REGISTRY,
|
||||||
|
};
|
||||||
|
QString GetConfigPath(ConfigPath config);
|
||||||
}
|
}
|
||||||
|
|
||||||
class ScopedWCharArray {
|
class ScopedWCharArray {
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "gstengine.h"
|
#include "gstengine.h"
|
||||||
#include "gstenginepipeline.h"
|
#include "gstenginepipeline.h"
|
||||||
#include "core/boundfuturewatcher.h"
|
#include "core/boundfuturewatcher.h"
|
||||||
|
#include "core/utilities.h"
|
||||||
|
|
||||||
#ifdef HAVE_IMOBILEDEVICE
|
#ifdef HAVE_IMOBILEDEVICE
|
||||||
# include "gstafcsrc/gstafcsrc.h"
|
# include "gstafcsrc/gstafcsrc.h"
|
||||||
|
@ -120,9 +121,7 @@ bool GstEngine::Init() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(Q_OS_WIN32) || defined(Q_OS_DARWIN)
|
#if defined(Q_OS_WIN32) || defined(Q_OS_DARWIN)
|
||||||
registry_filename = QString("%1/.config/%2/gst-registry-%3.bin").arg(
|
registry_filename = Utilities::GetConfigPath(Utilities::GSTREAMER_REGISTRY);
|
||||||
QDir::homePath(), QCoreApplication::organizationName(),
|
|
||||||
QCoreApplication::applicationVersion());
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!scanner_path.isEmpty())
|
if (!scanner_path.isEmpty())
|
||||||
|
|
26
src/main.cpp
26
src/main.cpp
|
@ -23,12 +23,14 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "core/commandlineoptions.h"
|
#include "core/commandlineoptions.h"
|
||||||
|
#include "core/database.h"
|
||||||
#include "core/encoding.h"
|
#include "core/encoding.h"
|
||||||
#include "core/mac_startup.h"
|
#include "core/mac_startup.h"
|
||||||
#include "core/network.h"
|
#include "core/network.h"
|
||||||
#include "core/player.h"
|
#include "core/player.h"
|
||||||
#include "core/potranslator.h"
|
#include "core/potranslator.h"
|
||||||
#include "core/song.h"
|
#include "core/song.h"
|
||||||
|
#include "core/utilities.h"
|
||||||
#include "engines/enginebase.h"
|
#include "engines/enginebase.h"
|
||||||
#include "library/directory.h"
|
#include "library/directory.h"
|
||||||
#include "radio/lastfmservice.h"
|
#include "radio/lastfmservice.h"
|
||||||
|
@ -40,10 +42,12 @@
|
||||||
#include "qtsingleapplication.h"
|
#include "qtsingleapplication.h"
|
||||||
#include "qtsinglecoreapplication.h"
|
#include "qtsinglecoreapplication.h"
|
||||||
|
|
||||||
#include <QtDebug>
|
|
||||||
#include <QLibraryInfo>
|
|
||||||
#include <QTranslator>
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QLibraryInfo>
|
||||||
|
#include <QSqlDatabase>
|
||||||
|
#include <QSqlQuery>
|
||||||
|
#include <QTranslator>
|
||||||
|
#include <QtDebug>
|
||||||
|
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
#include <glib/gutils.h>
|
#include <glib/gutils.h>
|
||||||
|
@ -103,6 +107,22 @@ int main(int argc, char *argv[]) {
|
||||||
QCoreApplication::setOrganizationName("Clementine");
|
QCoreApplication::setOrganizationName("Clementine");
|
||||||
QCoreApplication::setOrganizationDomain("davidsansome.com");
|
QCoreApplication::setOrganizationDomain("davidsansome.com");
|
||||||
|
|
||||||
|
#ifdef Q_OS_DARWIN
|
||||||
|
// Must happen after QCoreApplication::setOrganizationName().
|
||||||
|
if (mac::MigrateLegacyConfigFiles()) {
|
||||||
|
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
|
||||||
|
db.setDatabaseName(Utilities::GetConfigPath(
|
||||||
|
Utilities::ROOT) + "/" + Database::kDatabaseFilename);
|
||||||
|
db.open();
|
||||||
|
QSqlQuery query(
|
||||||
|
"UPDATE songs SET art_manual = replace("
|
||||||
|
"art_manual, '.config', 'Library/Application Support') "
|
||||||
|
"WHERE art_manual LIKE '%.config%';", db);
|
||||||
|
query.exec();
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// This makes us show up nicely in gnome-volume-control
|
// This makes us show up nicely in gnome-volume-control
|
||||||
g_type_init();
|
g_type_init();
|
||||||
g_set_application_name(QCoreApplication::applicationName().toLocal8Bit());
|
g_set_application_name(QCoreApplication::applicationName().toLocal8Bit());
|
||||||
|
|
Loading…
Reference in New Issue