diff options
author | Ondrej Holy <oholy@redhat.com> | 2015-01-22 16:39:39 +0100 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2016-01-20 12:32:18 +0100 |
commit | e37131e9e8d1a543fa1ded6bde629e09230fbff3 (patch) | |
tree | 4b1490cea8c892aa578697f60ea792764a77bec9 /daemon/gvfsbackendmtp.c | |
parent | f7e13d06c5849116f3b5ecb9aadc85c654eda9f6 (diff) | |
download | gvfs-e37131e9e8d1a543fa1ded6bde629e09230fbff3.tar.gz |
mtp: Allow reading if GetPartialObject is supported
Read support is allowed currently only if android.com extension is
detected. However necessary functions can be provided also by different
extension. Therefor check whether GetPartialObject is supported.
https://bugzilla.gnome.org/show_bug.cgi?id=743359
Diffstat (limited to 'daemon/gvfsbackendmtp.c')
-rw-r--r-- | daemon/gvfsbackendmtp.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c index d8a5faa0..7701836e 100644 --- a/daemon/gvfsbackendmtp.c +++ b/daemon/gvfsbackendmtp.c @@ -1014,6 +1014,11 @@ get_device (GVfsBackend *backend, const char *id, GVfsJob *job) { } } +#if HAVE_LIBMTP_1_1_9 + G_VFS_BACKEND_MTP (backend)->get_partial_object_capability + = LIBMTP_Check_Capability (device, LIBMTP_DEVICECAP_GetPartialObject); +#endif + exit: g_debug ("(II) get_device done.\n"); return device; @@ -2150,7 +2155,8 @@ do_open_for_read (GVfsBackend *backend, GVfsJobOpenForRead *job, const char *filename) { - if (!G_VFS_BACKEND_MTP (backend)->android_extension) { + if (!G_VFS_BACKEND_MTP (backend)->android_extension && + !G_VFS_BACKEND_MTP (backend)->get_partial_object_capability) { g_vfs_job_failed_literal (G_VFS_JOB (job), G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("Operation unsupported")); @@ -2344,6 +2350,14 @@ do_read (GVfsBackend *backend, uint32_t actual; if (handle->handle_type == HANDLE_FILE) { #if HAVE_LIBMTP_1_1_6 + if (!G_VFS_BACKEND_MTP (backend)->android_extension && + offset > G_MAXUINT32) { + g_vfs_job_failed_literal (G_VFS_JOB (job), + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Operation unsupported")); + goto exit; + } + unsigned char *temp; int ret = LIBMTP_GetPartialObject (G_VFS_BACKEND_MTP (backend)->device, id, offset, bytes_requested, &temp, &actual); |