Index: chrome/browser/media_galleries/win/mtp_device_operations_util.cc |
diff --git a/chrome/browser/media_galleries/win/mtp_device_operations_util.cc b/chrome/browser/media_galleries/win/mtp_device_operations_util.cc |
index 8b03b109f6dc9868befc0cb04280e7301c131926..a74c0f43d16f2043483ca3f3743c47ad42c064ff 100644 |
--- a/chrome/browser/media_galleries/win/mtp_device_operations_util.cc |
+++ b/chrome/browser/media_galleries/win/mtp_device_operations_util.cc |
@@ -118,9 +118,9 @@ base::string16 GetObjectName(IPortableDeviceValues* properties_values) { |
} |
// Gets the last modified time of the object from the property key values |
-// specified by the |properties_values|. On success, returns true and fills in |
+// specified by the |properties_values|. On success, fills in |
// |last_modified_time|. |
-bool GetLastModifiedTime(IPortableDeviceValues* properties_values, |
+void GetLastModifiedTime(IPortableDeviceValues* properties_values, |
base::Time* last_modified_time) { |
DCHECK(properties_values); |
DCHECK(last_modified_time); |
@@ -128,20 +128,24 @@ bool GetLastModifiedTime(IPortableDeviceValues* properties_values, |
HRESULT hr = properties_values->GetValue(WPD_OBJECT_DATE_MODIFIED, |
last_modified_date.Receive()); |
if (FAILED(hr)) |
- return false; |
+ return; |
+ |
+ // Some PTP devices don't provide an mtime. Try using the ctime instead. |
+ if (last_modified_date.get().vt != VT_DATE) { |
+ last_modified_date.Reset(); |
+ HRESULT hr = properties_values->GetValue(WPD_OBJECT_DATE_CREATED, |
+ last_modified_date.Receive()); |
+ if (FAILED(hr)) |
+ return; |
+ } |
- bool last_modified_time_set = (last_modified_date.get().vt == VT_DATE); |
- if (last_modified_time_set) { |
- SYSTEMTIME system_time; |
- FILETIME file_time; |
- if (VariantTimeToSystemTime(last_modified_date.get().date, &system_time) && |
- SystemTimeToFileTime(&system_time, &file_time)) { |
- *last_modified_time = base::Time::FromFileTime(file_time); |
- } else { |
- last_modified_time_set = false; |
- } |
+ SYSTEMTIME system_time; |
+ FILETIME file_time; |
+ if (last_modified_date.get().vt == VT_DATE && |
+ VariantTimeToSystemTime(last_modified_date.get().date, &system_time) && |
+ SystemTimeToFileTime(&system_time, &file_time)) { |
+ *last_modified_time = base::Time::FromFileTime(file_time); |
} |
- return last_modified_time_set; |
} |
// Gets the size of the file object in bytes from the property key values |
@@ -161,7 +165,8 @@ bool GetObjectSize(IPortableDeviceValues* properties_values, int64* size) { |
// Gets the details of the object specified by the |object_id| given the media |
// transfer protocol |device|. On success, returns true and fills in |name|, |
-// |is_directory|, |size| and |last_modified_time|. |
+// |is_directory|, |size|. |last_modified_time| will be filled in if possible, |
+// but failure to get it doesn't prevent success. |
bool GetObjectDetails(IPortableDevice* device, |
const base::string16 object_id, |
base::string16* name, |
@@ -197,6 +202,7 @@ bool GetObjectDetails(IPortableDevice* device, |
FAILED(properties_to_read->Add(WPD_OBJECT_ORIGINAL_FILE_NAME)) || |
FAILED(properties_to_read->Add(WPD_OBJECT_NAME)) || |
FAILED(properties_to_read->Add(WPD_OBJECT_DATE_MODIFIED)) || |
+ FAILED(properties_to_read->Add(WPD_OBJECT_DATE_CREATED)) || |
FAILED(properties_to_read->Add(WPD_OBJECT_SIZE))) |
return false; |
@@ -219,8 +225,11 @@ bool GetObjectDetails(IPortableDevice* device, |
*last_modified_time = base::Time(); |
return true; |
} |
- return (GetObjectSize(properties_values.get(), size) && |
- GetLastModifiedTime(properties_values.get(), last_modified_time)); |
+ |
+ // Try to get the last modified time, but don't fail if we can't. |
+ GetLastModifiedTime(properties_values.get(), last_modified_time); |
+ |
+ return GetObjectSize(properties_values.get(), size); |
} |
// Creates an MTP device object entry for the given |device| and |object_id|. |