Custom extension element in Stanza for Smack 4.1.4

后端 未结 2 1699
灰色年华
灰色年华 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

    <message id='923442621149' type='chat'><body>shanraisshan</body></message>
    

    1. CUSTOM EXTENSION STANZA TYPE-1

    In order to generate below custom extension stanza

    <message id='923442621149' type='chat'><body>shanraisshan</body>
    <reply xmlns='shayan:reply' rText='this is custom attribute'/>
    </message>
    

    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<ReplyExtension> {
            @Override
            protected ReplyExtension createReturnExtension(String    currentElement, String currentNamespace, Map<String, String> attributeMap,    List<? extends ExtensionElement> 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

    <message id='923442621149' type='chat'><body>shanraisshan</body>
    <reply xmlns='shayan:reply'><rText>this is custom attribute</rText></reply>
    </message>
    

    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"));
    }
    
    0 讨论(0)
  • 2021-01-07 07:27

    Finally figured it out.... Here is the solution for it...

    import org.jivesoftware.smack.packet.DefaultExtensionElement;
    
    public class IM_FileSharing_Extension extends DefaultExtensionElement implements
        IM_Commons_Extension_FileSharing {
    
    private String fileUrl;
    private String fileType;
    private String base64preview;
    private String fileId;
    private String fileSize;
    
    public IM_FileSharing_Extension(String fileUrl, String fileType,
            String base64preview, String fileId, String fileSize) {
        super(FILE_TAG, XMLNS);
        this.fileUrl = fileUrl;
        this.fileType = fileType;
        this.base64preview = base64preview;
        this.fileId = fileId;
        this.fileSize = fileSize;
    }
    
    @Override
    public String toXML() {
    
        StringBuilder sb = new StringBuilder("<" + FILE_TAG + " xmlns=\""
                + XMLNS + "\" ");
        sb.append(FILE_URL + "=\"" + fileUrl + "\" ");
        sb.append(FILE_ID + "=\"" + fileId + "\" ");
        sb.append(FILE_TYPE + "=\"" + fileType + "\" ");
        sb.append(FILE_SIZE + "=\"" + fileSize + "\">");
        sb.append("<" + FILE_PREVIEW_TAG + ">" + base64preview + "</"
                + FILE_PREVIEW_TAG + ">");
        sb.append("</" + FILE_TAG + ">");
    
        return sb.toString();
    }
    
    public String getFileUrl() {
        return fileUrl;
    }
    
    public void setFileUrl(String fileUrl) {
        this.fileUrl = fileUrl;
    }
    
    public String getBase64preview() {
        return base64preview;
    }
    
    public void setBase64preview(String base64preview) {
        this.base64preview = base64preview;
    }
    
    public String getFileId() {
        return fileId;
    }
    
    public void setFileId(String fileId) {
        this.fileId = fileId;
    }
    
    public String getFileType() {
        return fileType;
    }
    
    public void setFileType(String fileType) {
        this.fileType = fileType;
    }
    
    public String getFileSize() {
        return fileSize;
    }
    
    public void setFileSize(String fileSize) {
        this.fileSize = fileSize;
    }
    
    }
    

    Provider for the above extension is as follows...

    import java.io.IOException;
    
    import org.jivesoftware.smack.SmackException;
    import org.jivesoftware.smack.provider.ExtensionElementProvider;
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    
    import android.util.Log;
    
    public class IM_FileSharingExtension_Provider extends
        ExtensionElementProvider<IM_FileSharing_Extension> implements
        IM_Commons_Extension_FileSharing {
    static final String TAG = "file_extension";
    
    @Override
    public IM_FileSharing_Extension parse(XmlPullParser parser, int initialDepth)
            throws XmlPullParserException, IOException, SmackException {
    
        IM_FileSharing_Extension fileExtension = null;
    
        boolean stop = false;
    
        String n = null;
    
        int evtType;
    
        String fileUrl = null;
        String fileType = null;
        String fileId = null;
        String fileSize = null;
        while (!stop) {
    
            evtType = parser.getEventType();
            n = parser.getName();
            Log.d(TAG, "n:" + n + " evt:" + evtType);
            switch (evtType) {
    
            case XmlPullParser.START_TAG:
    
                if (FILE_TAG.equals(n)) {
    
                    fileUrl = parser.getAttributeValue("", FILE_URL);
    
                    fileType = parser.getAttributeValue("", FILE_TYPE);
    
                    fileId = parser.getAttributeValue("", FILE_ID);
    
                    fileSize = parser.getAttributeValue("", FILE_SIZE);
    
                    evtType = parser.next();
    
                }
    
                if (FILE_PREVIEW_TAG.equals(parser.getName())) {
                    String basePreview = parser.nextText();
                    fileExtension = new IM_FileSharing_Extension(fileUrl,
                            fileType, basePreview, fileId, fileSize);
                }
    
                evtType = parser.next();
    
                break;
    
            case XmlPullParser.END_TAG:
    
                if (parser.getName().equals(FILE_TAG)) {
                    return fileExtension;
                }
                evtType = parser.next();
    
            }
    
        }
        return null;
    }
    
    }
    

    And should be added in Provider manager as following....

    ProviderManager.addExtensionProvider(
                IM_Commons_Extension_FileSharing.FILE_TAG,
                IM_Commons_Extension_FileSharing.XMLNS,
                new IM_FileSharingExtension_Provider());
    
    0 讨论(0)
提交回复
热议问题