]> code.delx.au - pymsnt/blob - src/utils.py
OOB file sending nearly done.
[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
5
6 def getLang(el):
7 return el.getAttribute((u'http://www.w3.org/XML/1998/namespace', u'lang'))
8
9
10 import sha
11 def socks5Hash(sid, initiator, target):
12 return sha.new("%s%s%s" % (sid, initiator, target)).hexdigest()
13
14
15 import urllib
16 import os.path
17 def getURLBits(url, assumedType=None):
18 type, rest = urllib.splittype(url)
19 if assumedType and type != assumedType:
20 return
21 hostport, path = urllib.splithost(rest)
22 host, port = urllib.splitnport(hostport, 80)
23 filename = os.path.basename(path)
24 return host, port, path, filename
25
26
27 try:
28 import Image
29 import StringIO
30
31 def convertToPNG(imageData):
32 inbuff = StringIO.StringIO(imageData)
33 outbuff = StringIO.StringIO()
34 Image.open(inbuff).save(outbuff, "PNG")
35 outbuff.seek(0)
36 imageData = outbuff.read()
37 return imageData
38 except ImportError:
39 print "WARNING! Only PNG avatars will be understood by this transport. Please install the Python Imaging Library."
40
41 def convertToPNG(imageData):
42 return ""
43
44
45 errorCodeMap = {
46 "bad-request" : 400,
47 "conflict" : 409,
48 "feature-not-implemented" : 501,
49 "forbidden" : 403,
50 "gone" : 302,
51 "internal-server-error" : 500,
52 "item-not-found" : 404,
53 "jid-malformed" : 400,
54 "not-acceptable" : 406,
55 "not-allowed" : 405,
56 "not-authorized" : 401,
57 "payment-required" : 402,
58 "recipient-unavailable" : 404,
59 "redirect" : 302,
60 "registration-required" : 407,
61 "remote-server-not-found" : 404,
62 "remote-server-timeout" : 504,
63 "resource-constraint" : 500,
64 "service-unavailable" : 503,
65 "subscription-required" : 407,
66 "undefined-condition" : 500,
67 "unexpected-request" : 400
68 }
69
70
71 def parseText(text, beExtremelyLenient=False):
72 t = TextParser(beExtremelyLenient)
73 t.parseString(text)
74 return t.root
75
76 def parseFile(filename, beExtremelyLenient=False):
77 t = TextParser(beExtremelyLenient)
78 t.parseFile(filename)
79 return t.root
80
81
82 checkTwistedCached = None
83 def checkTwisted():
84 """ Returns False if we're using an old version that needs tlib, otherwise returns True """
85 global checkTwistedCached
86 if checkTwistedCached == None:
87 import twisted.copyright
88 checkTwistedCached = (VersionNumber(twisted.copyright.version) >= VersionNumber("2.0.0"))
89 return checkTwistedCached
90
91 class VersionNumber:
92 def __init__(self, vstring):
93 self.varray = [0]
94 index = 0
95 flag = True
96 for c in vstring:
97 if c == '.':
98 self.varray.append(0)
99 index += 1
100 flag = True
101 elif c.isdigit() and flag:
102 self.varray[index] *= 10
103 self.varray[index] += int(c)
104 else:
105 flag = False
106
107 def __cmp__(self, other):
108 i = 0
109 while(True):
110 if i == len(other.varray):
111 if i < len(self.varray):
112 return 1
113 else:
114 return 0
115 if i == len(self.varray):
116 if i < len(other.varray):
117 return -1
118 else:
119 return 0
120
121 if self.varray[i] > other.varray[i]:
122 return 1
123 elif self.varray[i] < other.varray[i]:
124 return -1
125
126 i += 1
127
128
129 if checkTwisted():
130 from twisted.xish.domish import SuxElementStream
131 else:
132 from tlib.domish import SuxElementStream
133 class TextParser:
134 """ Taken from http://xoomer.virgilio.it/dialtone/rsschannel.py """
135
136 def __init__(self, beExtremelyLenient=False):
137 self.root = None
138 self.beExtremelyLenient = beExtremelyLenient
139
140 def parseFile(self, filename):
141 return self.parseString(file(filename).read())
142
143 def parseString(self, data):
144 es = SuxElementStream()
145 es.beExtremelyLenient = self.beExtremelyLenient
146 es.DocumentStartEvent = self.docStart
147 es.DocumentEndEvent = self.docEnd
148 es.ElementEvent = self.element
149 es.parse(data)
150 return self.root
151
152 def docStart(self, e):
153 self.root = e
154
155 def docEnd(self):
156 pass
157
158 def element(self, e):
159 self.root.addChild(e)
160
161