⛏️ index : haiku.git

/*
 * Copyright 2007, Ingo Weinhold, bonefish@users.sf.net.
 * Distributed under the terms of the MIT License.
 */
#ifndef _PARTITION_DELEGATE_H
#define _PARTITION_DELEGATE_H

#include <DiskSystemAddOn.h>
#include <MutablePartition.h>
#include <Partition.h>


class BDiskSystemAddOn;
class BPartitionHandle;


class BPartition::Delegate {
public:
								Delegate(BPartition* partition);
								~Delegate();

			BPartition*			Partition() const	{ return fPartition; }

			BMutablePartition*	MutablePartition();
			const BMutablePartition* MutablePartition() const;

			status_t			InitHierarchy(
									const user_partition_data* partitionData,
									Delegate* parent);
			status_t			InitAfterHierarchy();

			const user_partition_data* PartitionData() const;

			Delegate*			ChildAt(int32 index) const;
			int32				CountChildren() const;

			bool				IsModified() const;

			uint32				SupportedOperations(uint32 mask);
			uint32				SupportedChildOperations(Delegate* child,
									uint32 mask);

			// Self Modification

			status_t			Defragment();
			status_t			Repair(bool checkOnly);

			status_t			ValidateResize(off_t* size) const;
			status_t			ValidateResizeChild(Delegate* child,
									off_t* size) const;
			status_t			Resize(off_t size);
			status_t			ResizeChild(Delegate* child, off_t size);

			status_t			ValidateMove(off_t* offset) const;
			status_t			ValidateMoveChild(Delegate* child,
									off_t* offset) const;
			status_t			Move(off_t offset);
			status_t			MoveChild(Delegate* child, off_t offset);

			status_t			ValidateSetContentName(BString* name) const;
			status_t			ValidateSetName(Delegate* child,
									BString* name) const;
			status_t			SetContentName(const char* name);
			status_t			SetName(Delegate* child, const char* name);

			status_t			ValidateSetType(Delegate* child,
									const char* type) const;
			status_t			SetType(Delegate* child, const char* type);

			status_t			SetContentParameters(const char* parameters);
			status_t			SetParameters(Delegate* child,
									const char* parameters);

			status_t			GetParameterEditor(
									B_PARAMETER_EDITOR_TYPE type,
									BPartitionParameterEditor** editor) const;
			status_t			GetNextSupportedChildType(Delegate* child,
									int32* cookie, BString* type) const;
			bool				IsSubSystem(Delegate* child,
									const char* diskSystem) const;

			bool				CanInitialize(const char* diskSystem) const;
			status_t			ValidateInitialize(const char* diskSystem,
									BString* name, const char* parameters);
			status_t			Initialize(const char* diskSystem,
									const char* name,
									const char* parameters);
			status_t			Uninitialize();
	
			// Modification of child partitions

			status_t			GetPartitioningInfo(BPartitioningInfo* info);

			status_t			ValidateCreateChild(off_t* start, off_t* size,
									const char* type, BString* name,
									const char* parameters) const;
			status_t			CreateChild(off_t start, off_t size,
									const char* type, const char* name,
									const char* parameters, BPartition** child);
	
			status_t			DeleteChild(Delegate* child);

private:
			void				_FreeHandle();

private:
			BPartition*			fPartition;
			BMutablePartition	fMutablePartition;
			BDiskSystemAddOn*	fDiskSystem;
			BPartitionHandle*	fPartitionHandle;
};


#endif	// _PARTITION_DELEGATE_H