⛏️ index : haiku.git

/*
 * Copyright 2003-2011, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Ingo Weinhold <ingo_weinhold@gmx.de>
 */
#ifndef _K_DISK_DEVICE_SYSTEM_H
#define _K_DISK_DEVICE_SYSTEM_H


#include "disk_device_manager.h"


struct user_disk_system_info;


namespace BPrivate {
namespace DiskDevice {


class KPartition;


//!	\brief Common ancestor for disk system add-on wrappers
class KDiskSystem {
public:
								KDiskSystem(const char *name);
	virtual						~KDiskSystem();

	virtual	status_t			Init();

//			void				SetID(disk_system_id id);
			disk_system_id		ID() const;

			const char*			Name() const;
			const char*			ShortName() const;
			const char*			PrettyName() const;
			uint32				Flags() const;

			bool				IsFileSystem() const;
			bool				IsPartitioningSystem() const;

			void				GetInfo(user_disk_system_info* info);

	// manager will be locked
			status_t			Load();		// load/unload -- can be nested
			void				Unload();	//
			bool				IsLoaded() const;

	// Scanning
	// Device must be write locked.

	virtual	float				Identify(KPartition* partition, void** cookie);
	virtual	status_t			Scan(KPartition* partition, void* cookie);
	virtual	void				FreeIdentifyCookie(KPartition* partition,
									void* cookie);
	virtual	void				FreeCookie(KPartition* partition);
	virtual	void				FreeContentCookie(KPartition* partition);

	// Writing
	// Device should not be locked, but all affected partitions are marked
	// busy, meaning that no one else is allowed to modify it (and we only,
	// if we get a write lock).

	virtual	status_t			Defragment(KPartition* partition,
									disk_job_id job);
	virtual	status_t			Repair(KPartition* partition, bool checkOnly,
									disk_job_id job);
	virtual	status_t			Resize(KPartition* partition, off_t size,
									disk_job_id job);
	virtual	status_t			ResizeChild(KPartition* child, off_t size,
									disk_job_id job);
	virtual	status_t			Move(KPartition* partition, off_t offset,
									disk_job_id job);
	virtual	status_t			MoveChild(KPartition* child, off_t offset,
									disk_job_id job);
	virtual	status_t			SetName(KPartition* partition, const char* name,
									disk_job_id job);
	virtual	status_t			SetContentName(KPartition* partition,
									const char* name, disk_job_id job);
	virtual	status_t			SetType(KPartition* partition, const char* type,
									disk_job_id job);
	virtual	status_t			SetParameters(KPartition* partition,
									const char* parameters, disk_job_id job);
	virtual	status_t			SetContentParameters(KPartition* partition,
									const char* parameters, disk_job_id job);
	virtual	status_t			Initialize(KPartition* partition,
									const char* name, const char* parameters,
									disk_job_id job);
	virtual	status_t			Uninitialize(KPartition* partition,
									disk_job_id job);
	virtual	status_t			CreateChild(KPartition* partition, off_t offset,
									off_t size, const char* type,
									const char* name, const char* parameters,
									disk_job_id job, KPartition** child = NULL,
									partition_id childID = -1);
	virtual	status_t			DeleteChild(KPartition* child, disk_job_id job);

protected:
	virtual	status_t			LoadModule();
	virtual	void				UnloadModule();

			status_t			SetShortName(const char* name);
			status_t			SetPrettyName(const char* name);
			void				SetFlags(uint32 flags);

	static	int32				_NextID();

private:
			disk_system_id		fID;
			char*				fName;
			char*				fShortName;
			char*				fPrettyName;
			uint32				fFlags;
			int32				fLoadCounter;

	static	int32				fNextID;
};


} // namespace DiskDevice
} // namespace BPrivate

using BPrivate::DiskDevice::KDiskSystem;

#endif	// _K_DISK_DEVICE_SYSTEM_H