1/*
2 * Copyright 2001-2010, Haiku Inc. All rights reserved.
3 * This file may be used under the terms of the MIT License.
4 *
5 * Authors:
6 *		Janito V. Ferreira Filho
7 */
8#ifndef DATASTREAM_H
9#define DATASTREAM_H
10
11
12#include "ext2.h"
13#include "Transaction.h"
14
15
16class Volume;
17
18
19class DataStream
20{
21public:
22					DataStream(Volume* volume, ext2_data_stream* stream,
23						off_t size);
24					~DataStream();
25
26	status_t		FindBlock(off_t offset, fsblock_t& block,
27						uint32 *_count = NULL);
28	status_t		Enlarge(Transaction& transaction, off_t& numBlocks);
29	status_t		Shrink(Transaction& transaction, off_t& numBlocks);
30
31private:
32	uint32			_BlocksNeeded(off_t end);
33
34	status_t		_GetBlock(Transaction& transaction, uint32& block);
35	status_t		_PrepareBlock(Transaction& transaction, uint32* pos,
36						uint32& blockNum, bool& clear);
37
38	status_t		_AddBlocks(Transaction& transaction, uint32* block,
39						off_t count);
40	status_t		_AddBlocks(Transaction& transaction, uint32* block,
41						off_t start, off_t end, int recursion);
42
43	status_t		_AddForDirectBlocks(Transaction& transaction,
44						uint32 numBlocks);
45	status_t		_AddForIndirectBlock(Transaction& transaction,
46						uint32 numBlocks);
47	status_t		_AddForDoubleIndirectBlock(Transaction& transaction,
48						uint32 numBlocks);
49	status_t		_AddForTripleIndirectBlock(Transaction& transaction,
50						uint32 numBlocks);
51
52	status_t		_PerformFree(Transaction& transaction);
53	status_t		_MarkBlockForRemoval(Transaction& transaction,
54						uint32* block);
55
56	status_t		_FreeBlocks(Transaction& transaction, uint32* block,
57						uint32 count);
58	status_t		_FreeBlocks(Transaction& transaction, uint32* block,
59						off_t start, off_t end, bool freeParent,
60						int recursion);
61
62	status_t		_RemoveFromDirectBlocks(Transaction& transaction,
63						uint32 numBlocks);
64	status_t		_RemoveFromIndirectBlock(Transaction& transaction,
65						uint32 numBlocks);
66	status_t		_RemoveFromDoubleIndirectBlock(Transaction& transaction,
67						uint32 numBlocks);
68	status_t		_RemoveFromTripleIndirectBlock(Transaction& transaction,
69						uint32 numBlocks);
70
71
72	const uint32	kBlockSize;
73	const uint32	kIndirectsPerBlock;
74	const uint32	kIndirectsPerBlock2;
75	const uint32	kIndirectsPerBlock3;
76
77	const uint32	kMaxDirect;
78	const uint32	kMaxIndirect;
79	const uint32	kMaxDoubleIndirect;
80
81	Volume*			fVolume;
82	ext2_data_stream* fStream;
83	uint32			fFirstBlock;
84
85	uint32			fAllocated;
86	fsblock_t		fAllocatedPos;
87	uint32			fWaiting;
88
89	uint32			fFreeStart;
90	uint32			fFreeCount;
91
92	off_t			fNumBlocks;
93	uint32			fRemovedBlocks;
94	off_t			fSize;
95};
96
97#endif	// DATASTREAM_H
98
99