static void recent_backend_finalize (GObject *object) { GVfsBackendRecent *backend = G_VFS_BACKEND_RECENT (object); g_clear_object (&backend->dir_monitor); g_clear_object (&backend->file_monitor); g_hash_table_destroy (backend->items); g_hash_table_destroy (backend->uri_map); g_signal_handlers_disconnect_by_func (backend->recent_manager, on_recent_manager_changed, backend); if (G_OBJECT_CLASS (g_vfs_backend_recent_parent_class)->finalize) (*G_OBJECT_CLASS (g_vfs_backend_recent_parent_class)->finalize) (object); }
static gboolean recent_backend_create_file_monitor (GVfsBackend *vfs_backend, GVfsJobCreateMonitor *job, const char *filename, GFileMonitorFlags flags) { GVfsBackendRecent *backend = G_VFS_BACKEND_RECENT (vfs_backend); GVfsMonitor *monitor; if (filename[1]) monitor = g_vfs_monitor_new (vfs_backend); else monitor = recent_backend_get_file_monitor (backend, TRUE); g_vfs_job_create_monitor_set_monitor (job, monitor); g_vfs_job_succeeded (G_VFS_JOB (job)); g_object_unref (monitor); return TRUE; }
static gboolean recent_backend_mount (GVfsBackend *vfs_backend, GVfsJobMount *job, GMountSpec *mount_spec, GMountSource *mount_source, gboolean is_automount) { GVfsBackendRecent *backend = G_VFS_BACKEND_RECENT (vfs_backend); backend->recent_manager = gtk_recent_manager_get_default (); g_signal_connect (backend->recent_manager, "changed", G_CALLBACK (on_recent_manager_changed), backend); reload_recent_items (backend); g_vfs_job_succeeded (G_VFS_JOB (job)); return TRUE; }
static gboolean recent_backend_delete (GVfsBackend *vfs_backend, GVfsJobDelete *job, const char *filename) { GVfsBackendRecent *backend = G_VFS_BACKEND_RECENT (vfs_backend); GError *error = NULL; g_debug ("before job: %d\n", G_OBJECT(job)->ref_count); if (filename[1] == '\0') { g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED, _("The recent folder may not be deleted")); } else { RecentItem *item; item = g_hash_table_lookup (backend->items, filename + 1); if (item) { gboolean res; res = gtk_recent_manager_remove_item (backend->recent_manager, item->uri, &error); if (res) { g_vfs_job_succeeded (G_VFS_JOB (job)); return TRUE; } } else g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("No such file or directory")); } g_vfs_job_failed_from_error (G_VFS_JOB (job), error); g_error_free (error); return TRUE; }
/* ======================= method implementations ======================= */ static gboolean recent_backend_open_for_read (GVfsBackend *vfs_backend, GVfsJobOpenForRead *job, const char *filename) { GVfsBackendRecent *backend = G_VFS_BACKEND_RECENT (vfs_backend); GError *error = NULL; if (filename[1] == '\0') g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY, _("Can't open directory")); else { GFile *real; real = recent_backend_get_file (backend, filename, NULL, &error); if (real) { GFileInputStream *stream; stream = g_file_read (real, G_VFS_JOB (job)->cancellable, &error); g_object_unref (real); if (stream) { g_vfs_job_open_for_read_set_handle (job, stream); g_vfs_job_open_for_read_set_can_seek (job, TRUE); g_vfs_job_succeeded (G_VFS_JOB (job)); return TRUE; } } } g_vfs_job_failed_from_error (G_VFS_JOB (job), error); g_error_free (error); return TRUE; }
static gboolean recent_backend_enumerate (GVfsBackend *vfs_backend, GVfsJobEnumerate *job, const char *filename, GFileAttributeMatcher *attribute_matcher, GFileQueryInfoFlags flags) { GVfsBackendRecent *backend = G_VFS_BACKEND_RECENT (vfs_backend); GHashTableIter iter; gpointer key, value; g_assert (filename[0] == '/'); g_vfs_job_succeeded (G_VFS_JOB (job)); g_hash_table_iter_init (&iter, backend->items); while (g_hash_table_iter_next (&iter, &key, &value)) { RecentItem *item = value; GFileInfo *info; info = g_file_query_info (item->file, job->attributes, flags, G_VFS_JOB (job)->cancellable, NULL); if (info) { g_file_info_set_attribute_mask (info, attribute_matcher); recent_backend_add_info (item, info); g_vfs_job_enumerate_add_info (job, info); g_object_unref (info); } } g_vfs_job_enumerate_done (job); return TRUE; }
static gboolean recent_backend_query_info (GVfsBackend *vfs_backend, GVfsJobQueryInfo *job, const char *filename, GFileQueryInfoFlags flags, GFileInfo *info, GFileAttributeMatcher *matcher) { GVfsBackendRecent *backend = G_VFS_BACKEND_RECENT (vfs_backend); g_assert (filename[0] == '/'); if (filename[1]) { GError *error = NULL; RecentItem *item = NULL; GFile *real; real = recent_backend_get_file (backend, filename, &item, &error); if (real) { GFileInfo *real_info; real_info = g_file_query_info (real, job->attributes, flags, G_VFS_JOB (job)->cancellable, &error); g_object_unref (real); if (real_info) { g_file_info_copy_into (real_info, info); recent_backend_add_info (item, info); g_vfs_job_succeeded (G_VFS_JOB (job)); g_object_unref (real_info); return TRUE; } } g_vfs_job_failed_from_error (G_VFS_JOB (job), error); g_error_free (error); } else { GIcon *icon; g_file_info_set_file_type (info, G_FILE_TYPE_DIRECTORY); g_file_info_set_name (info, "/"); /* Translators: this is the display name of the backend */ g_file_info_set_display_name (info, _("Recent")); g_file_info_set_content_type (info, "inode/directory"); g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, FALSE); g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE, TRUE); g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH, FALSE); icon = g_themed_icon_new ("document-open-recent"); g_file_info_set_icon (info, icon); g_object_unref (icon); icon = g_themed_icon_new ("document-open-recent-symbolic"); g_file_info_set_symbolic_icon (info, icon); g_object_unref (icon); g_vfs_job_succeeded (G_VFS_JOB (job)); } return TRUE; }