Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: chrome/browser/chromeos/cros/mount_library.cc

Issue 7457001: Adding support for mount point different from removable devices to MountLibrary (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: some compile issues Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/cros/mount_library.h" 5 #include "chrome/browser/chromeos/cros/mount_library.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 83
84 // MountLibrary overrides. 84 // MountLibrary overrides.
85 virtual void AddObserver(Observer* observer) OVERRIDE { 85 virtual void AddObserver(Observer* observer) OVERRIDE {
86 observers_.AddObserver(observer); 86 observers_.AddObserver(observer);
87 } 87 }
88 88
89 virtual void RemoveObserver(Observer* observer) OVERRIDE { 89 virtual void RemoveObserver(Observer* observer) OVERRIDE {
90 observers_.RemoveObserver(observer); 90 observers_.RemoveObserver(observer);
91 } 91 }
92 92
93 virtual void MountPath(const char* device_path) OVERRIDE { 93 virtual std::string MountTypeToString(MountType type) const OVERRIDE {
94 switch (type) {
95 case MOUNT_TYPE_DEVICE:
96 return "device";
97 case MOUNT_TYPE_ARCHIVE:
98 return "file";
99 case MOUNT_TYPE_NETWORK_STORAGE:
100 return "network";
101 case MOUNT_TYPE_INVALID:
102 return "invalid";
103 default:
104 NOTREACHED();
105 }
106 return "";
107 }
108
109 virtual MountType MountTypeFromString(const std::string& type_str) const
110 OVERRIDE {
111 if (type_str == "device") {
112 return MOUNT_TYPE_DEVICE;
113 } else if (type_str == "network") {
114 return MOUNT_TYPE_NETWORK_STORAGE;
115 } else if (type_str == "file") {
116 return MOUNT_TYPE_ARCHIVE;
117 } else {
118 return MOUNT_TYPE_INVALID;
119 }
120 }
121
122 virtual void MountPath(const char* source_path,
123 MountType type,
124 const MountPathOptions& options) OVERRIDE {
94 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 125 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
95 if (!CrosLibrary::Get()->EnsureLoaded()) { 126 if (!CrosLibrary::Get()->EnsureLoaded()) {
96 OnMountRemovableDevice(device_path, 127 OnMountCompleted(MOUNT_ERROR_LIBRARY_NOT_LOADED,
97 NULL, 128 source_path,
98 MOUNT_METHOD_ERROR_LOCAL, 129 type,
99 kLibraryNotLoaded); 130 NULL);
100 return; 131 return;
101 } 132 }
102 MountRemovableDevice(device_path, 133 MountSourcePath(source_path, type, options, &MountCompletedHandler, this);
103 &MountLibraryImpl::MountRemovableDeviceCallback,
104 this);
105 } 134 }
106 135
107 virtual void UnmountPath(const char* device_path) OVERRIDE { 136 virtual void UnmountPath(const char* path) OVERRIDE {
108 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 137 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
109 if (!CrosLibrary::Get()->EnsureLoaded()) { 138 if (!CrosLibrary::Get()->EnsureLoaded()) {
110 OnUnmountRemovableDevice(device_path, 139 OnUnmountPath(path,
111 MOUNT_METHOD_ERROR_LOCAL, 140 MOUNT_METHOD_ERROR_LOCAL,
112 kLibraryNotLoaded); 141 kLibraryNotLoaded);
113 return; 142 return;
114 } 143 }
115 UnmountRemovableDevice(device_path, 144 UnmountMountPoint(path, &MountLibraryImpl::UnmountMountPointCallback, this);
116 &MountLibraryImpl::UnmountRemovableDeviceCallback,
117 this);
118 } 145 }
119 146
120 virtual void UnmountDeviceRecursive(const char* device_path, 147 virtual void UnmountDeviceRecursive(const char* device_path,
121 UnmountDeviceRecursiveCallbackType callback, void* user_data) 148 UnmountDeviceRecursiveCallbackType callback, void* user_data)
122 OVERRIDE { 149 OVERRIDE {
123 bool success = true; 150 bool success = true;
124 const char* error_message = NULL; 151 const char* error_message = NULL;
125 std::vector<const char*> devices_to_unmount; 152 std::vector<const char*> devices_to_unmount;
126 153
127 if (!CrosLibrary::Get()->EnsureLoaded()) { 154 if (!CrosLibrary::Get()->EnsureLoaded()) {
(...skipping 16 matching lines...) Expand all
144 } 171 }
145 } 172 }
146 173
147 if (success) { 174 if (success) {
148 // We will send the same callback data object to all Unmount calls and use 175 // We will send the same callback data object to all Unmount calls and use
149 // it to syncronize callbacks. 176 // it to syncronize callbacks.
150 UnmountDeviceRecursiveCallbackData* 177 UnmountDeviceRecursiveCallbackData*
151 cb_data = new UnmountDeviceRecursiveCallbackData(this, user_data, 178 cb_data = new UnmountDeviceRecursiveCallbackData(this, user_data,
152 callback, devices_to_unmount.size()); 179 callback, devices_to_unmount.size());
153 for (std::vector<const char*>::iterator it = devices_to_unmount.begin(); 180 for (std::vector<const char*>::iterator it = devices_to_unmount.begin();
154 it != devices_to_unmount.end(); 181 it != devices_to_unmount.end();
155 ++it) { 182 ++it) {
156 UnmountRemovableDevice(*it, 183 UnmountMountPoint(
184 *it,
157 &MountLibraryImpl::UnmountDeviceRecursiveCallback, 185 &MountLibraryImpl::UnmountDeviceRecursiveCallback,
158 cb_data); 186 cb_data);
159 } 187 }
160 } else { 188 } else {
161 LOG(WARNING) << "Unmount recursive request failed for device " 189 LOG(WARNING) << "Unmount recursive request failed for device "
162 << device_path << ", with error: " << error_message; 190 << device_path << ", with error: " << error_message;
163 callback(user_data, false); 191 callback(user_data, false);
164 } 192 }
165 } 193 }
166 194
167 virtual void RequestMountInfoRefresh() OVERRIDE { 195 virtual void RequestMountInfoRefresh() OVERRIDE {
168 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 196 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
169 if (!CrosLibrary::Get()->EnsureLoaded()) { 197 if (!CrosLibrary::Get()->EnsureLoaded()) {
170 OnRequestMountInfo(NULL, 198 OnRequestMountInfo(NULL,
171 0, 199 0,
172 MOUNT_METHOD_ERROR_LOCAL, 200 MOUNT_METHOD_ERROR_LOCAL,
173 kLibraryNotLoaded); 201 kLibraryNotLoaded);
174 return; 202 return;
175 } 203 }
176 RequestMountInfo(&MountLibraryImpl::RequestMountInfoCallback, 204 RequestMountInfo(&MountLibraryImpl::RequestMountInfoCallback,
177 this); 205 this);
178 } 206 }
179 207
180 const DiskMap& disks() const OVERRIDE { return disks_; } 208 const DiskMap& disks() const OVERRIDE { return disks_; }
209 const MountPointMap& mount_points() const OVERRIDE { return mount_points_; }
181 210
182 private: 211 private:
183 // Callback for MountRemovableDevice method. 212 // Callback for MountComplete signal and MountSourcePath method.
184 static void MountRemovableDeviceCallback(void* object, 213 static void MountCompletedHandler(void* object,
185 const char* device_path, 214 MountError error_code,
186 const char* mount_path, 215 const char* source_path,
187 MountMethodErrorType error, 216 MountType type,
188 const char* error_message) { 217 const char* mount_path) {
189 DCHECK(object); 218 DCHECK(object);
190 MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object); 219 MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object);
191 self->OnMountRemovableDevice(device_path, 220 self->OnMountCompleted(static_cast<MountError>(error_code),
192 mount_path, 221 source_path,
193 error, 222 static_cast<MountType>(type),
194 error_message); 223 mount_path);
195 } 224 }
196 225
197 // Callback for UnmountRemovableDevice method. 226 // Callback for UnmountRemovableDevice method.
198 static void UnmountRemovableDeviceCallback(void* object, 227 static void UnmountMountPointCallback(void* object,
199 const char* device_path, 228 const char* device_path,
200 const char* mount_path, 229 MountMethodErrorType error,
201 MountMethodErrorType error, 230 const char* error_message) {
202 const char* error_message) {
203 DCHECK(object); 231 DCHECK(object);
204 MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object); 232 MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object);
205 self->OnUnmountRemovableDevice(device_path, 233 self->OnUnmountPath(device_path, error, error_message);
206 error,
207 error_message);
208 } 234 }
209 235
210 // Callback for UnmountDeviceRecursive. 236 // Callback for UnmountDeviceRecursive.
211 static void UnmountDeviceRecursiveCallback(void* object, 237 static void UnmountDeviceRecursiveCallback(void* object,
212 const char* device_path, 238 const char* device_path,
213 const char* mount_path,
214 MountMethodErrorType error, 239 MountMethodErrorType error,
215 const char* error_message) { 240 const char* error_message) {
216 DCHECK(object); 241 DCHECK(object);
217 UnmountDeviceRecursiveCallbackData* cb_data = 242 UnmountDeviceRecursiveCallbackData* cb_data =
218 static_cast<UnmountDeviceRecursiveCallbackData*>(object); 243 static_cast<UnmountDeviceRecursiveCallbackData*>(object);
219 244
220 // Do standard processing for Unmount event. 245 // Do standard processing for Unmount event.
221 cb_data->object->OnUnmountRemovableDevice(device_path, 246 cb_data->object->OnUnmountPath(device_path,
222 error, 247 error,
223 error_message); 248 error_message);
224 if (error == MOUNT_METHOD_ERROR_LOCAL) { 249 if (error == MOUNT_METHOD_ERROR_LOCAL) {
225 cb_data->success = false; 250 cb_data->success = false;
226 } else if (error == MOUNT_METHOD_ERROR_NONE) { 251 } else if (error == MOUNT_METHOD_ERROR_NONE) {
227 LOG(WARNING) << device_path << " unmounted."; 252 LOG(WARNING) << device_path << " unmounted.";
228 } 253 }
229 254
230 // This is safe as long as all callbacks are called on the same thread as 255 // This is safe as long as all callbacks are called on the same thread as
231 // UnmountDeviceRecursive. 256 // UnmountDeviceRecursive.
232 cb_data->pending_callbacks_count--; 257 cb_data->pending_callbacks_count--;
233 258
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 // This method will receive events that are caused by drive status changes. 293 // This method will receive events that are caused by drive status changes.
269 static void MonitorMountEventsHandler(void* object, 294 static void MonitorMountEventsHandler(void* object,
270 MountEventType evt, 295 MountEventType evt,
271 const char* device_path) { 296 const char* device_path) {
272 DCHECK(object); 297 DCHECK(object);
273 MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object); 298 MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object);
274 self->OnMountEvent(evt, device_path); 299 self->OnMountEvent(evt, device_path);
275 } 300 }
276 301
277 302
278 void OnMountRemovableDevice(const char* device_path, 303 void OnMountCompleted(MountError error_code,
279 const char* mount_path, 304 const char* source_path,
280 MountMethodErrorType error, 305 MountType type,
281 const char* error_message) { 306 const char* mount_path) {
282 DCHECK(device_path); 307 DCHECK(source_path);
283 308
284 if (error == MOUNT_METHOD_ERROR_NONE && device_path && mount_path) { 309 FireMountCompleted(MOUNTING, error_code, source_path, type, mount_path);
285 std::string path(device_path); 310
311 if (error_code == MOUNT_ERROR_NONE &&
312 mount_points_.find(source_path) == mount_points_.end()) {
313 mount_points_.insert(MountPointMap::value_type(source_path,
314 MountPointInfo(source_path, mount_path, type)));
315 }
316
317 if (error_code == MOUNT_ERROR_NONE && type == MOUNT_TYPE_DEVICE &&
318 source_path && mount_path) {
319 std::string path(source_path);
286 DiskMap::iterator iter = disks_.find(path); 320 DiskMap::iterator iter = disks_.find(path);
287 if (iter == disks_.end()) { 321 if (iter == disks_.end()) {
288 // disk might have been removed by now? 322 // disk might have been removed by now?
289 return; 323 return;
290 } 324 }
291 Disk* disk = iter->second; 325 Disk* disk = iter->second;
292 DCHECK(disk); 326 DCHECK(disk);
293 disk->set_mount_path(mount_path); 327 disk->set_mount_path(mount_path);
294 FireDiskStatusUpdate(MOUNT_DISK_MOUNTED, disk); 328 FireDiskStatusUpdate(MOUNT_DISK_MOUNTED, disk);
295 } else {
296 LOG(WARNING) << "Mount request failed for device "
297 << device_path << ", with error: "
298 << (error_message ? error_message : "Unknown");
299 } 329 }
300 } 330 }
301 331
302 void OnUnmountRemovableDevice(const char* device_path, 332 void OnUnmountPath(const char* source_path,
303 MountMethodErrorType error, 333 MountMethodErrorType error,
304 const char* error_message) { 334 const char* error_message) {
305 DCHECK(device_path); 335 DCHECK(source_path);
306 if (error == MOUNT_METHOD_ERROR_NONE && device_path) { 336
307 std::string path(device_path); 337 if (error == MOUNT_METHOD_ERROR_NONE && source_path) {
338 MountPointMap::iterator mount_points_it = mount_points_.find(source_path);
339 if (mount_points_it == mount_points_.end())
340 return;
341 // TODO(tbarzic): Add separate, PathUnmounted event to Observer.
342 FireMountCompleted(UNMOUNTING,
343 MOUNT_ERROR_NONE,
344 mount_points_it->second.source_path.c_str(),
345 mount_points_it->second.mount_type,
346 mount_points_it->second.mount_path.c_str());
347 mount_points_.erase(mount_points_it);
348
349 std::string path(source_path);
308 DiskMap::iterator iter = disks_.find(path); 350 DiskMap::iterator iter = disks_.find(path);
309 if (iter == disks_.end()) { 351 if (iter == disks_.end()) {
310 // disk might have been removed by now? 352 // disk might have been removed by now?
311 return; 353 return;
312 } 354 }
313 Disk* disk = iter->second; 355 Disk* disk = iter->second;
314 DCHECK(disk); 356 DCHECK(disk);
315 disk->clear_mount_path(); 357 disk->clear_mount_path();
316 FireDiskStatusUpdate(MOUNT_DISK_UNMOUNTED, disk); 358 FireDiskStatusUpdate(MOUNT_DISK_UNMOUNTED, disk);
317 } else { 359 } else {
318 LOG(WARNING) << "Unmount request failed for device " 360 LOG(WARNING) << "Unmount request failed for device "
319 << device_path << ", with error: " 361 << source_path << ", with error: "
320 << (error_message ? error_message : "Unknown"); 362 << (error_message ? error_message : "Unknown");
321 } 363 }
322 } 364 }
323 365
324 void OnGetDiskProperties(const char* device_path, 366 void OnGetDiskProperties(const char* device_path,
325 const DiskInfo* disk1, 367 const DiskInfo* disk1,
326 MountMethodErrorType error, 368 MountMethodErrorType error,
327 const char* error_message) { 369 const char* error_message) {
328 DCHECK(device_path); 370 DCHECK(device_path);
329 if (error == MOUNT_METHOD_ERROR_NONE && device_path) { 371 if (error == MOUNT_METHOD_ERROR_NONE && device_path) {
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 break; 511 break;
470 } 512 }
471 case DEVICE_REMOVED: { 513 case DEVICE_REMOVED: {
472 type = MOUNT_DEVICE_REMOVED; 514 type = MOUNT_DEVICE_REMOVED;
473 break; 515 break;
474 } 516 }
475 case DEVICE_SCANNED: { 517 case DEVICE_SCANNED: {
476 type = MOUNT_DEVICE_SCANNED; 518 type = MOUNT_DEVICE_SCANNED;
477 break; 519 break;
478 } 520 }
479 default: 521 default: {
480 return; 522 return;
523 }
481 } 524 }
482 FireDeviceStatusUpdate(type, std::string(device_path)); 525 FireDeviceStatusUpdate(type, std::string(device_path));
483 } 526 }
484 527
485 void Init() { 528 void Init() {
486 // Getting the monitor status so that the daemon starts up. 529 // Getting the monitor status so that the daemon starts up.
487 mount_status_connection_ = MonitorMountEvents( 530 mount_status_connection_ = MonitorAllMountEvents(
488 &MonitorMountEventsHandler, this); 531 &MonitorMountEventsHandler, &MountCompletedHandler, this);
489 } 532 }
490 533
491 void FireDiskStatusUpdate(MountLibraryEventType evt, 534 void FireDiskStatusUpdate(MountLibraryEventType evt,
492 const Disk* disk) { 535 const Disk* disk) {
493 // Make sure we run on UI thread. 536 // Make sure we run on UI thread.
494 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 537 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
495 FOR_EACH_OBSERVER( 538 FOR_EACH_OBSERVER(
496 Observer, observers_, DiskChanged(evt, disk)); 539 Observer, observers_, DiskChanged(evt, disk));
497 } 540 }
498 541
499 void FireDeviceStatusUpdate(MountLibraryEventType evt, 542 void FireDeviceStatusUpdate(MountLibraryEventType evt,
500 const std::string& device_path) { 543 const std::string& device_path) {
501 // Make sure we run on UI thread. 544 // Make sure we run on UI thread.
502 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 545 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
503 FOR_EACH_OBSERVER( 546 FOR_EACH_OBSERVER(
504 Observer, observers_, DeviceChanged(evt, device_path)); 547 Observer, observers_, DeviceChanged(evt, device_path));
505 } 548 }
506 549
550 void FireMountCompleted(MountEvent event_type,
551 MountError error_code,
552 const char* source_path,
553 MountType mount_type,
554 const char* mount_path) {
555 // Make sure we run on UI thread.
556 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
557 FOR_EACH_OBSERVER(
558 Observer, observers_, MountCompleted(event_type,
559 error_code,
560 source_path,
561 mount_type,
562 mount_path));
563 }
564
507 // Mount event change observers. 565 // Mount event change observers.
508 ObserverList<Observer> observers_; 566 ObserverList<Observer> observers_;
509 567
510 // A reference to the mount api, to allow callbacks when the mount 568 // A reference to the mount api, to allow callbacks when the mount
511 // status changes. 569 // status changes.
512 MountEventConnection mount_status_connection_; 570 MountEventConnection mount_status_connection_;
513 571
514 // The list of disks found. 572 // The list of disks found.
515 MountLibrary::DiskMap disks_; 573 MountLibrary::DiskMap disks_;
516 574
575 MountLibrary::MountPointMap mount_points_;
576
517 DISALLOW_COPY_AND_ASSIGN(MountLibraryImpl); 577 DISALLOW_COPY_AND_ASSIGN(MountLibraryImpl);
518 }; 578 };
519 579
520 class MountLibraryStubImpl : public MountLibrary { 580 class MountLibraryStubImpl : public MountLibrary {
521 public: 581 public:
522 MountLibraryStubImpl() {} 582 MountLibraryStubImpl() {}
523 virtual ~MountLibraryStubImpl() {} 583 virtual ~MountLibraryStubImpl() {}
524 584
525 // MountLibrary overrides. 585 // MountLibrary overrides.
526 virtual void AddObserver(Observer* observer) OVERRIDE {} 586 virtual void AddObserver(Observer* observer) OVERRIDE {}
527 virtual void RemoveObserver(Observer* observer) OVERRIDE {} 587 virtual void RemoveObserver(Observer* observer) OVERRIDE {}
528 virtual const DiskMap& disks() const OVERRIDE { return disks_; } 588 virtual const DiskMap& disks() const OVERRIDE { return disks_; }
589 virtual const MountPointMap& mount_points() const OVERRIDE {
590 return mount_points_;
591 }
592 virtual std::string MountTypeToString(MountType type) const OVERRIDE {
593 return "";
594 }
595 virtual MountType MountTypeFromString(const std::string& type_str) const
596 OVERRIDE {
597 return MOUNT_TYPE_INVALID;
598 }
529 virtual void RequestMountInfoRefresh() OVERRIDE {} 599 virtual void RequestMountInfoRefresh() OVERRIDE {}
530 virtual void MountPath(const char* device_path) OVERRIDE {} 600 virtual void MountPath(const char* source_path, MountType type,
531 virtual void UnmountPath(const char* device_path) OVERRIDE {} 601 const MountPathOptions& options) OVERRIDE {}
602 virtual void UnmountPath(const char* path) OVERRIDE {}
532 virtual void UnmountDeviceRecursive(const char* device_path, 603 virtual void UnmountDeviceRecursive(const char* device_path,
533 UnmountDeviceRecursiveCallbackType callback, void* user_data) 604 UnmountDeviceRecursiveCallbackType callback, void* user_data)
534 OVERRIDE {} 605 OVERRIDE {}
535 606
536 private: 607 private:
537 // The list of disks found. 608 // The list of disks found.
538 DiskMap disks_; 609 DiskMap disks_;
610 MountPointMap mount_points_;
539 611
540 DISALLOW_COPY_AND_ASSIGN(MountLibraryStubImpl); 612 DISALLOW_COPY_AND_ASSIGN(MountLibraryStubImpl);
541 }; 613 };
542 614
543 // static 615 // static
544 MountLibrary* MountLibrary::GetImpl(bool stub) { 616 MountLibrary* MountLibrary::GetImpl(bool stub) {
545 if (stub) 617 if (stub)
546 return new MountLibraryStubImpl(); 618 return new MountLibraryStubImpl();
547 else 619 else
548 return new MountLibraryImpl(); 620 return new MountLibraryImpl();
549 } 621 }
550 622
551 } // namespace chromeos 623 } // namespace chromeos
552 624
553 // Allows InvokeLater without adding refcounting. This class is a Singleton and 625 // Allows InvokeLater without adding refcounting. This class is a Singleton and
554 // won't be deleted until it's last InvokeLater is run. 626 // won't be deleted until it's last InvokeLater is run.
555 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::MountLibraryImpl); 627 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::MountLibraryImpl);
556 628
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698