1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/extensions/api/image_writer_private/removable_storage_provider.h" 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chromeos/disks/disk_mount_manager.h" 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace extensions { 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kUnknownSDDiskModel[] = "SD Card"; 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kUnknownUSBDiskModel[] = "USB Drive"; 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing chromeos::disks::DiskMountManager; 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// The Chrome OS implementation takes advantage of the Chrome OS 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// DiskMountManager. This does not expose whether the device is a removable or 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// fixed disk. In fact, some SD cards will present themselves as fixed disks 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// (see http://crbug.com/340761). Thus we just expose all USB and SD drives. 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool RemovableStorageProvider::PopulateDeviceList( 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<StorageDeviceList> device_list) { 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DiskMountManager* disk_mount_manager = DiskMountManager::GetInstance(); 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const DiskMountManager::DiskMap& disks = disk_mount_manager->disks(); 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch for (DiskMountManager::DiskMap::const_iterator iter = disks.begin(); 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch iter != disks.end(); 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ++iter) { 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const DiskMountManager::Disk& disk = *iter->second; 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (disk.is_parent() && !disk.on_boot_device() && disk.has_media() && 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch (disk.device_type() == chromeos::DEVICE_TYPE_USB || 31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch disk.device_type() == chromeos::DEVICE_TYPE_SD)) { 32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch linked_ptr<api::image_writer_private::RemovableStorageDevice> device( 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new api::image_writer_private::RemovableStorageDevice()); 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device->storage_unit_id = disk.device_path(); 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch device->capacity = disk.total_size_in_bytes(); 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) device->removable = disk.on_removable_device(); 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch device->vendor = disk.vendor_name(); 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch device->model = disk.product_name(); 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (device->model.empty() && device->vendor.empty()) { 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (disk.device_type() == chromeos::DEVICE_TYPE_USB) { 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch device->model = kUnknownUSBDiskModel; 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else { 44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch device->model = kUnknownSDDiskModel; 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch device_list->data.push_back(device); 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace extensions 56