def _establish_session(self, jid, service_id, path, conf): start = Element("start", xmlns=SERVICE_NS, id=service_id) if path: path_element = Element("path") path_element.add(serialize.dump(path)) start.add(path_element) conf_element = Element("config") conf_element.add(serialize.dump(conf)) start.add(conf_element) try: result = yield self.xmpp.core.iq_set(start, to=jid) except XMPPError as error: if error.type != "cancel": raise if error.condition == "session-failure": raise SessionError( "session for service " + repr(service_id) + " failed: " + error.text) idiokit.stop() except Unavailable: idiokit.stop() for start in result.children("start", SERVICE_NS).with_attrs("id"): session_id = start.get_attr("id") session = self._catch(jid, session_id) idiokit.pipe(self.fork(), session) sessions = self.jids.setdefault(jid, dict()) sessions[session_id] = session idiokit.stop(session) else: raise SessionError( "no session ID for service " + repr(service_id) + "received")
def to_elements(self, include_body=True): element = Element("event", xmlns=EVENT_NS) for key, value in self.items(): key = _replace_non_xml_chars(key) value = _replace_non_xml_chars(value) attr = Element("attr", key=key, value=value) element.add(attr) if not include_body: return element body = Element("body") body.text = _replace_non_xml_chars(unicode(self)) return Elements(body, element)
def _try_session(inner, self, service_id, *path, **conf): matches = list() for jid, service_ids in self.catalogue.items(): if service_id in service_ids: matches.append(jid) if matches: jid = random.choice(matches) else: channel = threado.Channel() self.waiters.setdefault(service_id, set()).add(channel) try: while not channel.was_source: jid = yield inner, channel finally: waiters = self.waiters.get(service_id, set()) waiters.discard(channel) if not waiters: self.waiters.pop(service_id, None) start = Element("start", xmlns=SERVICE_NS, id=service_id) if path: path_element = Element("path") path_element.add(serialize.dump(path)) start.add(path_element) conf_element = Element("config") conf_element.add(serialize.dump(conf)) start.add(conf_element) try: result = yield inner.sub(self.xmpp.core.iq_set(start, to=jid)) except XMPPError, error: if error.type != "cancel": raise inner.finish()
def _update_presence(self): services = Element("services", xmlns=SERVICE_NS) for service_id, service in self.services.items(): element = Element("service", id=service_id) services.add(element) self.xmpp.core.presence(services, to=self.room.jid)
def dump_list(dump, name, obj): element = Element(name) for item in obj: element.add(dump(item)) return element
def dump_rule(cls, dump, name, rule): element = Element(name) element.add(dump(rule.child)) return element
def dump_rule(cls, dump, name, rule): element = Element(name, ip=rule.ip, bits=rule.bits) if rule.keys is not None: element.add(serialize.dump_list(dump, "keys", rule.keys)) return element
def dump_rule(cls, dump, name, rule): element = Element(name) element.add(serialize.dump_list(dump, "keys", rule.keys)) element.add(serialize.dump_dict(dump, "key-values", rule.key_values)) return element
def dump(self, obj, name, context): element = Element(name) element.add(context.dump(obj.dump())) return element
def dump(self, obj, name, context): element = Element(name) for item in obj: element.add(context.dump(item)) return element