Fix config file location on Mac and automatically migrate.

This commit is contained in:
John Maguire 2010-12-09 12:34:08 +00:00
parent 04bbf73cff
commit 3a19bb9d46
9 changed files with 114 additions and 14 deletions

View File

@ -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() {

View File

@ -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");

View File

@ -24,6 +24,8 @@ QString GetBundlePath();
QString GetResourcesPath(); QString GetResourcesPath();
QString GetApplicationSupportPath(); QString GetApplicationSupportPath();
bool MigrateLegacyConfigFiles();
} // namespace mac } // namespace mac
#endif #endif

View File

@ -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

View File

@ -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()));
} }
} }

View File

@ -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)

View File

@ -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 {

View File

@ -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())

View File

@ -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());