Пример #1
0
    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")
Пример #2
0
    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)
Пример #3
0
    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()
Пример #4
0
 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)
Пример #5
0
def dump_list(dump, name, obj):
    element = Element(name)
    for item in obj:
        element.add(dump(item))
    return element
Пример #6
0
 def dump_rule(cls, dump, name, rule):
     element = Element(name)
     element.add(dump(rule.child))
     return element
Пример #7
0
 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
Пример #8
0
 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
Пример #9
0
 def dump(self, obj, name, context):
     element = Element(name)
     element.add(context.dump(obj.dump()))
     return element
Пример #10
0
 def dump(self, obj, name, context):
     element = Element(name)
     for item in obj:
         element.add(context.dump(item))
     return element