1 /* 2 * Copyright 2003-2007, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Copyright 2003, Tyler Akidau, haiku@akidau.net. 4 * Distributed under the terms of the MIT License. 5 */ 6 #ifndef _PARTITION_H 7 #define _PARTITION_H 8 9 #include <DiskDeviceDefs.h> 10 #include <Messenger.h> 11 #include <Mime.h> 12 #include <ObjectList.h> 13 14 15 class BBitmap; 16 class BDiskDevice; 17 class BDiskDeviceParameterEditor; 18 class BDiskDeviceVisitor; 19 class BDiskSystem; 20 class BMutablePartition; 21 class BPartitioningInfo; 22 class BPath; 23 class BVolume; 24 struct user_partition_data; 25 26 27 namespace BPrivate { 28 class DiskDeviceJobGenerator; 29 } 30 31 class BPartition { 32 public: 33 // Partition Info 34 35 off_t Offset() const; // 0 for devices 36 off_t Size() const; 37 off_t ContentSize() const; // 0 if uninitialized 38 uint32 BlockSize() const; 39 int32 Index() const; // 0 for devices 40 uint32 Status() const; 41 42 bool ContainsFileSystem() const; 43 bool ContainsPartitioningSystem() const; 44 45 bool IsDevice() const; 46 bool IsReadOnly() const; 47 bool IsMounted() const; 48 bool IsBusy() const; 49 50 uint32 Flags() const; 51 52 const char* Name() const; 53 const char* ContentName() const; 54 const char* Type() const; // See DiskDeviceTypes.h 55 const char* ContentType() const; // See DiskDeviceTypes.h 56 partition_id ID() const; 57 const char* Parameters() const; 58 const char* ContentParameters() const; 59 60 status_t GetDiskSystem(BDiskSystem* diskSystem) const; 61 62 virtual status_t GetPath(BPath* path) const; 63 status_t GetVolume(BVolume* volume) const; 64 status_t GetIcon(BBitmap* icon, icon_size which) const; 65 status_t GetIcon(uint8** _data, size_t* _size, 66 type_code* _type) const; 67 status_t GetMountPoint(BPath* mountPoint) const; 68 69 dev_t Mount(const char* mountPoint = NULL, 70 uint32 mountFlags = 0, 71 const char* parameters = NULL); 72 status_t Unmount(uint32 unmountFlags = 0); 73 74 // Hierarchy Info 75 76 BDiskDevice* Device() const; 77 BPartition* Parent() const; 78 BPartition* ChildAt(int32 index) const; 79 int32 CountChildren() const; 80 int32 CountDescendants() const; 81 BPartition* FindDescendant(partition_id id) const; 82 83 status_t GetPartitioningInfo( 84 BPartitioningInfo* info) const; 85 86 BPartition* VisitEachChild(BDiskDeviceVisitor* visitor) 87 const; 88 virtual BPartition* VisitEachDescendant( 89 BDiskDeviceVisitor* visitor) const; 90 91 // Self Modification 92 93 bool CanDefragment(bool* whileMounted = NULL) const; 94 status_t Defragment() const; 95 96 bool CanRepair(bool checkOnly, 97 bool* whileMounted = NULL) const; 98 status_t Repair(bool checkOnly) const; 99 100 bool CanResize(bool* canResizeContents = NULL, 101 bool* whileMounted = NULL) const; 102 status_t ValidateResize(off_t* size) const; 103 status_t Resize(off_t size); 104 105 bool CanMove(BObjectList<BPartition>* 106 unmovableDescendants = NULL, 107 BObjectList<BPartition>* 108 movableOnlyIfUnmounted = NULL) const; 109 status_t ValidateMove(off_t* newOffset) const; 110 status_t Move(off_t newOffset); 111 112 bool CanSetName() const; 113 status_t ValidateSetName(BString* name) const; 114 // adjusts name to be suitable 115 status_t SetName(const char* name); 116 117 bool CanSetContentName( 118 bool* whileMounted = NULL) const; 119 status_t ValidateSetContentName(BString* name) const; 120 // adjusts name to be suitable 121 status_t SetContentName(const char* name); 122 123 bool CanSetType() const; 124 status_t ValidateSetType(const char* type) const; 125 // type must be one the parent disk system's 126 // GetNextSupportedType() returns. 127 status_t SetType(const char* type); 128 129 bool CanEditParameters() const; 130 status_t GetParameterEditor( 131 BDiskDeviceParameterEditor** editor); 132 status_t SetParameters(const char* parameters); 133 134 bool CanEditContentParameters( 135 bool* whileMounted = NULL) const; 136 status_t GetContentParameterEditor( 137 BDiskDeviceParameterEditor** editor); 138 status_t SetContentParameters(const char* parameters); 139 140 status_t GetNextSupportedType(int32 *cookie, 141 BString* type) const; 142 // Returns all partition types for this 143 // partition supported by the parent disk 144 // system. 145 status_t GetNextSupportedChildType(int32 *cookie, 146 BString* type) const; 147 // Returns all partition types for a child 148 // of this partition supported by its disk 149 // system. 150 bool IsSubSystem(const char* diskSystem) const; 151 152 bool CanInitialize(const char* diskSystem) const; 153 status_t GetInitializationParameterEditor( 154 const char* system, 155 BDiskDeviceParameterEditor** editor) const; 156 status_t ValidateInitialize(const char* diskSystem, 157 BString* name, const char* parameters); 158 status_t Initialize(const char* diskSystem, 159 const char* name, const char* parameters); 160 status_t Uninitialize(); 161 162 // Modification of child partitions 163 164 bool CanCreateChild() const; 165 status_t GetChildCreationParameterEditor( 166 const char* type, 167 BDiskDeviceParameterEditor** editor) const; 168 status_t ValidateCreateChild(off_t* start, off_t* size, 169 const char* type, BString* name, 170 const char* parameters) const; 171 status_t CreateChild(off_t start, off_t size, 172 const char* type, const char* name, 173 const char* parameters, 174 BPartition** child = NULL); 175 176 bool CanDeleteChild(int32 index) const; 177 status_t DeleteChild(int32 index); 178 179 private: 180 class Delegate; 181 182 BPartition(); 183 BPartition(const BPartition&); 184 virtual ~BPartition(); 185 186 BPartition& operator=(const BPartition&); 187 188 status_t _SetTo(BDiskDevice* device, BPartition* parent, 189 user_partition_data* data); 190 void _Unset(); 191 status_t _RemoveObsoleteDescendants( 192 user_partition_data* data, bool* updated); 193 status_t _Update(user_partition_data* data, 194 bool* updated); 195 void _RemoveChild(int32 index); 196 197 BPartition* _ChildAt(int32 index) const; 198 int32 _CountChildren() const; 199 int32 _CountDescendants() const; 200 201 int32 _Level() const; 202 virtual bool _AcceptVisitor(BDiskDeviceVisitor* visitor, 203 int32 level); 204 BPartition* _VisitEachDescendant( 205 BDiskDeviceVisitor* visitor, 206 int32 level = -1); 207 208 const user_partition_data* _PartitionData() const; 209 210 bool _HasContent() const; 211 bool _SupportsOperation(uint32 flag, 212 uint32 whileMountedFlag, 213 bool* whileMounted) const; 214 bool _SupportsChildOperation(const BPartition* child, 215 uint32 flag) const; 216 217 status_t _CreateDelegates(); 218 status_t _InitDelegates(); 219 void _DeleteDelegates(); 220 bool _IsModified() const; 221 222 friend class BDiskDevice; 223 friend class BDiskSystem; 224 friend class BMutablePartition; 225 friend class BPrivate::DiskDeviceJobGenerator; 226 227 BDiskDevice* fDevice; 228 BPartition* fParent; 229 user_partition_data* fPartitionData; 230 Delegate* fDelegate; 231 }; 232 233 #endif // _PARTITION_H 234