cros_disks_client.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/cros_disks_client.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/bus.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_proxy.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kDefaultMountOptions[] = {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "rw",
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "nodev",
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "noexec",
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "nosuid",
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kDefaultUnmountOptions[] = {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "force",
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLazyUnmountOption[] = "lazy";
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMountLabelOption[] = "mountlabel";
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks if retrieved media type is in boundaries of DeviceMediaType.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsValidMediaType(uint32 type) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type < static_cast<uint32>(cros_disks::DEVICE_MEDIA_NUM_VALUES);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Translates enum used in cros-disks to enum used in Chrome.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that we could just do static_cast, but this is less sensitive to
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// changes in cros-disks.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceType DeviceMediaTypeToDeviceType(uint32 media_type_uint32) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsValidMediaType(media_type_uint32))
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return DEVICE_TYPE_UNKNOWN;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_disks::DeviceMediaType media_type =
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cros_disks::DeviceMediaType(media_type_uint32);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (media_type) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case(cros_disks::DEVICE_MEDIA_UNKNOWN):
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DEVICE_TYPE_UNKNOWN;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case(cros_disks::DEVICE_MEDIA_USB):
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DEVICE_TYPE_USB;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case(cros_disks::DEVICE_MEDIA_SD):
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DEVICE_TYPE_SD;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case(cros_disks::DEVICE_MEDIA_OPTICAL_DISC):
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DEVICE_TYPE_OPTICAL_DISC;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case(cros_disks::DEVICE_MEDIA_MOBILE):
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DEVICE_TYPE_MOBILE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case(cros_disks::DEVICE_MEDIA_DVD):
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DEVICE_TYPE_DVD;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DEVICE_TYPE_UNKNOWN;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pops a bool value when |reader| is not NULL.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true when a value is popped, false otherwise.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MaybePopBool(dbus::MessageReader* reader, bool* value) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopBool(value);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pops a string value when |reader| is not NULL.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true when a value is popped, false otherwise.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MaybePopString(dbus::MessageReader* reader, std::string* value) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopString(value);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pops a uint32 value when |reader| is not NULL.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true when a value is popped, false otherwise.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MaybePopUint32(dbus::MessageReader* reader, uint32* value) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopUint32(value);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pops a uint64 value when |reader| is not NULL.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true when a value is popped, false otherwise.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MaybePopUint64(dbus::MessageReader* reader, uint64* value) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopUint64(value);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pops an array of strings when |reader| is not NULL.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true when an array is popped, false otherwise.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MaybePopArrayOfStrings(dbus::MessageReader* reader,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            std::vector<std::string>* value) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopArrayOfStrings(value);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The CrosDisksClient implementation.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CrosDisksClientImpl : public CrosDisksClient {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit CrosDisksClientImpl(dbus::Bus* bus)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : proxy_(bus->GetObjectProxy(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cros_disks::kCrosDisksServiceName,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          dbus::ObjectPath(cros_disks::kCrosDisksServicePath))),
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        weak_ptr_factory_(this) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CrosDisksClient override.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Mount(const std::string& source_path,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& source_format,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& mount_label,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     MountType type,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const MountCallback& callback,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const ErrorCallback& error_callback) OVERRIDE {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(cros_disks::kCrosDisksInterface,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 cros_disks::kMount);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendString(source_path);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendString(source_format);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> mount_options(kDefaultMountOptions,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           kDefaultMountOptions +
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           arraysize(kDefaultMountOptions));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!mount_label.empty()) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string mount_label_option = base::StringPrintf("%s=%s",
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          kMountLabelOption,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          mount_label.c_str());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mount_options.push_back(mount_label_option);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendArrayOfStrings(mount_options);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Bind(&CrosDisksClientImpl::OnMount,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  weak_ptr_factory_.GetWeakPtr(),
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  callback,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  error_callback));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CrosDisksClient override.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Unmount(const std::string& device_path,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       UnmountOptions options,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const UnmountCallback& callback,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const UnmountCallback& error_callback) OVERRIDE {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(cros_disks::kCrosDisksInterface,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 cros_disks::kUnmount);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendString(device_path);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> unmount_options(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kDefaultUnmountOptions,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kDefaultUnmountOptions + arraysize(kDefaultUnmountOptions));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (options == UNMOUNT_OPTIONS_LAZY)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unmount_options.push_back(kLazyUnmountOption);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendArrayOfStrings(unmount_options);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Bind(&CrosDisksClientImpl::OnUnmount,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  weak_ptr_factory_.GetWeakPtr(),
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  device_path,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  callback,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  error_callback));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CrosDisksClient override.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EnumerateAutoMountableDevices(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const EnumerateAutoMountableDevicesCallback& callback,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ErrorCallback& error_callback) OVERRIDE {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(cros_disks::kCrosDisksInterface,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 cros_disks::kEnumerateAutoMountableDevices);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_->CallMethod(
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&CrosDisksClientImpl::OnEnumerateAutoMountableDevices,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   error_callback));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CrosDisksClient override.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void FormatDevice(const std::string& device_path,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& filesystem,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const FormatDeviceCallback& callback,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const ErrorCallback& error_callback) OVERRIDE {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(cros_disks::kCrosDisksInterface,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 cros_disks::kFormatDevice);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendString(device_path);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendString(filesystem);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Bind(&CrosDisksClientImpl::OnFormatDevice,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  weak_ptr_factory_.GetWeakPtr(),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  device_path,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  callback,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  error_callback));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CrosDisksClient override.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetDeviceProperties(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& device_path,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetDevicePropertiesCallback& callback,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ErrorCallback& error_callback) OVERRIDE {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(cros_disks::kCrosDisksInterface,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 cros_disks::kGetDeviceProperties);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendString(device_path);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_->CallMethod(&method_call,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Bind(&CrosDisksClientImpl::OnGetDeviceProperties,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  weak_ptr_factory_.GetWeakPtr(),
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  device_path,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  callback,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  error_callback));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CrosDisksClient override.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpConnections(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const MountEventHandler& mount_event_handler,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const MountCompletedHandler& mount_completed_handler) OVERRIDE {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const SignalEventTuple kSignalEventTuples[] = {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { cros_disks::kDeviceAdded, DEVICE_ADDED },
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { cros_disks::kDeviceScanned, DEVICE_SCANNED },
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { cros_disks::kDeviceRemoved, DEVICE_REMOVED },
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { cros_disks::kDiskAdded, DISK_ADDED },
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { cros_disks::kDiskChanged, DISK_CHANGED },
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { cros_disks::kDiskRemoved, DISK_REMOVED },
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { cros_disks::kFormattingFinished, FORMATTING_FINISHED },
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const size_t kNumSignalEventTuples = arraysize(kSignalEventTuples);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < kNumSignalEventTuples; ++i) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy_->ConnectToSignal(
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cros_disks::kCrosDisksInterface,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kSignalEventTuples[i].signal_name,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&CrosDisksClientImpl::OnMountEvent,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     weak_ptr_factory_.GetWeakPtr(),
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     kSignalEventTuples[i].event_type,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     mount_event_handler),
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&CrosDisksClientImpl::OnSignalConnected,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     weak_ptr_factory_.GetWeakPtr()));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_->ConnectToSignal(
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cros_disks::kCrosDisksInterface,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cros_disks::kMountCompleted,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&CrosDisksClientImpl::OnMountCompleted,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   mount_completed_handler),
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&CrosDisksClientImpl::OnSignalConnected,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A struct to contain a pair of signal name and mount event type.
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used by SetUpConnections.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SignalEventTuple {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *signal_name;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MountEventType event_type;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles the result of Mount and calls |callback| or |error_callback|.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnMount(const MountCallback& callback,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const ErrorCallback& error_callback,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               dbus::Response* response) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_callback.Run();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles the result of Unount and calls |callback| or |error_callback|.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUnmount(const std::string& device_path,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const UnmountCallback& callback,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const UnmountCallback& error_callback,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 dbus::Response* response) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_callback.Run(device_path);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(device_path);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles the result of EnumerateAutoMountableDevices and calls |callback| or
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |error_callback|.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnEnumerateAutoMountableDevices(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const EnumerateAutoMountableDevicesCallback& callback,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ErrorCallback& error_callback,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::Response* response) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_callback.Run();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(response);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> device_paths;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!reader.PopArrayOfStrings(&device_paths)) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Invalid response: " << response->ToString();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_callback.Run();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(device_paths);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles the result of FormatDevice and calls |callback| or
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |error_callback|.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnFormatDevice(const std::string& device_path,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const FormatDeviceCallback& callback,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const ErrorCallback& error_callback,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      dbus::Response* response) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_callback.Run();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(response);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success = false;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!reader.PopBool(&success)) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Invalid response: " << response->ToString();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_callback.Run();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(device_path, success);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles the result of GetDeviceProperties and calls |callback| or
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |error_callback|.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetDeviceProperties(const std::string& device_path,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const GetDevicePropertiesCallback& callback,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const ErrorCallback& error_callback,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             dbus::Response* response) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_callback.Run();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DiskInfo disk(device_path, response);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(disk);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles mount event signals and calls |handler|.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnMountEvent(MountEventType event_type,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    MountEventHandler handler,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    dbus::Signal* signal) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(signal);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string device;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!reader.PopString(&device)) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Invalid signal: " << signal->ToString();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler.Run(event_type, device);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles MountCompleted signal and calls |handler|.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnMountCompleted(MountCompletedHandler handler, dbus::Signal* signal) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(signal);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int error_code = 0;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string source_path;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int mount_type = 0;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string mount_path;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!reader.PopUint32(&error_code) ||
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !reader.PopString(&source_path) ||
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !reader.PopUint32(&mount_type) ||
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !reader.PopString(&mount_path)) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Invalid signal: " << signal->ToString();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler.Run(static_cast<MountError>(error_code), source_path,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                static_cast<MountType>(mount_type), mount_path);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles the result of signal connection setup.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSignalConnected(const std::string& interface,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const std::string& signal,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool succeeded) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG_IF(ERROR, !succeeded) << "Connect to " << interface << " " <<
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        signal << " failed.";
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::ObjectProxy* proxy_;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This should remain the last member so it'll be destroyed and
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalidate its weak pointers before any other members are destroyed.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<CrosDisksClientImpl> weak_ptr_factory_;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CrosDisksClientImpl);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A stub implementaion of CrosDisksClient.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CrosDisksClientStubImpl : public CrosDisksClient {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosDisksClientStubImpl() {}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~CrosDisksClientStubImpl() {}
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Mount(const std::string& source_path,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& source_format,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& mount_label,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     MountType type,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const MountCallback& callback,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const ErrorCallback& error_callback) OVERRIDE {}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Unmount(const std::string& device_path,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       UnmountOptions options,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const UnmountCallback& callback,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const UnmountCallback& error_callback) OVERRIDE {}
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EnumerateAutoMountableDevices(
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const EnumerateAutoMountableDevicesCallback& callback,
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ErrorCallback& error_callback) OVERRIDE {}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void FormatDevice(const std::string& device_path,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& filesystem,
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const FormatDeviceCallback& callback,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const ErrorCallback& error_callback) OVERRIDE {}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetDeviceProperties(
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& device_path,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetDevicePropertiesCallback& callback,
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ErrorCallback& error_callback) OVERRIDE {}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpConnections(
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const MountEventHandler& mount_event_handler,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const MountCompletedHandler& mount_completed_handler) OVERRIDE {}
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CrosDisksClientStubImpl);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DiskInfo
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DiskInfo::DiskInfo(const std::string& device_path, dbus::Response* response)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : device_path_(device_path),
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_drive_(false),
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_media_(false),
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      on_boot_device_(false),
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_type_(DEVICE_TYPE_UNKNOWN),
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      total_size_in_bytes_(0),
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_read_only_(false),
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_hidden_(true) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeFromResponse(response);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DiskInfo::~DiskInfo() {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initializes |this| from |response| given by the cros-disks service.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Below is an example of |response|'s raw message (long string is ellipsized).
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// message_type: MESSAGE_METHOD_RETURN
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destination: :1.8
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sender: :1.16
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// signature: a{sv}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// serial: 96
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reply_serial: 267
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// array [
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DeviceFile"
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       string "/dev/sdb"
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DeviceIsDrive"
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       bool true
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DeviceIsMediaAvailable"
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       bool true
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DeviceIsMounted"
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       bool false
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DeviceIsOnBootDevice"
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       bool false
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DeviceIsReadOnly"
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       bool false
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DeviceIsVirtual"
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       bool false
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DeviceMediaType"
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       uint32 1
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DeviceMountPaths"
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       array [
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       ]
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DevicePresentationHide"
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       bool true
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DeviceSize"
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       uint64 7998537728
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DriveIsRotational"
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       bool false
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "VendorId"
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       string "18d1"
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "VendorName"
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       string "Google Inc."
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "ProductId"
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       string "4e11"
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "ProductName"
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       string "Nexus One"
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "DriveModel"
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       string "TransMemory"
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "IdLabel"
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       string ""
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "IdUuid"
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       string ""
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   dict entry {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     string "NativePath"
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     variant       string "/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-4/...
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ]
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskInfo::InitializeFromResponse(dbus::Response* response) {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageReader response_reader(response);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageReader array_reader(response);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!response_reader.PopArray(&array_reader)) {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Invalid response: " << response->ToString();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(satorux): Rework this code using Protocol Buffers. crosbug.com/22626
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, dbus::MessageReader*> PropertiesMap;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PropertiesMap properties;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLValueDeleter<PropertiesMap> properties_value_deleter(&properties);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (array_reader.HasMoreData()) {
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader* value_reader = new dbus::MessageReader(response);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader dict_entry_reader(response);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!array_reader.PopDictEntry(&dict_entry_reader) ||
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !dict_entry_reader.PopString(&key) ||
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !dict_entry_reader.PopVariant(value_reader)) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Invalid response: " << response->ToString();
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    properties[key] = value_reader;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopBool(properties[cros_disks::kDeviceIsDrive], &is_drive_);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopBool(properties[cros_disks::kDeviceIsReadOnly], &is_read_only_);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopBool(properties[cros_disks::kDevicePresentationHide], &is_hidden_);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopBool(properties[cros_disks::kDeviceIsMediaAvailable], &has_media_);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopBool(properties[cros_disks::kDeviceIsOnBootDevice],
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &on_boot_device_);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopString(properties[cros_disks::kNativePath], &system_path_);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopString(properties[cros_disks::kDeviceFile], &file_path_);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopString(properties[cros_disks::kVendorId], &vendor_id_);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopString(properties[cros_disks::kVendorName], &vendor_name_);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopString(properties[cros_disks::kProductId], &product_id_);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopString(properties[cros_disks::kProductName], &product_name_);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopString(properties[cros_disks::kDriveModel], &drive_model_);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopString(properties[cros_disks::kIdLabel], &label_);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopString(properties[cros_disks::kIdUuid], &uuid_);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePopUint64(properties[cros_disks::kDeviceSize], &total_size_in_bytes_);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 media_type_uint32 = 0;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (MaybePopUint32(properties[cros_disks::kDeviceMediaType],
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     &media_type_uint32)) {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    device_type_ = DeviceMediaTypeToDeviceType(media_type_uint32);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> mount_paths;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (MaybePopArrayOfStrings(properties[cros_disks::kDeviceMountPaths],
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             &mount_paths) && !mount_paths.empty())
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mount_path_ = mount_paths[0];
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CrosDisksClient
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CrosDisksClient::CrosDisksClient() {}
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CrosDisksClient::~CrosDisksClient() {}
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CrosDisksClient* CrosDisksClient::Create(DBusClientImplementationType type,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         dbus::Bus* bus) {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new CrosDisksClientImpl(bus);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new CrosDisksClientStubImpl();
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
614