xref: /haiku/src/system/boot/loader/file_systems/fat/Stream.h (revision 085cf27b40c06dc45f633f33c41258f32bec3a23)
12cf4975bSFrançois Revol /*
22cf4975bSFrançois Revol  * Copyright 2008, Haiku, Inc.
32cf4975bSFrançois Revol  * Distributed under the terms of the MIT License.
42cf4975bSFrançois Revol  *
52cf4975bSFrançois Revol  * Authors:
62cf4975bSFrançois Revol  *		François Revol <revol@free.fr>
72cf4975bSFrançois Revol  */
82cf4975bSFrançois Revol #ifndef STREAM_H
92cf4975bSFrançois Revol #define STREAM_H
102cf4975bSFrançois Revol 
112cf4975bSFrançois Revol #include "fatfs.h"
122cf4975bSFrançois Revol #include "Volume.h"
132cf4975bSFrançois Revol 
142cf4975bSFrançois Revol #include <sys/stat.h>
152cf4975bSFrançois Revol 
162cf4975bSFrançois Revol #define CLUSTER_MAP_CACHE_SIZE 50
172cf4975bSFrançois Revol 
182cf4975bSFrançois Revol class Node;
192cf4975bSFrançois Revol 
209da23568SFrançois Revol struct file_map_run;
212cf4975bSFrançois Revol 
222cf4975bSFrançois Revol namespace FATFS {
232cf4975bSFrançois Revol 
242cf4975bSFrançois Revol class Stream {
252cf4975bSFrançois Revol 	public:
262cf4975bSFrançois Revol 		Stream(Volume &volume, uint32 chain, off_t size, const char *name);
272cf4975bSFrançois Revol 		~Stream();
282cf4975bSFrançois Revol 
292cf4975bSFrançois Revol 		status_t InitCheck();
GetVolume()302cf4975bSFrançois Revol 		Volume &GetVolume() const { return fVolume; }
312cf4975bSFrançois Revol 
322cf4975bSFrançois Revol 		status_t GetName(char *nameBuffer, size_t bufferSize) const;
339da23568SFrançois Revol 		status_t GetFileMap(struct file_map_run *runs, int32 *count);
Size()342cf4975bSFrançois Revol 		off_t	Size() const { return fSize; }
FirstCluster()352cf4975bSFrançois Revol 		uint32	FirstCluster() const { return fFirstCluster; }
362cf4975bSFrançois Revol 
SetSize(off_t size)37*085cf27bSIngo Weinhold 		void	SetSize(off_t size)		{ fSize = size; }
38*085cf27bSIngo Weinhold 
39*085cf27bSIngo Weinhold 		status_t ReadAt(off_t pos, void *buffer, size_t *length,
40*085cf27bSIngo Weinhold 					off_t *diskOffset = NULL);
41*085cf27bSIngo Weinhold 		status_t WriteAt(off_t pos, const void *buffer, size_t *length,
42*085cf27bSIngo Weinhold 					off_t *diskOffset = NULL);
432cf4975bSFrançois Revol 
442cf4975bSFrançois Revol 	private:
452cf4975bSFrançois Revol 		status_t		BuildClusterList();
46*085cf27bSIngo Weinhold 		status_t		_FindCluster(off_t pos, uint32& _cluster);
47*085cf27bSIngo Weinhold 		status_t		_FindOrCreateCluster(off_t pos, uint32& _cluster,
48*085cf27bSIngo Weinhold 							bool& _added);
492cf4975bSFrançois Revol 		status_t		FindBlock(off_t pos, off_t &block, off_t &offset);
50*085cf27bSIngo Weinhold 
512cf4975bSFrançois Revol 		Volume			&fVolume;
522cf4975bSFrançois Revol 		uint32			fFirstCluster;
532cf4975bSFrançois Revol 		uint32			fClusterCount;
542cf4975bSFrançois Revol 		//uint32			*fClusters; // [fClusterCount]
552cf4975bSFrançois Revol 		struct {
562cf4975bSFrançois Revol 			off_t block;
572cf4975bSFrançois Revol 			uint32 cluster;
582cf4975bSFrançois Revol 		}			fClusterMapCache[CLUSTER_MAP_CACHE_SIZE];
592cf4975bSFrançois Revol 		int			fClusterMapCacheLast;
602cf4975bSFrançois Revol 		off_t			fSize;
612cf4975bSFrançois Revol 		// we cache the name here, since FAT doesn't have inodes,
622cf4975bSFrançois Revol 		// let alone names inside.
632cf4975bSFrançois Revol 		char			fName[FATFS_NAME_LENGTH+1];
642cf4975bSFrançois Revol };
652cf4975bSFrançois Revol 
662cf4975bSFrançois Revol }	// namespace FATFS
672cf4975bSFrançois Revol 
682cf4975bSFrançois Revol #endif	/* STREAM_H */
69