Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 1 | // Copyright (c) 2012 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 | |
Eric Caruso | 721d82e | 2017-08-21 15:57:30 -0700 | [diff] [blame] | 5 | #include "mtpd/mtpd_server_impl.h" |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 6 | |
Hidehiko Abe | 018e0fa | 2019-06-14 19:53:22 +0900 | [diff] [blame] | 7 | #include <base/location.h> |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 8 | #include <base/logging.h> |
Lei Zhang | 0d66f92 | 2012-08-07 15:22:05 -0700 | [diff] [blame] | 9 | #include <base/rand_util.h> |
| 10 | #include <base/stl_util.h> |
Lei Zhang | 85e6aa0 | 2013-03-07 12:29:55 -0800 | [diff] [blame] | 11 | #include <base/strings/string_number_conversions.h> |
Lei Zhang | 12dbc6f | 2017-04-21 23:00:45 -0700 | [diff] [blame] | 12 | #include <chromeos/dbus/service_constants.h> |
Lei Zhang | 85e6aa0 | 2013-03-07 12:29:55 -0800 | [diff] [blame] | 13 | |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 14 | namespace mtpd { |
| 15 | |
Lei Zhang | 0d66f92 | 2012-08-07 15:22:05 -0700 | [diff] [blame] | 16 | namespace { |
| 17 | |
Lei Zhang | 032b9e0 | 2012-11-13 18:38:38 -0800 | [diff] [blame] | 18 | // Maximum number of bytes to read from the device at one time. This is set low |
| 19 | // enough such that a reasonable device can read this much data before D-Bus |
| 20 | // times out. |
| 21 | const uint32_t kMaxReadCount = 1024 * 1024; |
| 22 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 23 | void AddError(brillo::ErrorPtr* error, |
Hidehiko Abe | 018e0fa | 2019-06-14 19:53:22 +0900 | [diff] [blame] | 24 | const base::Location& location, |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 25 | const std::string& message) { |
Tom Hughes | 79b550d | 2020-08-27 16:10:04 -0700 | [diff] [blame] | 26 | brillo::Error::AddTo(error, location, brillo::errors::dbus::kDomain, |
| 27 | kMtpdServiceError, message); |
Lei Zhang | bd08aa2 | 2012-08-22 15:20:36 -0700 | [diff] [blame] | 28 | } |
| 29 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 30 | void AddInvalidHandleError(brillo::ErrorPtr* error, |
Hidehiko Abe | 018e0fa | 2019-06-14 19:53:22 +0900 | [diff] [blame] | 31 | const base::Location& location, |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 32 | const std::string& handle) { |
Tom Hughes | 79b550d | 2020-08-27 16:10:04 -0700 | [diff] [blame] | 33 | brillo::Error::AddToPrintf(error, location, brillo::errors::dbus::kDomain, |
| 34 | kMtpdServiceError, "Invalid handle %s", |
| 35 | handle.c_str()); |
Lei Zhang | bd08aa2 | 2012-08-22 15:20:36 -0700 | [diff] [blame] | 36 | } |
| 37 | |
Lei Zhang | 0d66f92 | 2012-08-07 15:22:05 -0700 | [diff] [blame] | 38 | } // namespace |
| 39 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 40 | MtpdServer::MtpdServer(scoped_refptr<dbus::Bus> bus) |
| 41 | : org::chromium::MtpdAdaptor(this), |
| 42 | dbus_object_(nullptr, bus, dbus::ObjectPath(kMtpdServicePath)), |
Lei Zhang | 1c82c53 | 2017-04-17 22:09:12 -0700 | [diff] [blame] | 43 | device_manager_(this) {} |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 44 | |
Lei Zhang | 1c82c53 | 2017-04-17 22:09:12 -0700 | [diff] [blame] | 45 | MtpdServer::~MtpdServer() {} |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 46 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 47 | std::vector<std::string> MtpdServer::EnumerateStorages() { |
Lei Zhang | c1768cf | 2012-11-16 13:35:37 -0800 | [diff] [blame] | 48 | return device_manager_.EnumerateStorages(); |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 49 | } |
| 50 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 51 | std::vector<uint8_t> MtpdServer::GetStorageInfo( |
| 52 | const std::string& storage_name) { |
| 53 | const StorageInfo* info = device_manager_.GetStorageInfo(storage_name); |
Lei Zhang | 6cd0bfc | 2012-09-06 20:18:26 -0700 | [diff] [blame] | 54 | return info ? info->ToDBusFormat() : StorageInfo().ToDBusFormat(); |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 55 | } |
| 56 | |
Yuki Awano | 8256028 | 2015-05-19 16:41:20 +0900 | [diff] [blame] | 57 | std::vector<uint8_t> MtpdServer::GetStorageInfoFromDevice( |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 58 | const std::string& storage_name) { |
Yuki Awano | 8256028 | 2015-05-19 16:41:20 +0900 | [diff] [blame] | 59 | const StorageInfo* info = |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 60 | device_manager_.GetStorageInfoFromDevice(storage_name); |
Yuki Awano | 8256028 | 2015-05-19 16:41:20 +0900 | [diff] [blame] | 61 | return info ? info->ToDBusFormat() : StorageInfo().ToDBusFormat(); |
| 62 | } |
| 63 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 64 | bool MtpdServer::OpenStorage(brillo::ErrorPtr* error, |
| 65 | const std::string& storage_name, |
| 66 | const std::string& mode, |
| 67 | std::string* id) { |
Yuki Awano | 3a9c419 | 2015-02-24 13:37:40 +0900 | [diff] [blame] | 68 | if (!(mode == kReadOnlyMode || mode == kReadWriteMode)) { |
Tom Hughes | 79b550d | 2020-08-27 16:10:04 -0700 | [diff] [blame] | 69 | brillo::Error::AddToPrintf(error, FROM_HERE, brillo::errors::dbus::kDomain, |
| 70 | kMtpdServiceError, "Cannot open %s in mode: %s", |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 71 | storage_name.c_str(), mode.c_str()); |
| 72 | return false; |
Lei Zhang | 0d66f92 | 2012-08-07 15:22:05 -0700 | [diff] [blame] | 73 | } |
| 74 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 75 | if (!device_manager_.HasStorage(storage_name)) { |
Tom Hughes | 79b550d | 2020-08-27 16:10:04 -0700 | [diff] [blame] | 76 | brillo::Error::AddToPrintf( |
| 77 | error, FROM_HERE, brillo::errors::dbus::kDomain, kMtpdServiceError, |
| 78 | "Cannot open unknown storage %s", storage_name.c_str()); |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 79 | return false; |
Lei Zhang | 0d66f92 | 2012-08-07 15:22:05 -0700 | [diff] [blame] | 80 | } |
| 81 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 82 | std::string new_id; |
Lei Zhang | 032b9e0 | 2012-11-13 18:38:38 -0800 | [diff] [blame] | 83 | uint32_t random_data[4]; |
Lei Zhang | 0d66f92 | 2012-08-07 15:22:05 -0700 | [diff] [blame] | 84 | do { |
| 85 | base::RandBytes(random_data, sizeof(random_data)); |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 86 | new_id = base::HexEncode(random_data, sizeof(random_data)); |
Qijiang Fan | 5243904 | 2020-06-17 15:34:38 +0900 | [diff] [blame] | 87 | } while (base::Contains(handle_map_, new_id)); |
Lei Zhang | 0d66f92 | 2012-08-07 15:22:05 -0700 | [diff] [blame] | 88 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 89 | handle_map_.insert( |
| 90 | std::make_pair(new_id, std::make_pair(storage_name, mode))); |
| 91 | *id = new_id; |
| 92 | return true; |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 93 | } |
| 94 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 95 | bool MtpdServer::CloseStorage(brillo::ErrorPtr* error, |
| 96 | const std::string& handle) { |
| 97 | if (handle_map_.erase(handle) == 0) { |
| 98 | AddInvalidHandleError(error, FROM_HERE, handle); |
| 99 | return false; |
| 100 | } |
| 101 | |
| 102 | return true; |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 103 | } |
| 104 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 105 | bool MtpdServer::ReadDirectoryEntryIds( |
Tom Hughes | 79b550d | 2020-08-27 16:10:04 -0700 | [diff] [blame] | 106 | brillo::ErrorPtr* error, |
| 107 | const std::string& handle, |
| 108 | uint32_t file_id, |
| 109 | std::vector<uint32_t>* directory_listing) { |
Lei Zhang | 8c3a3f3 | 2014-07-22 16:33:25 -0700 | [diff] [blame] | 110 | std::string storage_name = LookupHandle(handle); |
| 111 | if (storage_name.empty()) { |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 112 | AddInvalidHandleError(error, FROM_HERE, handle); |
| 113 | return false; |
Lei Zhang | 8c3a3f3 | 2014-07-22 16:33:25 -0700 | [diff] [blame] | 114 | } |
| 115 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 116 | if (!device_manager_.ReadDirectoryEntryIds(storage_name, file_id, |
| 117 | directory_listing)) { |
| 118 | AddError(error, FROM_HERE, "ReadDirectoryEntryIds failed"); |
| 119 | return false; |
Lei Zhang | 8c3a3f3 | 2014-07-22 16:33:25 -0700 | [diff] [blame] | 120 | } |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 121 | |
| 122 | return true; |
Lei Zhang | 8c3a3f3 | 2014-07-22 16:33:25 -0700 | [diff] [blame] | 123 | } |
| 124 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 125 | bool MtpdServer::GetFileInfo(brillo::ErrorPtr* error, |
| 126 | const std::string& handle, |
| 127 | const std::vector<uint32_t>& file_ids, |
| 128 | std::vector<uint8_t>* serialized_file_entries) { |
| 129 | if (file_ids.empty()) { |
| 130 | AddError(error, FROM_HERE, "GetFileInfo called with no file ids"); |
| 131 | return false; |
Lei Zhang | 8c3a3f3 | 2014-07-22 16:33:25 -0700 | [diff] [blame] | 132 | } |
| 133 | |
| 134 | std::string storage_name = LookupHandle(handle); |
| 135 | if (storage_name.empty()) { |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 136 | AddInvalidHandleError(error, FROM_HERE, handle); |
| 137 | return false; |
Lei Zhang | 8c3a3f3 | 2014-07-22 16:33:25 -0700 | [diff] [blame] | 138 | } |
| 139 | |
| 140 | std::vector<FileEntry> file_info; |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 141 | if (!device_manager_.GetFileInfo(storage_name, file_ids, &file_info)) { |
| 142 | AddError(error, FROM_HERE, "GetFileInfo failed"); |
| 143 | return false; |
Lei Zhang | 8c3a3f3 | 2014-07-22 16:33:25 -0700 | [diff] [blame] | 144 | } |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 145 | |
| 146 | *serialized_file_entries = FileEntry::FileEntriesToDBusFormat(file_info); |
| 147 | return true; |
Lei Zhang | 8c3a3f3 | 2014-07-22 16:33:25 -0700 | [diff] [blame] | 148 | } |
| 149 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 150 | bool MtpdServer::ReadFileChunk(brillo::ErrorPtr* error, |
| 151 | const std::string& handle, |
| 152 | uint32_t file_id, |
| 153 | uint32_t offset, |
| 154 | uint32_t count, |
| 155 | std::vector<uint8_t>* file_contents) { |
Lei Zhang | c1768cf | 2012-11-16 13:35:37 -0800 | [diff] [blame] | 156 | if (count > kMaxReadCount || count == 0) { |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 157 | AddError(error, FROM_HERE, "Invalid count for ReadFileChunk"); |
| 158 | return false; |
Lei Zhang | 032b9e0 | 2012-11-13 18:38:38 -0800 | [diff] [blame] | 159 | } |
| 160 | std::string storage_name = LookupHandle(handle); |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 161 | if (storage_name.empty()) { |
| 162 | AddInvalidHandleError(error, FROM_HERE, handle); |
| 163 | return false; |
Lei Zhang | 032b9e0 | 2012-11-13 18:38:38 -0800 | [diff] [blame] | 164 | } |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 165 | |
| 166 | if (!device_manager_.ReadFileChunk(storage_name, file_id, offset, count, |
| 167 | file_contents)) { |
| 168 | AddError(error, FROM_HERE, "ReadFileChunk failed"); |
| 169 | return false; |
| 170 | } |
| 171 | |
| 172 | return true; |
Lei Zhang | 032b9e0 | 2012-11-13 18:38:38 -0800 | [diff] [blame] | 173 | } |
| 174 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 175 | bool MtpdServer::CopyFileFromLocal(brillo::ErrorPtr* error, |
| 176 | const std::string& handle, |
Eric Caruso | abf933e | 2018-03-22 16:09:37 -0700 | [diff] [blame] | 177 | const base::ScopedFD& file_descriptor, |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 178 | uint32_t parent_id, |
| 179 | const std::string& file_name) { |
Yuki Awano | d814ec1 | 2015-02-13 13:17:18 +0900 | [diff] [blame] | 180 | const std::string storage_name = LookupHandle(handle); |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 181 | if (storage_name.empty() || !IsOpenedWithWrite(handle)) { |
| 182 | AddInvalidHandleError(error, FROM_HERE, handle); |
| 183 | return false; |
Yuki Awano | d814ec1 | 2015-02-13 13:17:18 +0900 | [diff] [blame] | 184 | } |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 185 | |
Eric Caruso | abf933e | 2018-03-22 16:09:37 -0700 | [diff] [blame] | 186 | if (!device_manager_.CopyFileFromLocal(storage_name, file_descriptor.get(), |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 187 | parent_id, file_name)) { |
| 188 | AddError(error, FROM_HERE, "CopyFileFromLocal failed"); |
| 189 | return false; |
| 190 | } |
| 191 | |
| 192 | return true; |
Yuki Awano | d814ec1 | 2015-02-13 13:17:18 +0900 | [diff] [blame] | 193 | } |
| 194 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 195 | bool MtpdServer::DeleteObject(brillo::ErrorPtr* error, |
| 196 | const std::string& handle, |
| 197 | uint32_t object_id) { |
Yuki Awano | 3a9c419 | 2015-02-24 13:37:40 +0900 | [diff] [blame] | 198 | const std::string storage_name = LookupHandle(handle); |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 199 | if (storage_name.empty() || !IsOpenedWithWrite(handle)) { |
| 200 | AddInvalidHandleError(error, FROM_HERE, handle); |
| 201 | return false; |
Yuki Awano | 3a9c419 | 2015-02-24 13:37:40 +0900 | [diff] [blame] | 202 | } |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 203 | |
| 204 | if (!device_manager_.DeleteObject(storage_name, object_id)) { |
| 205 | AddError(error, FROM_HERE, "DeleteObject failed"); |
| 206 | return false; |
| 207 | } |
| 208 | |
| 209 | return true; |
Yuki Awano | 3a9c419 | 2015-02-24 13:37:40 +0900 | [diff] [blame] | 210 | } |
| 211 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 212 | bool MtpdServer::RenameObject(brillo::ErrorPtr* error, |
| 213 | const std::string& handle, |
| 214 | uint32_t object_id, |
| 215 | const std::string& new_name) { |
Yuki Awano | 595a8e2 | 2015-03-09 15:58:18 +0900 | [diff] [blame] | 216 | const std::string storage_name = LookupHandle(handle); |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 217 | if (storage_name.empty() || !IsOpenedWithWrite(handle)) { |
| 218 | AddInvalidHandleError(error, FROM_HERE, handle); |
| 219 | return false; |
Yuki Awano | 595a8e2 | 2015-03-09 15:58:18 +0900 | [diff] [blame] | 220 | } |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 221 | |
| 222 | if (!device_manager_.RenameObject(storage_name, object_id, new_name)) { |
| 223 | AddError(error, FROM_HERE, "RenameObject failed"); |
| 224 | return false; |
| 225 | } |
| 226 | |
| 227 | return true; |
Yuki Awano | 595a8e2 | 2015-03-09 15:58:18 +0900 | [diff] [blame] | 228 | } |
| 229 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 230 | bool MtpdServer::CreateDirectory(brillo::ErrorPtr* error, |
| 231 | const std::string& handle, |
| 232 | uint32_t parent_id, |
| 233 | const std::string& directory_name) { |
Yuki Awano | b8062c0 | 2015-03-12 20:09:25 +0900 | [diff] [blame] | 234 | const std::string storage_name = LookupHandle(handle); |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 235 | if (storage_name.empty() || !IsOpenedWithWrite(handle)) { |
| 236 | AddInvalidHandleError(error, FROM_HERE, handle); |
| 237 | return false; |
Yuki Awano | b8062c0 | 2015-03-12 20:09:25 +0900 | [diff] [blame] | 238 | } |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 239 | |
| 240 | if (!device_manager_.CreateDirectory(storage_name, parent_id, |
| 241 | directory_name)) { |
| 242 | AddError(error, FROM_HERE, "CreateDirectory failed."); |
| 243 | return false; |
| 244 | } |
| 245 | |
| 246 | return true; |
Yuki Awano | b8062c0 | 2015-03-12 20:09:25 +0900 | [diff] [blame] | 247 | } |
| 248 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 249 | bool MtpdServer::IsAlive() { |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 250 | return true; |
| 251 | } |
| 252 | |
Lei Zhang | 63e89bd | 2012-08-06 17:05:33 -0700 | [diff] [blame] | 253 | void MtpdServer::StorageAttached(const std::string& storage_name) { |
| 254 | // Fire DBus signal. |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 255 | SendMTPStorageAttachedSignal(storage_name); |
Lei Zhang | 63e89bd | 2012-08-06 17:05:33 -0700 | [diff] [blame] | 256 | } |
| 257 | |
| 258 | void MtpdServer::StorageDetached(const std::string& storage_name) { |
| 259 | // Fire DBus signal. |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 260 | SendMTPStorageDetachedSignal(storage_name); |
Lei Zhang | 63e89bd | 2012-08-06 17:05:33 -0700 | [diff] [blame] | 261 | } |
| 262 | |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 263 | int MtpdServer::GetDeviceEventDescriptor() const { |
Lei Zhang | 63e89bd | 2012-08-06 17:05:33 -0700 | [diff] [blame] | 264 | return device_manager_.GetDeviceEventDescriptor(); |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 265 | } |
| 266 | |
| 267 | void MtpdServer::ProcessDeviceEvents() { |
Lei Zhang | 63e89bd | 2012-08-06 17:05:33 -0700 | [diff] [blame] | 268 | device_manager_.ProcessDeviceEvents(); |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 269 | } |
| 270 | |
Lei Zhang | a326413 | 2012-08-16 22:52:49 -0700 | [diff] [blame] | 271 | std::string MtpdServer::LookupHandle(const std::string& handle) { |
| 272 | HandleMap::const_iterator it = handle_map_.find(handle); |
Yuki Awano | 3a9c419 | 2015-02-24 13:37:40 +0900 | [diff] [blame] | 273 | return (it == handle_map_.end()) ? std::string() : it->second.first; |
| 274 | } |
| 275 | |
| 276 | bool MtpdServer::IsOpenedWithWrite(const std::string& handle) { |
| 277 | HandleMap::const_iterator it = handle_map_.find(handle); |
| 278 | return (it == handle_map_.end()) ? false |
| 279 | : it->second.second == kReadWriteMode; |
Lei Zhang | a326413 | 2012-08-16 22:52:49 -0700 | [diff] [blame] | 280 | } |
| 281 | |
Eric Caruso | 2b923ad | 2017-08-22 17:18:40 -0700 | [diff] [blame] | 282 | void MtpdServer::RegisterAsync( |
| 283 | const brillo::dbus_utils::AsyncEventSequencer::CompletionAction& cb) { |
| 284 | RegisterWithDBusObject(&dbus_object_); |
| 285 | dbus_object_.RegisterAsync(cb); |
| 286 | } |
| 287 | |
Lei Zhang | 91af91d | 2012-08-03 11:02:20 -0700 | [diff] [blame] | 288 | } // namespace mtpd |