Skip to content

Commit 41a446a

Browse files
committed
Add a factory class for Directory objects.
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.
1 parent d45a9f5 commit 41a446a

10 files changed

Lines changed: 58 additions & 27 deletions

src/core/metatypes.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ void RegisterMetaTypes() {
7070
qRegisterMetaType<GstElement*>("GstElement*");
7171
qRegisterMetaType<GstEngine::OutputDetails>("GstEngine::OutputDetails");
7272
qRegisterMetaType<GstEnginePipeline*>("GstEnginePipeline*");
73+
qRegisterMetaType<DirectoryFactory*>("DirectoryFactory*");
7374
qRegisterMetaType<PlaylistItemList>("PlaylistItemList");
7475
qRegisterMetaType<PlaylistItemPtr>("PlaylistItemPtr");
7576
qRegisterMetaType<PodcastEpisodeList>("PodcastEpisodeList");

src/devices/connecteddevice.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616
*/
1717

1818
#include "connecteddevice.h"
19-
#include "devicelister.h"
20-
#include "devicemanager.h"
2119
#include "core/application.h"
2220
#include "core/database.h"
2321
#include "core/logging.h"
22+
#include "devicelister.h"
23+
#include "devicemanager.h"
2424
#include "library/library.h"
2525
#include "library/librarybackend.h"
26+
#include "library/librarydirectorymodel.h"
2627
#include "library/librarymodel.h"
2728

2829
#include <QtDebug>
@@ -39,6 +40,7 @@ ConnectedDevice::ConnectedDevice(const QUrl& url, DeviceLister* lister,
3940
unique_id_(unique_id),
4041
database_id_(database_id),
4142
manager_(manager),
43+
directory_factory_(new DirectoryFactory),
4244
model_(nullptr),
4345
song_count_(0) {
4446
qLog(Info) << "connected" << url << unique_id << first_time;
@@ -57,14 +59,16 @@ ConnectedDevice::ConnectedDevice(const QUrl& url, DeviceLister* lister,
5759

5860
// Create the model
5961
model_ = new LibraryModel(backend_, app_, this);
62+
model_->directory_model()->SetDirectoryFactory(directory_factory_);
6063
}
6164

6265
ConnectedDevice::~ConnectedDevice() {}
6366

6467
void ConnectedDevice::InitBackendDirectory(const QString& mount_point,
6568
bool first_time, bool rewrite_path) {
66-
if (first_time || backend_->GetAllDirectories().isEmpty()) {
67-
backend_->AddDirectory(mount_point);
69+
if (first_time ||
70+
backend_->GetAllDirectories(directory_factory_.get()).isEmpty()) {
71+
backend_->AddDirectory(directory_factory_.get(), mount_point);
6872
} else {
6973
if (rewrite_path) {
7074
// This is a bit of a hack. The device might not be mounted at the same
@@ -74,7 +78,7 @@ void ConnectedDevice::InitBackendDirectory(const QString& mount_point,
7478

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

8589
// Load the directory properly now
86-
backend_->LoadDirectoriesAsync();
90+
backend_->LoadDirectoriesAsync(directory_factory_.get());
8791
}
8892
}
8993

src/devices/connecteddevice.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class Application;
3131
class Database;
3232
class DeviceLister;
3333
class DeviceManager;
34+
class DirectoryFactory;
3435
class LibraryBackend;
3536
class LibraryModel;
3637

@@ -85,6 +86,7 @@ class ConnectedDevice : public QObject,
8586
DeviceManager* manager_;
8687

8788
std::shared_ptr<LibraryBackend> backend_;
89+
std::shared_ptr<DirectoryFactory> directory_factory_;
8890
LibraryModel* model_;
8991

9092
int song_count_;

src/library/directory.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ Q_DECLARE_METATYPE(Directory)
3939
typedef QList<Directory> DirectoryList;
4040
Q_DECLARE_METATYPE(DirectoryList)
4141

42+
struct DirectoryFactory {
43+
virtual Directory GetDirectory(const QString& path) const {
44+
Directory dir;
45+
dir.path = path;
46+
return dir;
47+
}
48+
};
49+
Q_DECLARE_METATYPE(DirectoryFactory)
50+
4251
struct Subdirectory {
4352
Subdirectory() : directory_id(-1), mtime(0) {}
4453

src/library/library.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@
1717

1818
#include "library.h"
1919

20-
#include "librarymodel.h"
21-
#include "librarybackend.h"
2220
#include "core/application.h"
2321
#include "core/database.h"
2422
#include "core/player.h"
2523
#include "core/tagreaderclient.h"
2624
#include "core/taskmanager.h"
2725
#include "core/thread.h"
26+
#include "librarybackend.h"
27+
#include "librarydirectorymodel.h"
28+
#include "librarymodel.h"
2829
#include "smartplaylists/generator.h"
2930
#include "smartplaylists/querygenerator.h"
3031
#include "smartplaylists/search.h"
@@ -38,6 +39,7 @@ Library::Library(Application* app, QObject* parent)
3839
: QObject(parent),
3940
app_(app),
4041
backend_(nullptr),
42+
directory_factory_(new DirectoryFactory),
4143
model_(nullptr),
4244
watcher_(nullptr),
4345
watcher_thread_(nullptr),
@@ -56,6 +58,7 @@ Library::Library(Application* app, QObject* parent)
5658
using smart_playlists::SearchTerm;
5759

5860
model_ = new LibraryModel(backend_, app_, this);
61+
model_->directory_model()->SetDirectoryFactory(directory_factory_);
5962
model_->set_show_smart_playlists(true);
6063
model_->set_default_smart_playlists(
6164
LibraryModel::DefaultGenerators()
@@ -168,7 +171,7 @@ void Library::Init() {
168171
connect(app_->player(), SIGNAL(Stopped()), SLOT(Stopped()));
169172

170173
// This will start the watcher checking for updates
171-
backend_->LoadDirectoriesAsync();
174+
backend_->LoadDirectoriesAsync(directory_factory_.get());
172175
}
173176

174177
void Library::IncrementalScan() { watcher_->IncrementalScanAsync(); }

src/library/library.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
class Application;
3030
class Database;
31+
class DirectoryFactory;
3132
class LibraryBackend;
3233
class LibraryModel;
3334
class LibraryWatcher;
@@ -79,6 +80,7 @@ class Library : public QObject {
7980
private:
8081
Application* app_;
8182
std::shared_ptr<LibraryBackend> backend_;
83+
std::shared_ptr<DirectoryFactory> directory_factory_;
8284
LibraryModel* model_;
8385

8486
LibraryWatcher* watcher_;

src/library/librarybackend.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ void LibraryBackend::Init(Database* db, const QString& songs_table,
5757
fts_table_ = fts_table;
5858
}
5959

60-
void LibraryBackend::LoadDirectoriesAsync() {
61-
metaObject()->invokeMethod(this, "LoadDirectories", Qt::QueuedConnection);
60+
void LibraryBackend::LoadDirectoriesAsync(DirectoryFactory* directory_factory) {
61+
metaObject()->invokeMethod(this, "LoadDirectories", Qt::QueuedConnection,
62+
Q_ARG(DirectoryFactory*, directory_factory));
6263
}
6364

6465
void LibraryBackend::UpdateTotalSongCountAsync() {
@@ -93,8 +94,8 @@ void LibraryBackend::UpdateSongsRatingAsync(const QList<int>& ids,
9394
Q_ARG(float, rating));
9495
}
9596

96-
void LibraryBackend::LoadDirectories() {
97-
DirectoryList dirs = GetAllDirectories();
97+
void LibraryBackend::LoadDirectories(DirectoryFactory* info) {
98+
DirectoryList dirs = GetAllDirectories(info);
9899

99100
QMutexLocker l(db_->Mutex());
100101
QSqlDatabase db(db_->Connect());
@@ -150,7 +151,9 @@ void LibraryBackend::ChangeDirPath(int id, const QString& old_path,
150151
t.Commit();
151152
}
152153

153-
DirectoryList LibraryBackend::GetAllDirectories() {
154+
DirectoryList LibraryBackend::GetAllDirectories(
155+
DirectoryFactory* directory_factory) {
156+
Q_ASSERT(directory_factory);
154157
QMutexLocker l(db_->Mutex());
155158
QSqlDatabase db(db_->Connect());
156159

@@ -162,9 +165,8 @@ DirectoryList LibraryBackend::GetAllDirectories() {
162165
if (db_->CheckErrors(q)) return ret;
163166

164167
while (q.next()) {
165-
Directory dir;
168+
Directory dir = directory_factory->GetDirectory(q.value(1).toString());
166169
dir.id = q.value(0).toInt();
167-
dir.path = q.value(1).toString();
168170

169171
ret << dir;
170172
}
@@ -212,7 +214,9 @@ void LibraryBackend::UpdateTotalSongCount() {
212214
emit TotalSongCountUpdated(q.value(0).toInt());
213215
}
214216

215-
void LibraryBackend::AddDirectory(const QString& path) {
217+
void LibraryBackend::AddDirectory(DirectoryFactory* directory_factory,
218+
const QString& path) {
219+
Q_ASSERT(directory_factory);
216220
QString canonical_path = QFileInfo(path).canonicalFilePath();
217221
QString db_path = canonical_path;
218222

@@ -234,8 +238,7 @@ void LibraryBackend::AddDirectory(const QString& path) {
234238
q.exec();
235239
if (db_->CheckErrors(q)) return;
236240

237-
Directory dir;
238-
dir.path = canonical_path;
241+
Directory dir = directory_factory->GetDirectory(canonical_path);
239242
dir.id = q.lastInsertId().toInt();
240243

241244
emit DirectoryDiscovered(dir, SubdirectoryList());

src/library/librarybackend.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ class LibraryBackendInterface : public QObject {
6969
virtual QString songs_table() const = 0;
7070

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

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

7777
virtual SongList FindSongsInDirectory(int id) = 0;
7878
virtual SubdirectoryList SubdirsInDirectory(int id) = 0;
79-
virtual DirectoryList GetAllDirectories() = 0;
79+
virtual DirectoryList GetAllDirectories(DirectoryFactory* info) = 0;
8080
virtual void ChangeDirPath(int id, const QString& old_path,
8181
const QString& new_path) = 0;
8282

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

121-
virtual void AddDirectory(const QString& path) = 0;
121+
virtual void AddDirectory(DirectoryFactory* directory_factory,
122+
const QString& path) = 0;
122123
virtual void RemoveDirectory(int dir_id) = 0;
123124

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

143144
// Get a list of directories in the library. Emits DirectoriesDiscovered.
144-
void LoadDirectoriesAsync();
145+
void LoadDirectoriesAsync(DirectoryFactory* directory_factory);
145146

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

149150
SongList FindSongsInDirectory(int id);
150151
SubdirectoryList SubdirsInDirectory(int id);
151-
DirectoryList GetAllDirectories();
152+
DirectoryList GetAllDirectories(DirectoryFactory* directory_factory);
152153
void ChangeDirPath(int id, const QString& old_path, const QString& new_path);
153154

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

188-
void AddDirectory(const QString& path);
189+
void AddDirectory(DirectoryFactory* directory_factory, const QString& path);
189190
void RemoveDirectory(int dir_id);
190191

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

204205
public slots:
205-
void LoadDirectories();
206+
void LoadDirectories(DirectoryFactory* directory_factory);
206207
void UpdateTotalSongCount();
207208
void AddOrUpdateSongs(const SongList& songs);
208209
void UpdateMTimesOnly(const SongList& songs);

src/library/librarydirectorymodel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void LibraryDirectoryModel::DirectoryDeleted(int dir_id) {
6464
void LibraryDirectoryModel::AddDirectory(const QString& path) {
6565
if (!backend_) return;
6666

67-
backend_->AddDirectory(path);
67+
backend_->AddDirectory(directory_factory_.get(), path);
6868
}
6969

7070
void LibraryDirectoryModel::RemoveDirectory(const QModelIndex& index) {

src/library/librarydirectorymodel.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ class LibraryDirectoryModel : public QStandardItemModel {
3535
LibraryDirectoryModel(LibraryBackend* backend, QObject* parent = nullptr);
3636
~LibraryDirectoryModel();
3737

38+
void SetDirectoryFactory(
39+
std::shared_ptr<DirectoryFactory> directory_factory) {
40+
directory_factory_ = directory_factory;
41+
}
42+
3843
// To be called by GUIs
3944
void AddDirectory(const QString& path);
4045
void RemoveDirectory(const QModelIndex& index);
@@ -51,6 +56,7 @@ class LibraryDirectoryModel : public QStandardItemModel {
5156

5257
QIcon dir_icon_;
5358
LibraryBackend* backend_;
59+
std::shared_ptr<DirectoryFactory> directory_factory_;
5460
QList<std::shared_ptr<MusicStorage> > storage_;
5561
};
5662

0 commit comments

Comments
 (0)