【问题标题】:SMACK XEP-313 ImplementationSMACK XEP-313 实施
【发布时间】:2015-05-30 16:59:08
【问题描述】:

需要附加一个 0313 XEP (0.2) http://xmpp.org/extensions/attic/xep-0313-0.2.html#sect-idp616432 进入 SMACK/ASMACK。 我为此创建了 PacketExtension。

    public class Archive313 implements PacketExtension {
    static final public String NAMESPACE = "urn:xmpp:mam:tmp";
    static final public String ELEMENT = "result";
    private String Id;
    private String Queryid;
    private String Stamp;
    private String To;
    private String From;
    private String Type;
    private String Body;

    public Archive313(String id, String queryid, String stamp, String to, String from, String type, String body) {
        Id = id;
        Queryid = queryid;
        Stamp = stamp;
        To = to;
        From = from;
        Type = type;
        Body = body;
    }

    @Override
    public String getElementName() {
        return ELEMENT;
    }

    @Override
    public String getNamespace() {
        return NAMESPACE;
    }

    @Override
    public String toXML() {
        return "<" + ELEMENT + " xmlns='" + NAMESPACE + "' queryid='" + Queryid + "' id='" + Id + "'>" +
                "<forwarded xmlns='urn:xmpp:forward:0'>" +
                "<delay xmlns='urn:xmpp:delay' stamp='" + Stamp + "'/><message to='"
                + To + "' from='" + From + "' type='" + Type + "'><body>" + Body + "</body></message></forwarded></result>";
    }

    public static class Archive313Provider implements PacketExtensionProvider {

        @Override
        public PacketExtension parseExtension(XmlPullParser xmlPullParser) throws Exception {
            String tag_name = "";
            String id = "";
            String queryid = "";
            String stamp = "";
            String to = "";
            String from = "";
            String type = "";
            String body = "";

            while (xmlPullParser.getEventType() != XmlPullParser.END_DOCUMENT) {
                switch (xmlPullParser.getEventType()) {
                    case XmlPullParser.START_TAG:
                        tag_name = xmlPullParser.getName();
                        for (int i = 0; i < xmlPullParser.getAttributeCount(); i++) {
                            if (tag_name != null && tag_name.equals("result")) {
                                if (xmlPullParser.getAttributeName(i).equals("queryid")) {
                                    queryid = xmlPullParser.getAttributeValue(i);
                                }
                                if (xmlPullParser.getAttributeName(i).equals("id")) {
                                    id = xmlPullParser.getAttributeValue(i);
                                }
                            }

                            if (tag_name != null && tag_name.equals("delay")) {
                                if (xmlPullParser.getAttributeName(i).equals("stamp")) {
                                    stamp = xmlPullParser.getAttributeValue(i);
                                }
                            }

                            if (tag_name != null && tag_name.equals("message") && xmlPullParser.getAttributeCount() > 2) {
                                if (xmlPullParser.getAttributeName(i).equals("to")) {
                                    to = xmlPullParser.getAttributeValue(i);
                                }

                                if (xmlPullParser.getAttributeName(i).equals("from")) {
                                    from = xmlPullParser.getAttributeValue(i);
                                }

                                if (xmlPullParser.getAttributeName(i).equals("type")) {
                                    type = xmlPullParser.getAttributeValue(i);
                                }
                            }
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        tag_name = xmlPullParser.getName();
                        break;
                    case XmlPullParser.TEXT:
                        if ("body".equals(tag_name)) {
                            body = xmlPullParser.getText();
                        }
                        break;
                    default:
                        break;
                }
                xmlPullParser.next();
            }

            return new Archive313(id,queryid,stamp,to,from,type,body);
        }
    }
}

ProviderManager pm = ProviderManager.getInstance();

pm.addExtensionProvider("result", "urn:xmpp:mam:tmp", new Archive313.Archive313Provider());

mXMPPConnection.addPacketListener(archiveListener, new PacketExtensionFilter("result", "urn:xmpp:mam:tmp"));

private PacketListener archiveListener = new PacketListener() {

    @Override
    public void processPacket(Packet packet) {
        Log.d("archiveListener", packet.toXML());
    }
};

在这个实现中,我不给 archiveListener 任何数据包。

如果我设置过滤器:

PacketFilter filter = new PacketFilter() {
    @Override
    public boolean accept(Packet packet) {
        if (packet.toXML().contains("urn:xmpp:mam:tmp")) {
            return true;
        }
        return false;
    }
};

我收到了包裹,但还没有装满。

需要:

<message id='aeb213' to='juliet@capulet.lit/chamber'>
  <result xmlns='urn:xmpp:mam:tmp' queryid='f27' id='28482-98726-73623'>
    <forwarded xmlns='urn:xmpp:forward:0'>
      <delay xmlns='urn:xmpp:delay' stamp='2010-07-10T23:08:25Z'/>
      <message to='juliet@capulet.lit/balcony'
        from='romeo@montague.lit/orchard'
        type='chat'>
        <body>Call me but love, and I'll be new baptized; Henceforth I never will be Romeo.</body>
      </message>
    </forwarded>
  </result>
</message>

我明白了:

<message id='aeb213' to='juliet@capulet.lit/chamber'>
  <result xmlns='urn:xmpp:mam:tmp' queryid='f27' id='28482-98726-73623'>
  </result>
</message>

在 SMACK 日志中,我收到了完整的消息。

【问题讨论】:

  • 我建议阅读有关提供者的 smack 文档。
  • 嗨,我也被困在同一点上。你修了吗?请帮忙
  • 可能您使用的服务器不支持该功能。我开发了一个 openfire 插件来实现它
  • 顺便说一句:XEP-0313:消息存档管理 - 警告:XMPP 标准基金会已推迟考虑本文档。不建议实施此处描述的协议。
  • 嗨,我从服务器获取实际响应作为日志,因为我已启用调试。但在我的数据包过滤器中,数据包没有日志所示的“转发”或“延迟”扩展/元素。

标签: java android xmpp smack asmack


【解决方案1】:

看起来像你的代码

ProviderManager pm = ProviderManager.getInstance();
pm.addExtensionProvider("result", "urn:xmpp:mam:tmp", new Archive313.Archive313Provider());

从不打电话。检查这个。通常,此代码必须放在与 xmpp lib 一起使用的主类的静态块中。

【讨论】:

    【解决方案2】:

    要添加任何扩展,您必须做三件事。

    1. 创建自定义扩展类扩展 Extension/ExtensionElement。

    2. 创建扩展 ExtensionProvider 的扩展提供程序。

    3. 将自定义扩展提供程序添加到提供程序管理器。

    注意:扩展提供者将根据您的要求(提供者的 onParse() 方法)从数据包 (XML) 中解析您的扩展。每个自定义扩展都必须手动解析,并且需要将自定义提供程序添加到提供程序管理器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2015-05-31
      相关资源
      最近更新 更多