Index: src/libmtp.c
===================================================================
--- src/libmtp.c	(revision 148597)
+++ src/libmtp.c	(working copy)
@@ -1144,6 +1144,9 @@
   int supported = 0;
   uint16_t ptp_prop = map_libmtp_property_to_ptp_property(property);
 
+  if (!ptp_operation_issupported(device->params, PTP_OC_MTP_GetObjectPropsSupported))
+    return 0;
+
   ret = ptp_mtp_getobjectpropssupported(device->params, map_libmtp_type_to_ptp_type(filetype), &propcnt, &props);
   if (ret != PTP_RC_OK) {
     add_ptp_error_to_errorstack(device, ret, "LIBMTP_Is_Property_Supported(): could not get properties supported.");
@@ -1974,40 +1977,42 @@
   }
 
   /* Determine if the object size supported is 32 or 64 bit wide */
-  for (i=0;i<current_params->deviceinfo.ImageFormats_len;i++) {
-    PTPObjectPropDesc opd;
+  if (ptp_operation_issupported(current_params,PTP_OC_MTP_GetObjectPropsSupported)) {
+    for (i=0;i<current_params->deviceinfo.ImageFormats_len;i++) {
+      PTPObjectPropDesc opd;
 
-    if (ptp_mtp_getobjectpropdesc(current_params,
-				  PTP_OPC_ObjectSize,
-				  current_params->deviceinfo.ImageFormats[i],
-				  &opd) != PTP_RC_OK) {
-      LIBMTP_ERROR("LIBMTP PANIC: "
-	     "could not inspect object property descriptions!\n");
-    } else {
-      if (opd.DataType == PTP_DTC_UINT32) {
-	if (bs == 0) {
-	  bs = 32;
-	} else if (bs != 32) {
-	  LIBMTP_ERROR("LIBMTP PANIC: "
-		 "different objects support different object sizes!\n");
-	  bs = 0;
-	  break;
-	}
-      } else if (opd.DataType == PTP_DTC_UINT64) {
-	if (bs == 0) {
-	  bs = 64;
-	} else if (bs != 64) {
-	  LIBMTP_ERROR("LIBMTP PANIC: "
-		 "different objects support different object sizes!\n");
-	  bs = 0;
-	  break;
-	}
+      if (ptp_mtp_getobjectpropdesc(current_params,
+                                    PTP_OPC_ObjectSize,
+                                    current_params->deviceinfo.ImageFormats[i],
+                                    &opd) != PTP_RC_OK) {
+        LIBMTP_ERROR("LIBMTP PANIC: "
+                     "could not inspect object property descriptions!\n");
       } else {
-	// Ignore if other size.
-	LIBMTP_ERROR("LIBMTP PANIC: "
-	       "awkward object size data type: %04x\n", opd.DataType);
-	bs = 0;
-	break;
+        if (opd.DataType == PTP_DTC_UINT32) {
+          if (bs == 0) {
+            bs = 32;
+          } else if (bs != 32) {
+            LIBMTP_ERROR("LIBMTP PANIC: "
+                         "different objects support different object sizes!\n");
+            bs = 0;
+            break;
+          }
+        } else if (opd.DataType == PTP_DTC_UINT64) {
+          if (bs == 0) {
+            bs = 64;
+          } else if (bs != 64) {
+            LIBMTP_ERROR("LIBMTP PANIC: "
+                         "different objects support different object sizes!\n");
+            bs = 0;
+            break;
+          }
+        } else {
+          // Ignore if other size.
+          LIBMTP_ERROR("LIBMTP PANIC: "
+                       "awkward object size data type: %04x\n", opd.DataType);
+          bs = 0;
+          break;
+        }
       }
     }
   }
@@ -4107,7 +4112,7 @@
 	break;
       }
     }
-  } else {
+  } else if (ptp_operation_issupported(params,PTP_OC_MTP_GetObjectPropsSupported)) {
     uint16_t *props = NULL;
     uint32_t propcnt = 0;
     int ret;
