1/*
2 * Copyright 2003-2007, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _DISK_DEVICE_JOB_GENERATOR_H
6#define _DISK_DEVICE_JOB_GENERATOR_H
7
8#include <DiskDeviceDefs.h>
9
10
11class BDiskDevice;
12class BMutablePartition;
13class BPartition;
14
15
16namespace BPrivate {
17
18
19class DiskDeviceJob;
20class DiskDeviceJobQueue;
21class PartitionReference;
22
23
24class DiskDeviceJobGenerator {
25public:
26								DiskDeviceJobGenerator(BDiskDevice* device,
27									DiskDeviceJobQueue* jobQueue);
28								~DiskDeviceJobGenerator();
29
30			status_t			GenerateJobs();
31
32private:
33			status_t			_AddJob(DiskDeviceJob* job);
34
35			status_t			_GenerateCleanupJobs(BPartition* partition);
36			status_t			_GeneratePlacementJobs(BPartition* partition);
37			status_t			_GenerateChildPlacementJobs(
38									BPartition* partition);
39			status_t			_GenerateRemainingJobs(BPartition* parent,
40									BPartition* partition);
41
42			BMutablePartition*	_GetMutablePartition(BPartition* partition);
43
44			status_t			_GenerateInitializeJob(BPartition* partition);
45			status_t			_GenerateUninitializeJob(BPartition* partition);
46			status_t			_GenerateSetContentNameJob(
47									BPartition* partition);
48			status_t			_GenerateSetContentParametersJob(
49									BPartition* partition);
50			status_t			_GenerateDefragmentJob(BPartition* partition);
51			status_t			_GenerateRepairJob(BPartition* partition,
52									bool repair);
53
54			status_t			_GenerateCreateChildJob(BPartition* parent,
55									BPartition* partition);
56			status_t			_GenerateDeleteChildJob(BPartition* parent,
57									BPartition* partition);
58			status_t			_GenerateResizeJob(BPartition* partition);
59			status_t			_GenerateMoveJob(BPartition* partition);
60			status_t 			_GenerateSetNameJob(BPartition* parent,
61									BPartition* partition);
62			status_t			_GenerateSetTypeJob(BPartition* parent,
63									BPartition* partition);
64			status_t			_GenerateSetParametersJob(BPartition* parent,
65									BPartition* partition);
66
67			status_t			_CollectContentsToMove(BPartition* partition);
68			status_t			_PushContentsToMove(BPartition* partition);
69
70			status_t			_GetPartitionReference(BPartition* partition,
71									PartitionReference*& reference);
72
73	static	int					_CompareMoveInfoPosition(const void* _a,
74									const void* _b);
75
76private:
77			struct MoveInfo;
78			struct PartitionRefInfo;
79
80			BDiskDevice*		fDevice;
81			DiskDeviceJobQueue*	fJobQueue;
82			MoveInfo*			fMoveInfos;
83			int32				fPartitionCount;
84			PartitionRefInfo*	fPartitionRefs;
85			PartitionReference** fContentsToMove;
86			int32				fContentsToMoveCount;
87};
88
89
90}	// namespace BPrivate
91
92using BPrivate::DiskDeviceJobGenerator;
93
94#endif	// _DISK_DEVICE_JOB_GENERATOR_H
95