File indexing completed on 2024-04-28 05:45:19

0001 /*
0002  * SPDX-FileCopyrightText: 2014 Frank Reininghaus <frank78ac@googlemail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "spaceinfoobserver.h"
0008 
0009 #include "mountpointobserver.h"
0010 
0011 SpaceInfoObserver::SpaceInfoObserver(const QUrl &url, QObject *parent)
0012     : QObject(parent)
0013     , m_mountPointObserver(nullptr)
0014     , m_hasData(false)
0015     , m_dataSize(0)
0016     , m_dataAvailable(0)
0017 {
0018     m_mountPointObserver = MountPointObserver::observerForUrl(url);
0019     m_mountPointObserver->ref();
0020     connect(m_mountPointObserver, &MountPointObserver::spaceInfoChanged, this, &SpaceInfoObserver::spaceInfoChanged);
0021     m_mountPointObserver->update();
0022 }
0023 
0024 SpaceInfoObserver::~SpaceInfoObserver()
0025 {
0026     if (m_mountPointObserver) {
0027         m_mountPointObserver->deref();
0028         m_mountPointObserver = nullptr;
0029     }
0030 }
0031 
0032 quint64 SpaceInfoObserver::size() const
0033 {
0034     return m_dataSize;
0035 }
0036 
0037 quint64 SpaceInfoObserver::available() const
0038 {
0039     return m_dataAvailable;
0040 }
0041 
0042 void SpaceInfoObserver::setUrl(const QUrl &url)
0043 {
0044     MountPointObserver *newObserver = MountPointObserver::observerForUrl(url);
0045     if (newObserver != m_mountPointObserver) {
0046         if (m_mountPointObserver) {
0047             disconnect(m_mountPointObserver, &MountPointObserver::spaceInfoChanged, this, &SpaceInfoObserver::spaceInfoChanged);
0048             m_mountPointObserver->deref();
0049             m_mountPointObserver = nullptr;
0050         }
0051 
0052         m_mountPointObserver = newObserver;
0053         m_mountPointObserver->ref();
0054         connect(m_mountPointObserver, &MountPointObserver::spaceInfoChanged, this, &SpaceInfoObserver::spaceInfoChanged);
0055 
0056         // If newObserver is cached it won't call update until the next timer update,
0057         // so update the observer now.
0058         m_mountPointObserver->update();
0059     }
0060 }
0061 
0062 void SpaceInfoObserver::update()
0063 {
0064     if (m_mountPointObserver) {
0065         m_mountPointObserver->update();
0066     }
0067 }
0068 
0069 void SpaceInfoObserver::spaceInfoChanged(quint64 size, quint64 available)
0070 {
0071     // Make sure that the size has actually changed
0072     if (m_dataSize != size || m_dataAvailable != available || !m_hasData) {
0073         m_hasData = true;
0074         m_dataSize = size;
0075         m_dataAvailable = available;
0076 
0077         Q_EMIT valuesChanged();
0078     }
0079 }
0080 
0081 #include "moc_spaceinfoobserver.cpp"