Skip to content

Commit

Permalink
Add a factory class for Directory objects.
Browse files Browse the repository at this point in the history
Create a DirectoryFactory class that is owned by the Library or Device objects
and provided to methods that need to create Directory objects. This will allow
information to be provided through the Directory object. For example:
- If the directory is on a removable device.
- A mount point that may change on future uses.
- Whether paths should be relative or absolute.
  • Loading branch information
jbroadus committed Jan 31, 2020
1 parent d45a9f5 commit 9369eb6
Show file tree
Hide file tree
Showing 10 changed files with 55 additions and 27 deletions.
1 change: 1 addition & 0 deletions src/core/metatypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ void RegisterMetaTypes() {
qRegisterMetaType<GstElement*>("GstElement*");
qRegisterMetaType<GstEngine::OutputDetails>("GstEngine::OutputDetails");
qRegisterMetaType<GstEnginePipeline*>("GstEnginePipeline*");
qRegisterMetaType<DirectoryFactory*>("DirectoryFactory*");
qRegisterMetaType<PlaylistItemList>("PlaylistItemList");
qRegisterMetaType<PlaylistItemPtr>("PlaylistItemPtr");
qRegisterMetaType<PodcastEpisodeList>("PodcastEpisodeList");
Expand Down
15 changes: 9 additions & 6 deletions src/devices/connecteddevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@
*/

#include "connecteddevice.h"
#include "devicelister.h"
#include "devicemanager.h"
#include "core/application.h"
#include "core/database.h"
#include "core/logging.h"
#include "devicelister.h"
#include "devicemanager.h"
#include "library/library.h"
#include "library/librarybackend.h"
#include "library/librarydirectorymodel.h"
#include "library/librarymodel.h"

#include <QtDebug>
Expand All @@ -39,6 +40,7 @@ ConnectedDevice::ConnectedDevice(const QUrl& url, DeviceLister* lister,
unique_id_(unique_id),
database_id_(database_id),
manager_(manager),
directory_factory_(new DirectoryFactory),
model_(nullptr),
song_count_(0) {
qLog(Info) << "connected" << url << unique_id << first_time;
Expand All @@ -57,14 +59,15 @@ ConnectedDevice::ConnectedDevice(const QUrl& url, DeviceLister* lister,

// Create the model
model_ = new LibraryModel(backend_, app_, this);
model_->directory_model()->SetDirectoryFactory(directory_factory_);
}

ConnectedDevice::~ConnectedDevice() {}

void ConnectedDevice::InitBackendDirectory(const QString& mount_point,
bool first_time, bool rewrite_path) {
if (first_time || backend_->GetAllDirectories().isEmpty()) {
backend_->AddDirectory(mount_point);
if (first_time || backend_->GetAllDirectories(directory_factory_.get()).isEmpty()) {
backend_->AddDirectory(directory_factory_.get(), mount_point);
} else {
if (rewrite_path) {
// This is a bit of a hack. The device might not be mounted at the same
Expand All @@ -74,7 +77,7 @@ void ConnectedDevice::InitBackendDirectory(const QString& mount_point,

// Get the directory it was mounted at last time. Devices only have one
// directory (the root).
Directory dir = backend_->GetAllDirectories()[0];
Directory dir = backend_->GetAllDirectories(directory_factory_.get())[0];
if (dir.path != mount_point) {
// The directory is different, commence the munging.
qLog(Info) << "Changing path from" << dir.path << "to" << mount_point;
Expand All @@ -83,7 +86,7 @@ void ConnectedDevice::InitBackendDirectory(const QString& mount_point,
}

// Load the directory properly now
backend_->LoadDirectoriesAsync();
backend_->LoadDirectoriesAsync(directory_factory_.get());
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/devices/connecteddevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class Application;
class Database;
class DeviceLister;
class DeviceManager;
class DirectoryFactory;
class LibraryBackend;
class LibraryModel;

Expand Down Expand Up @@ -85,6 +86,7 @@ class ConnectedDevice : public QObject,
DeviceManager* manager_;

std::shared_ptr<LibraryBackend> backend_;
std::shared_ptr<DirectoryFactory> directory_factory_;
LibraryModel* model_;

int song_count_;
Expand Down
9 changes: 9 additions & 0 deletions src/library/directory.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,15 @@ Q_DECLARE_METATYPE(Directory)
typedef QList<Directory> DirectoryList;
Q_DECLARE_METATYPE(DirectoryList)

struct DirectoryFactory {
virtual Directory GetDirectory(const QString& path) const {
Directory dir;
dir.path = path;
return dir;
}
};
Q_DECLARE_METATYPE(DirectoryFactory)

struct Subdirectory {
Subdirectory() : directory_id(-1), mtime(0) {}

Expand Down
9 changes: 6 additions & 3 deletions src/library/library.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@

#include "library.h"

#include "librarymodel.h"
#include "librarybackend.h"
#include "core/application.h"
#include "core/database.h"
#include "core/player.h"
#include "core/tagreaderclient.h"
#include "core/taskmanager.h"
#include "core/thread.h"
#include "librarybackend.h"
#include "librarydirectorymodel.h"
#include "librarymodel.h"
#include "smartplaylists/generator.h"
#include "smartplaylists/querygenerator.h"
#include "smartplaylists/search.h"
Expand All @@ -38,6 +39,7 @@ Library::Library(Application* app, QObject* parent)
: QObject(parent),
app_(app),
backend_(nullptr),
directory_factory_(new DirectoryFactory),
model_(nullptr),
watcher_(nullptr),
watcher_thread_(nullptr),
Expand All @@ -56,6 +58,7 @@ Library::Library(Application* app, QObject* parent)
using smart_playlists::SearchTerm;

model_ = new LibraryModel(backend_, app_, this);
model_->directory_model()->SetDirectoryFactory(directory_factory_);
model_->set_show_smart_playlists(true);
model_->set_default_smart_playlists(
LibraryModel::DefaultGenerators()
Expand Down Expand Up @@ -168,7 +171,7 @@ void Library::Init() {
connect(app_->player(), SIGNAL(Stopped()), SLOT(Stopped()));

// This will start the watcher checking for updates
backend_->LoadDirectoriesAsync();
backend_->LoadDirectoriesAsync(directory_factory_.get());
}

void Library::IncrementalScan() { watcher_->IncrementalScanAsync(); }
Expand Down
2 changes: 2 additions & 0 deletions src/library/library.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

class Application;
class Database;
class DirectoryFactory;
class LibraryBackend;
class LibraryModel;
class LibraryWatcher;
Expand Down Expand Up @@ -79,6 +80,7 @@ class Library : public QObject {
private:
Application* app_;
std::shared_ptr<LibraryBackend> backend_;
std::shared_ptr<DirectoryFactory> directory_factory_;
LibraryModel* model_;

LibraryWatcher* watcher_;
Expand Down
22 changes: 12 additions & 10 deletions src/library/librarybackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,9 @@ void LibraryBackend::Init(Database* db, const QString& songs_table,
fts_table_ = fts_table;
}

void LibraryBackend::LoadDirectoriesAsync() {
metaObject()->invokeMethod(this, "LoadDirectories", Qt::QueuedConnection);
void LibraryBackend::LoadDirectoriesAsync(DirectoryFactory* directory_factory) {
metaObject()->invokeMethod(this, "LoadDirectories", Qt::QueuedConnection,
Q_ARG(DirectoryFactory*, directory_factory));
}

void LibraryBackend::UpdateTotalSongCountAsync() {
Expand Down Expand Up @@ -93,8 +94,8 @@ void LibraryBackend::UpdateSongsRatingAsync(const QList<int>& ids,
Q_ARG(float, rating));
}

void LibraryBackend::LoadDirectories() {
DirectoryList dirs = GetAllDirectories();
void LibraryBackend::LoadDirectories(DirectoryFactory* info) {
DirectoryList dirs = GetAllDirectories(info);

QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
Expand Down Expand Up @@ -150,7 +151,8 @@ void LibraryBackend::ChangeDirPath(int id, const QString& old_path,
t.Commit();
}

DirectoryList LibraryBackend::GetAllDirectories() {
DirectoryList LibraryBackend::GetAllDirectories(DirectoryFactory* directory_factory) {
Q_ASSERT(directory_factory);
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());

Expand All @@ -162,9 +164,8 @@ DirectoryList LibraryBackend::GetAllDirectories() {
if (db_->CheckErrors(q)) return ret;

while (q.next()) {
Directory dir;
Directory dir = directory_factory->GetDirectory(q.value(1).toString());
dir.id = q.value(0).toInt();
dir.path = q.value(1).toString();

ret << dir;
}
Expand Down Expand Up @@ -212,7 +213,9 @@ void LibraryBackend::UpdateTotalSongCount() {
emit TotalSongCountUpdated(q.value(0).toInt());
}

void LibraryBackend::AddDirectory(const QString& path) {
void LibraryBackend::AddDirectory(DirectoryFactory* directory_factory,
const QString& path) {
Q_ASSERT(directory_factory);
QString canonical_path = QFileInfo(path).canonicalFilePath();
QString db_path = canonical_path;

Expand All @@ -234,8 +237,7 @@ void LibraryBackend::AddDirectory(const QString& path) {
q.exec();
if (db_->CheckErrors(q)) return;

Directory dir;
dir.path = canonical_path;
Directory dir = directory_factory->GetDirectory(canonical_path);
dir.id = q.lastInsertId().toInt();

emit DirectoryDiscovered(dir, SubdirectoryList());
Expand Down
15 changes: 8 additions & 7 deletions src/library/librarybackend.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,14 @@ class LibraryBackendInterface : public QObject {
virtual QString songs_table() const = 0;

// Get a list of directories in the library. Emits DirectoriesDiscovered.
virtual void LoadDirectoriesAsync() = 0;
virtual void LoadDirectoriesAsync(DirectoryFactory* directory_factory) = 0;

// Counts the songs in the library. Emits TotalSongCountUpdated
virtual void UpdateTotalSongCountAsync() = 0;

virtual SongList FindSongsInDirectory(int id) = 0;
virtual SubdirectoryList SubdirsInDirectory(int id) = 0;
virtual DirectoryList GetAllDirectories() = 0;
virtual DirectoryList GetAllDirectories(DirectoryFactory* info) = 0;
virtual void ChangeDirPath(int id, const QString& old_path,
const QString& new_path) = 0;

Expand Down Expand Up @@ -118,7 +118,8 @@ class LibraryBackendInterface : public QObject {
// songs.
virtual Song GetSongByUrl(const QUrl& url, qint64 beginning = 0) = 0;

virtual void AddDirectory(const QString& path) = 0;
virtual void AddDirectory(DirectoryFactory* directory_factory,
const QString& path) = 0;
virtual void RemoveDirectory(int dir_id) = 0;

virtual bool ExecQuery(LibraryQuery* q) = 0;
Expand All @@ -141,14 +142,14 @@ class LibraryBackend : public LibraryBackendInterface {
QString subdirs_table() const { return subdirs_table_; }

// Get a list of directories in the library. Emits DirectoriesDiscovered.
void LoadDirectoriesAsync();
void LoadDirectoriesAsync(DirectoryFactory* directory_factory);

// Counts the songs in the library. Emits TotalSongCountUpdated
void UpdateTotalSongCountAsync();

SongList FindSongsInDirectory(int id);
SubdirectoryList SubdirsInDirectory(int id);
DirectoryList GetAllDirectories();
DirectoryList GetAllDirectories(DirectoryFactory* directory_factory);
void ChangeDirPath(int id, const QString& old_path, const QString& new_path);

QStringList GetAll(const QString& column,
Expand Down Expand Up @@ -185,7 +186,7 @@ class LibraryBackend : public LibraryBackendInterface {
SongList GetSongsByUrl(const QUrl& url);
Song GetSongByUrl(const QUrl& url, qint64 beginning = 0);

void AddDirectory(const QString& path);
void AddDirectory(DirectoryFactory* directory_factory, const QString& path);
void RemoveDirectory(int dir_id);

bool ExecQuery(LibraryQuery* q);
Expand All @@ -202,7 +203,7 @@ class LibraryBackend : public LibraryBackendInterface {
void DeleteAll();

public slots:
void LoadDirectories();
void LoadDirectories(DirectoryFactory* directory_factory);
void UpdateTotalSongCount();
void AddOrUpdateSongs(const SongList& songs);
void UpdateMTimesOnly(const SongList& songs);
Expand Down
2 changes: 1 addition & 1 deletion src/library/librarydirectorymodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ void LibraryDirectoryModel::DirectoryDeleted(int dir_id) {
void LibraryDirectoryModel::AddDirectory(const QString& path) {
if (!backend_) return;

backend_->AddDirectory(path);
backend_->AddDirectory(directory_factory_.get(), path);
}

void LibraryDirectoryModel::RemoveDirectory(const QModelIndex& index) {
Expand Down
5 changes: 5 additions & 0 deletions src/library/librarydirectorymodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ class LibraryDirectoryModel : public QStandardItemModel {
LibraryDirectoryModel(LibraryBackend* backend, QObject* parent = nullptr);
~LibraryDirectoryModel();

void SetDirectoryFactory(std::shared_ptr<DirectoryFactory> directory_factory) {
directory_factory_ = directory_factory;
}

// To be called by GUIs
void AddDirectory(const QString& path);
void RemoveDirectory(const QModelIndex& index);
Expand All @@ -51,6 +55,7 @@ class LibraryDirectoryModel : public QStandardItemModel {

QIcon dir_icon_;
LibraryBackend* backend_;
std::shared_ptr<DirectoryFactory> directory_factory_;
QList<std::shared_ptr<MusicStorage> > storage_;
};

Expand Down

0 comments on commit 9369eb6

Please sign in to comment.