diff options
author | re2zero <yangwu@uniontech.com> | 2023-03-15 16:13:54 +0800 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2023-05-03 08:13:00 +0000 |
commit | de47910648eac28779ba162884b3ee8e2cdc85b9 (patch) | |
tree | 254f09d72b20b91a398ff3aef86c9054d72ed8be | |
parent | e206a98a96b3f2ace8f8f4968f6de54e7312a567 (diff) | |
download | gvfs-de47910648eac28779ba162884b3ee8e2cdc85b9.tar.gz |
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.
-rw-r--r-- | daemon/gvfsbackendmtp.c | 47 | ||||
-rw-r--r-- | 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 |