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