subfile.rs 927 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. use std::io::{Read, Seek, SeekFrom, Result};
  2. pub struct Subfile<T: Read + Seek> {
  3. stream: T,
  4. offset: u64
  5. }
  6. impl <T: Read + Seek> Subfile<T> {
  7. pub fn new(mut stream: T, offset: u64) -> Subfile<T> {
  8. stream.seek(SeekFrom::Start(offset)).unwrap();
  9. Subfile {
  10. stream: stream,
  11. offset: offset
  12. }
  13. }
  14. }
  15. impl <T: Read + Seek> Read for Subfile<T> {
  16. fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
  17. self.stream.read(buf)
  18. }
  19. }
  20. impl <T: Read + Seek> Seek for Subfile<T> {
  21. fn seek(&mut self, mut pos: SeekFrom) -> Result<u64> {
  22. pos = match pos {
  23. SeekFrom::Start(offset) => SeekFrom::Start(offset + self.offset),
  24. x => x
  25. };
  26. let newpos = try!(self.stream.seek(pos));
  27. if newpos > self.offset {
  28. return Ok(newpos - self.offset)
  29. } else {
  30. return Ok(0)
  31. }
  32. }
  33. }