Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add custom extension(time) to <message> tag?

I'm trying to add time extension to message with custom packet extension. It seems like time gets added while sending message. But at receiver end, it shows null.

This is my packet extension class and EmbeddedExtensionProvider

public class TimestampExtension implements PacketExtension {

    public static final String ELEMENT = "timestamp";
    public static final String NAMESPACE = "urn:xmpp:timestamp";

    public String TIME = null;

    public TimestampExtension() {

    }

    public void setTime() {
        SimpleDateFormat time = new SimpleDateFormat("hh:mm a");
        Date dateTime = new Date();
        String strTime = time.format(dateTime);
        this.TIME = strTime;
    }

    public String getTime() {
        return TIME;
    }

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

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

    @Override
    public String toXML() {
        return "<" + ELEMENT + " xmlns='" + NAMESPACE + "'><time>" + TIME
            + "</time></" + ELEMENT + ">";
    }

    public static class Provider extends EmbeddedExtensionProvider {

        @Override
        protected PacketExtension createReturnExtension(String arg0,
            String arg1, Map<String, String> arg2,
            List<? extends PacketExtension> arg3) {

            return new TimestampExtension();
        }
    }
}

Registering provider

ProviderManager.getInstance().addExtensionProvider(
            TimestampExtension.ELEMENT, TimestampExtension.NAMESPACE,
            new TimestampExtension.Provider());

Sending message with extension

TimestampExtension timeExt = new TimestampExtension();
timeExt.setTime();
msg.addExtension(timeExt);
connection.sendPacket(msg);

Message xml output at sender:

<message id="m55K5-7" to="testfirzan@sushant" type="chat">
<body>hi</body><request xmlns='urn:xmpp:receipts'/>
<timestamp xmlns='urn:xmpp:timestamp'>
<time>01:04 PM</time>
</timestamp>

Message xml output at receiver:

<message id="m55K5-7" to="testfirzan@sushant" from="testsushant@sushant/Smack" type="chat">
<body>hi</body><request xmlns='urn:xmpp:receipts'/>
<timestamp xmlns='urn:xmpp:timestamp'>
<time>null</time>
</timestamp>

It's supposed to show sending time in time element. What i'm doing wrong ?

like image 701
Sushant Avatar asked Nov 30 '25 12:11

Sushant


1 Answers

Sushant's answer is correct but with latest version of org.igniterealtime.smack:smack-android:4.2.0-beta2 they have changed the DefaultPacketExtension to StandardExtensionElement for adding custom element in message.

Code to add extension

//Creating Standard packet extension with name as 'timestamp' and urn as 'urn:xmpp:timestamp'
 StandardExtensionElement extTimeStamp = StandardExtensionElement.builder(
        "timestamp", "urn:xmpp:timestamp")
        .addAttribute("timestamp", String.valueOf(System.currentTimeMillis()))  //Setting value in extension
        .build();


//Add extension to message tag
message.addExtension(extTimeStamp);

Hope this will help future developers.

like image 53
Wasim K. Memon Avatar answered Dec 02 '25 03:12

Wasim K. Memon



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!