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