diff --git a/src/services/fs.rs b/src/services/fs.rs index 688341e..ac84667 100644 --- a/src/services/fs.rs +++ b/src/services/fs.rs @@ -53,6 +53,7 @@ pub struct Archive { pub struct File { handle: u32, + offset: u64, } pub struct OpenOptions { @@ -111,6 +112,41 @@ impl Archive { } } +impl File { + pub fn len(&self) -> Result { + unsafe { + let mut len = 0; + let r = FSFILE_GetSize(self.handle, &mut len); + if r < 0 { + Err(r) + } else { + Ok(len) + } + } + } + + pub fn read(&mut self, buf: &mut [u8]) -> Result { + unsafe { + let mut n_read = 0; + let r = FSFILE_Read( + self.handle, + &mut n_read, + self.offset, + buf.as_mut_ptr() as _, + buf.len() as u32 + ); + + self.offset += n_read as u64; + + if r < 0 { + Err(r) + } else { + Ok(n_read) + } + } + } +} + impl OpenOptions { pub fn read(&mut self, read: bool) -> &mut OpenOptions { self.read = read; @@ -140,7 +176,10 @@ impl OpenOptions { if ret < 0 { Err(ret) } else { - Ok(File { handle: file_handle }) + Ok(File { + handle: file_handle, + offset: 0, + }) } } }