]> code.delx.au - pymsnt/blob - src/tlib/throttle.py
Handle MSN error conditions
[pymsnt] / src / tlib / throttle.py
1 from twisted.internet import task
2
3
4
5 class Throttler:
6 def __init__(self, consumer, speed):
7 self.consumer = consumer
8
9 self.buffer = ""
10 self.speed = speed # Bytes/second
11 self.canClose = False
12
13 self.loopTask = task.LoopingCall(self.loopFunc)
14 self.loopTask.start(1.0)
15
16 def write(self, data):
17 if not self.consumer:
18 raise ValueError, "I/O operation on closed 'file'"
19 self.buffer += data
20
21 def close(self):
22 self.canClose = True
23
24 def error(self):
25 self.consumer.error()
26 self.consumer = None
27 self.buffer = None
28 self.loopTask.stop()
29
30 def loopFunc(self):
31 if self.canClose and len(self.buffer) == 0:
32 self.consumer.close()
33 self.consumer = None
34 self.loopTask.stop()
35
36 else:
37 chunk, self.buffer = self.buffer[:self.speed], self.buffer[self.speed:]
38 self.consumer.write(chunk)
39
40
41