12345678910111213141516171819202122232425262728293031323334353637383940 |
- use std::io::{Read, Seek, SeekFrom, Result};
- pub struct Subfile<T: Read + Seek> {
- stream: T,
- offset: u64
- }
- impl <T: Read + Seek> Subfile<T> {
- pub fn new(mut stream: T, offset: u64) -> Subfile<T> {
- stream.seek(SeekFrom::Start(offset)).unwrap();
- Subfile {
- stream: stream,
- offset: offset
- }
- }
- }
- impl <T: Read + Seek> Read for Subfile<T> {
- fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
- self.stream.read(buf)
- }
- }
- impl <T: Read + Seek> Seek for Subfile<T> {
- fn seek(&mut self, mut pos: SeekFrom) -> Result<u64> {
- pos = match pos {
- SeekFrom::Start(offset) => SeekFrom::Start(offset + self.offset),
- x => x
- };
- let newpos = try!(self.stream.seek(pos));
- if newpos > self.offset {
- return Ok(newpos - self.offset)
- } else {
- return Ok(0)
- }
- }
- }
|