Package spoon :: Module spoonstream
[hide private]
[frames] | no frames]

Source Code for Module spoon.spoonstream

 1  # 
 2  # Copyright (C) 2006, Matt Sullivan <matts@zarrf.com> 
 3  # 
 4  # Permission is hereby granted, free of charge, to any person obtaining 
 5  # a copy of this software and associated documentation files (the 
 6  # "Software"), to deal in the Software without restriction, including 
 7  # without limitation the rights to use, copy, modify, merge, publish, 
 8  # distribute, sublicense, and/or sell copies of the Software, and to 
 9  # permit persons to whom the Software is furnished to do so, subject to 
10  # the following conditions: 
11  #  
12  # The above copyright notice and this permission notice shall be included 
13  # in all copies or substantial portions of the Software. 
14  #  
15  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
16  # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
17  # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
18  # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
19  # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
20  # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
21  # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
22  # 
23   
24  import ber 
25  import StringIO 
26  import zlib 
27   
28 -class SocketFile (object):
29 """ 30 Simple wrapper around a socket like object that pretends to be a file. 31 Albeit one that can't seek or tell for obvious reasons. 32 """
33 - def __init__(self, sock):
34 self.sock = sock
35
36 - def read(self, cnt=1):
37 return self.sock.recv(cnt)
38
39 - def write(self, data):
40 return self.sock.send(data)
41
42 - def close(self):
43 self.sock.close()
44
45 -class SpoonStream (object):
46 """ 47 SpoonStream implements an object stream. 48 This will take either a file like object or a socket like object 49 """
50 - def __init__(self, fd, compress=False):
51 self.compress = compress 52 self.realfd = fd 53 if hasattr(fd, "write") and hasattr(fd, "read"): 54 self.fd = fd 55 else: 56 self.fd = SocketFile(fd) 57 self.buffer = StringIO.StringIO()
58
59 - def read(self, cnt=None):
60 return ber.BERStream(self.fd).next()
61
62 - def recv(self, cnt=None):
63 return self.read()
64
65 - def write(self, obj):
66 ber.BERStream(self.buffer).add(obj, self.compress) 67 self.fd.write(self.buffer.getvalue()) 68 self.buffer.truncate(0)
69
70 - def send(self, obj):
71 self.write(obj)
72
73 - def close(self):
74 self.realfd.close()
75