core/io: hopefully fix BoundedFileReader::read_buf_some() for good
[nihav.git] / nihav-core / src / io / byteio.rs
index a194e657678dd12cbcf88ad9a383bc18cdb5de2f..0ff54cb13ed9321e31f794dbea03e8365d53dc39 100644 (file)
@@ -557,6 +557,12 @@ impl<T: Read+Seek> FileReader<T> {
     pub fn new_read(file: T) -> Self {
         FileReader { file: Box::new(file), eof : false }
     }
+    /// Constructs a new instance of `FileReader` using a boxed resource.
+    pub fn new_read_boxed(file: Box<T>) -> Self {
+        FileReader { file, eof : false }
+    }
+    /// Destroys the reader and releases the reader resource for a further use.
+    pub fn finish(self) -> Box<T> { self.file }
 }
 
 impl<T: Read+Seek> ByteIO for FileReader<T> {
@@ -594,8 +600,11 @@ impl<T: Read+Seek> ByteIO for FileReader<T> {
         if ret.is_err() { return Err(ByteIOError::ReadError); }
         let sz = ret.unwrap();
         if sz < buf.len() {
-            if let Err(_err) = self.file.read(&mut buf[sz..][..1]) {
+            if let Err(_err) = self.file.read_exact(&mut buf[sz..][..1]) {
                 self.eof = true;
+                if sz == 0 {
+                    return Err(ByteIOError::EOF);
+                }
             } else {
                 return Ok(sz + 1);
             }
@@ -708,6 +717,12 @@ impl<T: Read+Seek> ByteIO for BoundedFileReader<T> {
     }
 
     fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
+        if let Some(epos) = self.end {
+            if self.real_tell() >= epos {
+                self.eof = true;
+                return Err(ByteIOError::EOF);
+            }
+        }
         let len = self.max_read_len(buf.len());
         match self.file.read_exact(&mut buf[..len]) {
             Ok(()) if len == buf.len() => Ok(buf.len()),
@@ -727,16 +742,24 @@ impl<T: Read+Seek> ByteIO for BoundedFileReader<T> {
     }
 
     fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
+        if let Some(epos) = self.end {
+            if self.real_tell() >= epos {
+                self.eof = true;
+                return Err(ByteIOError::EOF);
+            }
+        }
         let len = self.max_read_len(buf.len());
         let ret = self.file.read(&mut buf[..len]);
         if ret.is_err() { return Err(ByteIOError::ReadError); }
         let sz = ret.unwrap();
         if sz < len {
-            if let Err(_err) = self.file.read(&mut buf[sz..][..1]) {
-                self.eof = true;
-            } else {
+            if let Ok(1) = self.file.read(&mut buf[sz..][..1]) {
                 return Ok(sz + 1);
             }
+            self.eof = true;
+            if sz == 0 {
+                return Err(ByteIOError::EOF);
+            }
         }
         Ok(sz)
     }