Package pyxmpp :: Module objects
[hide private]

Source Code for Module pyxmpp.objects

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