<< (i*
return result
def readBytesAsInt(self, numBytes) :
result = 0
bytes = self.readSignedBytes(numBytes)
if len(bytes) == numBytes :
for i in range(numBytes) :
result |= bytes<< (i*
return result
def skipPadding(self) :
result = 0
if self.bytesRead % 4 != 0 :
paddingLength = 4 - self.bytesRead % 4
self.readPlainBytes(paddingLength)
result = paddingLength
return result
class SISFileReader(SISReader) :
def __init__(self, inStream) :
self.inStream = inStream
self.eof = False
self.bytesRead = 0
def readPlainBytes(self, numBytes) :
if self.eof :
return ""
if numBytes == 0 :
return ""
buf = ""
buf = self.inStream.read(numBytes)
if len(buf) < numBytes :
self.eof = True
return ""
self.bytesRead += numBytes
return buf
def isEof(self) :
return self.eof
class SISBufferReader(SISReader) :
def __init__(self, buffer) :
self.buffer = buffer
self.bytesRead = 0
def readPlainBytes(self, numBytes) :
if self.isEof() :
return ""
if numBytes == 0 :
return ""
result = self.buffer[self.bytesRead:self.bytesRead+numBytes]
self.bytesRead += numBytes
return result
def isEof(self) :
return self.bytesRead >= len(self.buffer)
class SISFieldParser :
def __init__(self) :
self.lastReadBytes = 0
def parseField(self, fileReader) :
"""Reads the next field from the fileReader stream and returns it"""
field = None
self.lastReadBytes = 0
type = fileReader.readBytesAsUint(4)
self.lastReadBytes += 4
if type != 0 :
field = sisfields.SISFieldTypes[type]()
field.type = type
field.initFromFile(fileReader)
self.lastReadBytes += field.length + 4 # Field length + length field
self.lastReadBytes += fileReader.skipPadding()
return field