home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- __revision__ = '$Id: muccore.py 648 2006-08-26 20:09:37Z jajcus $'
- __docformat__ = 'restructuredtext en'
- import libxml2
- from pyxmpp.utils import to_utf8, from_utf8
- from pyxmpp.xmlextra import common_doc, common_root, common_ns, get_node_ns_uri
- from pyxmpp.presence import Presence
- from pyxmpp.iq import Iq
- from pyxmpp.jid import JID
- from pyxmpp import xmlextra
- from pyxmpp.objects import StanzaPayloadWrapperObject
- from pyxmpp.xmlextra import xml_element_iter
- MUC_NS = 'http://jabber.org/protocol/muc'
- MUC_USER_NS = MUC_NS + '#user'
- MUC_ADMIN_NS = MUC_NS + '#admin'
- MUC_OWNER_NS = MUC_NS + '#owner'
- affiliations = ('admin', 'member', 'none', 'outcast', 'owner')
- roles = ('moderator', 'none', 'participant', 'visitor')
-
- class MucXBase(StanzaPayloadWrapperObject):
- element = 'x'
- ns = None
-
- def __init__(self, xmlnode = None, copy = True, parent = None):
- if self.ns == None:
- raise RuntimeError, 'Pure virtual class called'
-
- self.xmlnode = None
- self.borrowed = False
- if isinstance(xmlnode, libxml2.xmlNode):
- if copy:
- self.xmlnode = xmlnode.docCopyNode(common_doc, 1)
- common_root.addChild(self.xmlnode)
- else:
- self.xmlnode = xmlnode
- self.borrowed = True
- if copy:
- ns = xmlnode.ns()
- xmlextra.replace_ns(self.xmlnode, ns, common_ns)
-
- elif isinstance(xmlnode, MucXBase):
- if not copy:
- raise TypeError, 'MucXBase may only be copied'
-
- self.xmlnode = xmlnode.xmlnode.docCopyNode(common_doc, 1)
- common_root.addChild(self.xmlnode)
- elif xmlnode is not None:
- raise TypeError, 'Bad MucX constructor argument'
- elif parent:
- self.xmlnode = parent.newChild(None, self.element, None)
- self.borrowed = True
- else:
- self.xmlnode = common_root.newChild(None, self.element, None)
- ns = self.xmlnode.newNs(self.ns, None)
- self.xmlnode.setNs(ns)
-
-
- def __del__(self):
- if self.xmlnode:
- self.free()
-
-
-
- def free(self):
- if not self.borrowed:
- self.xmlnode.unlinkNode()
- self.xmlnode.freeNode()
-
- self.xmlnode = None
-
-
- def free_borrowed(self):
- self.xmlnode = None
-
-
- def xpath_eval(self, expr):
- ctxt = common_doc.xpathNewContext()
- ctxt.setContextNode(self.xmlnode)
- ctxt.xpathRegisterNs('muc', self.ns.getContent())
- ret = ctxt.xpathEval(to_utf8(expr))
- ctxt.xpathFreeContext()
- return ret
-
-
- def serialize(self):
- return self.xmlnode.serialize()
-
-
-
- class MucX(MucXBase):
- ns = MUC_NS
-
- def __init__(self, xmlnode = None, copy = True, parent = None):
- MucXBase.__init__(self, xmlnode = xmlnode, copy = copy, parent = parent)
-
-
- def set_history(self, parameters):
- for child in xml_element_iter(self.xmlnode.children):
- if get_node_ns_uri(child) == MUC_NS and child.name == 'history':
- child.unlinkNode()
- child.freeNode()
- break
- continue
-
- if parameters.maxchars and parameters.maxchars < 0:
- raise ValueError, 'History parameter maxchars must be positive'
-
- if parameters.maxstanzas and parameters.maxstanzas < 0:
- raise ValueError, 'History parameter maxstanzas must be positive'
-
- if parameters.maxseconds and parameters.maxseconds < 0:
- raise ValueError, 'History parameter maxseconds must be positive'
-
- hnode = self.xmlnode.newChild(self.xmlnode.ns(), 'history', None)
- if parameters.maxchars is not None:
- hnode.setProp('maxchars', str(parameters.maxchars))
-
- if parameters.maxstanzas is not None:
- hnode.setProp('maxstanzas', str(parameters.maxstanzas))
-
- if parameters.maxseconds is not None:
- hnode.setProp('maxseconds', str(parameters.maxseconds))
-
- if parameters.since is not None:
- hnode.setProp('since', parameters.since.strftime('%Y-%m-%dT%H:%M:%SZ'))
-
-
-
- def get_history(self):
- for child in xml_element_iter(self.xmlnode.children):
- if get_node_ns_uri(child) == MUC_NS and child.name == 'history':
- maxchars = from_utf8(child.prop('maxchars'))
- if maxchars is not None:
- maxchars = int(maxchars)
-
- maxstanzas = from_utf8(child.prop('maxstanzas'))
- if maxstanzas is not None:
- maxstanzas = int(maxstanzas)
-
- maxseconds = from_utf8(child.prop('maxseconds'))
- if maxseconds is not None:
- maxseconds = int(maxseconds)
-
- since = None
- return HistoryParameters(maxchars, maxstanzas, maxseconds, since)
- continue
-
-
-
- def set_password(self, password):
- for child in xml_element_iter(self.xmlnode.children):
- if get_node_ns_uri(child) == MUC_NS and child.name == 'password':
- child.unlinkNode()
- child.freeNode()
- break
- continue
-
- if password is not None:
- self.xmlnode.newTextChild(self.xmlnode.ns(), 'password', to_utf8(password))
-
-
-
- def get_password(self):
- for child in xml_element_iter(self.xmlnode.children):
- if get_node_ns_uri(child) == MUC_NS and child.name == 'password':
- return from_utf8(child.getContent())
- continue
-
-
-
-
- class HistoryParameters(object):
-
- def __init__(self, maxchars = None, maxstanzas = None, maxseconds = None, since = None):
- self.maxchars = maxchars
- self.maxstanzas = maxstanzas
- self.maxseconds = maxseconds
- self.since = since
-
-
-
- class MucItemBase(object):
-
- def __init__(self):
- if self.__class__ is MucItemBase:
- raise RuntimeError, 'Abstract class called'
-
-
-
-
- class MucItem(MucItemBase):
-
- def __init__(self, xmlnode_or_affiliation, role = None, jid = None, nick = None, actor = None, reason = None):
- (self.jid, self.nick, self.actor, self.affiliation, self.reason, self.role) = (None, None, None, None, None, None)
- MucItemBase.__init__(self)
- if isinstance(xmlnode_or_affiliation, libxml2.xmlNode):
- self._MucItem__from_xmlnode(xmlnode_or_affiliation)
- else:
- self._MucItem__init(xmlnode_or_affiliation, role, jid, nick, actor, reason)
-
-
- def __init(self, affiliation, role, jid = None, nick = None, actor = None, reason = None):
- if not affiliation:
- affiliation = None
- elif affiliation not in affiliations:
- raise ValueError, 'Bad affiliation'
-
- self.affiliation = affiliation
- if not role:
- role = None
- elif role not in roles:
- raise ValueError, 'Bad role'
-
- self.role = role
- if jid:
- self.jid = JID(jid)
- else:
- self.jid = None
- if actor:
- self.actor = JID(actor)
- else:
- self.actor = None
- self.nick = nick
- self.reason = reason
-
-
- def __from_xmlnode(self, xmlnode):
- actor = None
- reason = None
- n = xmlnode.children
- while n:
- ns = n.ns()
- if ns and ns.getContent() != MUC_USER_NS:
- continue
-
- if n.name == 'actor':
- actor = n.getContent()
-
- if n.name == 'reason':
- reason = n.getContent()
-
- n = n.next
- self._MucItem__init(from_utf8(xmlnode.prop('affiliation')), from_utf8(xmlnode.prop('role')), from_utf8(xmlnode.prop('jid')), from_utf8(xmlnode.prop('nick')), from_utf8(actor), from_utf8(reason))
-
-
- def as_xml(self, parent):
- n = parent.newChild(None, 'item', None)
- if self.actor:
- n.newTextChild(None, 'actor', to_utf8(self.actor))
-
- if self.reason:
- n.newTextChild(None, 'reason', to_utf8(self.reason))
-
- n.setProp('affiliation', to_utf8(self.affiliation))
- n.setProp('role', to_utf8(self.role))
- if self.jid:
- n.setProp('jid', to_utf8(self.jid.as_unicode()))
-
- if self.nick:
- n.setProp('nick', to_utf8(self.nick))
-
- return n
-
-
-
- class MucStatus(MucItemBase):
-
- def __init__(self, xmlnode_or_code):
- self.code = None
- MucItemBase.__init__(self)
- if isinstance(xmlnode_or_code, libxml2.xmlNode):
- self._MucStatus__from_xmlnode(xmlnode_or_code)
- else:
- self._MucStatus__init(xmlnode_or_code)
-
-
- def __init(self, code):
- code = int(code)
- if code < 0 or code > 999:
- raise ValueError, 'Bad status code'
-
- self.code = code
-
-
- def __from_xmlnode(self, xmlnode):
- self.code = int(xmlnode.prop('code'))
-
-
- def as_xml(self, parent):
- n = parent.newChild(None, 'status', None)
- n.setProp('code', '%03i' % (self.code,))
- return n
-
-
-
- class MucUserX(MucXBase):
- ns = MUC_USER_NS
-
- def get_items(self):
- if not self.xmlnode.children:
- return []
-
- ret = []
- n = self.xmlnode.children
- while n:
- ns = n.ns()
- if ns and ns.getContent() != self.ns:
- pass
- elif n.name == 'item':
- ret.append(MucItem(n))
- elif n.name == 'status':
- ret.append(MucStatus(n))
-
- n = n.next
- return ret
-
-
- def clear(self):
- if not self.xmlnode.children:
- return None
-
- n = self.xmlnode.children
- while n:
- ns = n.ns()
- if ns and ns.getContent() != MUC_USER_NS:
- pass
- else:
- n.unlinkNode()
- n.freeNode()
- n = n.next
-
-
- def add_item(self, item):
- if not isinstance(item, MucItemBase):
- raise TypeError, 'Bad item type for muc#user'
-
- item.as_xml(self.xmlnode)
-
-
-
- class MucOwnerX(MucXBase):
- pass
-
-
- class MucAdminQuery(MucUserX):
- ns = MUC_ADMIN_NS
- element = 'query'
-
-
- class MucStanzaExt:
-
- def __init__(self):
- if self.__class__ is MucStanzaExt:
- raise RuntimeError, 'Abstract class called'
-
- self.xmlnode = None
- self.muc_child = None
-
-
- def get_muc_child(self):
- if self.muc_child:
- return self.muc_child
-
- if not self.xmlnode.children:
- return None
-
- n = self.xmlnode.children
- while n:
- if n.name not in ('x', 'query'):
- n = n.next
- continue
-
- ns = n.ns()
- if not ns:
- n = n.next
- continue
-
- ns_uri = ns.getContent()
- if (n.name, ns_uri) == ('x', MUC_NS):
- self.muc_child = MucX(n)
- return self.muc_child
-
- if (n.name, ns_uri) == ('x', MUC_USER_NS):
- self.muc_child = MucUserX(n)
- return self.muc_child
-
- if (n.name, ns_uri) == ('query', MUC_ADMIN_NS):
- self.muc_child = MucAdminQuery(n)
- return self.muc_child
-
- if (n.name, ns_uri) == ('query', MUC_OWNER_NS):
- self.muc_child = MucOwnerX(n)
- return self.muc_child
-
- n = n.next
-
-
- def clear_muc_child(self):
- if self.muc_child:
- self.muc_child.free_borrowed()
- self.muc_child = None
-
- if not self.xmlnode.children:
- return None
-
- n = self.xmlnode.children
- while n:
- if n.name not in ('x', 'query'):
- n = n.next
- continue
-
- ns = n.ns()
- if not ns:
- n = n.next
- continue
-
- ns_uri = ns.getContent()
- if ns_uri in (MUC_NS, MUC_USER_NS, MUC_ADMIN_NS, MUC_OWNER_NS):
- n.unlinkNode()
- n.freeNode()
-
- n = n.next
-
-
- def make_muc_userinfo(self):
- self.clear_muc_child()
- self.muc_child = MucUserX(parent = self.xmlnode)
- return self.muc_child
-
-
- def make_muc_admin_quey(self):
- self.clear_muc_child()
- self.muc_child = MucAdminQuery(parent = self.xmlnode)
- return self.muc_child
-
-
- def muc_free(self):
- if self.muc_child:
- self.muc_child.free_borrowed()
-
-
-
-
- class MucPresence(Presence, MucStanzaExt):
-
- def __init__(self, xmlnode = None, from_jid = None, to_jid = None, stanza_type = None, stanza_id = None, show = None, status = None, priority = 0, error = None, error_cond = None):
- MucStanzaExt.__init__(self)
- Presence.__init__(self, xmlnode, from_jid = from_jid, to_jid = to_jid, stanza_type = stanza_type, stanza_id = stanza_id, show = show, status = status, priority = priority, error = error, error_cond = error_cond)
-
-
- def copy(self):
- return MucPresence(self)
-
-
- def make_join_request(self, password = None, history_maxchars = None, history_maxstanzas = None, history_seconds = None, history_since = None):
- self.clear_muc_child()
- self.muc_child = MucX(parent = self.xmlnode)
- if history_maxchars is not None and history_maxstanzas is not None and history_seconds is not None or history_since is not None:
- history = HistoryParameters(history_maxchars, history_maxstanzas, history_seconds, history_since)
- self.muc_child.set_history(history)
-
- if password is not None:
- self.muc_child.set_password(password)
-
-
-
- def get_join_info(self):
- x = self.get_muc_child()
- if not x:
- return None
-
- if not isinstance(x, MucX):
- return None
-
- return x
-
-
- def free(self):
- self.muc_free()
- Presence.free(self)
-
-
-
- class MucIq(Iq, MucStanzaExt):
-
- def __init__(self, xmlnode = None, from_jid = None, to_jid = None, stanza_type = None, stanza_id = None, error = None, error_cond = None):
- MucStanzaExt.__init__(self)
- Iq.__init__(self, xmlnode, from_jid = from_jid, to_jid = to_jid, stanza_type = stanza_type, stanza_id = stanza_id, error = error, error_cond = error_cond)
-
-
- def copy(self):
- return MucIq(self)
-
-
- def make_kick_request(self, nick, reason):
- self.clear_muc_child()
- self.muc_child = MucAdminQuery(parent = self.xmlnode)
- item = MucItem('none', 'none', nick = nick, reason = reason)
- self.muc_child.add_item(item)
- return self.muc_child
-
-
- def free(self):
- self.muc_free()
- Iq.free(self)
-
-
-