[gvfs] MTP: Clear cache and emit delete events when an object is removed.
- From: Philip Langdale <philipl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] MTP: Clear cache and emit delete events when an object is removed.
- Date: Sat, 30 Mar 2013 23:27:00 +0000 (UTC)
commit 30ca34dfd2a4c2f86a906d9bdea75adf8d4a73f4
Author: Philip Langdale <philipl overt org>
Date: Sun Mar 17 15:58:46 2013 -0700
MTP: Clear cache and emit delete events when an object is removed.
If an object is reported as removed by the device, remove it from
the cache and emit a delete event for it.
https://bugzilla.gnome.org/show_bug.cgi?id=696016
daemon/gvfsbackendmtp.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 49 insertions(+), 0 deletions(-)
---
diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c
index ba0f45c..212aff6 100644
--- a/daemon/gvfsbackendmtp.c
+++ b/daemon/gvfsbackendmtp.c
@@ -131,6 +131,16 @@ typedef struct {
/************************************************
+ * Static prototypes
+ ************************************************/
+
+static void
+emit_delete_event (gpointer key,
+ gpointer value,
+ gpointer user_data);
+
+
+/************************************************
* Cache Helpers
************************************************/
@@ -288,6 +298,33 @@ remove_cache_entry (GVfsBackendMtp *backend,
DEBUG ("(III) remove_cache_entry done");
}
+
+static void
+remove_cache_entry_by_id (GVfsBackendMtp *backend,
+ uint32_t id)
+{
+ GHashTableIter iter;
+ gpointer key, value;
+ DEBUG ("(III) remove_cache_entry_by_id: %u", id);
+
+ g_hash_table_iter_init (&iter, backend->file_cache);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ const char *path = key;
+ const CacheEntry *entry = value;
+
+ if (entry->id == id) {
+ g_hash_table_foreach (backend->monitors,
+ emit_delete_event,
+ (char *)path);
+ g_hash_table_iter_remove (&iter);
+ break;
+ }
+ }
+
+ DEBUG ("(III) remove_cache_entry_by_id done");
+}
+
+
/************************************************
* Initialization
************************************************/
@@ -570,6 +607,18 @@ check_event (gpointer user_data)
} else {
return NULL;
}
+#if HAVE_LIBMTP_1_1_6
+ case LIBMTP_EVENT_OBJECT_REMOVED:
+ backend = g_weak_ref_get (event_ref);
+ if (backend && !g_atomic_int_get (&backend->unmount_started)) {
+ g_mutex_lock (&backend->mutex);
+ remove_cache_entry_by_id (G_VFS_BACKEND_MTP (backend), param1);
+ g_mutex_unlock (&backend->mutex);
+ g_object_unref (backend);
+ } else {
+ return NULL;
+ }
+#endif
default:
break;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]