1 // Copyright 2014 The Chromium 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 5 #ifndef COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_MAC_H_ 6 #define COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_MAC_H_ 7 8 #include <DiskArbitration/DiskArbitration.h> 9 #include <map> 10 11 #include "base/mac/scoped_cftyperef.h" 12 #include "base/memory/weak_ptr.h" 13 #include "components/storage_monitor/storage_monitor.h" 14 15 namespace storage_monitor { 16 17 class ImageCaptureDeviceManager; 18 19 // This class posts notifications to listeners when a new disk 20 // is attached, removed, or changed. 21 class StorageMonitorMac : public StorageMonitor, 22 public base::SupportsWeakPtr<StorageMonitorMac> { 23 public: 24 enum UpdateType { 25 UPDATE_DEVICE_ADDED, 26 UPDATE_DEVICE_CHANGED, 27 UPDATE_DEVICE_REMOVED, 28 }; 29 30 // Should only be called by browser start up code. Use GetInstance() instead. 31 StorageMonitorMac(); 32 33 virtual ~StorageMonitorMac(); 34 35 virtual void Init() OVERRIDE; 36 37 void UpdateDisk(const std::string& bsd_name, 38 const StorageInfo& info, 39 UpdateType update_type); 40 41 virtual bool GetStorageInfoForPath( 42 const base::FilePath& path, 43 StorageInfo* device_info) const OVERRIDE; 44 45 virtual void EjectDevice( 46 const std::string& device_id, 47 base::Callback<void(EjectStatus)> callback) OVERRIDE; 48 49 private: 50 static void DiskAppearedCallback(DADiskRef disk, void* context); 51 static void DiskDisappearedCallback(DADiskRef disk, void* context); 52 static void DiskDescriptionChangedCallback(DADiskRef disk, 53 CFArrayRef keys, 54 void *context); 55 void GetDiskInfoAndUpdate(DADiskRef disk, UpdateType update_type); 56 57 bool ShouldPostNotificationForDisk(const StorageInfo& info) const; 58 bool FindDiskWithMountPoint(const base::FilePath& mount_point, 59 StorageInfo* info) const; 60 61 base::ScopedCFTypeRef<DASessionRef> session_; 62 // Maps disk bsd names to disk info objects. This map tracks all mountable 63 // devices on the system, though only notifications for removable devices are 64 // posted. 65 std::map<std::string, StorageInfo> disk_info_map_; 66 67 int pending_disk_updates_; 68 69 scoped_ptr<ImageCaptureDeviceManager> image_capture_device_manager_; 70 71 DISALLOW_COPY_AND_ASSIGN(StorageMonitorMac); 72 }; 73 74 } // namespace storage_monitor 75 76 #endif // COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_MAC_H_ 77