Package pyxmpp :: Module objects
[hide private]

Source Code for Module pyxmpp.objects

  1  # 
  2  # (C) Copyright 2003-2010 Jacek Konieczny <jajcus@jajcus.net> 
  3  # 
  4  # This program is free software; you can redistribute it and/or modify 
  5  # it under the terms of the GNU Lesser General Public License Version 
  6  # 2.1 as published by the Free Software Foundation. 
  7  # 
  8  # This program is distributed in the hope that it will be useful, 
  9  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 10  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 11  # GNU Lesser General Public License for more details. 
 12  # 
 13  # You should have received a copy of the GNU Lesser General Public 
 14  # License along with this program; if not, write to the Free Software 
 15  # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 16  # 
 17  # pylint: disable-msg=W0232, E0201 
 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   
26 -class StanzaPayloadObject(object):
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
97 - def complete_xml_element(self, xmlnode, doc):
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
111 -class StanzaPayloadWrapperObject(object):
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 # vi: sts=4 et sw=4 168