File indexing completed on 2024-05-05 04:50:32
0001 /* 0002 SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr> 0003 0004 SPDX-License-Identifier: LGPL-3.0-or-later 0005 */ 0006 0007 #ifndef ABSTRACTFILELISTING_H 0008 #define ABSTRACTFILELISTING_H 0009 0010 #include "elisaLib_export.h" 0011 #include "datatypes.h" 0012 0013 #include <QObject> 0014 #include <QString> 0015 #include <QUrl> 0016 #include <QHash> 0017 #include <QDateTime> 0018 0019 #include <memory> 0020 0021 class AbstractFileListingPrivate; 0022 class FileScanner; 0023 class QFileInfo; 0024 0025 class ELISALIB_EXPORT AbstractFileListing : public QObject 0026 { 0027 0028 Q_OBJECT 0029 0030 public: 0031 0032 enum FileSystemWatchingMode { 0033 DoNotWatchFileSystemChanges, 0034 WatchChangedDirectories = 1 << 0, 0035 WatchChangedFiles = 1 << 1, 0036 }; 0037 0038 using FileSystemWatchingModes = QFlags<FileSystemWatchingMode>; 0039 0040 explicit AbstractFileListing(QObject *parent = nullptr); 0041 0042 ~AbstractFileListing() override; 0043 0044 virtual void applicationAboutToQuit(); 0045 0046 [[nodiscard]] const QStringList& allRootPaths() const; 0047 0048 [[nodiscard]] virtual bool canHandleRootPaths() const; 0049 0050 Q_SIGNALS: 0051 0052 void tracksList(const DataTypes::ListTrackDataType &tracks, const QHash<QString, QUrl> &covers); 0053 0054 void removedTracksList(const QList<QUrl> &removedTracks); 0055 0056 void modifyTracksList(const DataTypes::ListTrackDataType &modifiedTracks, const QHash<QString, QUrl> &covers); 0057 0058 void indexingStarted(); 0059 0060 void indexingFinished(); 0061 0062 void askRestoredTracks(); 0063 0064 void errorWatchingFileSystemChanges(); 0065 0066 public Q_SLOTS: 0067 0068 void refreshContent(); 0069 0070 void init(); 0071 0072 void stop(); 0073 0074 void newTrackFile(const DataTypes::TrackDataType &partialTrack); 0075 0076 void restoredTracks(QHash<QUrl, QDateTime> allFiles); 0077 0078 void setAllRootPaths(const QStringList &allRootPaths); 0079 0080 void databaseFinishedInsertingTracksList(); 0081 0082 void databaseFinishedRemovingTracksList(); 0083 0084 protected Q_SLOTS: 0085 0086 void directoryChanged(const QString &path); 0087 0088 void fileChanged(const QString &modifiedFileName); 0089 0090 protected: 0091 0092 virtual void executeInit(QHash<QUrl, QDateTime> allFiles); 0093 0094 virtual void triggerRefreshOfContent(); 0095 0096 virtual void triggerStop(); 0097 0098 void scanDirectory(DataTypes::ListTrackDataType &newFiles, const QUrl &path, FileSystemWatchingModes watchForFileSystemChanges); 0099 0100 virtual DataTypes::TrackDataType scanOneFile(const QUrl &scanFile, const QFileInfo &scanFileInfo, FileSystemWatchingModes watchForFileSystemChanges); 0101 0102 void watchPath(const QString &pathName); 0103 0104 void addFileInDirectory(const QUrl &newFile, const QUrl &directoryName, FileSystemWatchingModes watchForFileSystemChanges); 0105 0106 void scanDirectoryTree(const QString &path); 0107 0108 void setHandleNewFiles(bool handleThem); 0109 0110 void emitNewFiles(const DataTypes::ListTrackDataType &tracks); 0111 0112 void addCover(const DataTypes::TrackDataType &newTrack); 0113 0114 void removeDirectory(const QUrl &removedDirectory, QList<QUrl> &allRemovedFiles); 0115 0116 void removeFile(const QUrl &oneRemovedTrack, QList<QUrl> &allRemovedFiles); 0117 0118 QHash<QUrl, QDateTime>& allFiles(); 0119 0120 void checkFilesToRemove(); 0121 0122 FileScanner& fileScanner(); 0123 0124 [[nodiscard]] bool waitEndTrackRemoval() const; 0125 0126 void setWaitEndTrackRemoval(bool wait); 0127 0128 [[nodiscard]] bool isActive() const; 0129 0130 private: 0131 0132 std::unique_ptr<AbstractFileListingPrivate> d; 0133 0134 }; 0135 0136 Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractFileListing::FileSystemWatchingModes) 0137 0138 #endif // ABSTRACTFILELISTING_H