void LibraryWatcher::AddDirectory(const Directory& dir, const SubdirectoryList& subdirs) { watched_dirs_[dir.id] = dir; if (subdirs.isEmpty()) { // This is a new directory that we've never seen before. // Scan it fully. ScanTransaction transaction(this, dir.id, false); transaction.SetKnownSubdirs(subdirs); transaction.AddToProgressMax(1); ScanSubdirectory(dir.path, Subdirectory(), &transaction); } else { // We can do an incremental scan - looking at the mtimes of each // subdirectory and only rescan if the directory has changed. ScanTransaction transaction(this, dir.id, true); transaction.SetKnownSubdirs(subdirs); transaction.AddToProgressMax(subdirs.count()); for (const Subdirectory& subdir : subdirs) { if (stop_requested_) return; if (scan_on_startup_) ScanSubdirectory(subdir.path, subdir, &transaction); if (monitor_) AddWatch(dir, subdir.path); } } emit CompilationsNeedUpdating(); }
void LibraryWatcher::RescanPathsNow() { for (int dir : rescan_queue_.keys()) { if (stop_requested_) return; ScanTransaction transaction(this, dir, false); transaction.AddToProgressMax(rescan_queue_[dir].count()); for (const QString& path : rescan_queue_[dir]) { if (stop_requested_) return; Subdirectory subdir; subdir.directory_id = dir; subdir.mtime = 0; subdir.path = path; ScanSubdirectory(path, subdir, &transaction); } } rescan_queue_.clear(); emit CompilationsNeedUpdating(); }
FilesystemDevice::FilesystemDevice( const QUrl& url, DeviceLister* lister, const QString& unique_id, DeviceManager* manager, Application* app, int database_id, bool first_time) : FilesystemMusicStorage(url.toLocalFile()), ConnectedDevice(url, lister, unique_id, manager, app, database_id, first_time), watcher_(new LibraryWatcher), watcher_thread_(new QThread(this)) { watcher_->moveToThread(watcher_thread_); watcher_thread_->start(QThread::IdlePriority); watcher_->set_device_name(manager->data(manager->index( manager->FindDeviceById(unique_id)), DeviceManager::Role_FriendlyName).toString()); watcher_->set_backend(backend_); watcher_->set_task_manager(app_->task_manager()); connect(backend_, SIGNAL(DirectoryDiscovered(Directory,SubdirectoryList)), watcher_, SLOT(AddDirectory(Directory,SubdirectoryList))); connect(backend_, SIGNAL(DirectoryDeleted(Directory)), watcher_, SLOT(RemoveDirectory(Directory))); connect(watcher_, SIGNAL(NewOrUpdatedSongs(SongList)), backend_, SLOT(AddOrUpdateSongs(SongList))); connect(watcher_, SIGNAL(SongsMTimeUpdated(SongList)), backend_, SLOT(UpdateMTimesOnly(SongList))); connect(watcher_, SIGNAL(SongsDeleted(SongList)), backend_, SLOT(DeleteSongs(SongList))); connect(watcher_, SIGNAL(SubdirsDiscovered(SubdirectoryList)), backend_, SLOT(AddOrUpdateSubdirs(SubdirectoryList))); connect(watcher_, SIGNAL(SubdirsMTimeUpdated(SubdirectoryList)), backend_, SLOT(AddOrUpdateSubdirs(SubdirectoryList))); connect(watcher_, SIGNAL(CompilationsNeedUpdating()), backend_, SLOT(UpdateCompilations())); connect(watcher_, SIGNAL(ScanStarted(int)), SIGNAL(TaskStarted(int))); }