From 6e690ee98dc263d9fff72aafb7cfd1a00d8aafea Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Tue, 18 Apr 2017 17:18:08 -0500 Subject: [PATCH] Add support for reading from FileStore by type --- src/ox/fs/filestore.hpp | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/ox/fs/filestore.hpp b/src/ox/fs/filestore.hpp index c309f50bc..f21512fb2 100644 --- a/src/ox/fs/filestore.hpp +++ b/src/ox/fs/filestore.hpp @@ -202,6 +202,21 @@ class FileStore { typename Header::FsSize_t readSize, void *data, typename Header::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, typename Header::FsSize_t readStart, + typename Header::FsSize_t readSize, T *data, + typename Header::FsSize_t *size); + /** * Reads the stat information of the inode of the given inode id. * If the returned inode id is 0, then the requested inode was not found. @@ -266,8 +281,9 @@ class FileStore { * @param size pointer to a value that will be assigned the size of data * @return 0 if read is a success */ + template int read(Inode *inode, typename Header::FsSize_t readStart, - typename Header::FsSize_t readSize, void *data, + typename Header::FsSize_t readSize, T *data, typename Header::FsSize_t *size); /** @@ -568,19 +584,28 @@ void FileStore
::updateInodeAddress(InodeId_t id, typename Header::FsSize template int FileStore
::read(InodeId_t id, void *data, typename Header::FsSize_t *size) { auto inode = getInode(ptr(m_header.getRootInode()), id); - return inode ? read(inode, 0, inode->getDataLen(), data, size) : 1; + return inode ? read(inode, 0, inode->getDataLen(), (uint8_t*) data, size) : 1; } template int FileStore
::read(InodeId_t id, typename Header::FsSize_t readStart, typename Header::FsSize_t readSize, void *data, typename Header::FsSize_t *size) { auto inode = getInode(ptr(m_header.getRootInode()), id); + return inode ? read(inode, readStart, readSize, (uint8_t*) data, size) : 1; +} + +template +template +int FileStore
::read(InodeId_t id, typename Header::FsSize_t readStart, + typename Header::FsSize_t readSize, T *data, typename Header::FsSize_t *size) { + auto inode = getInode(ptr(m_header.getRootInode()), id); return inode ? read(inode, readStart, readSize, data, size) : 1; } template +template int FileStore
::read(Inode *inode, typename Header::FsSize_t readStart, - typename Header::FsSize_t readSize, void *data, typename Header::FsSize_t *size) { + typename Header::FsSize_t readSize, T *data, typename Header::FsSize_t *size) { // be sure read size is not greater than what is available to read if (inode->getDataLen() - readStart < readSize) { readSize = inode->getDataLen() - readStart; @@ -588,7 +613,12 @@ int FileStore
::read(Inode *inode, typename Header::FsSize_t readStart, if (size) { *size = readSize; } - ox_memcpy(data, inode->getData() + readStart, readSize); + + readSize /= sizeof(T); + T *it = (T*) &(inode->getData()[readStart]); + for (typename Header::FsSize_t i = 0; i < readSize; i++) { + *(data++) = *(it++); + } return 0; }