AutoMounter::AutoMounter() : BApplication(kMountServerSignature), fNormalMode(kRestorePreviousVolumes), fRemovableMode(kAllVolumes), fEjectWhenUnmounting(true) { set_thread_priority(Thread(), B_LOW_PRIORITY); if (!BootedInSafeMode()) { _ReadSettings(); } else { // defeat automounter in safe mode, don't even care about the settings fNormalMode = kNoVolumes; fRemovableMode = kNoVolumes; } BDiskDeviceRoster().StartWatching(this, B_DEVICE_REQUEST_DEVICE | B_DEVICE_REQUEST_DEVICE_LIST); }
AutoMounter::~AutoMounter() { BLaunchRoster().UnregisterEvent(this, kInitialMountEvent); BDiskDeviceRoster().StopWatching(this); }
void AutoMounter::_UnmountAndEjectVolume(BPartition* partition, BPath& mountPoint, const char* name) { BDiskDevice deviceStorage; BDiskDevice* device; if (partition == NULL) { // Try to retrieve partition BDiskDeviceRoster().FindPartitionByMountPoint(mountPoint.Path(), &deviceStorage, &partition); device = &deviceStorage; } else { device = partition->Device(); } status_t status; if (partition != NULL) status = partition->Unmount(); else status = fs_unmount_volume(mountPoint.Path(), 0); if (status != B_OK) { if (!_SuggestForceUnmount(name, status)) return; if (partition != NULL) status = partition->Unmount(B_FORCE_UNMOUNT); else status = fs_unmount_volume(mountPoint.Path(), B_FORCE_UNMOUNT); } if (status != B_OK) { _ReportUnmountError(name, status); return; } if (fEjectWhenUnmounting && partition != NULL) { // eject device if it doesn't have any mounted partitions left class IsMountedVisitor : public BDiskDeviceVisitor { public: IsMountedVisitor() : fHasMounted(false) { } virtual bool Visit(BDiskDevice* device) { return Visit(device, 0); } virtual bool Visit(BPartition* partition, int32 level) { if (partition->IsMounted()) { fHasMounted = true; return true; } return false; } bool HasMountedPartitions() const { return fHasMounted; } private: bool fHasMounted; } visitor; device->VisitEachDescendant(&visitor); if (!visitor.HasMountedPartitions()) device->Eject(); } // remove the directory if it's a directory in rootfs if (dev_for_path(mountPoint.Path()) == dev_for_path("/")) rmdir(mountPoint.Path()); }
AutoMounter::~AutoMounter() { BDiskDeviceRoster().StopWatching(this); }
MainWindow::~MainWindow() { BDiskDeviceRoster().StopWatching(this); delete fCurrentDisk; }