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