diff --git a/src/core/albumcoverloader.cpp b/src/core/albumcoverloader.cpp index 60d6c6b6a..35ba3fc1f 100644 --- a/src/core/albumcoverloader.cpp +++ b/src/core/albumcoverloader.cpp @@ -17,6 +17,7 @@ #include "albumcoverloader.h" #include "network.h" +#include "utilities.h" #include #include @@ -43,8 +44,7 @@ AlbumCoverLoader::AlbumCoverLoader(QObject* parent) } QString AlbumCoverLoader::ImageCacheDir() { - return QString("%1/.config/%2/albumcovers/") - .arg(QDir::homePath(), QCoreApplication::organizationName()); + return Utilities::GetConfigPath(Utilities::ALBUM_COVERS); } void AlbumCoverLoader::Clear() { diff --git a/src/core/database.cpp b/src/core/database.cpp index 439785aa6..2ac9d106d 100644 --- a/src/core/database.cpp +++ b/src/core/database.cpp @@ -18,6 +18,7 @@ #include "config.h" #include "database.h" #include "scopedtransaction.h" +#include "utilities.h" #include #include @@ -333,7 +334,7 @@ Database::Database(QObject* parent, const QString& database_name) } directory_ = QDir::toNativeSeparators( - QDir::homePath() + "/.config/" + QCoreApplication::organizationName()); + Utilities::GetConfigPath(Utilities::ROOT)); attached_databases_["jamendo"] = AttachedDatabase( directory_ + "/jamendo.db", ":/schema/jamendo.sql"); diff --git a/src/core/mac_startup.h b/src/core/mac_startup.h index 7729ff67a..c7179239f 100644 --- a/src/core/mac_startup.h +++ b/src/core/mac_startup.h @@ -24,6 +24,8 @@ QString GetBundlePath(); QString GetResourcesPath(); QString GetApplicationSupportPath(); +bool MigrateLegacyConfigFiles(); + } // namespace mac #endif diff --git a/src/core/mac_startup.mm b/src/core/mac_startup.mm index f869a70be..466ede368 100644 --- a/src/core/mac_startup.mm +++ b/src/core/mac_startup.mm @@ -22,7 +22,10 @@ #import #import +#import +#import #import +#import #import #import #import @@ -34,9 +37,12 @@ #include "globalshortcuts.h" #include "mac_startup.h" #include "macglobalshortcutbackend.h" +#include "utilities.h" #include +#include #include +#include #include @@ -203,15 +209,45 @@ QString GetResourcesPath() { } QString GetApplicationSupportPath() { + NSAutoreleasePool* pool = [NSAutoreleasePool alloc]; + [pool init]; NSArray* paths = NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory, NSUserDomainMask, YES); + QString ret; if ([paths count] > 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 diff --git a/src/core/network.cpp b/src/core/network.cpp index 0b6b77c9a..5c1b0324f 100644 --- a/src/core/network.cpp +++ b/src/core/network.cpp @@ -22,6 +22,8 @@ #include #include +#include "utilities.h" + QMutex ThreadSafeNetworkDiskCache::sMutex; QNetworkDiskCache* ThreadSafeNetworkDiskCache::sCache = NULL; @@ -30,8 +32,7 @@ ThreadSafeNetworkDiskCache::ThreadSafeNetworkDiskCache(QObject* parent) { QMutexLocker l(&sMutex); if (!sCache) { sCache = new QNetworkDiskCache; - sCache->setCacheDirectory(QString("%1/.config/%2/networkcache/") - .arg(QDir::homePath(), QCoreApplication::organizationName())); + sCache->setCacheDirectory(Utilities::GetConfigPath(Utilities::NETWORK_CACHE)); } } diff --git a/src/core/utilities.cpp b/src/core/utilities.cpp index c669f0392..68acec6bd 100644 --- a/src/core/utilities.cpp +++ b/src/core/utilities.cpp @@ -17,6 +17,7 @@ #include "utilities.h" +#include #include #include #include @@ -30,6 +31,10 @@ # include #endif +#ifdef Q_OS_DARWIN +# include "core/mac_startup.h" +#endif + #include namespace Utilities { @@ -194,7 +199,34 @@ QString ColorToRgba(const QColor& c) { .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) diff --git a/src/core/utilities.h b/src/core/utilities.h index d0a1447dd..01de50494 100644 --- a/src/core/utilities.h +++ b/src/core/utilities.h @@ -40,6 +40,15 @@ namespace Utilities { QString MakeTempDir(); void RemoveRecursive(const QString& path); bool Copy(QIODevice* source, QIODevice* destination); + + + enum ConfigPath { + ROOT, + ALBUM_COVERS, + NETWORK_CACHE, + GSTREAMER_REGISTRY, + }; + QString GetConfigPath(ConfigPath config); } class ScopedWCharArray { diff --git a/src/engines/gstengine.cpp b/src/engines/gstengine.cpp index 9ca9867e6..2ac899e93 100644 --- a/src/engines/gstengine.cpp +++ b/src/engines/gstengine.cpp @@ -25,6 +25,7 @@ #include "gstengine.h" #include "gstenginepipeline.h" #include "core/boundfuturewatcher.h" +#include "core/utilities.h" #ifdef HAVE_IMOBILEDEVICE # include "gstafcsrc/gstafcsrc.h" @@ -120,9 +121,7 @@ bool GstEngine::Init() { #endif #if defined(Q_OS_WIN32) || defined(Q_OS_DARWIN) - registry_filename = QString("%1/.config/%2/gst-registry-%3.bin").arg( - QDir::homePath(), QCoreApplication::organizationName(), - QCoreApplication::applicationVersion()); + registry_filename = Utilities::GetConfigPath(Utilities::GSTREAMER_REGISTRY); #endif if (!scanner_path.isEmpty()) diff --git a/src/main.cpp b/src/main.cpp index 28f9f8113..526c83a49 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,12 +23,14 @@ #include "config.h" #include "core/commandlineoptions.h" +#include "core/database.h" #include "core/encoding.h" #include "core/mac_startup.h" #include "core/network.h" #include "core/player.h" #include "core/potranslator.h" #include "core/song.h" +#include "core/utilities.h" #include "engines/enginebase.h" #include "library/directory.h" #include "radio/lastfmservice.h" @@ -40,10 +42,12 @@ #include "qtsingleapplication.h" #include "qtsinglecoreapplication.h" -#include -#include -#include #include +#include +#include +#include +#include +#include #include #include @@ -103,6 +107,22 @@ int main(int argc, char *argv[]) { QCoreApplication::setOrganizationName("Clementine"); 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 g_type_init(); g_set_application_name(QCoreApplication::applicationName().toLocal8Bit());