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