writable vfs

This commit is contained in:
David Rose 2011-09-17 00:41:06 +00:00
parent 278bc55d62
commit 703271d15d

View File

@ -91,60 +91,55 @@ class file:
# Actually open the streams. # Actually open the streams.
if mode == 'w': if mode == 'w':
self.__stream = pm.OFileStream() self.__stream = _vfs.openWriteFile(filename, autoUnwrap, True)
if not filename.openWrite(self.__stream, True): if not self.__stream:
message = 'Could not open %s for writing' % (filename) message = 'Could not open %s for writing' % (filename)
raise IOError, message raise IOError, message
writeMode = True writeMode = True
elif mode == 'a': elif mode == 'a':
self.__stream = pm.OFileStream() self.__stream = _vfs.openAppendFile(filename)
if not filename.openAppend(self.__stream): if not self.__stream:
message = 'Could not open %s for writing' % (filename) message = 'Could not open %s for writing' % (filename)
raise IOError, message raise IOError, message
writeMode = True writeMode = True
elif mode == 'w+': elif mode == 'w+':
self.__stream = pm.FileStream() self.__stream = _vfs.openReadWriteFile(filename, True)
if not filename.openReadWrite(self.__stream, True): if not self.__stream:
message = 'Could not open %s for writing' % (filename) message = 'Could not open %s for writing' % (filename)
raise IOError, message raise IOError, message
readMode = True readMode = True
writeMode = True writeMode = True
elif mode == 'a+': elif mode == 'a+':
self.__stream = pm.FileStream() self.__stream = _vfs.openReadAppendFile(filename)
if not filename.openReadAppend(self.__stream): if not self.__stream:
message = 'Could not open %s for writing' % (filename) message = 'Could not open %s for writing' % (filename)
raise IOError, message raise IOError, message
readMode = True readMode = True
writeMode = True writeMode = True
elif mode == 'r+': elif mode == 'r+':
self.__stream = pm.FileStream() self.__stream = _vfs.openReadWriteFile(filename, False)
if not filename.exists(): if not self.__stream:
message = 'No such file: %s' % (filename)
raise IOError, message
if not filename.openReadWrite(self.__stream, False):
message = 'Could not open %s for writing' % (filename) message = 'Could not open %s for writing' % (filename)
raise IOError, message raise IOError, message
readMode = True readMode = True
writeMode = True writeMode = True
elif mode == 'r': elif mode == 'r':
# For strictly read mode (not write or read-write
# mode), we use Panda's VirtualFileSystem.
self.__stream = _vfs.openReadFile(filename, autoUnwrap) self.__stream = _vfs.openReadFile(filename, autoUnwrap)
if not self.__stream: if not self.__stream:
if not filename.exists(): if not _vfs.exists(filename):
message = 'No such file: %s' % (filename) message = 'No such file: %s' % (filename)
else: else:
message = 'Could not open %s for reading' % (filename) message = 'Could not open %s for reading' % (filename)
raise IOError, message raise IOError, message
self.__needsVfsClose = True
readMode = True readMode = True
self.__needsVfsClose = True
if readMode: if readMode:
self.__reader = pm.StreamReader(self.__stream, False) self.__reader = pm.StreamReader(self.__stream, False)
if writeMode: if writeMode:
@ -156,7 +151,13 @@ class file:
def close(self): def close(self):
if self.__needsVfsClose: if self.__needsVfsClose:
if self.__reader and self.__writer:
_vfs.closeReadWriteFile(self.__stream)
elif self.__reader:
_vfs.closeReadFile(self.__stream) _vfs.closeReadFile(self.__stream)
else: # self.__writer:
_vfs.closeWriteFile(self.__stream)
self.__needsVfsClose = False self.__needsVfsClose = False
self.__stream = None self.__stream = None
self.__needsVfsClose = False self.__needsVfsClose = False
@ -165,6 +166,7 @@ class file:
def flush(self): def flush(self):
if self.__stream: if self.__stream:
self.__stream.clear() # clear eof flag
self.__stream.flush() self.__stream.flush()
def __iter__(self): def __iter__(self):
@ -186,9 +188,10 @@ class file:
message = 'Attempt to read from write-only stream' message = 'Attempt to read from write-only stream'
raise IOError, message raise IOError, message
self.__stream.clear() # clear eof flag
self.__lastWrite = False self.__lastWrite = False
if size >= 0: if size >= 0:
return self.__reader.extractBytes(size) result = self.__reader.extractBytes(size)
else: else:
# Read to end-of-file. # Read to end-of-file.
result = '' result = ''
@ -206,6 +209,7 @@ class file:
message = 'Attempt to read from write-only stream' message = 'Attempt to read from write-only stream'
raise IOError, message raise IOError, message
self.__stream.clear() # clear eof flag
self.__lastWrite = False self.__lastWrite = False
return self.__reader.readline() return self.__reader.readline()
@ -220,6 +224,8 @@ class file:
xreadlines = readlines xreadlines = readlines
def seek(self, offset, whence = 0): def seek(self, offset, whence = 0):
if self.__stream:
self.__stream.clear() # clear eof flag
if self.__reader: if self.__reader:
self.__stream.seekg(offset, whence) self.__stream.seekg(offset, whence)
if self.__writer: if self.__writer:
@ -249,6 +255,8 @@ class file:
# The stream is open only in read mode. # The stream is open only in read mode.
message = 'Attempt to write to read-only stream' message = 'Attempt to write to read-only stream'
raise IOError, message raise IOError, message
self.__stream.clear() # clear eof flag
self.__writer.appendData(str) self.__writer.appendData(str)
self.__lastWrite = True self.__lastWrite = True
@ -261,6 +269,8 @@ class file:
# The stream is open only in read mode. # The stream is open only in read mode.
message = 'Attempt to write to read-only stream' message = 'Attempt to write to read-only stream'
raise IOError, message raise IOError, message
self.__stream.clear() # clear eof flag
for line in lines: for line in lines:
self.__writer.appendData(line) self.__writer.appendData(line)
self.__lastWrite = True self.__lastWrite = True