예제 #1
0
파일: register.py 프로젝트: sgricci/digsby
    def __from_xml(self, xmlnode):
        """Initialize `Register` from an XML node.

        :Parameters:
            - `xmlnode`: the jabber:x:register XML element.
        :Types:
            - `xmlnode`: `libxml2.xmlNode`"""

        self.__logger.debug("Converting jabber:iq:register element from XML")
        if xmlnode.type != "element":
            raise ValueError, "XML node is not a jabber:iq:register element (not an element)"
        ns = get_node_ns_uri(xmlnode)
        if ns and ns != REGISTER_NS or xmlnode.name != "query":
            raise ValueError, "XML node is not a jabber:iq:register element"

        for element in xml_element_iter(xmlnode.children):
            ns = get_node_ns_uri(element)
            if ns == DATAFORM_NS and element.name == "x" and not self.form:
                self.form = Form(element)
            elif ns != REGISTER_NS:
                continue
            name = element.name
            if name == "instructions" and not self.instructions:
                self.instructions = from_utf8(element.getContent())
            elif name == "registered":
                self.registered = True
            elif name == "remove":
                self.remove = True
            elif name in legacy_fields and not getattr(self, name):
                value = from_utf8(element.getContent())
                if value is None:
                    value = u""
                self.__logger.debug(u"Setting legacy field %r to %r" %
                                    (name, value))
                setattr(self, name, value)
예제 #2
0
    def request_instant_room(self):
        """
        Request an "instant room" -- the default configuration for a MUC room.

        :return: id of the request stanza.
        :returntype: `unicode`
        """
        if self.configured:
            raise RuntimeError, "Instant room may be requested for unconfigured room only"
        form = Form("submit")
        return self.configure_room(form)
예제 #3
0
 def build_form_inc(self, form_type, title, instructions, field_data):
     form = Form(form_type)
     form.title = title
     form.instructions = instructions
     for name, ftype, values, label, options, required, desc in field_data:
         field = form.add_field(name=name,
                                field_type=ftype,
                                values=values,
                                label=label,
                                required=required,
                                desc=desc)
         for olabel, ovalue in options:
             field.add_option(ovalue, olabel)
     return form
예제 #4
0
 def main_menu_choice(self, response):
     if response == "o":
         form = self.form.make_submit()
         self.form = None
         self.callback(self, form)
         self.callback = None
     elif response == "c":
         self.form = None
         self.callback(self, Form("cancel"))
         self.callback = None
     elif response == "e":
         self.clear()
         self.edit_next_field(iter(self.editable_fields))
     elif response in xrange(1, len(self.editable_fields) + 1):
         self.clear()
         self.edit_field(self.editable_fields[response - 1], self.main_menu)
     else:
         self.main_menu()
예제 #5
0
 def build_form_direct(self, form_type, title, instructions, field_data):
     fields = []
     for name, ftype, values, label, options, required, desc in field_data:
         foptions = []
         for olabel, ovalue in options:
             foptions.append(Option(ovalue, olabel))
         field = Field(name=name,
                       field_type=ftype,
                       values=values,
                       label=label,
                       options=foptions,
                       required=required,
                       desc=desc)
         fields.append(field)
     form = Form(form_type,
                 title=title,
                 instructions=instructions,
                 fields=fields)
     return form
예제 #6
0
    def process_configuration_form_success(self, stanza):
        """
        Process successful result of a room configuration form request.

        :Parameters:
            - `stanza`: the stanza received.
        :Types:
            - `stanza`: `Presence`
        """
        if stanza.get_query_ns() != MUC_OWNER_NS:
            raise ValueError, "Bad result namespace"  # TODO: ProtocolError
        query = stanza.get_query()
        form = None
        for el in xml_element_ns_iter(query.children, DATAFORM_NS):
            form = Form(el)
            break
        if not form:
            raise ValueError, "No form received"  # TODO: ProtocolError
        self.configuration_form = form
        self.handler.configuration_form_received(form)
예제 #7
0
    def complete_xml_element(self, xmlnode, _unused):
        """Complete the XML node with `self` content.

        Should be overriden in classes derived from `StanzaPayloadObject`.

        :Parameters:
            - `xmlnode`: XML node with the element being built. It has already
              right name and namespace, but no attributes or content.
            - `_unused`: document to which the element belongs.
        :Types:
            - `xmlnode`: `libxml2.xmlNode`
            - `_unused`: `libxml2.xmlDoc`"""
        if self.possible_streams:
            field = dataforms.Field(
                name='stream-method',
                field_type='list-single',
                options=[dataforms.Option(n) for n in self.possible_streams])
            f = dataforms.Form(xmlnode_or_type='form', fields=[field])
        else:
            f = Form(xmlnode_or_type="submit")
            f.add_field(name='stream-method', value=self.selected_stream)
        f.as_xml(xmlnode, _unused)
예제 #8
0
파일: register.py 프로젝트: sgricci/digsby
    def get_form(self, form_type="form"):
        """Return Data Form for the `Register` object.

        Convert legacy fields to a data form if `self.form` is `None`, return `self.form` otherwise.

        :Parameters:
            - `form_type`: If "form", then a form to fill-in should be
              returned. If "sumbit", then a form with submitted data.
        :Types:
            - `form_type`: `unicode`

        :return: `self.form` or a form created from the legacy fields
        :returntype: `pyxmpp.jabber.dataforms.Form`"""

        if self.form:
            if self.form.type != form_type:
                raise ValueError, "Bad form type in the jabber:iq:register element"
            return self.form

        form = Form(form_type, instructions=self.instructions)
        form.add_field("FORM_TYPE", [u"jabber:iq:register"], "hidden")
        for field in legacy_fields:
            field_type, field_label = legacy_fields[field]
            value = getattr(self, field)
            if value is None:
                continue
            if form_type == "form":
                if not value:
                    value = None
                form.add_field(name=field,
                               field_type=field_type,
                               label=field_label,
                               value=value,
                               required=True)
            else:
                form.add_field(name=field, value=value)
        return form
예제 #9
0
 def parse_form(self, xml):
     doc = libxml2.parseDoc(xml)
     root = doc.getRootElement()
     return Form(root)