|
|
# Simple read() method around a bytearray
|
|
|
|
|
|
class BytesBuffer():
|
|
|
|
def __init__(self, b):
|
|
self.buf = b
|
|
self.readCount = 0
|
|
|
|
def count(self):
|
|
return self.readCount
|
|
|
|
def reset_count(self):
|
|
self.readCount = 0
|
|
|
|
def size(self):
|
|
return len(self.buf)
|
|
|
|
def peek(self):
|
|
return self.buf[0]
|
|
|
|
def write(self, b):
|
|
# b should be castable to byte array
|
|
self.buf += bytearray(b)
|
|
|
|
def read(self, n):
|
|
if len(self.buf) < n:
|
|
print "reader err: buf less than n"
|
|
# TODO: exception
|
|
return
|
|
self.readCount += n
|
|
r = self.buf[:n]
|
|
self.buf = self.buf[n:]
|
|
return r
|
|
|
|
# Buffer bytes off a tcp connection and read them off in chunks
|
|
|
|
|
|
class ConnReader():
|
|
|
|
def __init__(self, conn):
|
|
self.conn = conn
|
|
self.buf = bytearray()
|
|
|
|
# blocking
|
|
def read(self, n):
|
|
while n > len(self.buf):
|
|
moreBuf = self.conn.recv(1024)
|
|
if not moreBuf:
|
|
raise IOError("dead connection")
|
|
self.buf = self.buf + bytearray(moreBuf)
|
|
|
|
r = self.buf[:n]
|
|
self.buf = self.buf[n:]
|
|
return r
|