]> code.delx.au - pymsnt/blob - src/utils.py
Reimport and tags (0.10.1)
[pymsnt] / src / utils.py
1 # Copyright 2004-2005 James Bunton <james@delx.cjb.net>
2 # Licensed for distribution under the GPL version 2, check COPYING for details
3
4 def mutilateMe(me):
5 """ Mutilates a class :) """
6 # for key in dir(me):
7 # exec "me." + key + " = None"
8
9 def getLang(el):
10 return el.getAttribute((u'http://www.w3.org/XML/1998/namespace', u'lang'))
11
12
13 import random
14 def random_guid():
15 format = "{%4X%4X-%4X-%4X-%4X-%4X%4X%4X}"
16 data = []
17 for x in xrange(8):
18 data.append(random.random() * 0xAAFF + 0x1111)
19 data = tuple(data)
20
21 return format % data
22
23
24 import base64
25 def b64enc(s):
26 return base64.encodestring(s).replace('\n', '')
27
28 def b64dec(s):
29 return base64.decodestring(s)
30
31 try:
32 import Image
33 import StringIO
34
35 def convertToPNG(imageData):
36 inbuff = StringIO.StringIO(imageData)
37 outbuff = StringIO.StringIO()
38 Image.open(inbuff).save(outbuff, "PNG")
39 outbuff.seek(0)
40 imageData = outbuff.read()
41 return imageData
42 except ImportError:
43 print "WARNING! Only PNG avatars will be understood by this transport. Please install the Python Imaging Library."
44
45 def convertToPNG(imageData):
46 return ""
47
48
49 errorCodeMap = {
50 "bad-request" : 400,
51 "conflict" : 409,
52 "feature-not-implemented" : 501,
53 "forbidden" : 403,
54 "gone" : 302,
55 "internal-server-error" : 500,
56 "item-not-found" : 404,
57 "jid-malformed" : 400,
58 "not-acceptable" : 406,
59 "not-allowed" : 405,
60 "not-authorized" : 401,
61 "payment-required" : 402,
62 "recipient-unavailable" : 404,
63 "redirect" : 302,
64 "registration-required" : 407,
65 "remote-server-not-found" : 404,
66 "remote-server-timeout" : 504,
67 "resource-constraint" : 500,
68 "service-unavailable" : 503,
69 "subscription-required" : 407,
70 "undefined-condition" : 500,
71 "unexpected-request" : 400
72 }
73
74
75 def parseText(text, beExtremelyLenient=False):
76 t = TextParser(beExtremelyLenient)
77 t.parseString(text)
78 return t.root
79
80 def parseFile(filename, beExtremelyLenient=False):
81 t = TextParser(beExtremelyLenient)
82 t.parseFile(filename)
83 return t.root
84
85
86 checkTwistedCached = None
87 def checkTwisted():
88 """ Returns False if we're using an old version that needs tlib, otherwise returns True """
89 global checkTwistedCached
90 if checkTwistedCached == None:
91 import twisted.copyright
92 checkTwistedCached = (VersionNumber(twisted.copyright.version) >= VersionNumber("2.0.0"))
93 return checkTwistedCached
94
95 class VersionNumber:
96 def __init__(self, vstring):
97 self.varray = [0]
98 index = 0
99 flag = True
100 for c in vstring:
101 if c == '.':
102 self.varray.append(0)
103 index += 1
104 flag = True
105 elif c.isdigit() and flag:
106 self.varray[index] *= 10
107 self.varray[index] += int(c)
108 else:
109 flag = False
110
111 def __cmp__(self, other):
112 i = 0
113 while(True):
114 if i == len(other.varray):
115 if i < len(self.varray):
116 return 1
117 else:
118 return 0
119 if i == len(self.varray):
120 if i < len(other.varray):
121 return -1
122 else:
123 return 0
124
125 if self.varray[i] > other.varray[i]:
126 return 1
127 elif self.varray[i] < other.varray[i]:
128 return -1
129
130 i += 1
131
132
133 if checkTwisted():
134 from twisted.xish.domish import SuxElementStream
135 else:
136 from tlib.domish import SuxElementStream
137 class TextParser:
138 """ Taken from http://xoomer.virgilio.it/dialtone/rsschannel.py """
139
140 def __init__(self, beExtremelyLenient=False):
141 self.root = None
142 self.beExtremelyLenient = beExtremelyLenient
143
144 def parseFile(self, filename):
145 return self.parseString(file(filename).read())
146
147 def parseString(self, data):
148 es = SuxElementStream()
149 es.beExtremelyLenient = self.beExtremelyLenient
150 es.DocumentStartEvent = self.docStart
151 es.DocumentEndEvent = self.docEnd
152 es.ElementEvent = self.element
153 es.parse(data)
154 return self.root
155
156 def docStart(self, e):
157 self.root = e
158
159 def docEnd(self):
160 pass
161
162 def element(self, e):
163 self.root.addChild(e)
164
165
166
167 class RollingStack:
168 def __init__(self, size):
169 self.lst = []
170 self.size = size
171
172 def push(self, data):
173 self.lst.append(str(data))
174 if len(self.lst) > self.size:
175 self.lst.remove(self.lst[0])
176
177 def grabAll(self):
178 return "".join(self.lst)
179
180 def flush(self):
181 self.lst = []
182
183