Ryan Cairns | ea6505f | 2011-04-10 19:54:53 -0700 | [diff] [blame] | 1 | // Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Ben Chan | 5ccd9fe | 2013-11-13 18:28:27 -0800 | [diff] [blame] | 5 | #include "cros-disks/cros_disks_server.h" |
Ben Chan | 6e72692 | 2011-06-28 15:54:32 -0700 | [diff] [blame] | 6 | |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 7 | #include <utility> |
| 8 | |
Qijiang Fan | 713061e | 2021-03-08 15:45:12 +0900 | [diff] [blame] | 9 | #include <base/check.h> |
Ben Chan | f51ff00 | 2011-04-25 12:41:57 -0700 | [diff] [blame] | 10 | #include <base/logging.h> |
Ben Chan | 6d0b272 | 2011-11-18 08:24:14 -0800 | [diff] [blame] | 11 | #include <chromeos/dbus/service_constants.h> |
Ryan Cairns | ea6505f | 2011-04-10 19:54:53 -0700 | [diff] [blame] | 12 | |
Ben Chan | 5ccd9fe | 2013-11-13 18:28:27 -0800 | [diff] [blame] | 13 | #include "cros-disks/device_event.h" |
Ben Chan | bdc3974 | 2011-05-11 17:51:26 -0700 | [diff] [blame] | 14 | #include "cros-disks/disk.h" |
Ben Chan | 5ccd9fe | 2013-11-13 18:28:27 -0800 | [diff] [blame] | 15 | #include "cros-disks/disk_manager.h" |
Sergei Datsenko | 1682189 | 2019-04-05 11:26:38 +1100 | [diff] [blame] | 16 | #include "cros-disks/disk_monitor.h" |
François Degros | bf7bb59 | 2019-07-12 09:49:52 +1000 | [diff] [blame] | 17 | #include "cros-disks/error_logger.h" |
Ben Chan | 5ccd9fe | 2013-11-13 18:28:27 -0800 | [diff] [blame] | 18 | #include "cros-disks/format_manager.h" |
Omid Tourzan | 7943a9d | 2020-08-31 13:54:36 +1000 | [diff] [blame] | 19 | #include "cros-disks/partition_manager.h" |
Ben Chan | 8dcede8 | 2011-07-25 20:56:13 -0700 | [diff] [blame] | 20 | #include "cros-disks/platform.h" |
François Degros | 8b4e31e | 2019-07-29 11:39:19 +1000 | [diff] [blame] | 21 | #include "cros-disks/quote.h" |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 22 | #include "cros-disks/rename_manager.h" |
Szymon Sidor | 2733b51 | 2011-06-30 18:00:51 -0700 | [diff] [blame] | 23 | |
Ben Chan | 460439f | 2011-09-13 09:16:28 -0700 | [diff] [blame] | 24 | namespace cros_disks { |
Ryan Cairns | ea6505f | 2011-04-10 19:54:53 -0700 | [diff] [blame] | 25 | |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 26 | CrosDisksServer::CrosDisksServer(scoped_refptr<dbus::Bus> bus, |
Ben Chan | 8dcede8 | 2011-07-25 20:56:13 -0700 | [diff] [blame] | 27 | Platform* platform, |
Sergei Datsenko | 1682189 | 2019-04-05 11:26:38 +1100 | [diff] [blame] | 28 | DiskMonitor* disk_monitor, |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 29 | FormatManager* format_manager, |
Omid Tourzan | 7943a9d | 2020-08-31 13:54:36 +1000 | [diff] [blame] | 30 | PartitionManager* partition_manager, |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 31 | RenameManager* rename_manager) |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 32 | : org::chromium::CrosDisksAdaptor(this), |
| 33 | dbus_object_(nullptr, bus, dbus::ObjectPath(kCrosDisksServicePath)), |
Ben Chan | 8dcede8 | 2011-07-25 20:56:13 -0700 | [diff] [blame] | 34 | platform_(platform), |
Sergei Datsenko | 1682189 | 2019-04-05 11:26:38 +1100 | [diff] [blame] | 35 | disk_monitor_(disk_monitor), |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 36 | format_manager_(format_manager), |
Omid Tourzan | 7943a9d | 2020-08-31 13:54:36 +1000 | [diff] [blame] | 37 | partition_manager_(partition_manager), |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 38 | rename_manager_(rename_manager) { |
Ben Chan | 8dcede8 | 2011-07-25 20:56:13 -0700 | [diff] [blame] | 39 | CHECK(platform_) << "Invalid platform object"; |
Sergei Datsenko | 1682189 | 2019-04-05 11:26:38 +1100 | [diff] [blame] | 40 | CHECK(disk_monitor_) << "Invalid disk monitor object"; |
Ben Chan | b092d75 | 2011-07-13 11:44:38 -0700 | [diff] [blame] | 41 | CHECK(format_manager_) << "Invalid format manager object"; |
Omid Tourzan | 7943a9d | 2020-08-31 13:54:36 +1000 | [diff] [blame] | 42 | CHECK(partition_manager_) << "Invalid partition manager object"; |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 43 | CHECK(rename_manager_) << "Invalid rename manager object"; |
Szymon Sidor | 2733b51 | 2011-06-30 18:00:51 -0700 | [diff] [blame] | 44 | |
Ben Chan | c1e766c | 2011-11-21 12:56:59 -0800 | [diff] [blame] | 45 | format_manager_->set_observer(this); |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 46 | rename_manager_->set_observer(this); |
Ben Chan | f51ff00 | 2011-04-25 12:41:57 -0700 | [diff] [blame] | 47 | } |
Ryan Cairns | ea6505f | 2011-04-10 19:54:53 -0700 | [diff] [blame] | 48 | |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 49 | void CrosDisksServer::RegisterAsync( |
| 50 | const brillo::dbus_utils::AsyncEventSequencer::CompletionAction& cb) { |
| 51 | RegisterWithDBusObject(&dbus_object_); |
| 52 | dbus_object_.RegisterAsync(cb); |
| 53 | } |
| 54 | |
Ben Chan | f47fc35 | 2013-05-03 11:28:57 -0700 | [diff] [blame] | 55 | void CrosDisksServer::RegisterMountManager(MountManager* mount_manager) { |
| 56 | CHECK(mount_manager) << "Invalid mount manager object"; |
| 57 | mount_managers_.push_back(mount_manager); |
| 58 | } |
| 59 | |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 60 | void CrosDisksServer::Format(const std::string& path, |
| 61 | const std::string& filesystem_type, |
| 62 | const std::vector<std::string>& options) { |
Ben Chan | c833a52 | 2012-09-27 23:47:00 -0700 | [diff] [blame] | 63 | FormatErrorType error_type = FORMAT_ERROR_NONE; |
| 64 | Disk disk; |
Sergei Datsenko | 1682189 | 2019-04-05 11:26:38 +1100 | [diff] [blame] | 65 | if (!disk_monitor_->GetDiskByDevicePath(base::FilePath(path), &disk)) { |
Ben Chan | c833a52 | 2012-09-27 23:47:00 -0700 | [diff] [blame] | 66 | error_type = FORMAT_ERROR_INVALID_DEVICE_PATH; |
Ben Chan | c833a52 | 2012-09-27 23:47:00 -0700 | [diff] [blame] | 67 | } else { |
Ben Chan | ff92fa3 | 2017-10-17 16:17:15 -0700 | [diff] [blame] | 68 | error_type = format_manager_->StartFormatting(path, disk.device_file, |
Austin Tankiang | e1a317c | 2019-06-12 18:02:20 +1000 | [diff] [blame] | 69 | filesystem_type, options); |
Ben Chan | c833a52 | 2012-09-27 23:47:00 -0700 | [diff] [blame] | 70 | } |
| 71 | |
Ben Chan | c1e766c | 2011-11-21 12:56:59 -0800 | [diff] [blame] | 72 | if (error_type != FORMAT_ERROR_NONE) { |
François Degros | 8b4e31e | 2019-07-29 11:39:19 +1000 | [diff] [blame] | 73 | LOG(ERROR) << "Could not format device " << quote(path) << " as filesystem " |
| 74 | << quote(filesystem_type) << ": " << error_type; |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 75 | SendFormatCompletedSignal(error_type, path); |
Szymon Sidor | 2733b51 | 2011-06-30 18:00:51 -0700 | [diff] [blame] | 76 | } |
Szymon Sidor | 2733b51 | 2011-06-30 18:00:51 -0700 | [diff] [blame] | 77 | } |
| 78 | |
Omid Tourzan | 7943a9d | 2020-08-31 13:54:36 +1000 | [diff] [blame] | 79 | void CrosDisksServer::SinglePartitionFormat( |
| 80 | std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<uint32_t>> response, |
| 81 | const std::string& path) { |
| 82 | Disk disk; |
| 83 | |
| 84 | if (!disk_monitor_->GetDiskByDevicePath(base::FilePath(path), &disk)) { |
| 85 | LOG(ERROR) << "Invalid device path: " << quote(path) |
| 86 | << " error code: " << PARTITION_ERROR_INVALID_DEVICE_PATH; |
| 87 | response->Return(PARTITION_ERROR_INVALID_DEVICE_PATH); |
| 88 | } else if (disk.is_on_boot_device || !disk.is_drive || disk.is_read_only) { |
| 89 | LOG(ERROR) << "Device not allowed: " << quote(path) |
| 90 | << " error code: " << PARTITION_ERROR_DEVICE_NOT_ALLOWED; |
| 91 | response->Return(PARTITION_ERROR_DEVICE_NOT_ALLOWED); |
| 92 | } else { |
| 93 | partition_manager_->StartSinglePartitionFormat( |
| 94 | base::FilePath(disk.device_file), |
| 95 | base::BindOnce(&CrosDisksServer::OnPartitionCompleted, |
| 96 | base::Unretained(this), std::move(response))); |
| 97 | } |
| 98 | } |
| 99 | |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 100 | void CrosDisksServer::Rename(const std::string& path, |
| 101 | const std::string& volume_name) { |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 102 | RenameErrorType error_type = RENAME_ERROR_NONE; |
| 103 | Disk disk; |
Sergei Datsenko | 1682189 | 2019-04-05 11:26:38 +1100 | [diff] [blame] | 104 | if (!disk_monitor_->GetDiskByDevicePath(base::FilePath(path), &disk)) { |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 105 | error_type = RENAME_ERROR_INVALID_DEVICE_PATH; |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 106 | } else { |
Ben Chan | de0e3f6 | 2017-09-26 06:28:39 -0700 | [diff] [blame] | 107 | error_type = rename_manager_->StartRenaming( |
Ben Chan | ff92fa3 | 2017-10-17 16:17:15 -0700 | [diff] [blame] | 108 | path, disk.device_file, volume_name, disk.filesystem_type); |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 109 | } |
| 110 | |
| 111 | if (error_type != RENAME_ERROR_NONE) { |
François Degros | 8b4e31e | 2019-07-29 11:39:19 +1000 | [diff] [blame] | 112 | LOG(ERROR) << "Could not rename device " << quote(path) << " as " |
| 113 | << quote(volume_name) << ": " << error_type; |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 114 | SendRenameCompletedSignal(error_type, path); |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 115 | } |
| 116 | } |
| 117 | |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 118 | MountManager* CrosDisksServer::FindMounter( |
| 119 | const std::string& source_path) const { |
Tatsuhisa Yamaguchi | b670bd1 | 2016-09-28 23:06:44 +0900 | [diff] [blame] | 120 | for (const auto& manager : mount_managers_) { |
| 121 | if (manager->CanMount(source_path)) { |
| 122 | return manager; |
| 123 | } |
| 124 | } |
| 125 | return nullptr; |
| 126 | } |
| 127 | |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 128 | void CrosDisksServer::Mount(const std::string& source, |
| 129 | const std::string& filesystem_type, |
| 130 | const std::vector<std::string>& options) { |
Ben Chan | fcb2fc0 | 2011-11-21 09:44:07 -0800 | [diff] [blame] | 131 | MountErrorType error_type = MOUNT_ERROR_INVALID_PATH; |
Ben Chan | 6d0b272 | 2011-11-18 08:24:14 -0800 | [diff] [blame] | 132 | MountSourceType source_type = MOUNT_SOURCE_INVALID; |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 133 | std::string mount_path; |
Ben Chan | 8dcede8 | 2011-07-25 20:56:13 -0700 | [diff] [blame] | 134 | |
Sergei Datsenko | 0f014d2 | 2018-04-04 16:37:22 +1000 | [diff] [blame] | 135 | MountManager* mounter = FindMounter(source); |
| 136 | if (mounter) { |
| 137 | source_type = mounter->GetMountSourceType(); |
| 138 | error_type = mounter->Mount(source, filesystem_type, options, &mount_path); |
Ben Chan | 8dcede8 | 2011-07-25 20:56:13 -0700 | [diff] [blame] | 139 | } |
| 140 | |
Ben Chan | fcb2fc0 | 2011-11-21 09:44:07 -0800 | [diff] [blame] | 141 | if (error_type != MOUNT_ERROR_NONE) { |
François Degros | ca45086 | 2021-01-14 14:40:02 +1100 | [diff] [blame] | 142 | LOG(ERROR) << "Cannot mount " << redact(source) << " of type " |
| 143 | << quote(filesystem_type) << ": " << error_type; |
Ben Chan | d3fdc72 | 2011-07-21 18:15:22 -0700 | [diff] [blame] | 144 | } |
Sergei Datsenko | 0f014d2 | 2018-04-04 16:37:22 +1000 | [diff] [blame] | 145 | SendMountCompletedSignal(error_type, source, source_type, mount_path); |
Ben Chan | d3fdc72 | 2011-07-21 18:15:22 -0700 | [diff] [blame] | 146 | } |
| 147 | |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 148 | uint32_t CrosDisksServer::Unmount(const std::string& path, |
| 149 | const std::vector<std::string>& options) { |
François Degros | 3fe77c5 | 2020-02-20 14:44:54 +1100 | [diff] [blame] | 150 | if (path.empty()) { |
| 151 | LOG(ERROR) << "Cannot unmount an empty path"; |
| 152 | return MOUNT_ERROR_INVALID_ARGUMENT; |
| 153 | } |
| 154 | |
| 155 | LOG_IF(WARNING, !options.empty()) |
| 156 | << "Ignoring non-empty unmount options " << quote(options); |
Anand K Mistry | 5a6d5fa | 2019-11-05 17:21:48 +1100 | [diff] [blame] | 157 | |
Ben Chan | fcb2fc0 | 2011-11-21 09:44:07 -0800 | [diff] [blame] | 158 | MountErrorType error_type = MOUNT_ERROR_INVALID_PATH; |
Ben Chan | 63ec9c4 | 2014-04-21 19:13:23 -0700 | [diff] [blame] | 159 | for (const auto& manager : mount_managers_) { |
François Degros | 3fe77c5 | 2020-02-20 14:44:54 +1100 | [diff] [blame] | 160 | error_type = manager->Unmount(path); |
| 161 | if (error_type != MOUNT_ERROR_PATH_NOT_MOUNTED) |
Ben Chan | 8dcede8 | 2011-07-25 20:56:13 -0700 | [diff] [blame] | 162 | break; |
Ben Chan | 8dcede8 | 2011-07-25 20:56:13 -0700 | [diff] [blame] | 163 | } |
| 164 | |
François Degros | 3fe77c5 | 2020-02-20 14:44:54 +1100 | [diff] [blame] | 165 | LOG_IF(ERROR, error_type != MOUNT_ERROR_NONE) |
| 166 | << "Cannot unmount " << quote(path) << ": " << error_type; |
| 167 | |
Anand K Mistry | 36d2b30 | 2018-08-15 14:57:05 +1000 | [diff] [blame] | 168 | return error_type; |
Ben Chan | d3fdc72 | 2011-07-21 18:15:22 -0700 | [diff] [blame] | 169 | } |
| 170 | |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 171 | void CrosDisksServer::UnmountAll() { |
Ben Chan | 63ec9c4 | 2014-04-21 19:13:23 -0700 | [diff] [blame] | 172 | for (const auto& manager : mount_managers_) { |
Ben Chan | 8f51376 | 2011-11-14 12:44:42 -0800 | [diff] [blame] | 173 | manager->UnmountAll(); |
| 174 | } |
| 175 | } |
| 176 | |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 177 | std::vector<std::string> CrosDisksServer::EnumerateDevices() { |
| 178 | std::vector<Disk> disks = disk_monitor_->EnumerateDisks(); |
| 179 | std::vector<std::string> devices; |
Ben Chan | f51ff00 | 2011-04-25 12:41:57 -0700 | [diff] [blame] | 180 | devices.reserve(disks.size()); |
Ben Chan | 63ec9c4 | 2014-04-21 19:13:23 -0700 | [diff] [blame] | 181 | for (const auto& disk : disks) { |
Anand K Mistry | d268ae3 | 2018-08-13 14:15:10 +1000 | [diff] [blame] | 182 | devices.push_back(disk.native_path); |
Ben Chan | 490319f | 2011-05-06 14:00:42 -0700 | [diff] [blame] | 183 | } |
Ben Chan | f51ff00 | 2011-04-25 12:41:57 -0700 | [diff] [blame] | 184 | return devices; |
| 185 | } |
| 186 | |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 187 | std::vector<CrosDisksServer::DBusMountEntry> |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 188 | CrosDisksServer::EnumerateMountEntries() { |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 189 | std::vector<DBusMountEntry> dbus_mount_entries; |
Ben Chan | 8fb742b | 2014-04-28 23:46:57 -0700 | [diff] [blame] | 190 | for (const auto& manager : mount_managers_) { |
Ben Chan | 7dfb810 | 2017-10-17 15:47:37 -0700 | [diff] [blame] | 191 | for (const auto& mount_entry : manager->GetMountEntries()) { |
Ben Chan | 0214e30 | 2017-10-17 15:39:16 -0700 | [diff] [blame] | 192 | dbus_mount_entries.push_back( |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 193 | std::make_tuple(static_cast<uint32_t>(mount_entry.error_type), |
| 194 | mount_entry.source_path, |
| 195 | static_cast<uint32_t>(mount_entry.source_type), |
| 196 | mount_entry.mount_path)); |
Ben Chan | 8fb742b | 2014-04-28 23:46:57 -0700 | [diff] [blame] | 197 | } |
| 198 | } |
| 199 | return dbus_mount_entries; |
| 200 | } |
| 201 | |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 202 | bool CrosDisksServer::GetDeviceProperties( |
| 203 | brillo::ErrorPtr* error, |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 204 | const std::string& device_path, |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 205 | brillo::VariantDictionary* properties) { |
Ben Chan | f51ff00 | 2011-04-25 12:41:57 -0700 | [diff] [blame] | 206 | Disk disk; |
Sergei Datsenko | 1682189 | 2019-04-05 11:26:38 +1100 | [diff] [blame] | 207 | if (!disk_monitor_->GetDiskByDevicePath(base::FilePath(device_path), &disk)) { |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 208 | std::string message = |
| 209 | "Could not get the properties of device " + device_path; |
Ben Chan | f51ff00 | 2011-04-25 12:41:57 -0700 | [diff] [blame] | 210 | LOG(ERROR) << message; |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 211 | brillo::Error::AddTo(error, FROM_HERE, brillo::errors::dbus::kDomain, |
| 212 | kCrosDisksServiceError, message); |
| 213 | return false; |
Ben Chan | f51ff00 | 2011-04-25 12:41:57 -0700 | [diff] [blame] | 214 | } |
Ben Chan | ff92fa3 | 2017-10-17 16:17:15 -0700 | [diff] [blame] | 215 | |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 216 | brillo::VariantDictionary temp_properties; |
Ben Chan | 72640ea | 2018-07-26 18:09:53 -0700 | [diff] [blame] | 217 | temp_properties[kIsAutoMountable] = disk.is_auto_mountable; |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 218 | temp_properties[kDeviceIsDrive] = disk.is_drive; |
| 219 | temp_properties[kDevicePresentationHide] = disk.is_hidden; |
| 220 | temp_properties[kDeviceIsMounted] = disk.IsMounted(); |
| 221 | temp_properties[kDeviceIsMediaAvailable] = disk.is_media_available; |
| 222 | temp_properties[kDeviceIsOnBootDevice] = disk.is_on_boot_device; |
| 223 | temp_properties[kDeviceIsOnRemovableDevice] = disk.is_on_removable_device; |
| 224 | temp_properties[kDeviceIsVirtual] = disk.is_virtual; |
Austin Tankiang | 36f5bb5 | 2019-03-25 16:49:30 +1100 | [diff] [blame] | 225 | temp_properties[kStorageDevicePath] = disk.storage_device_path; |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 226 | temp_properties[kDeviceFile] = disk.device_file; |
| 227 | temp_properties[kIdUuid] = disk.uuid; |
| 228 | temp_properties[kIdLabel] = disk.label; |
| 229 | temp_properties[kVendorId] = disk.vendor_id; |
| 230 | temp_properties[kVendorName] = disk.vendor_name; |
| 231 | temp_properties[kProductId] = disk.product_id; |
| 232 | temp_properties[kProductName] = disk.product_name; |
| 233 | temp_properties[kDriveModel] = disk.drive_model; |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 234 | temp_properties[kDeviceMediaType] = static_cast<uint32_t>(disk.media_type); |
Timothy Loh | d813344 | 2020-11-03 16:21:07 +1100 | [diff] [blame] | 235 | temp_properties[kBusNumber] = disk.bus_number; |
| 236 | temp_properties[kDeviceNumber] = disk.device_number; |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 237 | temp_properties[kDeviceSize] = disk.device_capacity; |
| 238 | temp_properties[kDeviceIsReadOnly] = disk.is_read_only; |
| 239 | temp_properties[kFileSystemType] = disk.filesystem_type; |
| 240 | temp_properties[kDeviceMountPaths] = disk.mount_paths; |
| 241 | *properties = std::move(temp_properties); |
| 242 | return true; |
Ben Chan | f51ff00 | 2011-04-25 12:41:57 -0700 | [diff] [blame] | 243 | } |
| 244 | |
Sergei Datsenko | ad8b504 | 2020-09-21 22:39:04 +1000 | [diff] [blame] | 245 | void CrosDisksServer::AddDeviceToAllowlist(const std::string& device_path) { |
| 246 | disk_monitor_->AddDeviceToAllowlist(base::FilePath(device_path)); |
| 247 | } |
| 248 | |
| 249 | void CrosDisksServer::RemoveDeviceFromAllowlist( |
| 250 | const std::string& device_path) { |
| 251 | disk_monitor_->RemoveDeviceFromAllowlist(base::FilePath(device_path)); |
| 252 | } |
| 253 | |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 254 | void CrosDisksServer::OnFormatCompleted(const std::string& device_path, |
Ben Chan | c1e766c | 2011-11-21 12:56:59 -0800 | [diff] [blame] | 255 | FormatErrorType error_type) { |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 256 | SendFormatCompletedSignal(error_type, device_path); |
Ben Chan | c1e766c | 2011-11-21 12:56:59 -0800 | [diff] [blame] | 257 | } |
| 258 | |
Omid Tourzan | 7943a9d | 2020-08-31 13:54:36 +1000 | [diff] [blame] | 259 | void CrosDisksServer::OnPartitionCompleted( |
| 260 | std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<uint32_t>> response, |
| 261 | const base::FilePath& device_path, |
| 262 | PartitionErrorType error_type) { |
| 263 | LOG(ERROR) << "Partitioning for device " << quote(device_path) |
| 264 | << " completed, result code: " << std::to_string(error_type); |
| 265 | response->Return(error_type); |
| 266 | } |
| 267 | |
Ben Chan | 213c6d9 | 2019-04-10 16:21:52 -0700 | [diff] [blame] | 268 | void CrosDisksServer::OnRenameCompleted(const std::string& device_path, |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 269 | RenameErrorType error_type) { |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 270 | SendRenameCompletedSignal(error_type, device_path); |
Klemen Kozjek | b065885 | 2017-08-15 13:03:48 +0900 | [diff] [blame] | 271 | } |
| 272 | |
Ben Chan | 5988f29 | 2012-09-18 08:32:42 -0700 | [diff] [blame] | 273 | void CrosDisksServer::OnScreenIsLocked() { |
| 274 | // no-op |
| 275 | } |
| 276 | |
| 277 | void CrosDisksServer::OnScreenIsUnlocked() { |
| 278 | // no-op |
| 279 | } |
| 280 | |
Ben Chan | b3bf8d1 | 2013-04-23 13:57:55 -0700 | [diff] [blame] | 281 | void CrosDisksServer::OnSessionStarted() { |
Ben Chan | 63ec9c4 | 2014-04-21 19:13:23 -0700 | [diff] [blame] | 282 | for (const auto& manager : mount_managers_) { |
Ben Chan | b3bf8d1 | 2013-04-23 13:57:55 -0700 | [diff] [blame] | 283 | manager->StartSession(); |
Ben Chan | 8dcede8 | 2011-07-25 20:56:13 -0700 | [diff] [blame] | 284 | } |
Ben Chan | 6e72692 | 2011-06-28 15:54:32 -0700 | [diff] [blame] | 285 | } |
| 286 | |
Ben Chan | b3bf8d1 | 2013-04-23 13:57:55 -0700 | [diff] [blame] | 287 | void CrosDisksServer::OnSessionStopped() { |
Ben Chan | 63ec9c4 | 2014-04-21 19:13:23 -0700 | [diff] [blame] | 288 | for (const auto& manager : mount_managers_) { |
Ben Chan | b3bf8d1 | 2013-04-23 13:57:55 -0700 | [diff] [blame] | 289 | manager->StopSession(); |
Ben Chan | 8dcede8 | 2011-07-25 20:56:13 -0700 | [diff] [blame] | 290 | } |
Ben Chan | 6e72692 | 2011-06-28 15:54:32 -0700 | [diff] [blame] | 291 | } |
| 292 | |
| 293 | void CrosDisksServer::DispatchDeviceEvent(const DeviceEvent& event) { |
| 294 | switch (event.event_type) { |
| 295 | case DeviceEvent::kDeviceAdded: |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 296 | SendDeviceAddedSignal(event.device_path); |
Ben Chan | 6e72692 | 2011-06-28 15:54:32 -0700 | [diff] [blame] | 297 | break; |
| 298 | case DeviceEvent::kDeviceScanned: |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 299 | SendDeviceScannedSignal(event.device_path); |
Ben Chan | 6e72692 | 2011-06-28 15:54:32 -0700 | [diff] [blame] | 300 | break; |
| 301 | case DeviceEvent::kDeviceRemoved: |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 302 | SendDeviceRemovedSignal(event.device_path); |
Ben Chan | 6e72692 | 2011-06-28 15:54:32 -0700 | [diff] [blame] | 303 | break; |
| 304 | case DeviceEvent::kDiskAdded: |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 305 | SendDiskAddedSignal(event.device_path); |
Ben Chan | 6e72692 | 2011-06-28 15:54:32 -0700 | [diff] [blame] | 306 | break; |
Ben Chan | 6e72692 | 2011-06-28 15:54:32 -0700 | [diff] [blame] | 307 | case DeviceEvent::kDiskChanged: |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 308 | SendDiskChangedSignal(event.device_path); |
Ben Chan | 6e72692 | 2011-06-28 15:54:32 -0700 | [diff] [blame] | 309 | break; |
| 310 | case DeviceEvent::kDiskRemoved: |
Ben Chan | 445852f | 2017-10-02 23:00:16 -0700 | [diff] [blame] | 311 | SendDiskRemovedSignal(event.device_path); |
Ben Chan | 6e72692 | 2011-06-28 15:54:32 -0700 | [diff] [blame] | 312 | break; |
| 313 | default: |
| 314 | break; |
| 315 | } |
| 316 | } |
| 317 | |
Ben Chan | bdc3974 | 2011-05-11 17:51:26 -0700 | [diff] [blame] | 318 | } // namespace cros_disks |