Skip to content

Commit 0538a7d

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 ba43208 commit 0538a7d

10 files changed

Lines changed: 57 additions & 30 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: 9 additions & 7 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;
@@ -59,12 +61,12 @@ ConnectedDevice::ConnectedDevice(const QUrl& url, DeviceLister* lister,
5961
model_ = new LibraryModel(backend_, app_, this);
6062
}
6163

62-
ConnectedDevice::~ConnectedDevice() {}
64+
ConnectedDevice::~ConnectedDevice() { delete directory_factory_; }
6365

6466
void ConnectedDevice::InitBackendDirectory(const QString& mount_point,
6567
bool first_time, bool rewrite_path) {
66-
if (first_time || backend_->GetAllDirectories().isEmpty()) {
67-
backend_->AddDirectory(mount_point);
68+
if (first_time || backend_->GetAllDirectories(directory_factory_).isEmpty()) {
69+
backend_->AddDirectory(directory_factory_, mount_point);
6870
} else {
6971
if (rewrite_path) {
7072
// This is a bit of a hack. The device might not be mounted at the same
@@ -74,7 +76,7 @@ void ConnectedDevice::InitBackendDirectory(const QString& mount_point,
7476

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

8587
// Load the directory properly now
86-
backend_->LoadDirectoriesAsync();
88+
backend_->LoadDirectoriesAsync(directory_factory_);
8789
}
8890
}
8991

src/devices/connecteddevice.h

Lines changed: 3 additions & 1 deletion
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

@@ -43,7 +44,7 @@ class ConnectedDevice : public QObject,
4344
ConnectedDevice(const QUrl& url, DeviceLister* lister,
4445
const QString& unique_id, DeviceManager* manager,
4546
Application* app, int database_id, bool first_time);
46-
~ConnectedDevice();
47+
virtual ~ConnectedDevice();
4748

4849
virtual void Init() = 0;
4950
virtual void ConnectAsync();
@@ -85,6 +86,7 @@ class ConnectedDevice : public QObject,
8586
DeviceManager* manager_;
8687

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

9092
int song_count_;

src/library/directory.h

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

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

src/library/library.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Library::Library(Application* app, QObject* parent)
3939
: QObject(parent),
4040
app_(app),
4141
backend_(nullptr),
42+
directory_factory_(new DirectoryFactory),
4243
model_(nullptr),
4344
watcher_(nullptr),
4445
watcher_thread_(nullptr),
@@ -57,7 +58,7 @@ Library::Library(Application* app, QObject* parent)
5758
using smart_playlists::SearchTerm;
5859

5960
model_ = new LibraryModel(backend_, app_, this);
60-
dir_model_ = new LibraryDirectoryModel(backend_, this);
61+
dir_model_ = new LibraryDirectoryModel(backend_, directory_factory_, this);
6162
model_->set_show_smart_playlists(true);
6263
model_->set_default_smart_playlists(
6364
LibraryModel::DefaultGenerators()
@@ -170,7 +171,7 @@ void Library::Init() {
170171
connect(app_->player(), SIGNAL(Stopped()), SLOT(Stopped()));
171172

172173
// This will start the watcher checking for updates
173-
backend_->LoadDirectoriesAsync();
174+
backend_->LoadDirectoriesAsync(directory_factory_.get());
174175
}
175176

176177
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 LibraryDirectoryModel;
@@ -81,6 +82,7 @@ class Library : public QObject {
8182
private:
8283
Application* app_;
8384
std::shared_ptr<LibraryBackend> backend_;
85+
std::shared_ptr<DirectoryFactory> directory_factory_;
8486
LibraryModel* model_;
8587
LibraryDirectoryModel* dir_model_;
8688

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: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
#include "ui/iconloader.h"
2525

2626
LibraryDirectoryModel::LibraryDirectoryModel(
27-
std::shared_ptr<LibraryBackend> backend, QObject* parent)
27+
std::shared_ptr<LibraryBackend> backend,
28+
std::shared_ptr<DirectoryFactory> directory_factory, QObject* parent)
2829
: QStandardItemModel(parent),
2930
dir_icon_(IconLoader::Load("document-open-folder", IconLoader::Base)),
30-
backend_(backend) {
31+
backend_(backend),
32+
directory_factory_(directory_factory) {
3133
connect(backend_.get(),
3234
SIGNAL(DirectoryDiscovered(Directory, SubdirectoryList)),
3335
SLOT(DirectoryDiscovered(Directory)));
@@ -66,7 +68,7 @@ void LibraryDirectoryModel::DirectoryDeleted(int dir_id) {
6668
void LibraryDirectoryModel::AddDirectory(const QString& path) {
6769
if (!backend_) return;
6870

69-
backend_->AddDirectory(path);
71+
backend_->AddDirectory(directory_factory_.get(), path);
7072
}
7173

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

src/library/librarydirectorymodel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class LibraryDirectoryModel : public QStandardItemModel {
3333

3434
public:
3535
LibraryDirectoryModel(std::shared_ptr<LibraryBackend> backend,
36+
std::shared_ptr<DirectoryFactory> directory_factory,
3637
QObject* parent = nullptr);
3738
~LibraryDirectoryModel();
3839

@@ -52,6 +53,7 @@ class LibraryDirectoryModel : public QStandardItemModel {
5253

5354
QIcon dir_icon_;
5455
std::shared_ptr<LibraryBackend> backend_;
56+
std::shared_ptr<DirectoryFactory> directory_factory_;
5557
QList<std::shared_ptr<MusicStorage> > storage_;
5658
};
5759

0 commit comments

Comments
 (0)