How to send custom XML data using the Smack library?
i don't know why you want to add custom attributes to the message. This will be problematic on the client and may cause issues on the server as well since it will not match the schema for the message stanza.
The message content, on the other hand is easily handled as @Femi said with a packet extension. You need to create a MyExtension which extends PacketExtension, and the toXML() in that class will return your custom stanza.
You can create and send your custom message by:
Message message = new Message();
message.addExtension(new MyExtension());
chat.sendMessage(message);
To read the stanza, you will want to register a provider, which will create and return your custom PacketExtension. You should take a look at the EmbeddedExtensionProvider for this as it handles the tag parsing for you, thus simplifying the process.
I recently found out how to add custom stanza to your message. Its was quite easy once I figured it out. I just needed to extend the standard Message Class with my custom message class.
public class CustomMessage extends org.jivesoftware.smack.packet.Message {
public CustomMessage() {
super();
}
private String customStanza;
/**
* @param customStanza
* the customStanza to set
*/
public void setCustomStanza(String customStanza) {
this.customStanza = customStanza;
}
@Override
public String toXML() {
String XMLMessage = super.toXML();
String XMLMessage1 = XMLMessage.substring(0, XMLMessage.indexOf(">"));
String XMLMessage2 = XMLMessage.substring(XMLMessage.indexOf(">"));
if (this.customStanza != null) {
XMLMessage1 += " CustomStanza=\"" + this.customStanza + "\"";
}
return XMLMessage1 + XMLMessage2;
}
}
Then use the custom class to send messages like this:
CustomMessage message = new CustomMessage();
message.setCustomStanza("my data here");
System.out.println(message.toXML());
muc.sendMessage(message);
Your XML message would then look like this:
<message id="ee7Y7-8" CustomStanza="my data here"></message>