summaryrefslogtreecommitdiffstats
path: root/Lib/chunk.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1999-06-16 12:25:34 (GMT)
committerGuido van Rossum <guido@python.org>1999-06-16 12:25:34 (GMT)
commit7bb11d68bf12010a9a6d5074cc0f05e46d1cf517 (patch)
treee985092aaba07046c76690d82bd59deca7f3aa11 /Lib/chunk.py
parentf2f059458792a4ebf80f0adb7e97823e51e697a9 (diff)
downloadcpython-7bb11d68bf12010a9a6d5074cc0f05e46d1cf517.zip
cpython-7bb11d68bf12010a9a6d5074cc0f05e46d1cf517.tar.gz
cpython-7bb11d68bf12010a9a6d5074cc0f05e46d1cf517.tar.bz2
Sjoerd Mullender:
Added support for unseekable files. (I use unqualified excepts since we don't know why the seek/tell might fail. In my case it was because of an AttributeError.)
Diffstat (limited to 'Lib/chunk.py')
-rw-r--r--Lib/chunk.py32
1 files changed, 24 insertions, 8 deletions
diff --git a/Lib/chunk.py b/Lib/chunk.py
index 320339e..4105f31 100644
--- a/Lib/chunk.py
+++ b/Lib/chunk.py
@@ -63,7 +63,12 @@ class Chunk:
raise EOFError
self.chunksize = self.chunksize - 8 # subtract header
self.size_read = 0
- self.offset = self.file.tell()
+ try:
+ self.offset = self.file.tell()
+ except:
+ self.seekable = 0
+ else:
+ self.seekable = 1
def getname(self):
"""Return the name (ID) of the current chunk."""
@@ -87,6 +92,8 @@ class Chunk:
if self.closed:
raise ValueError, "I/O operation on closed file"
+ if not self.seekable:
+ raise IOError, "cannot seek"
if mode == 1:
pos = pos + self.size_read
elif mode == 2:
@@ -133,11 +140,20 @@ class Chunk:
if self.closed:
raise ValueError, "I/O operation on closed file"
- try:
- self.file.seek(self.chunksize - self.size_read, 1)
- except RuntimeError:
- while self.size_read < self.chunksize:
- dummy = self.read(8192)
- if not dummy:
- raise EOFError
+ if self.seekable:
+ try:
+ n = self.chunksize - self.size_read
+ # maybe fix alignment
+ if self.align and (self.chunksize & 1):
+ n = n + 1
+ self.file.seek(n, 1)
+ self.size_read = self.size_read + n
+ return
+ except:
+ pass
+ while self.size_read < self.chunksize:
+ n = min(8192, self.chunksize - self.size_read)
+ dummy = self.read(n)
+ if not dummy:
+ raise EOFError