1 /* 2 * Copyright 2003-2008, Haiku Inc. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef _DISK_DEVICE_ROSTER_H 6 #define _DISK_DEVICE_ROSTER_H 7 8 #include <image.h> 9 10 #include <DiskDeviceDefs.h> 11 #include <Messenger.h> 12 #include <SupportDefs.h> 13 14 class BDirectory; 15 class BDiskDevice; 16 class BDiskDeviceVisiting; 17 class BDiskDeviceVisitor; 18 class BDiskScannerPartitionAddOn; 19 class BDiskSystem; 20 class BPartition; 21 class BVolume; 22 23 namespace BPrivate { 24 class AddOnImage; 25 } 26 27 // watchable events 28 enum { 29 // Basic masks 30 B_DEVICE_REQUEST_MOUNT_POINT = 0x0001, // mount point changes 31 B_DEVICE_REQUEST_MOUNTING = 0x0002, // mounting/unmounting 32 B_DEVICE_REQUEST_PARTITION = 0x0004, // partition changes 33 B_DEVICE_REQUEST_DEVICE = 0x0008, // device changes (media changes) 34 B_DEVICE_REQUEST_DEVICE_LIST = 0x0010, // device additions/removals 35 B_DEVICE_REQUEST_JOB_LIST = 0x0020, // job addition/initiation/cancellation/completion 36 B_DEVICE_REQUEST_JOB_SIMPLE_PROGRESS = 0x0040, // simple job progress (i.e. "% complete" only) 37 B_DEVICE_REQUEST_JOB_EXTRA_PROGRESS = 0x0080, // extra info on job progress (no "% complete" info) 38 39 // Combination masks 40 B_DEVICE_REQUEST_JOB_COMPLETE_PROGRESS = 0x00C0, // complete job progress info 41 B_DEVICE_REQUEST_ALL = 0xffff, // all events 42 }; 43 44 // notification message "what" field 45 // TODO: move to app/AppDefs.h 46 enum { 47 B_DEVICE_UPDATE = 'DUPD' 48 }; 49 50 // notification message "event" field values 51 enum { 52 B_DEVICE_MOUNT_POINT_MOVED, // mount point moved/renamed 53 B_DEVICE_PARTITION_MOUNTED, // partition mounted 54 B_DEVICE_PARTITION_UNMOUNTED, // partition unmounted 55 B_DEVICE_PARTITION_INITIALIZED, // partition initialized 56 B_DEVICE_PARTITION_RESIZED, // partition resized 57 B_DEVICE_PARTITION_MOVED, // partition moved 58 B_DEVICE_PARTITION_CREATED, // partition created 59 B_DEVICE_PARTITION_DELETED, // partition deleted 60 B_DEVICE_PARTITION_DEFRAGMENTED, // partition defragmented 61 B_DEVICE_PARTITION_REPAIRED, // partition repaired 62 B_DEVICE_MEDIA_CHANGED, // media changed 63 B_DEVICE_ADDED, // device added 64 B_DEVICE_REMOVED, // device removed 65 B_DEVICE_JOB_SCHEDULED, // job added 66 B_DEVICE_JOB_INITIATED, // job initiated 67 B_DEVICE_JOB_CANCELED, // job canceled 68 B_DEVICE_JOB_FINISHED, // job finished 69 B_DEVICE_JOB_SIMPLE_PROGRESS, // job percent complete progress 70 B_DEVICE_JOB_EXTRA_PROGRESS, // extended job progress info 71 }; 72 73 // notification message "cause" field values 74 enum { 75 // helpful causes 76 B_DEVICE_CAUSE_MEDIA_CHANGED, 77 B_DEVICE_CAUSE_FORMATTED, // is this still applicable? 78 B_DEVICE_CAUSE_PARTITIONED, // is this still applicable? 79 B_DEVICE_CAUSE_INITIALIZED, // is this still applicable? 80 // unknown cause 81 B_DEVICE_CAUSE_UNKNOWN, 82 // for internal use only (e.g.: partition added, because device added) 83 B_DEVICE_CAUSE_PARENT_CHANGED, 84 }; 85 86 class BDiskDeviceRoster { 87 public: 88 BDiskDeviceRoster(); 89 ~BDiskDeviceRoster(); 90 91 status_t GetNextDevice(BDiskDevice* device); 92 status_t RewindDevices(); 93 94 status_t GetNextDiskSystem(BDiskSystem* system); 95 status_t RewindDiskSystems(); 96 97 status_t GetDiskSystem(BDiskSystem* system, const char* name); 98 99 partition_id RegisterFileDevice(const char* filename); 100 // publishes: /dev/disk/virtual/files/<disk device ID>/raw 101 status_t UnregisterFileDevice(const char* filename); 102 status_t UnregisterFileDevice(partition_id device); 103 104 bool VisitEachDevice(BDiskDeviceVisitor* visitor, 105 BDiskDevice* device = NULL); 106 bool VisitEachPartition(BDiskDeviceVisitor* visitor, 107 BDiskDevice* device = NULL, 108 BPartition** _partition = NULL); 109 110 bool VisitEachMountedPartition( 111 BDiskDeviceVisitor* visitor, 112 BDiskDevice* device = NULL, 113 BPartition** _partition = NULL); 114 bool VisitEachMountablePartition( 115 BDiskDeviceVisitor* visitor, 116 BDiskDevice* device = NULL, 117 BPartition** _partition = NULL); 118 119 status_t FindPartitionByVolume(const BVolume& volume, 120 BDiskDevice* device, 121 BPartition** _partition); 122 status_t FindPartitionByMountPoint(const char* mountPoint, 123 BDiskDevice* device, 124 BPartition** _partition); 125 126 status_t GetDeviceWithID(partition_id id, 127 BDiskDevice* device) const; 128 status_t GetPartitionWithID(partition_id id, 129 BDiskDevice* device, 130 BPartition** _partition) const; 131 132 status_t GetDeviceForPath(const char* filename, 133 BDiskDevice* device); 134 status_t GetPartitionForPath(const char* filename, 135 BDiskDevice* device, BPartition** _partition); 136 status_t GetFileDeviceForPath(const char* filename, 137 BDiskDevice* device); 138 139 status_t StartWatching(BMessenger target, 140 uint32 eventMask = B_DEVICE_REQUEST_ALL); 141 status_t StopWatching(BMessenger target); 142 143 private: 144 #if 0 145 status_t _GetObjectWithID(const char *fieldName, partition_id id, 146 BDiskDevice *device) const; 147 148 // TODO: Introduce iterators instead of these functions. 149 150 static status_t _GetNextAddOn(BDirectory **directory, int32 *index, 151 const char *subdir, 152 BPrivate::AddOnImage *image); 153 static status_t _GetNextAddOn(BDirectory *directory, 154 BPrivate::AddOnImage *image); 155 static status_t _GetNextAddOnDir(BPath *path, int32 *index, 156 const char *subdir); 157 static status_t _GetNextAddOnDir(BDirectory **directory, int32 *index, 158 const char *subdir); 159 160 static status_t _LoadPartitionAddOn(const char *partitioningSystem, 161 BPrivate::AddOnImage *image, 162 BDiskScannerPartitionAddOn **addOn); 163 #endif // 0 164 private: 165 int32 fDeviceCookie; 166 int32 fDiskSystemCookie; 167 int32 fJobCookie; 168 // BDirectory *fPartitionAddOnDir; 169 // BDirectory *fFSAddOnDir; 170 // int32 fPartitionAddOnDirIndex; 171 // int32 fFSAddOnDirIndex; 172 }; 173 174 #endif // _DISK_DEVICE_ROSTER_H 175