From 2e646494aa0606ccfc24f7616eca54098a441f80 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Wed, 11 Aug 2010 18:47:53 +0000 Subject: [PATCH] Update a device's free space after copying or removing files from it --- src/devices/connecteddevice.cpp | 9 +++++++++ src/devices/connecteddevice.h | 3 +++ src/devices/devicekitlister.cpp | 14 ++++++++++++++ src/devices/devicekitlister.h | 3 +++ src/devices/devicelister.h | 3 +++ src/devices/giolister.cpp | 28 ++++++++++++++++++++++++++++ src/devices/giolister.h | 3 +++ src/devices/gpoddevice.cpp | 10 ++++++++-- src/devices/gpoddevice.h | 4 +++- src/devices/ilister.cpp | 15 +++++++++++++++ src/devices/ilister.h | 3 +++ 11 files changed, 92 insertions(+), 3 deletions(-) diff --git a/src/devices/connecteddevice.cpp b/src/devices/connecteddevice.cpp index 6cf9edd19..428ba2fd9 100644 --- a/src/devices/connecteddevice.cpp +++ b/src/devices/connecteddevice.cpp @@ -15,6 +15,7 @@ */ #include "connecteddevice.h" +#include "devicelister.h" #include "devicemanager.h" #include "core/database.h" #include "library/library.h" @@ -84,3 +85,11 @@ void ConnectedDevice::InitBackendDirectory( void ConnectedDevice::Eject() { manager_->UnmountAsync(manager_->FindDeviceById(unique_id_)); } + +void ConnectedDevice::FinishCopy(bool) { + lister_->UpdateDeviceFreeSpace(unique_id_); +} + +void ConnectedDevice::FinishDelete(bool) { + lister_->UpdateDeviceFreeSpace(unique_id_); +} diff --git a/src/devices/connecteddevice.h b/src/devices/connecteddevice.h index 84b9f3f4a..3c98cca3c 100644 --- a/src/devices/connecteddevice.h +++ b/src/devices/connecteddevice.h @@ -48,6 +48,9 @@ public: LibraryModel* model() const { return model_; } QUrl url() const { return url_; } + virtual void FinishCopy(bool success); + virtual void FinishDelete(bool success); + void Eject(); signals: diff --git a/src/devices/devicekitlister.cpp b/src/devices/devicekitlister.cpp index 563786fd6..b4d16d582 100644 --- a/src/devices/devicekitlister.cpp +++ b/src/devices/devicekitlister.cpp @@ -278,3 +278,17 @@ void DeviceKitLister::UnmountDevice(const QString& id) { drive.DriveEject(QStringList()); // Don't bother waiting for the eject to finish } + +void DeviceKitLister::UpdateDeviceFreeSpace(const QString& id) { + { + QMutexLocker l(&mutex_); + if (!device_data_.contains(id)) + return; + + DeviceData& data = device_data_[id]; + if (!data.device_mount_paths.isEmpty()) + data.free_space = Utilities::FileSystemFreeSpace(data.device_mount_paths[0]); + } + + emit DeviceChanged(id); +} diff --git a/src/devices/devicekitlister.h b/src/devices/devicekitlister.h index 6b72e2731..b11decbc5 100644 --- a/src/devices/devicekitlister.h +++ b/src/devices/devicekitlister.h @@ -48,6 +48,9 @@ public: void UnmountDevice(const QString &id); +public slots: + void UpdateDeviceFreeSpace(const QString& id); + protected: void Init(); diff --git a/src/devices/devicelister.h b/src/devices/devicelister.h index d90c63ee1..10078a2bc 100644 --- a/src/devices/devicelister.h +++ b/src/devices/devicelister.h @@ -55,6 +55,9 @@ public: // Do whatever needs to be done to safely remove the device. virtual void UnmountDevice(const QString& id) = 0; +public slots: + virtual void UpdateDeviceFreeSpace(const QString& id) = 0; + signals: void DeviceAdded(const QString& id); void DeviceRemoved(const QString& id); diff --git a/src/devices/giolister.cpp b/src/devices/giolister.cpp index fa25facd9..0656c15db 100644 --- a/src/devices/giolister.cpp +++ b/src/devices/giolister.cpp @@ -323,3 +323,31 @@ void GioLister::UnmountDevice(const QString &id) { (GAsyncReadyCallback) MountUnmountFinished, NULL); } } + +void GioLister::UpdateDeviceFreeSpace(const QString& id) { + { + QMutexLocker l(&mutex_); + if (!mounts_.contains(id)) + return; + + MountInfo& mount_info = mounts_[id]; + + GFile* root = g_mount_get_root(mount_info.mount); + + GError* error = NULL; + GFileInfo* info = g_file_query_filesystem_info( + root, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, NULL, &error); + if (error) { + qWarning() << error->message; + g_error_free(error); + } else { + mount_info.filesystem_free = g_file_info_get_attribute_uint64( + info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); + g_object_unref(info); + } + + g_object_unref(root); + } + + emit DeviceChanged(id); +} diff --git a/src/devices/giolister.h b/src/devices/giolister.h index 5f2b16278..99e62ac33 100644 --- a/src/devices/giolister.h +++ b/src/devices/giolister.h @@ -46,6 +46,9 @@ public: void UnmountDevice(const QString &id); +public slots: + void UpdateDeviceFreeSpace(const QString& id); + protected: void Init(); diff --git a/src/devices/gpoddevice.cpp b/src/devices/gpoddevice.cpp index 49ab396aa..ed780f18a 100644 --- a/src/devices/gpoddevice.cpp +++ b/src/devices/gpoddevice.cpp @@ -129,7 +129,7 @@ bool GPodDevice::CopyToStorage( return true; } -void GPodDevice::FinishCopy(bool success) { +void GPodDevice::WriteDatabase(bool success) { if (success) { // Write the itunes database GError* error = NULL; @@ -154,6 +154,11 @@ void GPodDevice::FinishCopy(bool success) { db_busy_.unlock(); } +void GPodDevice::FinishCopy(bool success) { + WriteDatabase(success); + ConnectedDevice::FinishCopy(success); +} + void GPodDevice::StartDelete() { StartCopy(); } @@ -200,6 +205,7 @@ bool GPodDevice::DeleteFromStorage(const Song& metadata) { } void GPodDevice::FinishDelete(bool success) { - FinishCopy(success); + WriteDatabase(success); + ConnectedDevice::FinishDelete(success); } diff --git a/src/devices/gpoddevice.h b/src/devices/gpoddevice.h index ecbdf0130..08dc131c4 100644 --- a/src/devices/gpoddevice.h +++ b/src/devices/gpoddevice.h @@ -56,9 +56,11 @@ protected slots: protected: Itdb_Track* AddTrackToITunesDb(const Song& metadata); void AddTrackToModel(Itdb_Track* track, const QString& prefix); - virtual void FinaliseDatabase() {} +private: + void WriteDatabase(bool success); + protected: QThread* loader_thread_; GPodLoader* loader_; diff --git a/src/devices/ilister.cpp b/src/devices/ilister.cpp index 1d69948c4..38db1dc34 100644 --- a/src/devices/ilister.cpp +++ b/src/devices/ilister.cpp @@ -163,3 +163,18 @@ iLister::DeviceInfo iLister::ReadDeviceInfo(const char* uuid) { return ret; } + +void iLister::UpdateDeviceFreeSpace(const QString& id) { + { + QMutexLocker l(&mutex_); + if (!devices_.contains(id)) + return; + + DeviceInfo& info = devices_[id]; + iMobileDeviceConnection conn(info.uuid); + + info.free_bytes = conn.GetProperty("AmountDataAvailable", "com.apple.disk_usage").toULongLong(); + } + + emit DeviceChanged(id); +} diff --git a/src/devices/ilister.h b/src/devices/ilister.h index 3e88a2348..bcda33ab8 100644 --- a/src/devices/ilister.h +++ b/src/devices/ilister.h @@ -26,6 +26,9 @@ class iLister : public DeviceLister { virtual QList MakeDeviceUrls(const QString& id); virtual void UnmountDevice(const QString& id); + public slots: + virtual void UpdateDeviceFreeSpace(const QString& id); + private: struct DeviceInfo { DeviceInfo() : free_bytes(0), total_bytes(0) {}