parse stanza-id from messages

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/parser/MessageParser.java | 22 +++
src/main/java/eu/siacs/conversations/xml/Element.java          |  4 
2 files changed, 23 insertions(+), 3 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/parser/MessageParser.java 🔗

@@ -163,6 +163,17 @@ public class MessageParser extends AbstractParser implements
 		return null;
 	}
 
+	private static String extractStanzaId(Element packet, Jid by) {
+		for(Element child : packet.getChildren()) {
+			if (child.getName().equals("stanza-id")
+					&& "urn:xmpp:sid:0".equals(child.getNamespace())
+					&& by.equals(child.getAttributeAsJid("by"))) {
+				return child.getAttribute("id");
+			}
+		}
+		return null;
+	}
+
 	private void parseEvent(final Element event, final Jid from, final Account account) {
 		Element items = event.findChild("items");
 		String node = items == null ? null : items.getAttribute("node");
@@ -355,6 +366,11 @@ public class MessageParser extends AbstractParser implements
 			} else {
 				message = new Message(conversation, body, Message.ENCRYPTION_NONE, status);
 			}
+
+			if (serverMsgId == null) {
+				serverMsgId = extractStanzaId(packet, isTypeGroupChat ? conversation.getJid().toBareJid() : account.getServer());
+			}
+
 			message.setCounterpart(counterpart);
 			message.setRemoteMsgId(remoteMsgId);
 			message.setServerMsgId(serverMsgId);
@@ -379,11 +395,11 @@ public class MessageParser extends AbstractParser implements
 				Log.d(Config.LOGTAG,"skipping duplicate message from "+message.getCounterpart().toString()+" "+message.getBody());
 				return;
 			}
+
+			conversation.add(message);
 			if (query != null) {
 				query.incrementMessageCount();
-			}
-			conversation.add(message);
-			if (serverMsgId == null) {
+			} else {
 				if (status == Message.STATUS_SEND || status == Message.STATUS_SEND_RECEIVED) {
 					mXmppConnectionService.markRead(conversation);
 					account.activateGracePeriod();

src/main/java/eu/siacs/conversations/xml/Element.java 🔗

@@ -182,4 +182,8 @@ public class Element {
 		String attr = getAttribute(name);
 		return (attr != null && (attr.equalsIgnoreCase("true") || attr.equalsIgnoreCase("1")));
 	}
+
+	public String getNamespace() {
+		return getAttribute("xmlns");
+	}
 }