OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/media_galleries/win/mtp_device_operations_util.h" | 5 #include "chrome/browser/media_galleries/win/mtp_device_operations_util.h" |
6 | 6 |
7 #include <portabledevice.h> | 7 #include <portabledevice.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 // WPD_CONTENT_FUNCTIONAL_OBJECT. | 102 // WPD_CONTENT_FUNCTIONAL_OBJECT. |
103 return (content_type == WPD_CONTENT_TYPE_FOLDER || | 103 return (content_type == WPD_CONTENT_TYPE_FOLDER || |
104 content_type == WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT); | 104 content_type == WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT); |
105 } | 105 } |
106 | 106 |
107 // Returns the friendly name of the object from the property key values | 107 // Returns the friendly name of the object from the property key values |
108 // specified by the |properties_values|. | 108 // specified by the |properties_values|. |
109 base::string16 GetObjectName(IPortableDeviceValues* properties_values, | 109 base::string16 GetObjectName(IPortableDeviceValues* properties_values, |
110 bool is_directory) { | 110 bool is_directory) { |
111 DCHECK(properties_values); | 111 DCHECK(properties_values); |
112 base::win::ScopedCoMem<char16> buffer; | 112 base::win::ScopedCoMem<base::char16> buffer; |
113 REFPROPERTYKEY key = | 113 REFPROPERTYKEY key = |
114 is_directory ? WPD_OBJECT_NAME : WPD_OBJECT_ORIGINAL_FILE_NAME; | 114 is_directory ? WPD_OBJECT_NAME : WPD_OBJECT_ORIGINAL_FILE_NAME; |
115 HRESULT hr = properties_values->GetStringValue(key, &buffer); | 115 HRESULT hr = properties_values->GetStringValue(key, &buffer); |
116 base::string16 result; | 116 base::string16 result; |
117 if (SUCCEEDED(hr)) | 117 if (SUCCEEDED(hr)) |
118 result.assign(buffer); | 118 result.assign(buffer); |
119 return result; | 119 return result; |
120 } | 120 } |
121 | 121 |
122 // Gets the last modified time of the object from the property key values | 122 // Gets the last modified time of the object from the property key values |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 base::win::ScopedComPtr<IEnumPortableDeviceObjectIDs> enum_object_ids = | 262 base::win::ScopedComPtr<IEnumPortableDeviceObjectIDs> enum_object_ids = |
263 GetDeviceObjectEnumerator(device, directory_object_id); | 263 GetDeviceObjectEnumerator(device, directory_object_id); |
264 if (!enum_object_ids) | 264 if (!enum_object_ids) |
265 return false; | 265 return false; |
266 | 266 |
267 // Loop calling Next() while S_OK is being returned. | 267 // Loop calling Next() while S_OK is being returned. |
268 const DWORD num_objects_to_request = 10; | 268 const DWORD num_objects_to_request = 10; |
269 const bool get_all_entries = object_name.empty(); | 269 const bool get_all_entries = object_name.empty(); |
270 for (HRESULT hr = S_OK; hr == S_OK;) { | 270 for (HRESULT hr = S_OK; hr == S_OK;) { |
271 DWORD num_objects_fetched = 0; | 271 DWORD num_objects_fetched = 0; |
272 scoped_ptr<char16*[]> object_ids(new char16*[num_objects_to_request]); | 272 scoped_ptr<base::char16*[]> object_ids( |
| 273 new base::char16*[num_objects_to_request]); |
273 hr = enum_object_ids->Next(num_objects_to_request, | 274 hr = enum_object_ids->Next(num_objects_to_request, |
274 object_ids.get(), | 275 object_ids.get(), |
275 &num_objects_fetched); | 276 &num_objects_fetched); |
276 for (DWORD index = 0; index < num_objects_fetched; ++index) { | 277 for (DWORD index = 0; index < num_objects_fetched; ++index) { |
277 MTPDeviceObjectEntry entry; | 278 MTPDeviceObjectEntry entry; |
278 if (GetMTPDeviceObjectEntry(device, | 279 if (GetMTPDeviceObjectEntry(device, |
279 object_ids[index], | 280 object_ids[index], |
280 &entry)) { | 281 &entry)) { |
281 if (get_all_entries) { | 282 if (get_all_entries) { |
282 object_entries->push_back(entry); | 283 object_entries->push_back(entry); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 object_entries.empty()) | 402 object_entries.empty()) |
402 return base::string16(); | 403 return base::string16(); |
403 // TODO(thestig): This DCHECK can fail. Multiple MTP objects can have | 404 // TODO(thestig): This DCHECK can fail. Multiple MTP objects can have |
404 // the same name. Handle the situation gracefully. Refer to crbug.com/169930 | 405 // the same name. Handle the situation gracefully. Refer to crbug.com/169930 |
405 // for more details. | 406 // for more details. |
406 DCHECK_EQ(1U, object_entries.size()); | 407 DCHECK_EQ(1U, object_entries.size()); |
407 return object_entries[0].object_id; | 408 return object_entries[0].object_id; |
408 } | 409 } |
409 | 410 |
410 } // namespace media_transfer_protocol | 411 } // namespace media_transfer_protocol |
OLD | NEW |