xref: /haiku/headers/private/storage/Partition.h (revision 746cac055adc6ac3308c7bc2d29040fb95689cc9)
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