diff --git a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp index f7265a79..0c1f91fc 100644 --- a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp +++ b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp @@ -68,6 +68,21 @@ class FileStoreTemplate: public FileStore { Error read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size); + /** + * Reads the "file" at the given id. You are responsible for freeing + * the data when done with it. + * @param id id of the "file" + * @param readStart where in the data to start reading + * @param readSize how much data to read + * @param data pointer to the pointer where the data is stored + * @param size pointer to a value that will be assigned the size of data + * @return 0 if read is a success + */ + template + int read(InodeId_t id, FsSize_t readStart, + FsSize_t readSize, T *data, + FsSize_t *size); + StatInfo stat(InodeId_t id); InodeId_t spaceNeeded(FsSize_t size); @@ -236,6 +251,35 @@ Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, FsSize_t return 1; } +template +template +int FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, + FsSize_t readSize, T *data, FsSize_t *size) { + auto src = find(id); + if (src.valid()) { + auto srcData = src->data(); + if (srcData.valid()) { + auto sub = srcData.subPtr(readStart, readSize); + if (sub.valid() && sub.size() % sizeof(T)) { + for (FsSize_t i = 0; i < sub.size() / sizeof(T); i++) { + // do byte-by-byte copy to ensure alignment is right when + // copying to final destination + T tmp; + for (size_t i = 0; i < sizeof(T); i++) { + *reinterpret_cast(&tmp)[i] = *(reinterpret_cast(sub.get()) + i); + } + *(data + i) = tmp; + } + if (size) { + *size = sub.size(); + } + return 0; + } + } + } + return 1; +} + template typename FileStoreTemplate::StatInfo FileStoreTemplate::stat(InodeId_t id) { auto inode = find(id);