/usr/share/pyshared/pyxmpp/objects.py is in python-pyxmpp 1.1.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | #
# (C) Copyright 2003-2010 Jacek Konieczny <jajcus@jajcus.net>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License Version
# 2.1 as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# pylint: disable-msg=W0232, E0201
"""General base classes for PyXMPP objects."""
__docformat__="restructuredtext en"
import libxml2
from pyxmpp.xmlextra import common_doc
class StanzaPayloadObject(object):
"""Base class for objects that may be used as XMPP stanza payload and don't keep
internal XML representation, only parsed values.
Provides `as_xml` method. Derived classes must override `xml_element_name` and
`xml_element_namespace` class attributes and the `complete_xml_element` method.
Please note that not all classes derived from `StanzaPayloadObject` should be
used directly as stanza payload. Some of them are parts of higher level objects.
:Cvariables:
- `xml_element_name`: name for the XML element provided by the class.
- `xml_element_namespace`: namespace URI for the XML element provided
by the class.
:Types:
- `xml_element_name`: `unicode`
- `xml_element_namespace`: `unicode`
"""
xml_element_name = None
xml_element_namespace = None
def as_xml(self, parent = None, doc = None):
"""Get the XML representation of `self`.
New document will be created if no `parent` and no `doc` is given.
:Parameters:
- `parent`: the parent for the XML element.
- `doc`: the document where the element should be created. If not
given and `parent` is provided then autodetection is attempted.
If that fails, then `common_doc` is used.
:Types:
- `parent`: `libxml2.xmlNode`
- `doc`: `libxml2.xmlDoc`
:return: the new XML element or document created.
:returntype: `libxml2.xmlNode` or `libxml2.xmlDoc`"""
if parent:
if not doc:
n = parent
while n:
if n.type == "xml_document":
doc = n
break
n = n.parent
if not doc:
doc = common_doc
try:
ns = parent.searchNsByHref(doc, self.xml_element_namespace)
except libxml2.treeError:
ns = None
xmlnode = parent.newChild(ns,self.xml_element_name,None)
if not ns:
ns = xmlnode.newNs(self.xml_element_namespace,None)
xmlnode.setNs(ns)
doc1 = doc
else:
if doc:
doc1 = doc
else:
doc1 = libxml2.newDoc("1.0")
xmlnode = doc1.newChild(None,self.xml_element_name, None)
ns = xmlnode.newNs(self.xml_element_namespace, None)
xmlnode.setNs(ns)
self.complete_xml_element(xmlnode, doc1)
if doc or parent:
return xmlnode
doc1.setRootElement(xmlnode)
return doc1
def complete_xml_element(self, xmlnode, doc):
"""Complete the XML node with `self` content.
Should be overriden in classes derived from `StanzaPayloadObject`.
:Parameters:
- `xmlnode`: XML node with the element being built. It has already
right name and namespace, but no attributes or content.
- `doc`: document to which the element belongs.
:Types:
- `xmlnode`: `libxml2.xmlNode`
- `doc`: `libxml2.xmlDoc`"""
pass
class StanzaPayloadWrapperObject(object):
"""Base class for objects that may be used as XMPP stanza payload and maintain
an internal XML representation of self.
Provides `as_xml` method. Objects of derived classes must have the `xmlnode` attribute.
Please note that not all classes derived from `StanzaPayloadWrapperObject` should be
used directly as stanza payload. Some of them are parts of higher level objects.
:Ivariables:
- `xmlnode`: XML node of the object.
:Types:
- `xmlnode`: `libxml2.xmlNode`
"""
def as_xml(self, parent = None, doc = None):
"""Get the XML representation of `self`.
New document will be created if no `parent` and no `doc` is given.
:Parameters:
- `parent`: the parent for the XML element.
- `doc`: the document where the element should be created. If not
given and `parent` is provided then autodetection is attempted.
If that fails, then `common_doc` is used.
:Types:
- `parent`: `libxml2.xmlNode`
- `doc`: `libxml2.xmlDoc`
:return: the new XML element (copy of `self.xmlnode`) or document
created (containg the copy as the root element).
:returntype: `libxml2.xmlNode` or `libxml2.xmlDoc`"""
if parent:
if not doc:
n = parent
while n:
if n.type == "xml_document":
doc = n
break
n = n.parent
if not doc:
doc = common_doc
copy=self.xmlnode.docCopyNode(doc,True)
parent.addChild(copy)
return copy
else:
if not doc:
doc1=libxml2.newDoc("1.0")
else:
doc1=doc
xmlnode=doc1.addChild(self.xmlnode.docCopyNode(doc,True))
doc1.setRootElement(xmlnode)
if doc:
return xmlnode
return doc1
# vi: sts=4 et sw=4
|