From de47910648eac28779ba162884b3ee8e2cdc85b9 Mon Sep 17 00:00:00 2001 From: re2zero Date: Wed, 15 Mar 2023 16:13:54 +0800 Subject: mtp: Make mtp backend support incrementally enumerate. After libmtp has added get_children API, integrate this new API to get files incrementally. This LIBMTP_Get_Children API will be included in next libmtp release 1.1.21. --- daemon/gvfsbackendmtp.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- meson.build | 2 +- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c index 0bc35b7a..92e27fe7 100644 --- a/daemon/gvfsbackendmtp.c +++ b/daemon/gvfsbackendmtp.c @@ -1379,6 +1379,7 @@ do_enumerate (GVfsBackend *backend, if (ret != 0) { LIBMTP_Dump_Errorstack (device); LIBMTP_Clear_Errorstack (device); + g_vfs_job_succeeded (G_VFS_JOB (job)); goto success; } for (storage = device->storage; storage != 0; storage = storage->next) { @@ -1395,6 +1396,7 @@ do_enumerate (GVfsBackend *backend, g_free (storage_name); } + g_vfs_job_succeeded (G_VFS_JOB (job)); } else { CacheEntry *entry = get_cache_entry (G_VFS_BACKEND_MTP (backend), filename); @@ -1412,13 +1414,54 @@ do_enumerate (GVfsBackend *backend, remove_cache_entry (G_VFS_BACKEND_MTP (backend), remove_prefix); g_free (remove_prefix); - LIBMTP_file_t *files; LIBMTP_Clear_Errorstack (device); + +#if HAVE_LIBMTP_1_1_21 + uint32_t *handlers = NULL; + int count = LIBMTP_Get_Children (device, entry->storage, entry->id, &handlers); + + if (count < 0) { + fail_job (G_VFS_JOB (job), device); + goto exit; + } + + g_vfs_job_succeeded (G_VFS_JOB (job)); + + for (int i = 0; i < count; i++) { + LIBMTP_file_t *file; + + // Get metadata for one file, if it fails, try next file + file = LIBMTP_Get_Filemetadata (device, handlers[i]); + if (file == NULL) { + continue; + } + info = g_file_info_new (); + get_file_info (backend, device, info, file); + g_vfs_job_enumerate_add_info (job, info); + g_object_unref (info); + + add_cache_entry (G_VFS_BACKEND_MTP (backend), + g_build_filename (filename, file->filename, NULL), + file->storage_id, + file->item_id); + + LIBMTP_destroy_file_t (file); + } + + if (handlers) { + g_free (handlers); + } +#else + LIBMTP_file_t *files; + files = LIBMTP_Get_Files_And_Folders (device, entry->storage, entry->id); if (files == NULL && LIBMTP_Get_Errorstack (device) != NULL) { fail_job (G_VFS_JOB (job), device); goto exit; } + + g_vfs_job_succeeded (G_VFS_JOB (job)); + while (files != NULL) { LIBMTP_file_t *file = files; files = files->next; @@ -1435,11 +1478,11 @@ do_enumerate (GVfsBackend *backend, LIBMTP_destroy_file_t (file); } +#endif } success: g_vfs_job_enumerate_done (job); - g_vfs_job_succeeded (G_VFS_JOB (job)); exit: g_strfreev (elements); diff --git a/meson.build b/meson.build index e3aabbf2..47137812 100644 --- a/meson.build +++ b/meson.build @@ -440,7 +440,7 @@ if enable_mtp assert(enable_gudev, 'libmtp requested but gudev is required') libmtp_dep = dependency('libmtp', version: '>= 1.1.12') - foreach version: ['1.1.15'] + foreach version: ['1.1.15', '1.1.21'] config_h.set10('HAVE_LIBMTP_' + version.underscorify(), libmtp_dep.version().version_compare('>= ' + version)) endforeach endif -- cgit v1.2.1