[gvfs] mtp: Allow reading if GetPartialObject is supported



commit e37131e9e8d1a543fa1ded6bde629e09230fbff3
Author: Ondrej Holy <oholy redhat com>
Date:   Thu Jan 22 16:39:39 2015 +0100

    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

 configure.ac            |    5 +++++
 daemon/gvfsbackendmtp.c |   16 +++++++++++++++-
 daemon/gvfsbackendmtp.h |    1 +
 3 files changed, 21 insertions(+), 1 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index ebcd220..1caad91 100644
--- a/configure.ac
+++ b/configure.ac
@@ -522,6 +522,11 @@ if test "x$enable_libmtp" != "xno" -a "x$msg_gudev" = "xyes"; then
         [AC_DEFINE([HAVE_LIBMTP_1_1_6], 1, [Define to 1 if libmtp 1.1.6 is available])],
         []
     )
+
+    PKG_CHECK_MODULES([LIBMTP_1_1_9], [libmtp >= 1.1.9],
+        [AC_DEFINE([HAVE_LIBMTP_1_1_9], 1, [Define to 1 if libmtp 1.1.9 is available])],
+        []
+    )
   fi
 fi
 
diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c
index d8a5faa..7701836 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);
diff --git a/daemon/gvfsbackendmtp.h b/daemon/gvfsbackendmtp.h
index 9ae0301..a62f326 100644
--- a/daemon/gvfsbackendmtp.h
+++ b/daemon/gvfsbackendmtp.h
@@ -64,6 +64,7 @@ struct _GVfsBackendMtp
   gboolean force_unmounted;
 
   gboolean android_extension;
+  gboolean get_partial_object_capability;
 };
 
 struct _GVfsBackendMtpClass


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]