diff --git a/src/core/application.cpp b/src/core/application.cpp index b01cf5450..45d96b749 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -44,6 +44,8 @@ # include "moodbar/moodbarloader.h" #endif +bool Application::kIsPortable = false; + Application::Application(QObject* parent) : QObject(parent), tag_reader_client_(NULL), diff --git a/src/core/application.h b/src/core/application.h index d5f471158..f414b12b5 100644 --- a/src/core/application.h +++ b/src/core/application.h @@ -52,6 +52,8 @@ class Application : public QObject { Q_OBJECT public: + static bool kIsPortable; + Application(QObject* parent = NULL); ~Application(); diff --git a/src/core/song.cpp b/src/core/song.cpp index f79ab5f93..5cfaa970a 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -19,6 +19,7 @@ #include +#include #include #include #include @@ -258,8 +259,15 @@ qint64 Song::length_nanosec() const { return d->end_ - d->beginning_; } int Song::bitrate() const { return d->bitrate_; } int Song::samplerate() const { return d->samplerate_; } int Song::directory_id() const { return d->directory_id_; } -const QUrl& Song::url() const { return d->url_; } -const QString& Song::basefilename() const { return d->basefilename_; } +const QUrl& Song::url() const { + QUrl base = QUrl::fromLocalFile(QCoreApplication::applicationDirPath()); + qLog(Debug) << "Url" << d->url_.toLocalFile(); + qLog(Debug) << "base" << base.toString(); + qLog(Debug) << "absolute" << base.resolved(d->url_).toString(); + QUrl res = base.resolved(d->url_); + return d->url_; +} +const QString& Song::basefilename() const { return d->basefilename_; } uint Song::mtime() const { return d->mtime_; } uint Song::ctime() const { return d->ctime_; } int Song::filesize() const { return d->filesize_; } diff --git a/src/core/utilities.cpp b/src/core/utilities.cpp index 3fdc6be48..fb48fda00 100644 --- a/src/core/utilities.cpp +++ b/src/core/utilities.cpp @@ -37,6 +37,7 @@ #include #include +#include "core/application.h" #include "core/logging.h" #include "timeconstants.h" @@ -298,6 +299,9 @@ QString ColorToRgba(const QColor& c) { QString GetConfigPath(ConfigPath config) { switch (config) { case Path_Root: { + if (Application::kIsPortable) { + return QString("%1/data").arg(QCoreApplication::applicationDirPath()); + } #ifdef Q_OS_DARWIN return mac::GetApplicationSupportPath() + "/" + QCoreApplication::organizationName(); #else @@ -307,6 +311,9 @@ QString GetConfigPath(ConfigPath config) { break; case Path_CacheRoot: { + if (Application::kIsPortable) { + return GetConfigPath(Path_Root) + "/cache"; + } #if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) char* xdg = getenv("XDG_CACHE_HOME"); if (!xdg || !*xdg) { diff --git a/src/library/librarybackend.cpp b/src/library/librarybackend.cpp index 78dc1fab8..a3f16b64f 100644 --- a/src/library/librarybackend.cpp +++ b/src/library/librarybackend.cpp @@ -190,7 +190,7 @@ void LibraryBackend::UpdateTotalSongCount() { } void LibraryBackend::AddDirectory(const QString& path) { - QString canonical_path = QFileInfo(path).canonicalFilePath(); + QString canonical_path = path; //QFileInfo(path).canonicalFilePath(); QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); diff --git a/src/library/librarysettingspage.cpp b/src/library/librarysettingspage.cpp index d74ffa499..b7f82ec0f 100644 --- a/src/library/librarysettingspage.cpp +++ b/src/library/librarysettingspage.cpp @@ -68,7 +68,14 @@ void LibrarySettingsPage::Add() { path = QFileDialog::getExistingDirectory(this, tr("Add directory..."), path); if (!path.isNull()) { - dialog()->library_directory_model()->AddDirectory(path); + if (Application::kIsPortable) { + QDir appPath(QCoreApplication::applicationDirPath()); + QString relativePath = appPath.relativeFilePath(path); + qLog(Debug) << "Relative Path" << relativePath; + dialog()->library_directory_model()->AddDirectory(relativePath); + } else { + dialog()->library_directory_model()->AddDirectory(path); + } } settings.setValue("last_path", path); diff --git a/src/main.cpp b/src/main.cpp index 43db7d2b7..43e9a5957 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -225,6 +225,18 @@ void ParseAProto() { message.ParseFromArray(data.constData(), data.size()); } +void CheckPortable() { + QFile f(QApplication::applicationDirPath() + QDir::separator() + "data"); + qLog(Debug) << f.fileName(); + if (f.exists()) { + // We are portable. Set the bool and change the qsettings path + Application::kIsPortable = true; + + QSettings::setDefaultFormat(QSettings::IniFormat); + QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, f.fileName()); + } +} + int main(int argc, char *argv[]) { if (CrashReporting::SendCrashReport(argc, argv)) { return 0; @@ -306,6 +318,8 @@ int main(int argc, char *argv[]) { QtSingleApplication a(argc, argv); + CheckPortable(); + // A bug in Qt means the wheel_scroll_lines setting gets ignored and replaced // with the default value of 3 in QApplicationPrivate::initialize. { diff --git a/src/networkremote/remoteclient.cpp b/src/networkremote/remoteclient.cpp index 4e2a84c85..6079828c4 100644 --- a/src/networkremote/remoteclient.cpp +++ b/src/networkremote/remoteclient.cpp @@ -50,7 +50,6 @@ RemoteClient::RemoteClient(Application* app, QTcpSocket* client) authenticated_ = !use_auth_code_; } - RemoteClient::~RemoteClient() { client_->close(); if (client_->state() == QAbstractSocket::ConnectedState)