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