1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20   
 21   
 22  """A wrapper for cStringIO that provides more of the functions of StringIO at the speed of cStringIO""" 
 23   
 24  import cStringIO 
 25   
 28          if not isinstance(buf, (str, unicode)): 
 29              buf = str(buf) 
 30          if isinstance(buf, unicode): 
 31              buf = buf.encode('utf-8') 
 32          self.len = len(buf) 
 33          self.buf = cStringIO.StringIO() 
 34          self.buf.write(buf) 
 35          self.buf.seek(0) 
 36          self.pos = 0 
 37          self.closed = 0 
  38   
 41   
 43          if self.closed: 
 44              raise StopIteration 
 45          r = self.readline() 
 46          if not r: 
 47              raise StopIteration 
 48          return r 
  49   
 51          """Free the memory buffer. 
 52          """ 
 53          if not self.closed: 
 54              self.closed = 1 
 55              del self.buf, self.pos 
  56   
 58          if self.closed: 
 59              raise ValueError, "I/O operation on closed file" 
 60          return False 
  61   
 62 -    def seek(self, pos, mode = 0): 
  63          if self.closed: 
 64              raise ValueError, "I/O operation on closed file" 
 65          self.buf.seek(pos, mode) 
 66          self.pos = self.buf.tell() 
  67   
 69          if self.closed: 
 70              raise ValueError, "I/O operation on closed file" 
 71          return self.pos 
  72   
 73 -    def read(self, n = None): 
  74          if self.closed: 
 75              raise ValueError, "I/O operation on closed file" 
 76          if n == None: 
 77            r = self.buf.read() 
 78          else: 
 79            r = self.buf.read(n) 
 80          self.pos = self.buf.tell() 
 81          return r 
  82   
 84          if self.closed: 
 85              raise ValueError, "I/O operation on closed file" 
 86          if length is not None: 
 87              r = self.buf.readline(length) 
 88          else: 
 89              r = self.buf.readline(length) 
 90          self.pos = self.buf.tell() 
 91          return r 
  92   
 94          if self.closed: 
 95              raise ValueError, "I/O operation on closed file" 
 96          lines = self.buf.readlines() 
 97          self.pos = self.buf.tell() 
 98          return lines 
  99   
101          if self.closed: 
102              raise ValueError, "I/O operation on closed file" 
103          self.buf.truncate(size) 
104          self.pos = self.buf.tell() 
105          self.buf.seek(0, 2) 
106          self.len = self.buf.tell() 
107          self.buf.seek(self.pos) 
 108   
110          if self.closed: 
111              raise ValueError, "I/O operation on closed file" 
112          origpos = self.buf.tell() 
113          self.buf.write(s) 
114          self.pos = self.buf.tell() 
115          if origpos + len(s) > self.len: 
116            self.buf.seek(0, 2) 
117            self.len = self.buf.tell() 
118            self.buf.seek(self.pos) 
 119   
121          if self.closed: 
122              raise ValueError, "I/O operation on closed file" 
123          self.buf.writelines(lines) 
124          self.pos = self.buf.tell() 
125          self.buf.seek(0, 2) 
126          self.len = self.buf.tell() 
127          self.buf.seek(self.pos) 
 128   
130          if self.closed: 
131              raise ValueError, "I/O operation on closed file" 
132          self.buf.flush() 
 133   
135          if self.closed: 
136              raise ValueError, "I/O operation on closed file" 
137          return self.buf.getvalue() 
 140    """catches the output before it is closed and sends it to an onclose method""" 
142      """Set up the output stream, and remember a method to call on closing""" 
143      StringIO.__init__(self) 
144      self.onclose = onclose 
 145   
151   
153      """use this method to force the closing of the stream if it isn't closed yet""" 
154      if not self.closed: 
155        self.close() 
  156