1/*
2 * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2019, Haiku, Inc.
4 * All rights reserved. Distributed under the terms of the MIT license.
5 */
6#ifndef DATA_CONTAINER_H
7#define DATA_CONTAINER_H
8
9#include <OS.h>
10
11struct vm_page;
12class VMCache;
13class AllocationInfo;
14class Volume;
15
16class DataContainer {
17public:
18	DataContainer(Volume *volume);
19	virtual ~DataContainer();
20
21	status_t InitCheck() const;
22
23	Volume *GetVolume() const	{ return fVolume; }
24
25	status_t Resize(off_t newSize);
26	off_t GetSize() const { return fSize; }
27
28	VMCache* GetCache();
29
30	virtual status_t ReadAt(off_t offset, void *buffer, size_t size,
31							size_t *bytesRead);
32	virtual status_t WriteAt(off_t offset, const void *buffer, size_t size,
33							 size_t *bytesWritten);
34
35	// debugging
36	void GetAllocationInfo(AllocationInfo &info);
37
38private:
39	inline bool _RequiresCacheMode(size_t size);
40	inline bool _IsCacheMode() const;
41	status_t _SwitchToCacheMode();
42	void _GetPages(off_t offset, off_t length, bool isWrite, vm_page** pages);
43	void _PutPages(off_t offset, off_t length, vm_page** pages, bool success);
44	status_t _DoCacheIO(const off_t offset, uint8* buffer, ssize_t length,
45		size_t* bytesProcessed, bool isWrite);
46
47	inline int32 _CountBlocks() const;
48
49private:
50	Volume				*fVolume;
51	off_t				fSize;
52	VMCache*			fCache;
53
54	uint8*				fSmallBuffer;
55	off_t				fSmallBufferSize;
56};
57
58#endif	// DATA_CONTAINER_H
59