1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 """General base classes for PyXMPP objects."""
20
21 __docformat__="restructuredtext en"
22
23 import libxml2
24 from pyxmpp.xmlextra import common_doc
25
27 """Base class for objects that may be used as XMPP stanza payload and don't keep
28 internal XML representation, only parsed values.
29
30 Provides `as_xml` method. Derived classes must override `xml_element_name` and
31 `xml_element_namespace` class attributes and the `complete_xml_element` method.
32
33 Please note that not all classes derived from `StanzaPayloadObject` should be
34 used directly as stanza payload. Some of them are parts of higher level objects.
35
36 :Cvariables:
37 - `xml_element_name`: name for the XML element provided by the class.
38 - `xml_element_namespace`: namespace URI for the XML element provided
39 by the class.
40 :Types:
41 - `xml_element_name`: `unicode`
42 - `xml_element_namespace`: `unicode`
43 """
44 xml_element_name = None
45 xml_element_namespace = None
46
47 - def as_xml(self, parent = None, doc = None):
48 """Get the XML representation of `self`.
49
50 New document will be created if no `parent` and no `doc` is given.
51
52 :Parameters:
53 - `parent`: the parent for the XML element.
54 - `doc`: the document where the element should be created. If not
55 given and `parent` is provided then autodetection is attempted.
56 If that fails, then `common_doc` is used.
57 :Types:
58 - `parent`: `libxml2.xmlNode`
59 - `doc`: `libxml2.xmlDoc`
60 :return: the new XML element or document created.
61 :returntype: `libxml2.xmlNode` or `libxml2.xmlDoc`"""
62 if parent:
63 if not doc:
64 n = parent
65 while n:
66 if n.type == "xml_document":
67 doc = n
68 break
69 n = n.parent
70 if not doc:
71 doc = common_doc
72 try:
73 ns = parent.searchNsByHref(doc, self.xml_element_namespace)
74 except libxml2.treeError:
75 ns = None
76 xmlnode = parent.newChild(ns,self.xml_element_name,None)
77 if not ns:
78 ns = xmlnode.newNs(self.xml_element_namespace,None)
79 xmlnode.setNs(ns)
80 doc1 = doc
81 else:
82 if doc:
83 doc1 = doc
84 else:
85 doc1 = libxml2.newDoc("1.0")
86 xmlnode = doc1.newChild(None,self.xml_element_name, None)
87 ns = xmlnode.newNs(self.xml_element_namespace, None)
88 xmlnode.setNs(ns)
89
90 self.complete_xml_element(xmlnode, doc1)
91
92 if doc or parent:
93 return xmlnode
94 doc1.setRootElement(xmlnode)
95 return doc1
96
98 """Complete the XML node with `self` content.
99
100 Should be overriden in classes derived from `StanzaPayloadObject`.
101
102 :Parameters:
103 - `xmlnode`: XML node with the element being built. It has already
104 right name and namespace, but no attributes or content.
105 - `doc`: document to which the element belongs.
106 :Types:
107 - `xmlnode`: `libxml2.xmlNode`
108 - `doc`: `libxml2.xmlDoc`"""
109 pass
110
112 """Base class for objects that may be used as XMPP stanza payload and maintain
113 an internal XML representation of self.
114
115 Provides `as_xml` method. Objects of derived classes must have the `xmlnode` attribute.
116
117 Please note that not all classes derived from `StanzaPayloadWrapperObject` should be
118 used directly as stanza payload. Some of them are parts of higher level objects.
119
120 :Ivariables:
121 - `xmlnode`: XML node of the object.
122 :Types:
123 - `xmlnode`: `libxml2.xmlNode`
124 """
125
126 - def as_xml(self, parent = None, doc = None):
127 """Get the XML representation of `self`.
128
129 New document will be created if no `parent` and no `doc` is given.
130
131 :Parameters:
132 - `parent`: the parent for the XML element.
133 - `doc`: the document where the element should be created. If not
134 given and `parent` is provided then autodetection is attempted.
135 If that fails, then `common_doc` is used.
136 :Types:
137 - `parent`: `libxml2.xmlNode`
138 - `doc`: `libxml2.xmlDoc`
139
140 :return: the new XML element (copy of `self.xmlnode`) or document
141 created (containg the copy as the root element).
142 :returntype: `libxml2.xmlNode` or `libxml2.xmlDoc`"""
143 if parent:
144 if not doc:
145 n = parent
146 while n:
147 if n.type == "xml_document":
148 doc = n
149 break
150 n = n.parent
151 if not doc:
152 doc = common_doc
153 copy=self.xmlnode.docCopyNode(doc,True)
154 parent.addChild(copy)
155 return copy
156 else:
157 if not doc:
158 doc1=libxml2.newDoc("1.0")
159 else:
160 doc1=doc
161 xmlnode=doc1.addChild(self.xmlnode.docCopyNode(doc,True))
162 doc1.setRootElement(xmlnode)
163 if doc:
164 return xmlnode
165 return doc1
166
167
168