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" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/task_runner_util.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/worker_pool.h" 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/values.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/bus.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_proxy.h" 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "dbus/values_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kDefaultMountOptions[] = { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rw", 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "nodev", 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "noexec", 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "nosuid", 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kDefaultUnmountOptions[] = { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "force", 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLazyUnmountOption[] = "lazy"; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMountLabelOption[] = "mountlabel"; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks if retrieved media type is in boundaries of DeviceMediaType. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsValidMediaType(uint32 type) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return type < static_cast<uint32>(cros_disks::DEVICE_MEDIA_NUM_VALUES); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Translates enum used in cros-disks to enum used in Chrome. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that we could just do static_cast, but this is less sensitive to 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// changes in cros-disks. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceType DeviceMediaTypeToDeviceType(uint32 media_type_uint32) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsValidMediaType(media_type_uint32)) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DEVICE_TYPE_UNKNOWN; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_disks::DeviceMediaType media_type = 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_disks::DeviceMediaType(media_type_uint32); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (media_type) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case(cros_disks::DEVICE_MEDIA_UNKNOWN): 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DEVICE_TYPE_UNKNOWN; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case(cros_disks::DEVICE_MEDIA_USB): 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DEVICE_TYPE_USB; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case(cros_disks::DEVICE_MEDIA_SD): 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DEVICE_TYPE_SD; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case(cros_disks::DEVICE_MEDIA_OPTICAL_DISC): 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DEVICE_TYPE_OPTICAL_DISC; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case(cros_disks::DEVICE_MEDIA_MOBILE): 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DEVICE_TYPE_MOBILE; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case(cros_disks::DEVICE_MEDIA_DVD): 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DEVICE_TYPE_DVD; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DEVICE_TYPE_UNKNOWN; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ReadMountEntryFromDbus(dbus::MessageReader* reader, MountEntry* entry) { 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32 error_code = 0; 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string source_path; 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32 mount_type = 0; 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string mount_path; 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!reader->PopUint32(&error_code) || 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !reader->PopString(&source_path) || 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !reader->PopUint32(&mount_type) || 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !reader->PopString(&mount_path)) { 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *entry = MountEntry(static_cast<MountError>(error_code), source_path, 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<MountType>(mount_type), mount_path); 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The CrosDisksClient implementation. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CrosDisksClientImpl : public CrosDisksClient { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 98424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) CrosDisksClientImpl() : proxy_(NULL), weak_ptr_factory_(this) {} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CrosDisksClient override. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Mount(const std::string& source_path, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source_format, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mount_label, 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& callback, 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& error_callback) OVERRIDE { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_disks::kMount); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&method_call); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(source_path); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(source_format); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> mount_options(kDefaultMountOptions, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDefaultMountOptions + 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kDefaultMountOptions)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mount_label.empty()) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mount_label_option = base::StringPrintf("%s=%s", 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMountLabelOption, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_label.c_str()); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_options.push_back(mount_label_option); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendArrayOfStrings(mount_options); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnMount, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback)); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CrosDisksClient override. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Unmount(const std::string& device_path, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnmountOptions options, 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Closure& callback, 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Closure& error_callback) OVERRIDE { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_disks::kUnmount); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&method_call); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(device_path); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> unmount_options( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDefaultUnmountOptions, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDefaultUnmountOptions + arraysize(kDefaultUnmountOptions)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (options == UNMOUNT_OPTIONS_LAZY) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unmount_options.push_back(kLazyUnmountOption); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendArrayOfStrings(unmount_options); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnUnmount, 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 EnumerateAutoMountableDevices( 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumerateAutoMountableDevicesCallback& callback, 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& error_callback) OVERRIDE { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_disks::kEnumerateAutoMountableDevices); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_->CallMethod( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnEnumerateAutoMountableDevices, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CrosDisksClient override. 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void EnumerateMountEntries( 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const EnumerateMountEntriesCallback& callback, 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Closure& error_callback) OVERRIDE { 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cros_disks::kEnumerateMountEntries); 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) proxy_->CallMethod( 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnEnumerateMountEntries, 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback, 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) error_callback)); 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // CrosDisksClient override. 181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void Format(const std::string& device_path, 182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& filesystem, 183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::Closure& callback, 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::Closure& error_callback) OVERRIDE { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cros_disks::kFormat); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&method_call); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(device_path); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(filesystem); 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // No format option is currently specified, but we can later use this 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // argument to specify options for the format operation. 192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<std::string> format_options; 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) writer.AppendArrayOfStrings(format_options); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnFormat, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback)); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CrosDisksClient override. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetDeviceProperties( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_path, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GetDevicePropertiesCallback& callback, 2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& error_callback) OVERRIDE { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_disks::kGetDeviceProperties); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&method_call); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(device_path); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_->CallMethod(&method_call, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnGetDeviceProperties, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_path, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CrosDisksClient override. 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetMountEventHandler( 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const MountEventHandler& mount_event_handler) OVERRIDE { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const SignalEventTuple kSignalEventTuples[] = { 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { cros_disks::kDeviceAdded, CROS_DISKS_DEVICE_ADDED }, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { cros_disks::kDeviceScanned, CROS_DISKS_DEVICE_SCANNED }, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { cros_disks::kDeviceRemoved, CROS_DISKS_DEVICE_REMOVED }, 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { cros_disks::kDiskAdded, CROS_DISKS_DISK_ADDED }, 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { cros_disks::kDiskChanged, CROS_DISKS_DISK_CHANGED }, 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { cros_disks::kDiskRemoved, CROS_DISKS_DISK_REMOVED }, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kNumSignalEventTuples = arraysize(kSignalEventTuples); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kNumSignalEventTuples; ++i) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_->ConnectToSignal( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_disks::kCrosDisksInterface, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSignalEventTuples[i].signal_name, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnMountEvent, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSignalEventTuples[i].event_type, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_event_handler), 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnSignalConnected, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // CrosDisksClient override. 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetMountCompletedHandler( 247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const MountCompletedHandler& mount_completed_handler) OVERRIDE { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_->ConnectToSignal( 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_disks::kCrosDisksInterface, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_disks::kMountCompleted, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnMountCompleted, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mount_completed_handler), 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnSignalConnected, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // CrosDisksClient override. 259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetFormatCompletedHandler( 260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const FormatCompletedHandler& format_completed_handler) OVERRIDE { 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) proxy_->ConnectToSignal( 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cros_disks::kCrosDisksInterface, 263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cros_disks::kFormatCompleted, 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnFormatCompleted, 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) format_completed_handler), 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&CrosDisksClientImpl::OnSignalConnected, 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 271424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected: 272424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void Init(dbus::Bus* bus) OVERRIDE { 273424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) proxy_ = bus->GetObjectProxy( 274424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) cros_disks::kCrosDisksServiceName, 275424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) dbus::ObjectPath(cros_disks::kCrosDisksServicePath)); 276424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 277424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A struct to contain a pair of signal name and mount event type. 280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Used by SetMountEventHandler. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SignalEventTuple { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *signal_name; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountEventType event_type; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles the result of Mount and calls |callback| or |error_callback|. 2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void OnMount(const base::Closure& callback, 2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& error_callback, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::Response* response) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!response) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback.Run(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Handles the result of Unmount and calls |callback| or |error_callback|. 298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnUnmount(const base::Closure& callback, 299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Closure& error_callback, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::Response* response) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!response) { 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch error_callback.Run(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 306d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Temporarly allow Unmount method to report failure both by setting dbus 307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // error (in which case response is not set) and by returning mount error 308d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // different from MOUNT_ERROR_NONE. This is done so we can change Unmount 309d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // method to return mount error (http://crbug.com/288974) without breaking 310d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Chrome. 311d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // TODO(tbarzic): When Unmount implementation is changed on cros disks side, 312d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // make this fail if reader is not able to read the error code value from 313d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the response. 314d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) dbus::MessageReader reader(response); 315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uint32 error_code = 0; 316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (reader.PopUint32(&error_code) && 317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static_cast<MountError>(error_code) != MOUNT_ERROR_NONE) { 318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) error_callback.Run(); 319d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return; 320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 321d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback.Run(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles the result of EnumerateAutoMountableDevices and calls |callback| or 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |error_callback|. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnEnumerateAutoMountableDevices( 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumerateAutoMountableDevicesCallback& callback, 3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& error_callback, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::Response* response) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!response) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback.Run(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageReader reader(response); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> device_paths; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!reader.PopArrayOfStrings(&device_paths)) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Invalid response: " << response->ToString(); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback.Run(); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(device_paths); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Handles the result of EnumerateMountEntries and calls |callback| or 346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |error_callback|. 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnEnumerateMountEntries( 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const EnumerateMountEntriesCallback& callback, 349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Closure& error_callback, 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dbus::Response* response) { 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!response) { 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) error_callback.Run(); 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dbus::MessageReader reader(response); 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dbus::MessageReader array_reader(NULL); 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!reader.PopArray(&array_reader)) { 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LOG(ERROR) << "Invalid response: " << response->ToString(); 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) error_callback.Run(); 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<MountEntry> entries; 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) while (array_reader.HasMoreData()) { 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MountEntry entry; 367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dbus::MessageReader sub_reader(NULL); 368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!array_reader.PopStruct(&sub_reader) || 369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !ReadMountEntryFromDbus(&sub_reader, &entry)) { 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LOG(ERROR) << "Invalid response: " << response->ToString(); 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) error_callback.Run(); 372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) entries.push_back(entry); 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(entries); 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Handles the result of Format and calls |callback| or |error_callback|. 380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void OnFormat(const base::Closure& callback, 381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::Closure& error_callback, 382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dbus::Response* response) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!response) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback.Run(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) callback.Run(); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles the result of GetDeviceProperties and calls |callback| or 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |error_callback|. 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGetDeviceProperties(const std::string& device_path, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GetDevicePropertiesCallback& callback, 3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& error_callback, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::Response* response) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!response) { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback.Run(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DiskInfo disk(device_path, response); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(disk); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles mount event signals and calls |handler|. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnMountEvent(MountEventType event_type, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MountEventHandler handler, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::Signal* signal) { 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageReader reader(signal); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string device; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!reader.PopString(&device)) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Invalid signal: " << signal->ToString(); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler.Run(event_type, device); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles MountCompleted signal and calls |handler|. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnMountCompleted(MountCompletedHandler handler, dbus::Signal* signal) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageReader reader(signal); 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MountEntry entry; 421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!ReadMountEntryFromDbus(&reader, &entry)) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Invalid signal: " << signal->ToString(); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler.Run(entry); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Handles FormatCompleted signal and calls |handler|. 429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void OnFormatCompleted(FormatCompletedHandler handler, dbus::Signal* signal) { 430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dbus::MessageReader reader(signal); 431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uint32 error_code = 0; 432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string device_path; 433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!reader.PopUint32(&error_code) || !reader.PopString(&device_path)) { 434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Invalid signal: " << signal->ToString(); 435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler.Run(static_cast<FormatError>(error_code), device_path); 438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles the result of signal connection setup. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSignalConnected(const std::string& interface, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& signal, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG_IF(ERROR, !succeeded) << "Connect to " << interface << " " << 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal << " failed."; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectProxy* proxy_; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This should remain the last member so it'll be destroyed and 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invalidate its weak pointers before any other members are destroyed. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<CrosDisksClientImpl> weak_ptr_factory_; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CrosDisksClientImpl); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A stub implementaion of CrosDisksClient. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CrosDisksClientStubImpl : public CrosDisksClient { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CrosDisksClientStubImpl() 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : weak_ptr_factory_(this) {} 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CrosDisksClientStubImpl() {} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CrosDisksClient overrides: 466424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void Init(dbus::Bus* bus) OVERRIDE {} 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Mount(const std::string& source_path, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source_format, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mount_label, 4707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& callback, 4717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& error_callback) OVERRIDE { 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This stub implementation only accepts archive mount requests. 4737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const MountType type = MOUNT_TYPE_ARCHIVE; 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath mounted_path = GetArchiveMountPoint().Append( 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(mount_label)); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Already mounted path. 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mounted_to_source_path_map_.count(mounted_path.value()) != 0) { 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishMount(MOUNT_ERROR_PATH_ALREADY_MOUNTED, source_path, type, 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string(), callback); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Perform fake mount. 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::PostTaskAndReplyWithResult( 4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::WorkerPool::GetTaskRunner(true /* task_is_slow */).get(), 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&PerformFakeMount, source_path, mounted_path), 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CrosDisksClientStubImpl::ContinueMount, 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source_path, 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type, 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mounted_path)); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Unmount(const std::string& device_path, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnmountOptions options, 500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Closure& callback, 501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Closure& error_callback) OVERRIDE { 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Not mounted. 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mounted_to_source_path_map_.count(device_path) == 0) { 504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoopProxy::current()->PostTask(FROM_HERE, error_callback); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mounted_to_source_path_map_.erase(device_path); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove the directory created in Mount(). 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WorkerPool::PostTaskAndReply( 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(base::IgnoreResult(&base::DeleteFile), 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(device_path), 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true /* recursive */), 516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback, 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true /* task_is_slow */); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EnumerateAutoMountableDevices( 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumerateAutoMountableDevicesCallback& callback, 5227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& error_callback) OVERRIDE { 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> device_paths; 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(callback, device_paths)); 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void EnumerateMountEntries( 529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const EnumerateMountEntriesCallback& callback, 530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Closure& error_callback) OVERRIDE { 531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<MountEntry> entries; 532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, base::Bind(callback, entries)); 534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void Format(const std::string& device_path, 537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& filesystem, 538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::Closure& callback, 539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::Closure& error_callback) OVERRIDE { 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask(FROM_HERE, error_callback); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetDeviceProperties( 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_path, 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GetDevicePropertiesCallback& callback, 5467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& error_callback) OVERRIDE { 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask(FROM_HERE, error_callback); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetMountEventHandler( 551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const MountEventHandler& mount_event_handler) OVERRIDE { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mount_event_handler_ = mount_event_handler; 553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetMountCompletedHandler( 556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const MountCompletedHandler& mount_completed_handler) OVERRIDE { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mount_completed_handler_ = mount_completed_handler; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetFormatCompletedHandler( 561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const FormatCompletedHandler& format_completed_handler) OVERRIDE { 562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) format_completed_handler_ = format_completed_handler; 563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Performs file actions for Mount(). 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static MountError PerformFakeMount(const std::string& source_path, 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& mounted_path) { 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the source path exists. 5707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(base::FilePath::FromUTF8Unsafe(source_path))) { 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DLOG(ERROR) << "Source does not exist at " << source_path; 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MOUNT_ERROR_INVALID_PATH; 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Just create an empty directory and shows it as the mounted directory. 576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!base::CreateDirectory(mounted_path)) { 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DLOG(ERROR) << "Failed to create directory at " << mounted_path.value(); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MOUNT_ERROR_DIRECTORY_CREATION_FAILED; 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Put a dummy file. 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath dummy_file_path = 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mounted_path.Append("SUCCESSFULLY_PERFORMED_FAKE_MOUNT.txt"); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string dummy_file_content = "This is a dummy file."; 585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const int write_result = base::WriteFile( 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dummy_file_path, dummy_file_content.data(), dummy_file_content.size()); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (write_result != static_cast<int>(dummy_file_content.size())) { 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DLOG(ERROR) << "Failed to put a dummy file at " 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << dummy_file_path.value(); 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MOUNT_ERROR_MOUNT_PROGRAM_FAILED; 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MOUNT_ERROR_NONE; 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Part of Mount() implementation. 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ContinueMount(const std::string& source_path, 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MountType type, 5997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& callback, 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& mounted_path, 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MountError mount_error) { 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mount_error != MOUNT_ERROR_NONE) { 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishMount(mount_error, source_path, type, std::string(), callback); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mounted_to_source_path_map_[mounted_path.value()] = source_path; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishMount(MOUNT_ERROR_NONE, source_path, type, 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mounted_path.AsUTF8Unsafe(), callback); 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Runs |callback| and sends MountCompleted signal. 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Part of Mount() implementation. 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void FinishMount(MountError error, 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& source_path, 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MountType type, 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& mounted_path, 6177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& callback) { 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask(FROM_HERE, callback); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!mount_completed_handler_.is_null()) { 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(mount_completed_handler_, 623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MountEntry(error, source_path, type, mounted_path))); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Mounted path to source path map. 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, std::string> mounted_to_source_path_map_; 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MountEventHandler mount_event_handler_; 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MountCompletedHandler mount_completed_handler_; 632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FormatCompletedHandler format_completed_handler_; 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtrFactory<CrosDisksClientStubImpl> weak_ptr_factory_; 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CrosDisksClientStubImpl); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DiskInfo 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DiskInfo::DiskInfo(const std::string& device_path, dbus::Response* response) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : device_path_(device_path), 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_drive_(false), 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_media_(false), 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_boot_device_(false), 6495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) on_removable_device_(false), 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_type_(DEVICE_TYPE_UNKNOWN), 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_size_in_bytes_(0), 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_read_only_(false), 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_hidden_(true) { 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeFromResponse(response); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DiskInfo::~DiskInfo() { 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initializes |this| from |response| given by the cros-disks service. 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Below is an example of |response|'s raw message (long string is ellipsized). 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// message_type: MESSAGE_METHOD_RETURN 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destination: :1.8 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sender: :1.16 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// signature: a{sv} 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// serial: 96 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reply_serial: 267 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// array [ 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DeviceFile" 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant string "/dev/sdb" 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DeviceIsDrive" 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant bool true 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DeviceIsMediaAvailable" 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant bool true 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DeviceIsMounted" 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant bool false 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DeviceIsOnBootDevice" 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant bool false 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 6935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// string "DeviceIsOnRemovableDevice" 6945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// variant bool true 6955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// } 6965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// dict entry { 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DeviceIsReadOnly" 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant bool false 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DeviceIsVirtual" 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant bool false 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DeviceMediaType" 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant uint32 1 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DeviceMountPaths" 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant array [ 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ] 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DevicePresentationHide" 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant bool true 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DeviceSize" 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant uint64 7998537728 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DriveIsRotational" 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant bool false 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "VendorId" 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant string "18d1" 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "VendorName" 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant string "Google Inc." 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "ProductId" 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant string "4e11" 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "ProductName" 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant string "Nexus One" 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "DriveModel" 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant string "TransMemory" 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "IdLabel" 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant string "" 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "IdUuid" 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant string "" 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dict entry { 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string "NativePath" 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variant string "/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-4/... 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ] 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskInfo::InitializeFromResponse(dbus::Response* response) { 7597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dbus::MessageReader reader(response); 7607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<base::Value> value(dbus::PopDataAsValue(&reader)); 7617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DictionaryValue* properties = NULL; 7627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!value || !value->GetAsDictionary(&properties)) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetBooleanWithoutPathExpansion( 7667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kDeviceIsDrive, &is_drive_); 7677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetBooleanWithoutPathExpansion( 7687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kDeviceIsReadOnly, &is_read_only_); 7697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetBooleanWithoutPathExpansion( 7707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kDevicePresentationHide, &is_hidden_); 7717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetBooleanWithoutPathExpansion( 7727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kDeviceIsMediaAvailable, &has_media_); 7737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetBooleanWithoutPathExpansion( 7747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kDeviceIsOnBootDevice, &on_boot_device_); 7755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) properties->GetBooleanWithoutPathExpansion( 7765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cros_disks::kDeviceIsOnRemovableDevice, &on_removable_device_); 7777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetStringWithoutPathExpansion( 7787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kNativePath, &system_path_); 7797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetStringWithoutPathExpansion( 7807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kDeviceFile, &file_path_); 7817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetStringWithoutPathExpansion(cros_disks::kVendorId, &vendor_id_); 7827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetStringWithoutPathExpansion( 7837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kVendorName, &vendor_name_); 7847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetStringWithoutPathExpansion( 7857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kProductId, &product_id_); 7867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetStringWithoutPathExpansion( 7877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kProductName, &product_name_); 7887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetStringWithoutPathExpansion( 7897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cros_disks::kDriveModel, &drive_model_); 7907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetStringWithoutPathExpansion(cros_disks::kIdLabel, &label_); 7917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch properties->GetStringWithoutPathExpansion(cros_disks::kIdUuid, &uuid_); 7927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // dbus::PopDataAsValue() pops uint64 as double. 7947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The top 11 bits of uint64 are dropped by the use of double. But, this works 7957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // unless the size exceeds 8 PB. 7967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch double device_size_double = 0; 7977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (properties->GetDoubleWithoutPathExpansion(cros_disks::kDeviceSize, 7987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &device_size_double)) 7997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch total_size_in_bytes_ = device_size_double; 8007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // dbus::PopDataAsValue() pops uint32 as double. 8027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch double media_type_double = 0; 8037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (properties->GetDoubleWithoutPathExpansion(cros_disks::kDeviceMediaType, 8047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &media_type_double)) 8057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch device_type_ = DeviceMediaTypeToDeviceType(media_type_double); 8067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::ListValue* mount_paths = NULL; 8087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (properties->GetListWithoutPathExpansion(cros_disks::kDeviceMountPaths, 8097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &mount_paths)) 8107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mount_paths->GetString(0, &mount_path_); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CrosDisksClient 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CrosDisksClient::CrosDisksClient() {} 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CrosDisksClient::~CrosDisksClient() {} 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 821424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CrosDisksClient* CrosDisksClient::Create(DBusClientImplementationType type) { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) 823424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return new CrosDisksClientImpl(); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new CrosDisksClientStubImpl(); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath CrosDisksClient::GetArchiveMountPoint() { 8304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return base::FilePath(base::SysInfo::IsRunningOnChromeOS() ? 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("/media/archive") : 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("/tmp/chromeos/media/archive")); 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath CrosDisksClient::GetRemovableDiskMountPoint() { 8374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return base::FilePath(base::SysInfo::IsRunningOnChromeOS() ? 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("/media/removable") : 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("/tmp/chromeos/media/removable")); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 843