Search in sources :

Example 1 with TextSingleFormField

use of org.jivesoftware.smackx.xdata.TextSingleFormField in project Smack by igniterealtime.

the class FormFieldRegistry method register.

@SuppressWarnings("ReferenceEquality")
public static void register(DataForm dataForm) {
    // TODO: Also allow forms of type 'result'?
    if (dataForm.getType() != DataForm.Type.form) {
        throw new IllegalArgumentException();
    }
    String formType = null;
    TextSingleFormField hiddenFormTypeField = dataForm.getHiddenFormTypeField();
    if (hiddenFormTypeField != null) {
        formType = hiddenFormTypeField.getValue();
    }
    for (FormField formField : dataForm.getFields()) {
        // Note that we can compare here by reference equality to skip the hidden form type field.
        if (formField == hiddenFormTypeField) {
            continue;
        }
        FormField.Type type = formField.getType();
        if (type == FormField.Type.fixed) {
            continue;
        }
        String fieldName = formField.getFieldName();
        register(formType, fieldName, type);
    }
}
Also used : TextSingleFormField(org.jivesoftware.smackx.xdata.TextSingleFormField) FormField(org.jivesoftware.smackx.xdata.FormField) TextSingleFormField(org.jivesoftware.smackx.xdata.TextSingleFormField)

Example 2 with TextSingleFormField

use of org.jivesoftware.smackx.xdata.TextSingleFormField in project Smack by igniterealtime.

the class DataFormProvider method parse.

@Override
public DataForm parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException {
    DataForm.Type dataFormType = DataForm.Type.fromString(parser.getAttributeValue("", "type"));
    DataForm.Builder dataForm = DataForm.builder(dataFormType);
    String formType = null;
    DataForm.ReportedData reportedData = null;
    outerloop: while (true) {
        XmlPullParser.Event eventType = parser.next();
        switch(eventType) {
            case START_ELEMENT:
                String name = parser.getName();
                String namespace = parser.getNamespace();
                XmlEnvironment elementXmlEnvironment = XmlEnvironment.from(parser, xmlEnvironment);
                switch(name) {
                    case "instructions":
                        dataForm.addInstruction(parser.nextText());
                        break;
                    case "title":
                        dataForm.setTitle(parser.nextText());
                        break;
                    case "field":
                        // Note that we parse this form field without any potential reportedData. We only use reportedData
                        // to lookup form field types of fields under <item/>.
                        FormField formField = parseField(parser, elementXmlEnvironment, formType);
                        TextSingleFormField hiddenFormTypeField = formField.asHiddenFormTypeFieldIfPossible();
                        if (hiddenFormTypeField != null) {
                            if (formType != null) {
                                throw new SmackParsingException("Multiple hidden form type fields");
                            }
                            formType = hiddenFormTypeField.getValue();
                        }
                        dataForm.addField(formField);
                        break;
                    case "item":
                        DataForm.Item item = parseItem(parser, elementXmlEnvironment, formType, reportedData);
                        dataForm.addItem(item);
                        break;
                    case "reported":
                        if (reportedData != null) {
                            throw new SmackParsingException("Data form with multiple <reported/> elements");
                        }
                        reportedData = parseReported(parser, elementXmlEnvironment, formType);
                        dataForm.setReportedData(reportedData);
                        break;
                    // See XEP-133 Example 32 for a corner case where the data form contains this extension.
                    case RosterPacket.ELEMENT:
                        if (namespace.equals(RosterPacket.NAMESPACE)) {
                            dataForm.addExtensionElement(RosterPacketProvider.INSTANCE.parse(parser));
                        }
                        break;
                    // See XEP-141 Data Forms Layout
                    case DataLayout.ELEMENT:
                        if (namespace.equals(DataLayout.NAMESPACE)) {
                            dataForm.addExtensionElement(DataLayoutProvider.parse(parser));
                        }
                        break;
                }
                break;
            case END_ELEMENT:
                if (parser.getDepth() == initialDepth) {
                    break outerloop;
                }
                break;
            default:
                // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
                break;
        }
    }
    return dataForm.build();
}
Also used : TextSingleFormField(org.jivesoftware.smackx.xdata.TextSingleFormField) DataForm(org.jivesoftware.smackx.xdata.packet.DataForm) ListMultiFormField(org.jivesoftware.smackx.xdata.ListMultiFormField) AbstractSingleStringValueFormField(org.jivesoftware.smackx.xdata.AbstractSingleStringValueFormField) BooleanFormField(org.jivesoftware.smackx.xdata.BooleanFormField) FormField(org.jivesoftware.smackx.xdata.FormField) ListSingleFormField(org.jivesoftware.smackx.xdata.ListSingleFormField) JidMultiFormField(org.jivesoftware.smackx.xdata.JidMultiFormField) TextSingleFormField(org.jivesoftware.smackx.xdata.TextSingleFormField) AbstractMultiFormField(org.jivesoftware.smackx.xdata.AbstractMultiFormField) JidSingleFormField(org.jivesoftware.smackx.xdata.JidSingleFormField) XmlEnvironment(org.jivesoftware.smack.packet.XmlEnvironment) SmackParsingException(org.jivesoftware.smack.parsing.SmackParsingException)

Example 3 with TextSingleFormField

use of org.jivesoftware.smackx.xdata.TextSingleFormField in project Smack by igniterealtime.

the class SoftwareInfoFormTest method faultySoftwareInfoFormsTest.

@Test
public void faultySoftwareInfoFormsTest() {
    DataForm.Builder dataFormbuilder = DataForm.builder(DataForm.Type.result);
    TextSingleFormField formField = FormField.buildHiddenFormType("faulty_formtype");
    dataFormbuilder.addField(formField);
    assertThrows(IllegalArgumentException.class, () -> {
        SoftwareInfoForm.getBuilder().setDataForm(dataFormbuilder.build()).build();
    });
    DataForm.Builder builderWithoutFormType = DataForm.builder(DataForm.Type.result);
    assertThrows(IllegalArgumentException.class, () -> {
        SoftwareInfoForm.getBuilder().setDataForm(builderWithoutFormType.build()).build();
    });
}
Also used : TextSingleFormField(org.jivesoftware.smackx.xdata.TextSingleFormField) DataForm(org.jivesoftware.smackx.xdata.packet.DataForm) Test(org.junit.jupiter.api.Test)

Example 4 with TextSingleFormField

use of org.jivesoftware.smackx.xdata.TextSingleFormField in project Smack by igniterealtime.

the class SoftwareInfoFormTest method createSoftwareInfoFormUsingDataForm.

public static SoftwareInfoForm createSoftwareInfoFormUsingDataForm() throws URISyntaxException {
    DataForm.Builder dataFormBuilder = DataForm.builder(DataForm.Type.result);
    TextSingleFormField formField = FormField.buildHiddenFormType(SoftwareInfoForm.FORM_TYPE);
    dataFormBuilder.addField(formField);
    dataFormBuilder.addField(FormField.builder("icon").addFormFieldChildElement(createMediaElement()).build());
    dataFormBuilder.addField(FormField.builder("os").setValue("Windows").build());
    dataFormBuilder.addField(FormField.builder("os_version").setValue("XP").build());
    dataFormBuilder.addField(FormField.builder("software").setValue("Exodus").build());
    dataFormBuilder.addField(FormField.builder("software_version").setValue("0.9.1").build());
    SoftwareInfoForm softwareInfoForm = SoftwareInfoForm.getBuilder().setDataForm(dataFormBuilder.build()).build();
    return softwareInfoForm;
}
Also used : TextSingleFormField(org.jivesoftware.smackx.xdata.TextSingleFormField) SoftwareInfoForm(org.jivesoftware.smackx.softwareinfo.form.SoftwareInfoForm) DataForm(org.jivesoftware.smackx.xdata.packet.DataForm)

Aggregations

TextSingleFormField (org.jivesoftware.smackx.xdata.TextSingleFormField)4 DataForm (org.jivesoftware.smackx.xdata.packet.DataForm)3 FormField (org.jivesoftware.smackx.xdata.FormField)2 XmlEnvironment (org.jivesoftware.smack.packet.XmlEnvironment)1 SmackParsingException (org.jivesoftware.smack.parsing.SmackParsingException)1 SoftwareInfoForm (org.jivesoftware.smackx.softwareinfo.form.SoftwareInfoForm)1 AbstractMultiFormField (org.jivesoftware.smackx.xdata.AbstractMultiFormField)1 AbstractSingleStringValueFormField (org.jivesoftware.smackx.xdata.AbstractSingleStringValueFormField)1 BooleanFormField (org.jivesoftware.smackx.xdata.BooleanFormField)1 JidMultiFormField (org.jivesoftware.smackx.xdata.JidMultiFormField)1 JidSingleFormField (org.jivesoftware.smackx.xdata.JidSingleFormField)1 ListMultiFormField (org.jivesoftware.smackx.xdata.ListMultiFormField)1 ListSingleFormField (org.jivesoftware.smackx.xdata.ListSingleFormField)1 Test (org.junit.jupiter.api.Test)1