| Index: chrome/browser/chromeos/cros/mount_library.cc | 
| =================================================================== | 
| --- chrome/browser/chromeos/cros/mount_library.cc	(revision 93731) | 
| +++ chrome/browser/chromeos/cros/mount_library.cc	(working copy) | 
| @@ -90,31 +90,58 @@ | 
| observers_.RemoveObserver(observer); | 
| } | 
|  | 
| -  virtual void MountPath(const char* device_path) OVERRIDE { | 
| +  virtual std::string MountTypeToString(MountType type)  const OVERRIDE { | 
| +    switch (type) { | 
| +      case MOUNT_TYPE_DEVICE: | 
| +        return "device"; | 
| +      case MOUNT_TYPE_ARCHIVE: | 
| +        return "file"; | 
| +      case MOUNT_TYPE_NETWORK_STORAGE: | 
| +        return "network"; | 
| +      case MOUNT_TYPE_INVALID: | 
| +        return "invalid"; | 
| +      default: | 
| +        NOTREACHED(); | 
| +    } | 
| +    return ""; | 
| +  } | 
| + | 
| +  virtual MountType MountTypeFromString(const std::string& type_str) const | 
| +      OVERRIDE { | 
| +    if (type_str == "device") { | 
| +      return MOUNT_TYPE_DEVICE; | 
| +    } else if (type_str == "network") { | 
| +      return MOUNT_TYPE_NETWORK_STORAGE; | 
| +    } else if (type_str == "file") { | 
| +      return MOUNT_TYPE_ARCHIVE; | 
| +    } else { | 
| +      return MOUNT_TYPE_INVALID; | 
| +    } | 
| +  } | 
| + | 
| +  virtual void MountPath(const char* source_path, | 
| +                         MountType type, | 
| +                         const MountPathOptions& options) OVERRIDE { | 
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| if (!CrosLibrary::Get()->EnsureLoaded()) { | 
| -      OnMountRemovableDevice(device_path, | 
| -                             NULL, | 
| -                             MOUNT_METHOD_ERROR_LOCAL, | 
| -                             kLibraryNotLoaded); | 
| +      OnMountCompleted(MOUNT_ERROR_LIBRARY_NOT_LOADED, | 
| +                       source_path, | 
| +                       type, | 
| +                       NULL); | 
| return; | 
| } | 
| -    MountRemovableDevice(device_path, | 
| -                         &MountLibraryImpl::MountRemovableDeviceCallback, | 
| -                         this); | 
| +    MountSourcePath(source_path, type, options, &MountCompletedHandler, this); | 
| } | 
|  | 
| -  virtual void UnmountPath(const char* device_path) OVERRIDE { | 
| +  virtual void UnmountPath(const char* path) OVERRIDE { | 
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| if (!CrosLibrary::Get()->EnsureLoaded()) { | 
| -      OnUnmountRemovableDevice(device_path, | 
| -                               MOUNT_METHOD_ERROR_LOCAL, | 
| -                               kLibraryNotLoaded); | 
| +      OnUnmountPath(path, | 
| +                    MOUNT_METHOD_ERROR_LOCAL, | 
| +                    kLibraryNotLoaded); | 
| return; | 
| } | 
| -    UnmountRemovableDevice(device_path, | 
| -                           &MountLibraryImpl::UnmountRemovableDeviceCallback, | 
| -                           this); | 
| +    UnmountMountPoint(path, &MountLibraryImpl::UnmountMountPointCallback, this); | 
| } | 
|  | 
| virtual void UnmountDeviceRecursive(const char* device_path, | 
| @@ -151,9 +178,10 @@ | 
| cb_data = new UnmountDeviceRecursiveCallbackData(this, user_data, | 
| callback, devices_to_unmount.size()); | 
| for (std::vector<const char*>::iterator it = devices_to_unmount.begin(); | 
| -          it != devices_to_unmount.end(); | 
| -          ++it) { | 
| -        UnmountRemovableDevice(*it, | 
| +           it != devices_to_unmount.end(); | 
| +           ++it) { | 
| +        UnmountMountPoint( | 
| +            *it, | 
| &MountLibraryImpl::UnmountDeviceRecursiveCallback, | 
| cb_data); | 
| } | 
| @@ -178,39 +206,36 @@ | 
| } | 
|  | 
| const DiskMap& disks() const OVERRIDE { return disks_; } | 
| +  const MountPointMap& mount_points() const OVERRIDE { return mount_points_; } | 
|  | 
| private: | 
| -  // Callback for MountRemovableDevice method. | 
| -  static void MountRemovableDeviceCallback(void* object, | 
| -                                           const char* device_path, | 
| -                                           const char* mount_path, | 
| -                                           MountMethodErrorType error, | 
| -                                           const char* error_message) { | 
| +  // Callback for MountComplete signal and MountSourcePath method. | 
| +  static void MountCompletedHandler(void* object, | 
| +                                    MountError error_code, | 
| +                                    const char* source_path, | 
| +                                    MountType type, | 
| +                                    const char* mount_path) { | 
| DCHECK(object); | 
| MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object); | 
| -    self->OnMountRemovableDevice(device_path, | 
| -                                 mount_path, | 
| -                                 error, | 
| -                                 error_message); | 
| +    self->OnMountCompleted(static_cast<MountError>(error_code), | 
| +                           source_path, | 
| +                           static_cast<MountType>(type), | 
| +                           mount_path); | 
| } | 
|  | 
| // Callback for UnmountRemovableDevice method. | 
| -  static void UnmountRemovableDeviceCallback(void* object, | 
| -                                             const char* device_path, | 
| -                                             const char* mount_path, | 
| -                                             MountMethodErrorType error, | 
| -                                             const char* error_message) { | 
| +  static void UnmountMountPointCallback(void* object, | 
| +                                        const char* device_path, | 
| +                                        MountMethodErrorType error, | 
| +                                        const char* error_message) { | 
| DCHECK(object); | 
| MountLibraryImpl* self = static_cast<MountLibraryImpl*>(object); | 
| -    self->OnUnmountRemovableDevice(device_path, | 
| -                                   error, | 
| -                                   error_message); | 
| +    self->OnUnmountPath(device_path, error, error_message); | 
| } | 
|  | 
| // Callback for UnmountDeviceRecursive. | 
| static void UnmountDeviceRecursiveCallback(void* object, | 
| const char* device_path, | 
| -                                             const char* mount_path, | 
| MountMethodErrorType error, | 
| const char* error_message) { | 
| DCHECK(object); | 
| @@ -218,9 +243,9 @@ | 
| static_cast<UnmountDeviceRecursiveCallbackData*>(object); | 
|  | 
| // Do standard processing for Unmount event. | 
| -    cb_data->object->OnUnmountRemovableDevice(device_path, | 
| -                                              error, | 
| -                                              error_message); | 
| +    cb_data->object->OnUnmountPath(device_path, | 
| +                                   error, | 
| +                                   error_message); | 
| if (error == MOUNT_METHOD_ERROR_LOCAL) { | 
| cb_data->success = false; | 
| } else if (error == MOUNT_METHOD_ERROR_NONE) { | 
| @@ -275,14 +300,23 @@ | 
| } | 
|  | 
|  | 
| -  void OnMountRemovableDevice(const char* device_path, | 
| -                              const char* mount_path, | 
| -                              MountMethodErrorType error, | 
| -                              const char* error_message) { | 
| -    DCHECK(device_path); | 
| +  void OnMountCompleted(MountError error_code, | 
| +                        const char* source_path, | 
| +                        MountType type, | 
| +                        const char* mount_path) { | 
| +    DCHECK(source_path); | 
|  | 
| -    if (error == MOUNT_METHOD_ERROR_NONE && device_path && mount_path) { | 
| -      std::string path(device_path); | 
| +    FireMountCompleted(MOUNTING, error_code, source_path, type, mount_path); | 
| + | 
| +    if (error_code == MOUNT_ERROR_NONE && | 
| +        mount_points_.find(source_path) == mount_points_.end()) { | 
| +      mount_points_.insert(MountPointMap::value_type(source_path, | 
| +                           MountPointInfo(source_path, mount_path, type))); | 
| +    } | 
| + | 
| +    if (error_code == MOUNT_ERROR_NONE && type == MOUNT_TYPE_DEVICE && | 
| +        source_path && mount_path) { | 
| +      std::string path(source_path); | 
| DiskMap::iterator iter = disks_.find(path); | 
| if (iter == disks_.end()) { | 
| // disk might have been removed by now? | 
| @@ -292,19 +326,27 @@ | 
| DCHECK(disk); | 
| disk->set_mount_path(mount_path); | 
| FireDiskStatusUpdate(MOUNT_DISK_MOUNTED, disk); | 
| -    } else { | 
| -      LOG(WARNING) << "Mount request failed for device " | 
| -                   << device_path << ", with error: " | 
| -                   << (error_message ? error_message : "Unknown"); | 
| } | 
| } | 
|  | 
| -  void OnUnmountRemovableDevice(const char* device_path, | 
| -                                MountMethodErrorType error, | 
| -                                const char* error_message) { | 
| -    DCHECK(device_path); | 
| -    if (error == MOUNT_METHOD_ERROR_NONE && device_path) { | 
| -      std::string path(device_path); | 
| +  void OnUnmountPath(const char* source_path, | 
| +                     MountMethodErrorType error, | 
| +                     const char* error_message) { | 
| +    DCHECK(source_path); | 
| + | 
| +    if (error == MOUNT_METHOD_ERROR_NONE && source_path) { | 
| +      MountPointMap::iterator mount_points_it = mount_points_.find(source_path); | 
| +      if (mount_points_it == mount_points_.end()) | 
| +        return; | 
| +      // TODO(tbarzic): Add separate, PathUnmounted event to Observer. | 
| +      FireMountCompleted(UNMOUNTING, | 
| +                         MOUNT_ERROR_NONE, | 
| +                         mount_points_it->second.source_path.c_str(), | 
| +                         mount_points_it->second.mount_type, | 
| +                         mount_points_it->second.mount_path.c_str()); | 
| +      mount_points_.erase(mount_points_it); | 
| + | 
| +      std::string path(source_path); | 
| DiskMap::iterator iter = disks_.find(path); | 
| if (iter == disks_.end()) { | 
| // disk might have been removed by now? | 
| @@ -316,7 +358,7 @@ | 
| FireDiskStatusUpdate(MOUNT_DISK_UNMOUNTED, disk); | 
| } else { | 
| LOG(WARNING) << "Unmount request failed for device " | 
| -                   << device_path << ", with error: " | 
| +                   << source_path << ", with error: " | 
| << (error_message ? error_message : "Unknown"); | 
| } | 
| } | 
| @@ -476,16 +518,17 @@ | 
| type = MOUNT_DEVICE_SCANNED; | 
| break; | 
| } | 
| -      default: | 
| +      default: { | 
| return; | 
| +      } | 
| } | 
| FireDeviceStatusUpdate(type, std::string(device_path)); | 
| } | 
|  | 
| void Init() { | 
| // Getting the monitor status so that the daemon starts up. | 
| -    mount_status_connection_ = MonitorMountEvents( | 
| -        &MonitorMountEventsHandler, this); | 
| +    mount_status_connection_ = MonitorAllMountEvents( | 
| +        &MonitorMountEventsHandler, &MountCompletedHandler, this); | 
| } | 
|  | 
| void FireDiskStatusUpdate(MountLibraryEventType evt, | 
| @@ -504,6 +547,21 @@ | 
| Observer, observers_, DeviceChanged(evt, device_path)); | 
| } | 
|  | 
| +  void FireMountCompleted(MountEvent event_type, | 
| +                          MountError error_code, | 
| +                          const char* source_path, | 
| +                          MountType mount_type, | 
| +                          const char* mount_path) { | 
| +    // Make sure we run on UI thread. | 
| +    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| +    FOR_EACH_OBSERVER( | 
| +        Observer, observers_, MountCompleted(event_type, | 
| +                                             error_code, | 
| +                                             source_path, | 
| +                                             mount_type, | 
| +                                             mount_path)); | 
| +  } | 
| + | 
| // Mount event change observers. | 
| ObserverList<Observer> observers_; | 
|  | 
| @@ -514,6 +572,8 @@ | 
| // The list of disks found. | 
| MountLibrary::DiskMap disks_; | 
|  | 
| +  MountLibrary::MountPointMap mount_points_; | 
| + | 
| DISALLOW_COPY_AND_ASSIGN(MountLibraryImpl); | 
| }; | 
|  | 
| @@ -526,9 +586,20 @@ | 
| virtual void AddObserver(Observer* observer) OVERRIDE {} | 
| virtual void RemoveObserver(Observer* observer) OVERRIDE {} | 
| virtual const DiskMap& disks() const OVERRIDE { return disks_; } | 
| +  virtual const MountPointMap& mount_points() const OVERRIDE { | 
| +    return mount_points_; | 
| +  } | 
| +  virtual std::string MountTypeToString(MountType type) const OVERRIDE { | 
| +    return ""; | 
| +  } | 
| +  virtual MountType MountTypeFromString(const std::string& type_str) const | 
| +      OVERRIDE { | 
| +    return MOUNT_TYPE_INVALID; | 
| +  } | 
| virtual void RequestMountInfoRefresh() OVERRIDE {} | 
| -  virtual void MountPath(const char* device_path) OVERRIDE {} | 
| -  virtual void UnmountPath(const char* device_path) OVERRIDE {} | 
| +  virtual void MountPath(const char* source_path, MountType type, | 
| +                         const MountPathOptions& options) OVERRIDE {} | 
| +  virtual void UnmountPath(const char* path) OVERRIDE {} | 
| virtual void UnmountDeviceRecursive(const char* device_path, | 
| UnmountDeviceRecursiveCallbackType callback, void* user_data) | 
| OVERRIDE {} | 
| @@ -536,6 +607,7 @@ | 
| private: | 
| // The list of disks found. | 
| DiskMap disks_; | 
| +  MountPointMap mount_points_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(MountLibraryStubImpl); | 
| }; | 
|  |