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 "network.h"
#include "utilities.h"
#include <QPainter>
#include <QDir>
@ -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() {

View File

@ -18,6 +18,7 @@
#include "config.h"
#include "database.h"
#include "scopedtransaction.h"
#include "utilities.h"
#include <QCoreApplication>
#include <QDir>
@ -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");

View File

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

View File

@ -22,7 +22,10 @@
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSBundle.h>
#import <Foundation/NSError.h>
#import <Foundation/NSFileManager.h>
#import <Foundation/NSPathUtilities.h>
#import <Foundation/NSThread.h>
#import <Foundation/NSTimer.h>
#import <Foundation/NSURL.h>
#import <AppKit/NSNibDeclarations.h>
@ -34,9 +37,12 @@
#include "globalshortcuts.h"
#include "mac_startup.h"
#include "macglobalshortcutbackend.h"
#include "utilities.h"
#include <QCoreApplication>
#include <QDir>
#include <QEvent>
#include <QFile>
#include <QtDebug>
@ -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

View File

@ -22,6 +22,8 @@
#include <QNetworkAccessManager>
#include <QNetworkDiskCache>
#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));
}
}

View File

@ -17,6 +17,7 @@
#include "utilities.h"
#include <QtGlobal>
#include <QCoreApplication>
#include <QDateTime>
#include <QDir>
@ -30,6 +31,10 @@
# include <windows.h>
#endif
#ifdef Q_OS_DARWIN
# include "core/mac_startup.h"
#endif
#include <boost/scoped_array.hpp>
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)

View File

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

View File

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

View File

@ -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 <QtDebug>
#include <QLibraryInfo>
#include <QTranslator>
#include <QDir>
#include <QLibraryInfo>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QTranslator>
#include <QtDebug>
#include <glib-object.h>
#include <glib/gutils.h>
@ -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());