Custom extension element in Stanza for Smack 4.1.4

后端 未结 2 1700
灰色年华
灰色年华 2021-01-07 06:38

I am moving my android application from asmack-android library to Smack 4.1.4. I have some PacketExtensions in the asmack version of Smack, which uses PacketExtension and Pa

2条回答
  •  礼貌的吻别
    2021-01-07 07:09

    Message message = new Message();
    message.setStanzaId("923442621149");
    message.setType(Type.chat);
    message.setBody("shanraisshan");
    Log.e("message --->", message.toXML().toString());
    

    This will produce the following stanza

    shanraisshan
    

    1. CUSTOM EXTENSION STANZA TYPE-1

    In order to generate below custom extension stanza

    shanraisshan
    
    
    

    where reply is a custom extension, which contains

    1. Element (reply)
    2. Namespace (shayan:reply)

    the list of default xmpp namespaces are available at Official XMPP website

    Do following steps

    1. Add ReplyExtension.java in your project

    ReplyExtension.java

    package com.xmpp.extensions;
    
    import org.jivesoftware.smack.packet.DefaultExtensionElement;
    import org.jivesoftware.smack.packet.ExtensionElement;
    import org.jivesoftware.smack.provider.EmbeddedExtensionProvider;
    import org.jivesoftware.smack.util.XmlStringBuilder;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Shayan Rais (http://shanraisshan.com)
     * created on 9/7/2016
     */
    public class ReplyExtension implements ExtensionElement  {
    
        public static final String NAMESPACE = "shayan:reply";
        public static final String ELEMENT = "reply";
    
        String rText = null;
    
        static final String ATTRIBUTE_REPLY_TEXT = "rText";
    
        @Override
        public String getElementName() {
            return ELEMENT;
        }
    
        @Override
        public String getNamespace() {
            return NAMESPACE;
        }
    
        @Override
        public XmlStringBuilder toXML() {
            XmlStringBuilder xml = new XmlStringBuilder(this);
            xml.attribute(ATTRIBUTE_REPLY_TEXT, getReplyText());
            xml.closeEmptyElement();
            return xml;
        }
    
    //__________________________________________________________________________________________________
        public void setReplyText(String _rText) {
            rText = _rText;
        }
    
        public String getReplyText() {
            return rText;
        }
    
    //__________________________________________________________________________________________________
        public static class Provider extends   EmbeddedExtensionProvider {
            @Override
            protected ReplyExtension createReturnExtension(String    currentElement, String currentNamespace, Map attributeMap,    List content) {
                ReplyExtension repExt = new ReplyExtension();
                repExt.setReplyText(attributeMap.get(ATTRIBUTE_REPLY_TEXT));
                return repExt;
            }
        }
    }
    

    2. Register ReplyExtension in your Provider Manager

    ProviderManager.addExtensionProvider(ReplyExtension.ELEMENT, ReplyExtension.NAMESPACE, new ReplyExtension.Provider());
    

    FOR SENDING MESSAGES

    You can generate the custom extension stanza TYPE-1 by using following code

    Message message = new Message();
    message.setStanzaId("923442621149");
    message.setType(Type.chat);
    message.setBody("shanraisshan");
    //adding custom reply extension
    ReplyExtension repExt = new ReplyExtension();
    repExt.setReplyText("this is custom attribute");
    message.addExtension(repExt);
    Log.e("message --->", message.toXML().toString());
    

    DURING RECEIVING MESSAGES

    Now during receiving custom extension stanzas, you need to cast the extension to get attribute values.

    //check for message with reply extension
    ExtensionElement packetExtension =  message.getExtension(ReplyExtension.NAMESPACE);
    ReplyExtension repExt = (ReplyExtension)packetExtension;
    if(repExt!=null) {
        Log.e("--->", " ---  LOG REPLY EXTENSION ---");
        Log.e("--->", repExt.toXML() + "");
        Log.e("--->", repExt.getReplyText() + ""); //this is custom attribute
    }
    

    _______________________________________________________

    2. CUSTOM EXTENSION STANZA TYPE-2

    In order to generate below custom extension stanza

    shanraisshan
    this is custom attribute
    
    

    FOR SENDING MESSAGES

    You can generate the custom extension stanza TYPE-2 by using following code

    Message message = new Message();
    message.setStanzaId("923442621149");
    message.setType(Type.chat);
    message.setBody("shanraisshan");
    //adding custom reply extension
    DefaultExtensionElement repExt = new DefaultExtensionElement("reply", "shayan:reply");
    repExt.setValue("rText", "this is custom attribute");
    message.addExtension(repExt);
    Log.e("message --->", message.toXML().toString());
    

    DURING RECEIVING MESSAGES

    DefaultExtensionElement repExt = (DefaultExtensionElement) message.getExtension("shayan:reply");
    if(repExt!=null) {
        Log.e("--->", " ---  LOG REPLY EXTENSION ---");
        Log.e(getClass().getSimpleName(), repExt.getValue("rText"));
    }
    

提交回复
热议问题