xref: /haiku/src/system/boot/loader/file_systems/fat/Stream.h (revision 820dca4df6c7bf955c46e8f6521b9408f50b2900)
1 /*
2  * Copyright 2008, Haiku, Inc.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		François Revol <revol@free.fr>
7  */
8 #ifndef STREAM_H
9 #define STREAM_H
10 
11 #include "fatfs.h"
12 #include "Volume.h"
13 
14 #include <sys/stat.h>
15 
16 #define CLUSTER_MAP_CACHE_SIZE 50
17 
18 class Node;
19 
20 struct file_map_run;
21 
22 namespace FATFS {
23 
24 class Stream {
25 	public:
26 		Stream(Volume &volume, uint32 chain, off_t size, const char *name);
27 		~Stream();
28 
29 		status_t InitCheck();
30 		Volume &GetVolume() const { return fVolume; }
31 
32 		status_t GetName(char *nameBuffer, size_t bufferSize) const;
33 		status_t GetFileMap(struct file_map_run *runs, int32 *count);
34 		off_t	Size() const { return fSize; }
35 		uint32	FirstCluster() const { return fFirstCluster; }
36 
37 		void	SetSize(off_t size)		{ fSize = size; }
38 
39 		status_t ReadAt(off_t pos, void *buffer, size_t *length,
40 					off_t *diskOffset = NULL);
41 		status_t WriteAt(off_t pos, const void *buffer, size_t *length,
42 					off_t *diskOffset = NULL);
43 
44 	private:
45 		status_t		BuildClusterList();
46 		status_t		_FindCluster(off_t pos, uint32& _cluster);
47 		status_t		_FindOrCreateCluster(off_t pos, uint32& _cluster,
48 							bool& _added);
49 		status_t		FindBlock(off_t pos, off_t &block, off_t &offset);
50 
51 		Volume			&fVolume;
52 		uint32			fFirstCluster;
53 		uint32			fClusterCount;
54 		//uint32			*fClusters; // [fClusterCount]
55 		struct {
56 			off_t block;
57 			uint32 cluster;
58 		}			fClusterMapCache[CLUSTER_MAP_CACHE_SIZE];
59 		int			fClusterMapCacheLast;
60 		off_t			fSize;
61 		// we cache the name here, since FAT doesn't have inodes,
62 		// let alone names inside.
63 		char			fName[FATFS_NAME_LENGTH+1];
64 };
65 
66 }	// namespace FATFS
67 
68 #endif	/* STREAM_H */
69