Получить настроенный элемент из `vcard`, используя` xmpp` и `smack` - PullRequest
0 голосов
/ 05 марта 2019

Я создал vcard с пользовательскими элементами:

<vCard xmlns='vcard-temp'><NICKNAME>nickname</NICKNAME><elementName xmlns='xmlns:custom'><avatar>elementName_avatar_3.png</avatar></elementName></vCard>

, когда, однако, я спрашиваю это vcard, мой результат:

<iq xmlns='jabber:client' to='602157@peropenfire101.per.local/3r6td85ng7' from='271087@peropenfire101.per.local' id='jA5pI-33' type='result'><vCard xmlns='vcard-temp'><JABBERID>271087@peropenfire101.per.local/4usgw7j7u</JABBERID><NICKNAME>nickname</NICKNAME></vCard></iq>

, как вы можете видеть,пользовательские элементы отсутствуют.это моя просьба:

try {
        connection.sendStanzaWithResponseCallback(
                new cdcd(from),
                new StanzaFilter() {
                    @Override
                    public boolean accept(Stanza stanza) {
                        return false;
                    }
                },
                new StanzaListener() {
                    @Override
                    public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {
                    }
                });
    } catch (Exception e) {
        e.printStackTrace();
    }

private class cdcd extends Stanza{

    private final Jid from;

    public cdcd(Jid from) {
        this.from = from;
    }

    @Override
    public String toString() {
        return null;
    }

    @Override
    public CharSequence toXML(String enclosingNamespace) {
        return "<iq from=\'"+ from +"\' id='v1' type='get'><vCard xmlns='vcard-temp'/></iq>";
    }
}

Я не знаю, как это исправить.

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Решено ... Я создал новый класс, который расширяет VCardProvider, и я проанализировал свой пользовательский тег в переопределенном методе parse

public class CustomVCardProvider extends VCardProvider {

private static final String[] TEL = new String[]{
        "VOICE",
        "FAX",
        "PAGER",
        "MSG",
        "CELL",
        "VIDEO",
        "BBS",
        "MODEM",
        "ISDN",
        "PCS",
        "PREF",
};

private static final String[] ADR = new String[]{
        "POSTAL",
        "PARCEL",
        "DOM",
        "INTL",
        "PREF",
        "POBOX",
        "EXTADR",
        "STREET",
        "LOCALITY",
        "REGION",
        "PCODE",
        "CTRY",
        "FF",
};

@Override
public VCard parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException {

    VCard vCard = new VCard();
    String name = null;

    outerloop:
    while (true) {
        int eventType = parser.next();
        switch (eventType) {
            case XmlPullParser.START_TAG:
                name = parser.getName();
                switch (name) {
                    case CUSTOM_TAG:
                        parseCustomTag(parser, vCard);
                        break;
                    case "N":
                        parseName(parser, vCard);
                        break;
                    case "ORG":
                        parseOrg(parser, vCard);
                        break;
                    case "TEL":
                        parseTel(parser, vCard);
                        break;
                    case "ADR":
                        parseAddress(parser, vCard);
                        break;
                    case "EMAIL":
                        parseEmail(parser, vCard);
                        break;
                    case "NICKNAME":
                        vCard.setNickName(parser.nextText());
                        break;
                    case "JABBERID":
                        vCard.setJabberId(parser.nextText());
                        break;
                    case "PHOTO":
                        parsePhoto(parser, vCard);
                        break;
                    default:
                        break;
                }
                break;
            case XmlPullParser.TEXT:
                if (initialDepth + 1 == parser.getDepth()) {
                    vCard.setField(name, parser.getText());
                }
                break;
            case XmlPullParser.END_TAG:
                if (parser.getDepth() == initialDepth) {
                    break outerloop;
                }
                break;
            default:
                break;
        }
    }

    return vCard;
}

Не забудьте скопировать все парсеры из исходного провайдераи добавьте ProviderManager.addIQProvider("vCard", "vcard-temp", new CustomVCardProvider()); после аутентификации

0 голосов
/ 03 июля 2019

Согласно XEP-054 функция нестандартных элементов vCard DTD не поддерживается, поэтому ваш XMPP-сервер игнорирует их.

К сожалению, предложение Доусона недвигаться вперед в рамках процесса стандартизации IETF.По причинам, потерянным в глубине веков, проект Jabber продолжал использовать DTD из draft-dawson-vcard-xml-dtd-01, сделав две небольшие модификации, чтобы адаптировать его для использования в сообществе Jabber (добавив JABBERID и DESCэлементы), но также указав имена элементов во всех заглавных буквах, а не в нижнем регистре, как определено в draft-dawson-vcard-xml-dtd-01.Кроме того, сообщество Jabber следовало за использованием (но не DTD) в этом черновике в отношении информации о версии, включая ее как атрибут элемента vCard, а не как дочерний элемент.Этот формат был реализован в сообществе Jabber в пространстве имен vcard-temp.

Здесь вы можете увидеть все поддерживаемые элементы.Также см. Обсуждение здесь

...