File indexing completed on 2025-01-05 03:59:36

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2009 Bastian Holst <bastianholst@gmx.de>
0004 //
0005 
0006 #ifndef MARBLE_FILESTORAGEWATCHER_H
0007 #define MARBLE_FILESTORAGEWATCHER_H
0008 
0009 #include <QThread>
0010 #include <QMutex>
0011 #include <QMultiMap>
0012 #include <QDateTime>
0013 
0014 namespace Marble
0015 {
0016 
0017 // Worker object that lives inside the new Thread
0018 class FileStorageWatcherThread : public QObject
0019 {
0020     Q_OBJECT
0021 
0022     public:
0023     explicit FileStorageWatcherThread( const QString &dataDirectory, QObject * parent = nullptr );
0024 
0025     ~FileStorageWatcherThread() override;
0026 
0027     quint64 cacheLimit();
0028 
0029     Q_SIGNALS:
0030     /**
0031      * Is Q_EMITted when a variable has changed.
0032      */
0033     void variableChanged();
0034 
0035     public Q_SLOTS:
0036     /**
0037      * Sets the limit of the cache in @p bytes.
0038     */
0039     void setCacheLimit( quint64 bytes );
0040 
0041     /**
0042      * Add @p bytes to the current cache size.
0043      * So FileStorageWatcher is aware of the current cache size.
0044      */
0045     void addToCurrentSize( qint64 bytes );
0046 
0047     /**
0048      * Setting current cache size to 0.
0049      */
0050     void resetCurrentSize();
0051 
0052     /**
0053      * Stop doing things that take a long time to quit.
0054      */
0055     void prepareQuit();
0056 
0057     /**
0058      * Getting the current size of the data stored on the disc
0059      */
0060     void getCurrentCacheSize();
0061 
0062     private Q_SLOTS:
0063     /**
0064      * Ensures that the cache doesn't exceed limits.
0065      */
0066     void ensureCacheSize();
0067 
0068     private:
0069     Q_DISABLE_COPY( FileStorageWatcherThread )
0070 
0071     /**
0072      * Returns true if it is necessary to delete files.
0073      */
0074     bool keepDeleting() const;
0075 
0076     QString m_dataDirectory;
0077     QMultiMap<QDateTime,QString> m_filesCache;
0078     quint64 m_cacheLimit;
0079     quint64 m_cacheSoftLimit;
0080     quint64 m_currentCacheSize;
0081     int     m_filesDeleted;
0082     bool    m_deleting;
0083     QMutex  m_limitMutex;
0084     bool    m_willQuit;
0085 };
0086 
0087 
0088 // Lives inside main thread
0089 class FileStorageWatcher : public QThread
0090 {
0091     Q_OBJECT
0092 
0093     public:
0094     /**
0095      * Creates a new FileStorageWatcher, which is a thread watching the
0096      * space Marble takes on the hard drive and deletes files if necessary.
0097      *
0098      * @param dataDirectory The directory where the data is stored
0099      * @param parent The parent of the object.
0100      */
0101     explicit FileStorageWatcher( const QString &dataDirectory = QString(), QObject * parent = nullptr );
0102 
0103     ~FileStorageWatcher() override;
0104 
0105     /**
0106      * Returns the limit of the cache in bytes.
0107      */
0108     quint64 cacheLimit();
0109 
0110     public Q_SLOTS:
0111     /**
0112          * Sets the limit of the cache in @p bytes.
0113          */
0114     void setCacheLimit( quint64 bytes );
0115 
0116     /**
0117      * Add @p bytes to the current cache size.
0118      * So FileStorageWatcher is aware of the current cache size.
0119      */
0120     void addToCurrentSize( qint64 bytes );
0121 
0122     /**
0123      * Setting current cache size to 0.
0124      */
0125     void resetCurrentSize();
0126 
0127 
0128     Q_SIGNALS:
0129     void sizeChanged( qint64 bytes );
0130     void cleared();
0131 
0132     protected:
0133     /**
0134      * The function being called at starting Thread.
0135      * The thread is started by QThread::start().
0136      */
0137     void run() override;
0138 
0139     private:
0140     Q_DISABLE_COPY( FileStorageWatcher )
0141 
0142     QString m_dataDirectory;
0143     FileStorageWatcherThread *m_thread;
0144     QMutex *m_limitMutex;
0145     quint64 m_limit;
0146     bool m_started;
0147     bool m_quitting;
0148 };
0149 
0150 }
0151 
0152 #endif