summaryrefslogtreecommitdiff
path: root/daemon/gvfsbackendmtp.c
diff options
context:
space:
mode:
authorOndrej Holy <oholy@redhat.com>2015-01-22 16:39:39 +0100
committerOndrej Holy <oholy@redhat.com>2016-01-20 12:32:18 +0100
commite37131e9e8d1a543fa1ded6bde629e09230fbff3 (patch)
tree4b1490cea8c892aa578697f60ea792764a77bec9 /daemon/gvfsbackendmtp.c
parentf7e13d06c5849116f3b5ecb9aadc85c654eda9f6 (diff)
downloadgvfs-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.c16
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);