]> code.delx.au - pymsnt/blob - src/tlib/xmlw.py
Suppress SSL warning
[pymsnt] / src / tlib / xmlw.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 from twisted.python import log
5
6 checkTwistedCached = None
7 def checkTwisted():
8 """ Returns False if we're using an old version that needs tlib, otherwise returns True """
9 global checkTwistedCached
10 if checkTwistedCached == None:
11 import twisted.copyright
12 checkTwistedCached = (VersionNumber(twisted.copyright.version) >= VersionNumber("2.0.0"))
13 return checkTwistedCached
14
15 class VersionNumber:
16 def __init__(self, vstring):
17 self.varray = [0]
18 index = 0
19 flag = True
20 for c in vstring:
21 if c == '.':
22 self.varray.append(0)
23 index += 1
24 flag = True
25 elif c.isdigit() and flag:
26 self.varray[index] *= 10
27 self.varray[index] += int(c)
28 else:
29 flag = False
30
31 def __cmp__(self, other):
32 i = 0
33 while(True):
34 if i == len(other.varray):
35 if i < len(self.varray):
36 return 1
37 else:
38 return 0
39 if i == len(self.varray):
40 if i < len(other.varray):
41 return -1
42 else:
43 return 0
44
45 if self.varray[i] > other.varray[i]:
46 return 1
47 elif self.varray[i] < other.varray[i]:
48 return -1
49
50 i += 1
51
52
53
54 def parseText(text, beExtremelyLenient=False):
55 return TextParser(beExtremelyLenient).parseString(text)
56
57 def parseFile(filename, beExtremelyLenient=False):
58 t = TextParser(beExtremelyLenient)
59 t.parseFile(filename)
60 return t.root
61
62
63 import warnings, re
64 # Suppress the annoying warning we get with Twisted 1.3 words being deprecated
65 warnings.filters.append(("ignore", None, UserWarning, re.compile("twisted.words"), 21))
66 # Suppress the OpenSSL UserWarning
67 warnings.filters.append(("ignore", re.compile("SSL connection shutdown possibly unreliable, please upgrade to ver 0.XX"), UserWarning, re.compile("twisted.internet.tcp"), 216))
68
69
70 try:
71 log.msg("Trying to import XML DOM")
72 from twisted.words.xish.domish import SuxElementStream, Element, unescapeFromXml
73 from twisted.words.protocols.jabber import jid, component
74 jid.intern = jid.internJID # This got renamed for some reason
75 log.msg("Using Twisted >= 2.0, Words >= 0.3, Words DOM")
76 except ImportError:
77 try:
78 log.msg("Checking Twisted version...")
79 if checkTwisted():
80 from twisted.xish.domish import SuxElementStream, Element, unescapeFromXml
81 from twisted.words.protocols.jabber import jid, component
82 jid.intern = jid.internJID # This got renamed for some reason
83 log.msg("Using Twisted >= 2.0, Words < 0.3, Twisted DOM")
84 else:
85 from tlib.domish import SuxElementStream, Element, unescapeFromXml
86 from tlib.jabber import jid, component
87 log.msg("Using Twisted < 2.0, Internal patched DOM")
88 except ImportError:
89 print "Could not find the XML DOM. If you're using Twisted 2.x make sure you have twisted.words installed."
90 raise
91
92
93 class TextParser:
94 """ Taken from http://xoomer.virgilio.it/dialtone/rsschannel.py """
95
96 def __init__(self, beExtremelyLenient=False):
97 self.root = None
98 self.beExtremelyLenient = beExtremelyLenient
99
100 def parseFile(self, filename):
101 return self.parseString(file(filename).read())
102
103 def parseString(self, data):
104 es = SuxElementStream()
105 es.beExtremelyLenient = self.beExtremelyLenient
106 es.DocumentStartEvent = self.docStart
107 es.DocumentEndEvent = self.docEnd
108 es.ElementEvent = self.element
109 es.parse(data)
110 return self.root
111
112 def docStart(self, e):
113 self.root = e
114
115 def docEnd(self):
116 pass
117
118 def element(self, e):
119 self.root.addChild(e)
120
121