xref: /aosp_15_r20/external/libxml2/python/libxml.py (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Workerimport libxml2mod
2*7c568831SAndroid Build Coastguard Workerimport types
3*7c568831SAndroid Build Coastguard Workerimport sys
4*7c568831SAndroid Build Coastguard Worker
5*7c568831SAndroid Build Coastguard Worker# The root of all libxml2 errors.
6*7c568831SAndroid Build Coastguard Workerclass libxmlError(Exception): pass
7*7c568831SAndroid Build Coastguard Worker
8*7c568831SAndroid Build Coastguard Worker# Type of the wrapper class for the C objects wrappers
9*7c568831SAndroid Build Coastguard Workerdef checkWrapper(obj):
10*7c568831SAndroid Build Coastguard Worker    try:
11*7c568831SAndroid Build Coastguard Worker        n = type(_obj).__name__
12*7c568831SAndroid Build Coastguard Worker        if n != 'PyCObject' and n != 'PyCapsule':
13*7c568831SAndroid Build Coastguard Worker            return 1
14*7c568831SAndroid Build Coastguard Worker    except:
15*7c568831SAndroid Build Coastguard Worker        return 0
16*7c568831SAndroid Build Coastguard Worker    return 0
17*7c568831SAndroid Build Coastguard Worker
18*7c568831SAndroid Build Coastguard Worker#
19*7c568831SAndroid Build Coastguard Worker# id() is sometimes negative ...
20*7c568831SAndroid Build Coastguard Worker#
21*7c568831SAndroid Build Coastguard Workerdef pos_id(o):
22*7c568831SAndroid Build Coastguard Worker    i = id(o)
23*7c568831SAndroid Build Coastguard Worker    if (i < 0):
24*7c568831SAndroid Build Coastguard Worker        return (sys.maxsize - i)
25*7c568831SAndroid Build Coastguard Worker    return i
26*7c568831SAndroid Build Coastguard Worker
27*7c568831SAndroid Build Coastguard Worker#
28*7c568831SAndroid Build Coastguard Worker# Errors raised by the wrappers when some tree handling failed.
29*7c568831SAndroid Build Coastguard Worker#
30*7c568831SAndroid Build Coastguard Workerclass treeError(libxmlError):
31*7c568831SAndroid Build Coastguard Worker    def __init__(self, msg):
32*7c568831SAndroid Build Coastguard Worker        self.msg = msg
33*7c568831SAndroid Build Coastguard Worker    def __str__(self):
34*7c568831SAndroid Build Coastguard Worker        return self.msg
35*7c568831SAndroid Build Coastguard Worker
36*7c568831SAndroid Build Coastguard Workerclass parserError(libxmlError):
37*7c568831SAndroid Build Coastguard Worker    def __init__(self, msg):
38*7c568831SAndroid Build Coastguard Worker        self.msg = msg
39*7c568831SAndroid Build Coastguard Worker    def __str__(self):
40*7c568831SAndroid Build Coastguard Worker        return self.msg
41*7c568831SAndroid Build Coastguard Worker
42*7c568831SAndroid Build Coastguard Workerclass uriError(libxmlError):
43*7c568831SAndroid Build Coastguard Worker    def __init__(self, msg):
44*7c568831SAndroid Build Coastguard Worker        self.msg = msg
45*7c568831SAndroid Build Coastguard Worker    def __str__(self):
46*7c568831SAndroid Build Coastguard Worker        return self.msg
47*7c568831SAndroid Build Coastguard Worker
48*7c568831SAndroid Build Coastguard Workerclass xpathError(libxmlError):
49*7c568831SAndroid Build Coastguard Worker    def __init__(self, msg):
50*7c568831SAndroid Build Coastguard Worker        self.msg = msg
51*7c568831SAndroid Build Coastguard Worker    def __str__(self):
52*7c568831SAndroid Build Coastguard Worker        return self.msg
53*7c568831SAndroid Build Coastguard Worker
54*7c568831SAndroid Build Coastguard Workerclass ioWrapper:
55*7c568831SAndroid Build Coastguard Worker    def __init__(self, _obj):
56*7c568831SAndroid Build Coastguard Worker        self.__io = _obj
57*7c568831SAndroid Build Coastguard Worker        self._o = None
58*7c568831SAndroid Build Coastguard Worker
59*7c568831SAndroid Build Coastguard Worker    def io_close(self):
60*7c568831SAndroid Build Coastguard Worker        if self.__io == None:
61*7c568831SAndroid Build Coastguard Worker            return(-1)
62*7c568831SAndroid Build Coastguard Worker        self.__io.close()
63*7c568831SAndroid Build Coastguard Worker        self.__io = None
64*7c568831SAndroid Build Coastguard Worker        return(0)
65*7c568831SAndroid Build Coastguard Worker
66*7c568831SAndroid Build Coastguard Worker    def io_flush(self):
67*7c568831SAndroid Build Coastguard Worker        if self.__io == None:
68*7c568831SAndroid Build Coastguard Worker            return(-1)
69*7c568831SAndroid Build Coastguard Worker        self.__io.flush()
70*7c568831SAndroid Build Coastguard Worker        return(0)
71*7c568831SAndroid Build Coastguard Worker
72*7c568831SAndroid Build Coastguard Worker    def io_read(self, len = -1):
73*7c568831SAndroid Build Coastguard Worker        if self.__io == None:
74*7c568831SAndroid Build Coastguard Worker            return(-1)
75*7c568831SAndroid Build Coastguard Worker        try:
76*7c568831SAndroid Build Coastguard Worker            if len < 0:
77*7c568831SAndroid Build Coastguard Worker                ret = self.__io.read()
78*7c568831SAndroid Build Coastguard Worker            else:
79*7c568831SAndroid Build Coastguard Worker                ret = self.__io.read(len)
80*7c568831SAndroid Build Coastguard Worker        except Exception:
81*7c568831SAndroid Build Coastguard Worker            import sys
82*7c568831SAndroid Build Coastguard Worker            e = sys.exc_info()[1]
83*7c568831SAndroid Build Coastguard Worker            print("failed to read from Python:", type(e))
84*7c568831SAndroid Build Coastguard Worker            print("on IO:", self.__io)
85*7c568831SAndroid Build Coastguard Worker            self.__io == None
86*7c568831SAndroid Build Coastguard Worker            return(-1)
87*7c568831SAndroid Build Coastguard Worker
88*7c568831SAndroid Build Coastguard Worker        return(ret)
89*7c568831SAndroid Build Coastguard Worker
90*7c568831SAndroid Build Coastguard Worker    def io_write(self, str, len = -1):
91*7c568831SAndroid Build Coastguard Worker        if self.__io == None:
92*7c568831SAndroid Build Coastguard Worker            return(-1)
93*7c568831SAndroid Build Coastguard Worker        if len < 0:
94*7c568831SAndroid Build Coastguard Worker            return(self.__io.write(str))
95*7c568831SAndroid Build Coastguard Worker        return(self.__io.write(str, len))
96*7c568831SAndroid Build Coastguard Worker
97*7c568831SAndroid Build Coastguard Workerclass ioReadWrapper(ioWrapper):
98*7c568831SAndroid Build Coastguard Worker    def __init__(self, _obj, enc = ""):
99*7c568831SAndroid Build Coastguard Worker        ioWrapper.__init__(self, _obj)
100*7c568831SAndroid Build Coastguard Worker        self._o = libxml2mod.xmlCreateInputBuffer(self, enc)
101*7c568831SAndroid Build Coastguard Worker
102*7c568831SAndroid Build Coastguard Worker    def __del__(self):
103*7c568831SAndroid Build Coastguard Worker        print("__del__")
104*7c568831SAndroid Build Coastguard Worker        self.io_close()
105*7c568831SAndroid Build Coastguard Worker        if self._o != None:
106*7c568831SAndroid Build Coastguard Worker            libxml2mod.xmlFreeParserInputBuffer(self._o)
107*7c568831SAndroid Build Coastguard Worker        self._o = None
108*7c568831SAndroid Build Coastguard Worker
109*7c568831SAndroid Build Coastguard Worker    def close(self):
110*7c568831SAndroid Build Coastguard Worker        self.io_close()
111*7c568831SAndroid Build Coastguard Worker        if self._o != None:
112*7c568831SAndroid Build Coastguard Worker            libxml2mod.xmlFreeParserInputBuffer(self._o)
113*7c568831SAndroid Build Coastguard Worker        self._o = None
114*7c568831SAndroid Build Coastguard Worker
115*7c568831SAndroid Build Coastguard Workerclass ioWriteWrapper(ioWrapper):
116*7c568831SAndroid Build Coastguard Worker    def __init__(self, _obj, enc = ""):
117*7c568831SAndroid Build Coastguard Worker#        print "ioWriteWrapper.__init__", _obj
118*7c568831SAndroid Build Coastguard Worker        if type(_obj) == type(''):
119*7c568831SAndroid Build Coastguard Worker            print("write io from a string")
120*7c568831SAndroid Build Coastguard Worker            self.o = None
121*7c568831SAndroid Build Coastguard Worker        elif type(_obj).__name__ == 'PyCapsule':
122*7c568831SAndroid Build Coastguard Worker            file = libxml2mod.outputBufferGetPythonFile(_obj)
123*7c568831SAndroid Build Coastguard Worker            if file != None:
124*7c568831SAndroid Build Coastguard Worker                ioWrapper.__init__(self, file)
125*7c568831SAndroid Build Coastguard Worker            else:
126*7c568831SAndroid Build Coastguard Worker                ioWrapper.__init__(self, _obj)
127*7c568831SAndroid Build Coastguard Worker            self._o = _obj
128*7c568831SAndroid Build Coastguard Worker#        elif type(_obj) == types.InstanceType:
129*7c568831SAndroid Build Coastguard Worker#            print(("write io from instance of %s" % (_obj.__class__)))
130*7c568831SAndroid Build Coastguard Worker#            ioWrapper.__init__(self, _obj)
131*7c568831SAndroid Build Coastguard Worker#            self._o = libxml2mod.xmlCreateOutputBuffer(self, enc)
132*7c568831SAndroid Build Coastguard Worker        else:
133*7c568831SAndroid Build Coastguard Worker            file = libxml2mod.outputBufferGetPythonFile(_obj)
134*7c568831SAndroid Build Coastguard Worker            if file != None:
135*7c568831SAndroid Build Coastguard Worker                ioWrapper.__init__(self, file)
136*7c568831SAndroid Build Coastguard Worker            else:
137*7c568831SAndroid Build Coastguard Worker                ioWrapper.__init__(self, _obj)
138*7c568831SAndroid Build Coastguard Worker            self._o = _obj
139*7c568831SAndroid Build Coastguard Worker
140*7c568831SAndroid Build Coastguard Worker    def __del__(self):
141*7c568831SAndroid Build Coastguard Worker#        print "__del__"
142*7c568831SAndroid Build Coastguard Worker        self.io_close()
143*7c568831SAndroid Build Coastguard Worker        if self._o != None:
144*7c568831SAndroid Build Coastguard Worker            libxml2mod.xmlOutputBufferClose(self._o)
145*7c568831SAndroid Build Coastguard Worker        self._o = None
146*7c568831SAndroid Build Coastguard Worker
147*7c568831SAndroid Build Coastguard Worker    def flush(self):
148*7c568831SAndroid Build Coastguard Worker        self.io_flush()
149*7c568831SAndroid Build Coastguard Worker        if self._o != None:
150*7c568831SAndroid Build Coastguard Worker            libxml2mod.xmlOutputBufferClose(self._o)
151*7c568831SAndroid Build Coastguard Worker        self._o = None
152*7c568831SAndroid Build Coastguard Worker
153*7c568831SAndroid Build Coastguard Worker    def close(self):
154*7c568831SAndroid Build Coastguard Worker        self.io_flush()
155*7c568831SAndroid Build Coastguard Worker        if self._o != None:
156*7c568831SAndroid Build Coastguard Worker            libxml2mod.xmlOutputBufferClose(self._o)
157*7c568831SAndroid Build Coastguard Worker        self._o = None
158*7c568831SAndroid Build Coastguard Worker
159*7c568831SAndroid Build Coastguard Worker#
160*7c568831SAndroid Build Coastguard Worker# Example of a class to handle SAX events
161*7c568831SAndroid Build Coastguard Worker#
162*7c568831SAndroid Build Coastguard Workerclass SAXCallback:
163*7c568831SAndroid Build Coastguard Worker    """Base class for SAX handlers"""
164*7c568831SAndroid Build Coastguard Worker    def startDocument(self):
165*7c568831SAndroid Build Coastguard Worker        """called at the start of the document"""
166*7c568831SAndroid Build Coastguard Worker        pass
167*7c568831SAndroid Build Coastguard Worker
168*7c568831SAndroid Build Coastguard Worker    def endDocument(self):
169*7c568831SAndroid Build Coastguard Worker        """called at the end of the document"""
170*7c568831SAndroid Build Coastguard Worker        pass
171*7c568831SAndroid Build Coastguard Worker
172*7c568831SAndroid Build Coastguard Worker    def startElement(self, tag, attrs):
173*7c568831SAndroid Build Coastguard Worker        """called at the start of every element, tag is the name of
174*7c568831SAndroid Build Coastguard Worker           the element, attrs is a dictionary of the element's attributes"""
175*7c568831SAndroid Build Coastguard Worker        pass
176*7c568831SAndroid Build Coastguard Worker
177*7c568831SAndroid Build Coastguard Worker    def endElement(self, tag):
178*7c568831SAndroid Build Coastguard Worker        """called at the start of every element, tag is the name of
179*7c568831SAndroid Build Coastguard Worker           the element"""
180*7c568831SAndroid Build Coastguard Worker        pass
181*7c568831SAndroid Build Coastguard Worker
182*7c568831SAndroid Build Coastguard Worker    def characters(self, data):
183*7c568831SAndroid Build Coastguard Worker        """called when character data have been read, data is the string
184*7c568831SAndroid Build Coastguard Worker           containing the data, multiple consecutive characters() callback
185*7c568831SAndroid Build Coastguard Worker           are possible."""
186*7c568831SAndroid Build Coastguard Worker        pass
187*7c568831SAndroid Build Coastguard Worker
188*7c568831SAndroid Build Coastguard Worker    def cdataBlock(self, data):
189*7c568831SAndroid Build Coastguard Worker        """called when CDATA section have been read, data is the string
190*7c568831SAndroid Build Coastguard Worker           containing the data, multiple consecutive cdataBlock() callback
191*7c568831SAndroid Build Coastguard Worker           are possible."""
192*7c568831SAndroid Build Coastguard Worker        pass
193*7c568831SAndroid Build Coastguard Worker
194*7c568831SAndroid Build Coastguard Worker    def reference(self, name):
195*7c568831SAndroid Build Coastguard Worker        """called when an entity reference has been found"""
196*7c568831SAndroid Build Coastguard Worker        pass
197*7c568831SAndroid Build Coastguard Worker
198*7c568831SAndroid Build Coastguard Worker    def ignorableWhitespace(self, data):
199*7c568831SAndroid Build Coastguard Worker        """called when potentially ignorable white spaces have been found"""
200*7c568831SAndroid Build Coastguard Worker        pass
201*7c568831SAndroid Build Coastguard Worker
202*7c568831SAndroid Build Coastguard Worker    def processingInstruction(self, target, data):
203*7c568831SAndroid Build Coastguard Worker        """called when a PI has been found, target contains the PI name and
204*7c568831SAndroid Build Coastguard Worker           data is the associated data in the PI"""
205*7c568831SAndroid Build Coastguard Worker        pass
206*7c568831SAndroid Build Coastguard Worker
207*7c568831SAndroid Build Coastguard Worker    def comment(self, content):
208*7c568831SAndroid Build Coastguard Worker        """called when a comment has been found, content contains the comment"""
209*7c568831SAndroid Build Coastguard Worker        pass
210*7c568831SAndroid Build Coastguard Worker
211*7c568831SAndroid Build Coastguard Worker    def externalSubset(self, name, externalID, systemID):
212*7c568831SAndroid Build Coastguard Worker        """called when a DOCTYPE declaration has been found, name is the
213*7c568831SAndroid Build Coastguard Worker           DTD name and externalID, systemID are the DTD public and system
214*7c568831SAndroid Build Coastguard Worker           identifier for that DTd if available"""
215*7c568831SAndroid Build Coastguard Worker        pass
216*7c568831SAndroid Build Coastguard Worker
217*7c568831SAndroid Build Coastguard Worker    def internalSubset(self, name, externalID, systemID):
218*7c568831SAndroid Build Coastguard Worker        """called when a DOCTYPE declaration has been found, name is the
219*7c568831SAndroid Build Coastguard Worker           DTD name and externalID, systemID are the DTD public and system
220*7c568831SAndroid Build Coastguard Worker           identifier for that DTD if available"""
221*7c568831SAndroid Build Coastguard Worker        pass
222*7c568831SAndroid Build Coastguard Worker
223*7c568831SAndroid Build Coastguard Worker    def entityDecl(self, name, type, externalID, systemID, content):
224*7c568831SAndroid Build Coastguard Worker        """called when an ENTITY declaration has been found, name is the
225*7c568831SAndroid Build Coastguard Worker           entity name and externalID, systemID are the entity public and
226*7c568831SAndroid Build Coastguard Worker           system identifier for that entity if available, type indicates
227*7c568831SAndroid Build Coastguard Worker           the entity type, and content reports it's string content"""
228*7c568831SAndroid Build Coastguard Worker        pass
229*7c568831SAndroid Build Coastguard Worker
230*7c568831SAndroid Build Coastguard Worker    def notationDecl(self, name, externalID, systemID):
231*7c568831SAndroid Build Coastguard Worker        """called when an NOTATION declaration has been found, name is the
232*7c568831SAndroid Build Coastguard Worker           notation name and externalID, systemID are the notation public and
233*7c568831SAndroid Build Coastguard Worker           system identifier for that notation if available"""
234*7c568831SAndroid Build Coastguard Worker        pass
235*7c568831SAndroid Build Coastguard Worker
236*7c568831SAndroid Build Coastguard Worker    def attributeDecl(self, elem, name, type, defi, defaultValue, nameList):
237*7c568831SAndroid Build Coastguard Worker        """called when an ATTRIBUTE definition has been found"""
238*7c568831SAndroid Build Coastguard Worker        pass
239*7c568831SAndroid Build Coastguard Worker
240*7c568831SAndroid Build Coastguard Worker    def elementDecl(self, name, type, content):
241*7c568831SAndroid Build Coastguard Worker        """called when an ELEMENT definition has been found"""
242*7c568831SAndroid Build Coastguard Worker        pass
243*7c568831SAndroid Build Coastguard Worker
244*7c568831SAndroid Build Coastguard Worker    def entityDecl(self, name, publicId, systemID, notationName):
245*7c568831SAndroid Build Coastguard Worker        """called when an unparsed ENTITY declaration has been found,
246*7c568831SAndroid Build Coastguard Worker           name is the entity name and publicId,, systemID are the entity
247*7c568831SAndroid Build Coastguard Worker           public and system identifier for that entity if available,
248*7c568831SAndroid Build Coastguard Worker           and notationName indicate the associated NOTATION"""
249*7c568831SAndroid Build Coastguard Worker        pass
250*7c568831SAndroid Build Coastguard Worker
251*7c568831SAndroid Build Coastguard Worker    def warning(self, msg):
252*7c568831SAndroid Build Coastguard Worker        #print msg
253*7c568831SAndroid Build Coastguard Worker        pass
254*7c568831SAndroid Build Coastguard Worker
255*7c568831SAndroid Build Coastguard Worker    def error(self, msg):
256*7c568831SAndroid Build Coastguard Worker        raise parserError(msg)
257*7c568831SAndroid Build Coastguard Worker
258*7c568831SAndroid Build Coastguard Worker    def fatalError(self, msg):
259*7c568831SAndroid Build Coastguard Worker        raise parserError(msg)
260*7c568831SAndroid Build Coastguard Worker
261*7c568831SAndroid Build Coastguard Worker#
262*7c568831SAndroid Build Coastguard Worker# This class is the ancestor of all the Node classes. It provides
263*7c568831SAndroid Build Coastguard Worker# the basic functionalities shared by all nodes (and handle
264*7c568831SAndroid Build Coastguard Worker# gracefylly the exception), like name, navigation in the tree,
265*7c568831SAndroid Build Coastguard Worker# doc reference, content access and serializing to a string or URI
266*7c568831SAndroid Build Coastguard Worker#
267*7c568831SAndroid Build Coastguard Workerclass xmlCore:
268*7c568831SAndroid Build Coastguard Worker    def __init__(self, _obj=None):
269*7c568831SAndroid Build Coastguard Worker        if _obj != None:
270*7c568831SAndroid Build Coastguard Worker            self._o = _obj;
271*7c568831SAndroid Build Coastguard Worker            return
272*7c568831SAndroid Build Coastguard Worker        self._o = None
273*7c568831SAndroid Build Coastguard Worker
274*7c568831SAndroid Build Coastguard Worker    def __eq__(self, other):
275*7c568831SAndroid Build Coastguard Worker        if other == None:
276*7c568831SAndroid Build Coastguard Worker            return False
277*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.compareNodesEqual(self._o, other._o)
278*7c568831SAndroid Build Coastguard Worker        if ret == None:
279*7c568831SAndroid Build Coastguard Worker            return False
280*7c568831SAndroid Build Coastguard Worker        return ret == True
281*7c568831SAndroid Build Coastguard Worker    def __ne__(self, other):
282*7c568831SAndroid Build Coastguard Worker        if other == None:
283*7c568831SAndroid Build Coastguard Worker            return True
284*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.compareNodesEqual(self._o, other._o)
285*7c568831SAndroid Build Coastguard Worker        return not ret
286*7c568831SAndroid Build Coastguard Worker    def __hash__(self):
287*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.nodeHash(self._o)
288*7c568831SAndroid Build Coastguard Worker        return ret
289*7c568831SAndroid Build Coastguard Worker
290*7c568831SAndroid Build Coastguard Worker    def __str__(self):
291*7c568831SAndroid Build Coastguard Worker        return self.serialize()
292*7c568831SAndroid Build Coastguard Worker    def get_parent(self):
293*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.parent(self._o)
294*7c568831SAndroid Build Coastguard Worker        if ret == None:
295*7c568831SAndroid Build Coastguard Worker            return None
296*7c568831SAndroid Build Coastguard Worker        return nodeWrap(ret)
297*7c568831SAndroid Build Coastguard Worker    def get_children(self):
298*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.children(self._o)
299*7c568831SAndroid Build Coastguard Worker        if ret == None:
300*7c568831SAndroid Build Coastguard Worker            return None
301*7c568831SAndroid Build Coastguard Worker        return nodeWrap(ret)
302*7c568831SAndroid Build Coastguard Worker    def get_last(self):
303*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.last(self._o)
304*7c568831SAndroid Build Coastguard Worker        if ret == None:
305*7c568831SAndroid Build Coastguard Worker            return None
306*7c568831SAndroid Build Coastguard Worker        return nodeWrap(ret)
307*7c568831SAndroid Build Coastguard Worker    def get_next(self):
308*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.next(self._o)
309*7c568831SAndroid Build Coastguard Worker        if ret == None:
310*7c568831SAndroid Build Coastguard Worker            return None
311*7c568831SAndroid Build Coastguard Worker        return nodeWrap(ret)
312*7c568831SAndroid Build Coastguard Worker    def get_properties(self):
313*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.properties(self._o)
314*7c568831SAndroid Build Coastguard Worker        if ret == None:
315*7c568831SAndroid Build Coastguard Worker            return None
316*7c568831SAndroid Build Coastguard Worker        return xmlAttr(_obj=ret)
317*7c568831SAndroid Build Coastguard Worker    def get_prev(self):
318*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.prev(self._o)
319*7c568831SAndroid Build Coastguard Worker        if ret == None:
320*7c568831SAndroid Build Coastguard Worker            return None
321*7c568831SAndroid Build Coastguard Worker        return nodeWrap(ret)
322*7c568831SAndroid Build Coastguard Worker    def get_content(self):
323*7c568831SAndroid Build Coastguard Worker        return libxml2mod.xmlNodeGetContent(self._o)
324*7c568831SAndroid Build Coastguard Worker    getContent = get_content  # why is this duplicate naming needed ?
325*7c568831SAndroid Build Coastguard Worker    def get_name(self):
326*7c568831SAndroid Build Coastguard Worker        return libxml2mod.name(self._o)
327*7c568831SAndroid Build Coastguard Worker    def get_type(self):
328*7c568831SAndroid Build Coastguard Worker        return libxml2mod.type(self._o)
329*7c568831SAndroid Build Coastguard Worker    def get_doc(self):
330*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.doc(self._o)
331*7c568831SAndroid Build Coastguard Worker        if ret == None:
332*7c568831SAndroid Build Coastguard Worker            if self.type in ["document_xml", "document_html"]:
333*7c568831SAndroid Build Coastguard Worker                return xmlDoc(_obj=self._o)
334*7c568831SAndroid Build Coastguard Worker            else:
335*7c568831SAndroid Build Coastguard Worker                return None
336*7c568831SAndroid Build Coastguard Worker        return xmlDoc(_obj=ret)
337*7c568831SAndroid Build Coastguard Worker    #
338*7c568831SAndroid Build Coastguard Worker    # Those are common attributes to nearly all type of nodes
339*7c568831SAndroid Build Coastguard Worker    # defined as python2 properties
340*7c568831SAndroid Build Coastguard Worker    #
341*7c568831SAndroid Build Coastguard Worker    import sys
342*7c568831SAndroid Build Coastguard Worker    if float(sys.version[0:3]) < 2.2:
343*7c568831SAndroid Build Coastguard Worker        def __getattr__(self, attr):
344*7c568831SAndroid Build Coastguard Worker            if attr == "parent":
345*7c568831SAndroid Build Coastguard Worker                ret = libxml2mod.parent(self._o)
346*7c568831SAndroid Build Coastguard Worker                if ret == None:
347*7c568831SAndroid Build Coastguard Worker                    return None
348*7c568831SAndroid Build Coastguard Worker                return nodeWrap(ret)
349*7c568831SAndroid Build Coastguard Worker            elif attr == "properties":
350*7c568831SAndroid Build Coastguard Worker                ret = libxml2mod.properties(self._o)
351*7c568831SAndroid Build Coastguard Worker                if ret == None:
352*7c568831SAndroid Build Coastguard Worker                    return None
353*7c568831SAndroid Build Coastguard Worker                return xmlAttr(_obj=ret)
354*7c568831SAndroid Build Coastguard Worker            elif attr == "children":
355*7c568831SAndroid Build Coastguard Worker                ret = libxml2mod.children(self._o)
356*7c568831SAndroid Build Coastguard Worker                if ret == None:
357*7c568831SAndroid Build Coastguard Worker                    return None
358*7c568831SAndroid Build Coastguard Worker                return nodeWrap(ret)
359*7c568831SAndroid Build Coastguard Worker            elif attr == "last":
360*7c568831SAndroid Build Coastguard Worker                ret = libxml2mod.last(self._o)
361*7c568831SAndroid Build Coastguard Worker                if ret == None:
362*7c568831SAndroid Build Coastguard Worker                    return None
363*7c568831SAndroid Build Coastguard Worker                return nodeWrap(ret)
364*7c568831SAndroid Build Coastguard Worker            elif attr == "next":
365*7c568831SAndroid Build Coastguard Worker                ret = libxml2mod.next(self._o)
366*7c568831SAndroid Build Coastguard Worker                if ret == None:
367*7c568831SAndroid Build Coastguard Worker                    return None
368*7c568831SAndroid Build Coastguard Worker                return nodeWrap(ret)
369*7c568831SAndroid Build Coastguard Worker            elif attr == "prev":
370*7c568831SAndroid Build Coastguard Worker                ret = libxml2mod.prev(self._o)
371*7c568831SAndroid Build Coastguard Worker                if ret == None:
372*7c568831SAndroid Build Coastguard Worker                    return None
373*7c568831SAndroid Build Coastguard Worker                return nodeWrap(ret)
374*7c568831SAndroid Build Coastguard Worker            elif attr == "content":
375*7c568831SAndroid Build Coastguard Worker                return libxml2mod.xmlNodeGetContent(self._o)
376*7c568831SAndroid Build Coastguard Worker            elif attr == "name":
377*7c568831SAndroid Build Coastguard Worker                return libxml2mod.name(self._o)
378*7c568831SAndroid Build Coastguard Worker            elif attr == "type":
379*7c568831SAndroid Build Coastguard Worker                return libxml2mod.type(self._o)
380*7c568831SAndroid Build Coastguard Worker            elif attr == "doc":
381*7c568831SAndroid Build Coastguard Worker                ret = libxml2mod.doc(self._o)
382*7c568831SAndroid Build Coastguard Worker                if ret == None:
383*7c568831SAndroid Build Coastguard Worker                    if self.type == "document_xml" or self.type == "document_html":
384*7c568831SAndroid Build Coastguard Worker                        return xmlDoc(_obj=self._o)
385*7c568831SAndroid Build Coastguard Worker                    else:
386*7c568831SAndroid Build Coastguard Worker                        return None
387*7c568831SAndroid Build Coastguard Worker                return xmlDoc(_obj=ret)
388*7c568831SAndroid Build Coastguard Worker            raise AttributeError(attr)
389*7c568831SAndroid Build Coastguard Worker    else:
390*7c568831SAndroid Build Coastguard Worker        parent = property(get_parent, None, None, "Parent node")
391*7c568831SAndroid Build Coastguard Worker        children = property(get_children, None, None, "First child node")
392*7c568831SAndroid Build Coastguard Worker        last = property(get_last, None, None, "Last sibling node")
393*7c568831SAndroid Build Coastguard Worker        next = property(get_next, None, None, "Next sibling node")
394*7c568831SAndroid Build Coastguard Worker        prev = property(get_prev, None, None, "Previous sibling node")
395*7c568831SAndroid Build Coastguard Worker        properties = property(get_properties, None, None, "List of properties")
396*7c568831SAndroid Build Coastguard Worker        content = property(get_content, None, None, "Content of this node")
397*7c568831SAndroid Build Coastguard Worker        name = property(get_name, None, None, "Node name")
398*7c568831SAndroid Build Coastguard Worker        type = property(get_type, None, None, "Node type")
399*7c568831SAndroid Build Coastguard Worker        doc = property(get_doc, None, None, "The document this node belongs to")
400*7c568831SAndroid Build Coastguard Worker
401*7c568831SAndroid Build Coastguard Worker    #
402*7c568831SAndroid Build Coastguard Worker    # Serialization routines, the optional arguments have the following
403*7c568831SAndroid Build Coastguard Worker    # meaning:
404*7c568831SAndroid Build Coastguard Worker    #     encoding: string to ask saving in a specific encoding
405*7c568831SAndroid Build Coastguard Worker    #     indent: if 1 the serializer is asked to indent the output
406*7c568831SAndroid Build Coastguard Worker    #
407*7c568831SAndroid Build Coastguard Worker    def serialize(self, encoding = None, format = 0):
408*7c568831SAndroid Build Coastguard Worker        return libxml2mod.serializeNode(self._o, encoding, format)
409*7c568831SAndroid Build Coastguard Worker    def saveTo(self, file, encoding = None, format = 0):
410*7c568831SAndroid Build Coastguard Worker        return libxml2mod.saveNodeTo(self._o, file, encoding, format)
411*7c568831SAndroid Build Coastguard Worker
412*7c568831SAndroid Build Coastguard Worker    #
413*7c568831SAndroid Build Coastguard Worker    # Canonicalization routines:
414*7c568831SAndroid Build Coastguard Worker    #
415*7c568831SAndroid Build Coastguard Worker    #   nodes: the node set (tuple or list) to be included in the
416*7c568831SAndroid Build Coastguard Worker    #     canonized image or None if all document nodes should be
417*7c568831SAndroid Build Coastguard Worker    #     included.
418*7c568831SAndroid Build Coastguard Worker    #   exclusive: the exclusive flag (0 - non-exclusive
419*7c568831SAndroid Build Coastguard Worker    #     canonicalization; otherwise - exclusive canonicalization)
420*7c568831SAndroid Build Coastguard Worker    #   prefixes: the list of inclusive namespace prefixes (strings),
421*7c568831SAndroid Build Coastguard Worker    #     or None if there is no inclusive namespaces (only for
422*7c568831SAndroid Build Coastguard Worker    #     exclusive canonicalization, ignored otherwise)
423*7c568831SAndroid Build Coastguard Worker    #   with_comments: include comments in the result (!=0) or not
424*7c568831SAndroid Build Coastguard Worker    #     (==0)
425*7c568831SAndroid Build Coastguard Worker    def c14nMemory(self,
426*7c568831SAndroid Build Coastguard Worker                   nodes=None,
427*7c568831SAndroid Build Coastguard Worker                   exclusive=0,
428*7c568831SAndroid Build Coastguard Worker                   prefixes=None,
429*7c568831SAndroid Build Coastguard Worker                   with_comments=0):
430*7c568831SAndroid Build Coastguard Worker        if nodes:
431*7c568831SAndroid Build Coastguard Worker            nodes = [n._o for n in nodes]
432*7c568831SAndroid Build Coastguard Worker        return libxml2mod.xmlC14NDocDumpMemory(
433*7c568831SAndroid Build Coastguard Worker            self.get_doc()._o,
434*7c568831SAndroid Build Coastguard Worker            nodes,
435*7c568831SAndroid Build Coastguard Worker            exclusive != 0,
436*7c568831SAndroid Build Coastguard Worker            prefixes,
437*7c568831SAndroid Build Coastguard Worker            with_comments != 0)
438*7c568831SAndroid Build Coastguard Worker    def c14nSaveTo(self,
439*7c568831SAndroid Build Coastguard Worker                   file,
440*7c568831SAndroid Build Coastguard Worker                   nodes=None,
441*7c568831SAndroid Build Coastguard Worker                   exclusive=0,
442*7c568831SAndroid Build Coastguard Worker                   prefixes=None,
443*7c568831SAndroid Build Coastguard Worker                   with_comments=0):
444*7c568831SAndroid Build Coastguard Worker        if nodes:
445*7c568831SAndroid Build Coastguard Worker            nodes = [n._o for n in nodes]
446*7c568831SAndroid Build Coastguard Worker        return libxml2mod.xmlC14NDocSaveTo(
447*7c568831SAndroid Build Coastguard Worker            self.get_doc()._o,
448*7c568831SAndroid Build Coastguard Worker            nodes,
449*7c568831SAndroid Build Coastguard Worker            exclusive != 0,
450*7c568831SAndroid Build Coastguard Worker            prefixes,
451*7c568831SAndroid Build Coastguard Worker            with_comments != 0,
452*7c568831SAndroid Build Coastguard Worker            file)
453*7c568831SAndroid Build Coastguard Worker
454*7c568831SAndroid Build Coastguard Worker    #
455*7c568831SAndroid Build Coastguard Worker    # Selecting nodes using XPath, a bit slow because the context
456*7c568831SAndroid Build Coastguard Worker    # is allocated/freed every time but convenient.
457*7c568831SAndroid Build Coastguard Worker    #
458*7c568831SAndroid Build Coastguard Worker    def xpathEval(self, expr):
459*7c568831SAndroid Build Coastguard Worker        doc = self.doc
460*7c568831SAndroid Build Coastguard Worker        if doc == None:
461*7c568831SAndroid Build Coastguard Worker            return None
462*7c568831SAndroid Build Coastguard Worker        ctxt = doc.xpathNewContext()
463*7c568831SAndroid Build Coastguard Worker        ctxt.setContextNode(self)
464*7c568831SAndroid Build Coastguard Worker        res = ctxt.xpathEval(expr)
465*7c568831SAndroid Build Coastguard Worker        ctxt.xpathFreeContext()
466*7c568831SAndroid Build Coastguard Worker        return res
467*7c568831SAndroid Build Coastguard Worker
468*7c568831SAndroid Build Coastguard Worker#    #
469*7c568831SAndroid Build Coastguard Worker#    # Selecting nodes using XPath, faster because the context
470*7c568831SAndroid Build Coastguard Worker#    # is allocated just once per xmlDoc.
471*7c568831SAndroid Build Coastguard Worker#    #
472*7c568831SAndroid Build Coastguard Worker#    # Removed: DV memleaks c.f. #126735
473*7c568831SAndroid Build Coastguard Worker#    #
474*7c568831SAndroid Build Coastguard Worker#    def xpathEval2(self, expr):
475*7c568831SAndroid Build Coastguard Worker#        doc = self.doc
476*7c568831SAndroid Build Coastguard Worker#        if doc == None:
477*7c568831SAndroid Build Coastguard Worker#            return None
478*7c568831SAndroid Build Coastguard Worker#        try:
479*7c568831SAndroid Build Coastguard Worker#            doc._ctxt.setContextNode(self)
480*7c568831SAndroid Build Coastguard Worker#        except:
481*7c568831SAndroid Build Coastguard Worker#            doc._ctxt = doc.xpathNewContext()
482*7c568831SAndroid Build Coastguard Worker#            doc._ctxt.setContextNode(self)
483*7c568831SAndroid Build Coastguard Worker#        res = doc._ctxt.xpathEval(expr)
484*7c568831SAndroid Build Coastguard Worker#        return res
485*7c568831SAndroid Build Coastguard Worker    def xpathEval2(self, expr):
486*7c568831SAndroid Build Coastguard Worker        return self.xpathEval(expr)
487*7c568831SAndroid Build Coastguard Worker
488*7c568831SAndroid Build Coastguard Worker    # Remove namespaces
489*7c568831SAndroid Build Coastguard Worker    def removeNsDef(self, href):
490*7c568831SAndroid Build Coastguard Worker        """
491*7c568831SAndroid Build Coastguard Worker        Remove a namespace definition from a node.  If href is None,
492*7c568831SAndroid Build Coastguard Worker        remove all of the ns definitions on that node.  The removed
493*7c568831SAndroid Build Coastguard Worker        namespaces are returned as a linked list.
494*7c568831SAndroid Build Coastguard Worker
495*7c568831SAndroid Build Coastguard Worker        Note: If any child nodes referred to the removed namespaces,
496*7c568831SAndroid Build Coastguard Worker        they will be left with dangling links.  You should call
497*7c568831SAndroid Build Coastguard Worker        renconciliateNs() to fix those pointers.
498*7c568831SAndroid Build Coastguard Worker
499*7c568831SAndroid Build Coastguard Worker        Note: This method does not free memory taken by the ns
500*7c568831SAndroid Build Coastguard Worker        definitions.  You will need to free it manually with the
501*7c568831SAndroid Build Coastguard Worker        freeNsList() method on the returns xmlNs object.
502*7c568831SAndroid Build Coastguard Worker        """
503*7c568831SAndroid Build Coastguard Worker
504*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.xmlNodeRemoveNsDef(self._o, href)
505*7c568831SAndroid Build Coastguard Worker        if ret is None:return None
506*7c568831SAndroid Build Coastguard Worker        __tmp = xmlNs(_obj=ret)
507*7c568831SAndroid Build Coastguard Worker        return __tmp
508*7c568831SAndroid Build Coastguard Worker
509*7c568831SAndroid Build Coastguard Worker    # support for python2 iterators
510*7c568831SAndroid Build Coastguard Worker    def walk_depth_first(self):
511*7c568831SAndroid Build Coastguard Worker        return xmlCoreDepthFirstItertor(self)
512*7c568831SAndroid Build Coastguard Worker    def walk_breadth_first(self):
513*7c568831SAndroid Build Coastguard Worker        return xmlCoreBreadthFirstItertor(self)
514*7c568831SAndroid Build Coastguard Worker    __iter__ = walk_depth_first
515*7c568831SAndroid Build Coastguard Worker
516*7c568831SAndroid Build Coastguard Worker    def free(self):
517*7c568831SAndroid Build Coastguard Worker        try:
518*7c568831SAndroid Build Coastguard Worker            self.doc._ctxt.xpathFreeContext()
519*7c568831SAndroid Build Coastguard Worker        except:
520*7c568831SAndroid Build Coastguard Worker            pass
521*7c568831SAndroid Build Coastguard Worker        libxml2mod.xmlFreeDoc(self._o)
522*7c568831SAndroid Build Coastguard Worker
523*7c568831SAndroid Build Coastguard Worker
524*7c568831SAndroid Build Coastguard Worker#
525*7c568831SAndroid Build Coastguard Worker# implements the depth-first iterator for libxml2 DOM tree
526*7c568831SAndroid Build Coastguard Worker#
527*7c568831SAndroid Build Coastguard Workerclass xmlCoreDepthFirstItertor:
528*7c568831SAndroid Build Coastguard Worker    def __init__(self, node):
529*7c568831SAndroid Build Coastguard Worker        self.node = node
530*7c568831SAndroid Build Coastguard Worker        self.parents = []
531*7c568831SAndroid Build Coastguard Worker    def __iter__(self):
532*7c568831SAndroid Build Coastguard Worker        return self
533*7c568831SAndroid Build Coastguard Worker    def __next__(self):
534*7c568831SAndroid Build Coastguard Worker        while 1:
535*7c568831SAndroid Build Coastguard Worker            if self.node:
536*7c568831SAndroid Build Coastguard Worker                ret = self.node
537*7c568831SAndroid Build Coastguard Worker                self.parents.append(self.node)
538*7c568831SAndroid Build Coastguard Worker                self.node = self.node.children
539*7c568831SAndroid Build Coastguard Worker                return ret
540*7c568831SAndroid Build Coastguard Worker            try:
541*7c568831SAndroid Build Coastguard Worker                parent = self.parents.pop()
542*7c568831SAndroid Build Coastguard Worker            except IndexError:
543*7c568831SAndroid Build Coastguard Worker                raise StopIteration
544*7c568831SAndroid Build Coastguard Worker            self.node = parent.next
545*7c568831SAndroid Build Coastguard Worker    next = __next__
546*7c568831SAndroid Build Coastguard Worker
547*7c568831SAndroid Build Coastguard Worker#
548*7c568831SAndroid Build Coastguard Worker# implements the breadth-first iterator for libxml2 DOM tree
549*7c568831SAndroid Build Coastguard Worker#
550*7c568831SAndroid Build Coastguard Workerclass xmlCoreBreadthFirstItertor:
551*7c568831SAndroid Build Coastguard Worker    def __init__(self, node):
552*7c568831SAndroid Build Coastguard Worker        self.node = node
553*7c568831SAndroid Build Coastguard Worker        self.parents = []
554*7c568831SAndroid Build Coastguard Worker    def __iter__(self):
555*7c568831SAndroid Build Coastguard Worker        return self
556*7c568831SAndroid Build Coastguard Worker    def __next__(self):
557*7c568831SAndroid Build Coastguard Worker        while 1:
558*7c568831SAndroid Build Coastguard Worker            if self.node:
559*7c568831SAndroid Build Coastguard Worker                ret = self.node
560*7c568831SAndroid Build Coastguard Worker                self.parents.append(self.node)
561*7c568831SAndroid Build Coastguard Worker                self.node = self.node.next
562*7c568831SAndroid Build Coastguard Worker                return ret
563*7c568831SAndroid Build Coastguard Worker            try:
564*7c568831SAndroid Build Coastguard Worker                parent = self.parents.pop()
565*7c568831SAndroid Build Coastguard Worker            except IndexError:
566*7c568831SAndroid Build Coastguard Worker                raise StopIteration
567*7c568831SAndroid Build Coastguard Worker            self.node = parent.children
568*7c568831SAndroid Build Coastguard Worker    next = __next__
569*7c568831SAndroid Build Coastguard Worker
570*7c568831SAndroid Build Coastguard Worker#
571*7c568831SAndroid Build Coastguard Worker# converters to present a nicer view of the XPath returns
572*7c568831SAndroid Build Coastguard Worker#
573*7c568831SAndroid Build Coastguard Workerdef nodeWrap(o):
574*7c568831SAndroid Build Coastguard Worker    # TODO try to cast to the most appropriate node class
575*7c568831SAndroid Build Coastguard Worker    name = libxml2mod.type(o)
576*7c568831SAndroid Build Coastguard Worker    if name == "element" or name == "text":
577*7c568831SAndroid Build Coastguard Worker        return xmlNode(_obj=o)
578*7c568831SAndroid Build Coastguard Worker    if name == "attribute":
579*7c568831SAndroid Build Coastguard Worker        return xmlAttr(_obj=o)
580*7c568831SAndroid Build Coastguard Worker    if name[0:8] == "document":
581*7c568831SAndroid Build Coastguard Worker        return xmlDoc(_obj=o)
582*7c568831SAndroid Build Coastguard Worker    if name == "namespace":
583*7c568831SAndroid Build Coastguard Worker        return xmlNs(_obj=o)
584*7c568831SAndroid Build Coastguard Worker    if name == "elem_decl":
585*7c568831SAndroid Build Coastguard Worker        return xmlElement(_obj=o)
586*7c568831SAndroid Build Coastguard Worker    if name == "attribute_decl":
587*7c568831SAndroid Build Coastguard Worker        return xmlAttribute(_obj=o)
588*7c568831SAndroid Build Coastguard Worker    if name == "entity_decl":
589*7c568831SAndroid Build Coastguard Worker        return xmlEntity(_obj=o)
590*7c568831SAndroid Build Coastguard Worker    if name == "dtd":
591*7c568831SAndroid Build Coastguard Worker        return xmlDtd(_obj=o)
592*7c568831SAndroid Build Coastguard Worker    return xmlNode(_obj=o)
593*7c568831SAndroid Build Coastguard Worker
594*7c568831SAndroid Build Coastguard Workerdef xpathObjectRet(o):
595*7c568831SAndroid Build Coastguard Worker    otype = type(o)
596*7c568831SAndroid Build Coastguard Worker    if otype == type([]):
597*7c568831SAndroid Build Coastguard Worker        ret = list(map(xpathObjectRet, o))
598*7c568831SAndroid Build Coastguard Worker        return ret
599*7c568831SAndroid Build Coastguard Worker    elif otype == type(()):
600*7c568831SAndroid Build Coastguard Worker        ret = list(map(xpathObjectRet, o))
601*7c568831SAndroid Build Coastguard Worker        return tuple(ret)
602*7c568831SAndroid Build Coastguard Worker    elif otype == type('') or otype == type(0) or otype == type(0.0):
603*7c568831SAndroid Build Coastguard Worker        return o
604*7c568831SAndroid Build Coastguard Worker    else:
605*7c568831SAndroid Build Coastguard Worker        return nodeWrap(o)
606*7c568831SAndroid Build Coastguard Worker
607*7c568831SAndroid Build Coastguard Worker#
608*7c568831SAndroid Build Coastguard Worker# register an XPath function
609*7c568831SAndroid Build Coastguard Worker#
610*7c568831SAndroid Build Coastguard Workerdef registerXPathFunction(ctxt, name, ns_uri, f):
611*7c568831SAndroid Build Coastguard Worker    ret = libxml2mod.xmlRegisterXPathFunction(ctxt, name, ns_uri, f)
612*7c568831SAndroid Build Coastguard Worker
613*7c568831SAndroid Build Coastguard Worker#
614*7c568831SAndroid Build Coastguard Worker# For the xmlTextReader parser configuration
615*7c568831SAndroid Build Coastguard Worker#
616*7c568831SAndroid Build Coastguard WorkerPARSER_LOADDTD=1
617*7c568831SAndroid Build Coastguard WorkerPARSER_DEFAULTATTRS=2
618*7c568831SAndroid Build Coastguard WorkerPARSER_VALIDATE=3
619*7c568831SAndroid Build Coastguard WorkerPARSER_SUBST_ENTITIES=4
620*7c568831SAndroid Build Coastguard Worker
621*7c568831SAndroid Build Coastguard Worker#
622*7c568831SAndroid Build Coastguard Worker# For the error callback severities
623*7c568831SAndroid Build Coastguard Worker#
624*7c568831SAndroid Build Coastguard WorkerPARSER_SEVERITY_VALIDITY_WARNING=1
625*7c568831SAndroid Build Coastguard WorkerPARSER_SEVERITY_VALIDITY_ERROR=2
626*7c568831SAndroid Build Coastguard WorkerPARSER_SEVERITY_WARNING=3
627*7c568831SAndroid Build Coastguard WorkerPARSER_SEVERITY_ERROR=4
628*7c568831SAndroid Build Coastguard Worker
629*7c568831SAndroid Build Coastguard Worker#
630*7c568831SAndroid Build Coastguard Worker# register the libxml2 error handler
631*7c568831SAndroid Build Coastguard Worker#
632*7c568831SAndroid Build Coastguard Workerdef registerErrorHandler(f, ctx):
633*7c568831SAndroid Build Coastguard Worker    """Register a Python written function to for error reporting.
634*7c568831SAndroid Build Coastguard Worker       The function is called back as f(ctx, error). """
635*7c568831SAndroid Build Coastguard Worker    import sys
636*7c568831SAndroid Build Coastguard Worker    if 'libxslt' not in sys.modules:
637*7c568831SAndroid Build Coastguard Worker        # normal behaviour when libxslt is not imported
638*7c568831SAndroid Build Coastguard Worker        ret = libxml2mod.xmlRegisterErrorHandler(f,ctx)
639*7c568831SAndroid Build Coastguard Worker    else:
640*7c568831SAndroid Build Coastguard Worker        # when libxslt is already imported, one must
641*7c568831SAndroid Build Coastguard Worker        # use libxst's error handler instead
642*7c568831SAndroid Build Coastguard Worker        import libxslt
643*7c568831SAndroid Build Coastguard Worker        ret = libxslt.registerErrorHandler(f,ctx)
644*7c568831SAndroid Build Coastguard Worker    return ret
645*7c568831SAndroid Build Coastguard Worker
646*7c568831SAndroid Build Coastguard Workerclass parserCtxtCore:
647*7c568831SAndroid Build Coastguard Worker
648*7c568831SAndroid Build Coastguard Worker    def __init__(self, _obj=None):
649*7c568831SAndroid Build Coastguard Worker        if _obj != None:
650*7c568831SAndroid Build Coastguard Worker            self._o = _obj;
651*7c568831SAndroid Build Coastguard Worker            return
652*7c568831SAndroid Build Coastguard Worker        self._o = None
653*7c568831SAndroid Build Coastguard Worker
654*7c568831SAndroid Build Coastguard Worker    def __del__(self):
655*7c568831SAndroid Build Coastguard Worker        if self._o != None:
656*7c568831SAndroid Build Coastguard Worker            libxml2mod.xmlFreeParserCtxt(self._o)
657*7c568831SAndroid Build Coastguard Worker        self._o = None
658*7c568831SAndroid Build Coastguard Worker
659*7c568831SAndroid Build Coastguard Worker    def setErrorHandler(self,f,arg):
660*7c568831SAndroid Build Coastguard Worker        """Register an error handler that will be called back as
661*7c568831SAndroid Build Coastguard Worker           f(arg,msg,severity,reserved).
662*7c568831SAndroid Build Coastguard Worker
663*7c568831SAndroid Build Coastguard Worker           @reserved is currently always None."""
664*7c568831SAndroid Build Coastguard Worker        libxml2mod.xmlParserCtxtSetErrorHandler(self._o,f,arg)
665*7c568831SAndroid Build Coastguard Worker
666*7c568831SAndroid Build Coastguard Worker    def getErrorHandler(self):
667*7c568831SAndroid Build Coastguard Worker        """Return (f,arg) as previously registered with setErrorHandler
668*7c568831SAndroid Build Coastguard Worker           or (None,None)."""
669*7c568831SAndroid Build Coastguard Worker        return libxml2mod.xmlParserCtxtGetErrorHandler(self._o)
670*7c568831SAndroid Build Coastguard Worker
671*7c568831SAndroid Build Coastguard Worker    def addLocalCatalog(self, uri):
672*7c568831SAndroid Build Coastguard Worker        """Register a local catalog with the parser"""
673*7c568831SAndroid Build Coastguard Worker        return libxml2mod.addLocalCatalog(self._o, uri)
674*7c568831SAndroid Build Coastguard Worker
675*7c568831SAndroid Build Coastguard Worker
676*7c568831SAndroid Build Coastguard Workerclass ValidCtxtCore:
677*7c568831SAndroid Build Coastguard Worker
678*7c568831SAndroid Build Coastguard Worker    def __init__(self, *args, **kw):
679*7c568831SAndroid Build Coastguard Worker        pass
680*7c568831SAndroid Build Coastguard Worker
681*7c568831SAndroid Build Coastguard Worker    def setValidityErrorHandler(self, err_func, warn_func, arg=None):
682*7c568831SAndroid Build Coastguard Worker        """
683*7c568831SAndroid Build Coastguard Worker        Register error and warning handlers for DTD validation.
684*7c568831SAndroid Build Coastguard Worker        These will be called back as f(msg,arg)
685*7c568831SAndroid Build Coastguard Worker        """
686*7c568831SAndroid Build Coastguard Worker        libxml2mod.xmlSetValidErrors(self._o, err_func, warn_func, arg)
687*7c568831SAndroid Build Coastguard Worker
688*7c568831SAndroid Build Coastguard Worker
689*7c568831SAndroid Build Coastguard Workerclass SchemaValidCtxtCore:
690*7c568831SAndroid Build Coastguard Worker
691*7c568831SAndroid Build Coastguard Worker    def __init__(self, *args, **kw):
692*7c568831SAndroid Build Coastguard Worker        pass
693*7c568831SAndroid Build Coastguard Worker
694*7c568831SAndroid Build Coastguard Worker    def setValidityErrorHandler(self, err_func, warn_func, arg=None):
695*7c568831SAndroid Build Coastguard Worker        """
696*7c568831SAndroid Build Coastguard Worker        Register error and warning handlers for Schema validation.
697*7c568831SAndroid Build Coastguard Worker        These will be called back as f(msg,arg)
698*7c568831SAndroid Build Coastguard Worker        """
699*7c568831SAndroid Build Coastguard Worker        libxml2mod.xmlSchemaSetValidErrors(self._o, err_func, warn_func, arg)
700*7c568831SAndroid Build Coastguard Worker
701*7c568831SAndroid Build Coastguard Worker
702*7c568831SAndroid Build Coastguard Workerclass relaxNgValidCtxtCore:
703*7c568831SAndroid Build Coastguard Worker
704*7c568831SAndroid Build Coastguard Worker    def __init__(self, *args, **kw):
705*7c568831SAndroid Build Coastguard Worker        pass
706*7c568831SAndroid Build Coastguard Worker
707*7c568831SAndroid Build Coastguard Worker    def setValidityErrorHandler(self, err_func, warn_func, arg=None):
708*7c568831SAndroid Build Coastguard Worker        """
709*7c568831SAndroid Build Coastguard Worker        Register error and warning handlers for RelaxNG validation.
710*7c568831SAndroid Build Coastguard Worker        These will be called back as f(msg,arg)
711*7c568831SAndroid Build Coastguard Worker        """
712*7c568831SAndroid Build Coastguard Worker        libxml2mod.xmlRelaxNGSetValidErrors(self._o, err_func, warn_func, arg)
713*7c568831SAndroid Build Coastguard Worker
714*7c568831SAndroid Build Coastguard Worker
715*7c568831SAndroid Build Coastguard Workerdef _xmlTextReaderErrorFunc(xxx_todo_changeme,msg,severity,locator):
716*7c568831SAndroid Build Coastguard Worker    """Intermediate callback to wrap the locator"""
717*7c568831SAndroid Build Coastguard Worker    (f,arg) = xxx_todo_changeme
718*7c568831SAndroid Build Coastguard Worker    return f(arg,msg,severity,xmlTextReaderLocator(locator))
719*7c568831SAndroid Build Coastguard Worker
720*7c568831SAndroid Build Coastguard Workerclass xmlTextReaderCore:
721*7c568831SAndroid Build Coastguard Worker
722*7c568831SAndroid Build Coastguard Worker    def __init__(self, _obj=None):
723*7c568831SAndroid Build Coastguard Worker        self.input = None
724*7c568831SAndroid Build Coastguard Worker        if _obj != None:self._o = _obj;return
725*7c568831SAndroid Build Coastguard Worker        self._o = None
726*7c568831SAndroid Build Coastguard Worker
727*7c568831SAndroid Build Coastguard Worker    def __del__(self):
728*7c568831SAndroid Build Coastguard Worker        if self._o != None:
729*7c568831SAndroid Build Coastguard Worker            libxml2mod.xmlFreeTextReader(self._o)
730*7c568831SAndroid Build Coastguard Worker        self._o = None
731*7c568831SAndroid Build Coastguard Worker
732*7c568831SAndroid Build Coastguard Worker    def SetErrorHandler(self,f,arg):
733*7c568831SAndroid Build Coastguard Worker        """Register an error handler that will be called back as
734*7c568831SAndroid Build Coastguard Worker           f(arg,msg,severity,locator)."""
735*7c568831SAndroid Build Coastguard Worker        if f is None:
736*7c568831SAndroid Build Coastguard Worker            libxml2mod.xmlTextReaderSetErrorHandler(\
737*7c568831SAndroid Build Coastguard Worker                self._o,None,None)
738*7c568831SAndroid Build Coastguard Worker        else:
739*7c568831SAndroid Build Coastguard Worker            libxml2mod.xmlTextReaderSetErrorHandler(\
740*7c568831SAndroid Build Coastguard Worker                self._o,_xmlTextReaderErrorFunc,(f,arg))
741*7c568831SAndroid Build Coastguard Worker
742*7c568831SAndroid Build Coastguard Worker    def GetErrorHandler(self):
743*7c568831SAndroid Build Coastguard Worker        """Return (f,arg) as previously registered with setErrorHandler
744*7c568831SAndroid Build Coastguard Worker           or (None,None)."""
745*7c568831SAndroid Build Coastguard Worker        f,arg = libxml2mod.xmlTextReaderGetErrorHandler(self._o)
746*7c568831SAndroid Build Coastguard Worker        if f is None:
747*7c568831SAndroid Build Coastguard Worker            return None,None
748*7c568831SAndroid Build Coastguard Worker        else:
749*7c568831SAndroid Build Coastguard Worker            # assert f is _xmlTextReaderErrorFunc
750*7c568831SAndroid Build Coastguard Worker            return arg
751*7c568831SAndroid Build Coastguard Worker
752*7c568831SAndroid Build Coastguard Worker#
753*7c568831SAndroid Build Coastguard Worker# The cleanup now goes though a wrapper in libxml.c
754*7c568831SAndroid Build Coastguard Worker#
755*7c568831SAndroid Build Coastguard Workerdef cleanupParser():
756*7c568831SAndroid Build Coastguard Worker    libxml2mod.xmlPythonCleanupParser()
757*7c568831SAndroid Build Coastguard Worker
758*7c568831SAndroid Build Coastguard Worker#
759*7c568831SAndroid Build Coastguard Worker# The interface to xmlRegisterInputCallbacks.
760*7c568831SAndroid Build Coastguard Worker# Since this API does not allow to pass a data object along with
761*7c568831SAndroid Build Coastguard Worker# match/open callbacks, it is necessary to maintain a list of all
762*7c568831SAndroid Build Coastguard Worker# Python callbacks.
763*7c568831SAndroid Build Coastguard Worker#
764*7c568831SAndroid Build Coastguard Worker__input_callbacks = []
765*7c568831SAndroid Build Coastguard Workerdef registerInputCallback(func):
766*7c568831SAndroid Build Coastguard Worker    def findOpenCallback(URI):
767*7c568831SAndroid Build Coastguard Worker        for cb in reversed(__input_callbacks):
768*7c568831SAndroid Build Coastguard Worker            o = cb(URI)
769*7c568831SAndroid Build Coastguard Worker            if o is not None:
770*7c568831SAndroid Build Coastguard Worker                return o
771*7c568831SAndroid Build Coastguard Worker    libxml2mod.xmlRegisterInputCallback(findOpenCallback)
772*7c568831SAndroid Build Coastguard Worker    __input_callbacks.append(func)
773*7c568831SAndroid Build Coastguard Worker
774*7c568831SAndroid Build Coastguard Workerdef popInputCallbacks():
775*7c568831SAndroid Build Coastguard Worker    # First pop python-level callbacks, when no more available - start
776*7c568831SAndroid Build Coastguard Worker    # popping built-in ones.
777*7c568831SAndroid Build Coastguard Worker    if len(__input_callbacks) > 0:
778*7c568831SAndroid Build Coastguard Worker        __input_callbacks.pop()
779*7c568831SAndroid Build Coastguard Worker    if len(__input_callbacks) == 0:
780*7c568831SAndroid Build Coastguard Worker        libxml2mod.xmlUnregisterInputCallback()
781*7c568831SAndroid Build Coastguard Worker
782*7c568831SAndroid Build Coastguard Worker#
783*7c568831SAndroid Build Coastguard Worker# Deprecated
784*7c568831SAndroid Build Coastguard Worker#
785*7c568831SAndroid Build Coastguard Workerdef dumpMemory():
786*7c568831SAndroid Build Coastguard Worker    """DEPRECATED: This feature was removed."""
787*7c568831SAndroid Build Coastguard Worker
788*7c568831SAndroid Build Coastguard Worker# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
789*7c568831SAndroid Build Coastguard Worker#
790*7c568831SAndroid Build Coastguard Worker# Everything before this line comes from libxml.py
791*7c568831SAndroid Build Coastguard Worker# Everything after this line is automatically generated
792*7c568831SAndroid Build Coastguard Worker#
793*7c568831SAndroid Build Coastguard Worker# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
794*7c568831SAndroid Build Coastguard Worker
795