mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
writable vfs
This commit is contained in:
parent
278bc55d62
commit
703271d15d
@ -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:
|
||||||
_vfs.closeReadFile(self.__stream)
|
if self.__reader and self.__writer:
|
||||||
|
_vfs.closeReadWriteFile(self.__stream)
|
||||||
|
elif self.__reader:
|
||||||
|
_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,15 +188,16 @@ 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 = ''
|
||||||
while not self.__stream.eof():
|
while not self.__stream.eof():
|
||||||
result += self.__reader.extractBytes(1024)
|
result += self.__reader.extractBytes(1024)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def readline(self, size = -1):
|
def readline(self, size = -1):
|
||||||
if not self.__reader:
|
if not self.__reader:
|
||||||
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user