1/*
2 * Copyright 2003-2011, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Ingo Weinhold <ingo_weinhold@gmx.de>
7 */
8#ifndef _K_DISK_DEVICE_SYSTEM_H
9#define _K_DISK_DEVICE_SYSTEM_H
10
11
12#include "disk_device_manager.h"
13
14
15struct user_disk_system_info;
16
17
18namespace BPrivate {
19namespace DiskDevice {
20
21
22class KPartition;
23
24
25//!	\brief Common ancestor for disk system add-on wrappers
26class KDiskSystem {
27public:
28								KDiskSystem(const char *name);
29	virtual						~KDiskSystem();
30
31	virtual	status_t			Init();
32
33//			void				SetID(disk_system_id id);
34			disk_system_id		ID() const;
35
36			const char*			Name() const;
37			const char*			ShortName() const;
38			const char*			PrettyName() const;
39			uint32				Flags() const;
40
41			bool				IsFileSystem() const;
42			bool				IsPartitioningSystem() const;
43
44			void				GetInfo(user_disk_system_info* info);
45
46	// manager will be locked
47			status_t			Load();		// load/unload -- can be nested
48			void				Unload();	//
49			bool				IsLoaded() const;
50
51	// Scanning
52	// Device must be write locked.
53
54	virtual	float				Identify(KPartition* partition, void** cookie);
55	virtual	status_t			Scan(KPartition* partition, void* cookie);
56	virtual	void				FreeIdentifyCookie(KPartition* partition,
57									void* cookie);
58	virtual	void				FreeCookie(KPartition* partition);
59	virtual	void				FreeContentCookie(KPartition* partition);
60
61	// Writing
62	// Device should not be locked, but all affected partitions are marked
63	// busy, meaning that no one else is allowed to modify it (and we only,
64	// if we get a write lock).
65
66	virtual	status_t			Defragment(KPartition* partition,
67									disk_job_id job);
68	virtual	status_t			Repair(KPartition* partition, bool checkOnly,
69									disk_job_id job);
70	virtual	status_t			Resize(KPartition* partition, off_t size,
71									disk_job_id job);
72	virtual	status_t			ResizeChild(KPartition* child, off_t size,
73									disk_job_id job);
74	virtual	status_t			Move(KPartition* partition, off_t offset,
75									disk_job_id job);
76	virtual	status_t			MoveChild(KPartition* child, off_t offset,
77									disk_job_id job);
78	virtual	status_t			SetName(KPartition* partition, const char* name,
79									disk_job_id job);
80	virtual	status_t			SetContentName(KPartition* partition,
81									const char* name, disk_job_id job);
82	virtual	status_t			SetType(KPartition* partition, const char* type,
83									disk_job_id job);
84	virtual	status_t			SetParameters(KPartition* partition,
85									const char* parameters, disk_job_id job);
86	virtual	status_t			SetContentParameters(KPartition* partition,
87									const char* parameters, disk_job_id job);
88	virtual	status_t			Initialize(KPartition* partition,
89									const char* name, const char* parameters,
90									disk_job_id job);
91	virtual	status_t			Uninitialize(KPartition* partition,
92									disk_job_id job);
93	virtual	status_t			CreateChild(KPartition* partition, off_t offset,
94									off_t size, const char* type,
95									const char* name, const char* parameters,
96									disk_job_id job, KPartition** child = NULL,
97									partition_id childID = -1);
98	virtual	status_t			DeleteChild(KPartition* child, disk_job_id job);
99
100protected:
101	virtual	status_t			LoadModule();
102	virtual	void				UnloadModule();
103
104			status_t			SetShortName(const char* name);
105			status_t			SetPrettyName(const char* name);
106			void				SetFlags(uint32 flags);
107
108	static	int32				_NextID();
109
110private:
111			disk_system_id		fID;
112			char*				fName;
113			char*				fShortName;
114			char*				fPrettyName;
115			uint32				fFlags;
116			int32				fLoadCounter;
117
118	static	int32				fNextID;
119};
120
121
122} // namespace DiskDevice
123} // namespace BPrivate
124
125using BPrivate::DiskDevice::KDiskSystem;
126
127#endif	// _K_DISK_DEVICE_SYSTEM_H
128