libDaisy
Hardware Library for Daisy
Loading...
Searching...
No Matches
FileReader.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef FILEIO_ENABLE_FATFS_READER
4#include "ff.h"
5#endif
6#ifdef FILEIO_ENABLE_CSTDIO_READER
7#include <cstdio>
8#endif
9
10namespace daisy
11{
12// Abstract reader interface (minimal). Provide concrete implementation for
13// platform.
15{
16 public:
17 virtual ~IReader() = default;
18 virtual size_t read(void* dst,
19 size_t bytes)
20 = 0; // returns bytes actually read
21 virtual bool seek(uint32_t pos) = 0; // absolute seek from start
22 virtual uint32_t position() const = 0; // current absolute position
23 virtual uint32_t size() const = 0; // total size if known (0 if unknown)
24};
25
26#ifdef FILEIO_ENABLE_FATFS_READER
27class FileReader : public IReader
28{
29 public:
30 explicit FileReader(FIL* f) : f_(f)
31 {
32 if(f_)
33 {
34 size_ = static_cast<uint32_t>(f_size(f_));
35 f_rewind(f_);
36 }
37 }
38 size_t read(void* dst, size_t bytes) override
39 {
43 UINT br = 0;
44 f_read(f_, dst, bytes, &br);
45 return br;
46 }
47 bool seek(uint32_t pos) override
48 {
49 return f_lseek(f_, static_cast<FSIZE_t>(pos)) == FR_OK;
50 }
51 uint32_t position() const override
52 {
53 long p = f_tell(f_);
54 return p < 0 ? 0u : static_cast<uint32_t>(p);
55 }
56 uint32_t size() const override { return size_; }
57
58 private:
59 FIL* f_ = nullptr;
60 uint32_t size_ = 0;
61};
62#endif
63
64#ifdef FILEIO_ENABLE_CSTDIO_READER
65class FileReader : public IReader
66{
67 public:
68 explicit FileReader(FILE* f) : f_(f)
69 {
70 if(f_)
71 {
72 long pos = ftell(f_);
73 if(pos < 0)
74 pos = 0;
75 if(fseek(f_, 0, SEEK_END) == 0)
76 {
77 long end = ftell(f_);
78 if(end > 0)
79 size_ = static_cast<uint32_t>(end);
80 }
81 fseek(f_, pos, SEEK_SET);
82 }
83 }
84 size_t read(void* dst, size_t bytes) override
85 {
86 return fread(dst, 1, bytes, f_);
87 }
88 bool seek(uint32_t pos) override
89 {
90 return fseek(f_, static_cast<long>(pos), SEEK_SET) == 0;
91 }
92 uint32_t position() const override
93 {
94 long p = ftell(f_);
95 return p < 0 ? 0u : static_cast<uint32_t>(p);
96 }
97 uint32_t size() const override { return size_; }
98
99 private:
100 FILE* f_ = nullptr;
101 uint32_t size_ = 0;
102};
103#endif
104
105} // namespace daisy
Definition FileReader.h:15
virtual uint32_t size() const =0
virtual uint32_t position() const =0
virtual ~IReader()=default
virtual size_t read(void *dst, size_t bytes)=0
virtual bool seek(uint32_t pos)=0
Hardware defines and helpers for daisy field platform.
Definition index.h:2