diff options
Diffstat (limited to 'src/eu/siacs/conversations/parser/MessageParser.java')
-rw-r--r-- | src/eu/siacs/conversations/parser/MessageParser.java | 161 |
1 files changed, 126 insertions, 35 deletions
diff --git a/src/eu/siacs/conversations/parser/MessageParser.java b/src/eu/siacs/conversations/parser/MessageParser.java index 91d5e18d..3d2d1f2c 100644 --- a/src/eu/siacs/conversations/parser/MessageParser.java +++ b/src/eu/siacs/conversations/parser/MessageParser.java @@ -1,5 +1,6 @@ package eu.siacs.conversations.parser; +import android.os.SystemClock; import net.java.otr4j.session.Session; import net.java.otr4j.session.SessionStatus; import eu.siacs.conversations.entities.Account; @@ -8,25 +9,29 @@ import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.xml.Element; +import eu.siacs.conversations.xmpp.OnMessagePacketReceived; import eu.siacs.conversations.xmpp.stanzas.MessagePacket; -public class MessageParser extends AbstractParser { +public class MessageParser extends AbstractParser implements + OnMessagePacketReceived { + + private long lastCarbonMessageReceived = -XmppConnectionService.CARBON_GRACE_PERIOD; public MessageParser(XmppConnectionService service) { super(service); } - public Message parseChat(MessagePacket packet, Account account) { + private Message parseChat(MessagePacket packet, Account account) { String[] fromParts = packet.getFrom().split("/"); Conversation conversation = mXmppConnectionService .findOrCreateConversation(account, fromParts[0], false); conversation.setLatestMarkableMessageId(getMarkableMessageId(packet)); - updateLastseen(packet, account,true); + updateLastseen(packet, account, true); String pgpBody = getPgpBody(packet); Message finishedMessage; if (pgpBody != null) { - finishedMessage = new Message(conversation, packet.getFrom(), pgpBody, - Message.ENCRYPTION_PGP, Message.STATUS_RECIEVED); + finishedMessage = new Message(conversation, packet.getFrom(), + pgpBody, Message.ENCRYPTION_PGP, Message.STATUS_RECIEVED); } else { finishedMessage = new Message(conversation, packet.getFrom(), packet.getBody(), Message.ENCRYPTION_NONE, @@ -36,13 +41,13 @@ public class MessageParser extends AbstractParser { return finishedMessage; } - public Message parseOtrChat(MessagePacket packet, Account account) { + private Message parseOtrChat(MessagePacket packet, Account account) { boolean properlyAddressed = (packet.getTo().split("/").length == 2) || (account.countPresences() == 1); String[] fromParts = packet.getFrom().split("/"); Conversation conversation = mXmppConnectionService .findOrCreateConversation(account, fromParts[0], false); - updateLastseen(packet, account,true); + updateLastseen(packet, account, true); String body = packet.getBody(); if (!conversation.hasValidOtrSession()) { if (properlyAddressed) { @@ -84,22 +89,24 @@ public class MessageParser extends AbstractParser { conversation.setSymmetricKey(CryptoHelper.hexToBytes(key)); return null; } - conversation.setLatestMarkableMessageId(getMarkableMessageId(packet)); - Message finishedMessage = new Message(conversation, packet.getFrom(), body, - Message.ENCRYPTION_OTR, Message.STATUS_RECIEVED); + conversation + .setLatestMarkableMessageId(getMarkableMessageId(packet)); + Message finishedMessage = new Message(conversation, + packet.getFrom(), body, Message.ENCRYPTION_OTR, + Message.STATUS_RECIEVED); finishedMessage.setTime(getTimestamp(packet)); return finishedMessage; } catch (Exception e) { String receivedId = packet.getId(); - if (receivedId!=null) { - mXmppConnectionService.replyWithNotAcceptable(account,packet); + if (receivedId != null) { + mXmppConnectionService.replyWithNotAcceptable(account, packet); } conversation.endOtrIfNeeded(); return null; } } - public Message parseGroupchat(MessagePacket packet, Account account) { + private Message parseGroupchat(MessagePacket packet, Account account) { int status; String[] fromParts = packet.getFrom().split("/"); Conversation conversation = mXmppConnectionService @@ -128,17 +135,17 @@ public class MessageParser extends AbstractParser { conversation.setLatestMarkableMessageId(getMarkableMessageId(packet)); Message finishedMessage; if (pgpBody == null) { - finishedMessage = new Message(conversation, counterPart, packet.getBody(), - Message.ENCRYPTION_NONE, status); + finishedMessage = new Message(conversation, counterPart, + packet.getBody(), Message.ENCRYPTION_NONE, status); } else { - finishedMessage= new Message(conversation, counterPart, pgpBody, + finishedMessage = new Message(conversation, counterPart, pgpBody, Message.ENCRYPTION_PGP, status); } finishedMessage.setTime(getTimestamp(packet)); return finishedMessage; } - public Message parseCarbonMessage(MessagePacket packet, Account account) { + private Message parseCarbonMessage(MessagePacket packet, Account account) { int status; String fullJid; Element forwarded; @@ -163,7 +170,7 @@ public class MessageParser extends AbstractParser { } if (status == Message.STATUS_RECIEVED) { fullJid = message.getAttribute("from"); - updateLastseen(message, account,true); + updateLastseen(message, account, true); } else { fullJid = message.getAttribute("to"); } @@ -174,37 +181,45 @@ public class MessageParser extends AbstractParser { String pgpBody = getPgpBody(message); Message finishedMessage; if (pgpBody != null) { - finishedMessage = new Message(conversation, fullJid, pgpBody,Message.ENCRYPTION_PGP, status); + finishedMessage = new Message(conversation, fullJid, pgpBody, + Message.ENCRYPTION_PGP, status); } else { String body = message.findChild("body").getContent(); - finishedMessage= new Message(conversation, fullJid, body,Message.ENCRYPTION_NONE, status); + finishedMessage = new Message(conversation, fullJid, body, + Message.ENCRYPTION_NONE, status); } finishedMessage.setTime(getTimestamp(message)); return finishedMessage; } - public void parseError(MessagePacket packet, Account account) { + private void parseError(MessagePacket packet, Account account) { String[] fromParts = packet.getFrom().split("/"); mXmppConnectionService.markMessage(account, fromParts[0], packet.getId(), Message.STATUS_SEND_FAILED); } - - public void parseNormal(Element packet, Account account) { - if (packet.hasChild("displayed","urn:xmpp:chat-markers:0")) { - String id = packet.findChild("displayed","urn:xmpp:chat-markers:0").getAttribute("id"); + + private void parseNormal(Element packet, Account account) { + if (packet.hasChild("displayed", "urn:xmpp:chat-markers:0")) { + String id = packet + .findChild("displayed", "urn:xmpp:chat-markers:0") + .getAttribute("id"); String[] fromParts = packet.getAttribute("from").split("/"); - updateLastseen(packet, account,true); - mXmppConnectionService.markMessage(account,fromParts[0], id, Message.STATUS_SEND_DISPLAYED); - } else if (packet.hasChild("received","urn:xmpp:chat-markers:0")) { - String id = packet.findChild("received","urn:xmpp:chat-markers:0").getAttribute("id"); + updateLastseen(packet, account, true); + mXmppConnectionService.markMessage(account, fromParts[0], id, + Message.STATUS_SEND_DISPLAYED); + } else if (packet.hasChild("received", "urn:xmpp:chat-markers:0")) { + String id = packet.findChild("received", "urn:xmpp:chat-markers:0") + .getAttribute("id"); String[] fromParts = packet.getAttribute("from").split("/"); - updateLastseen(packet, account,false); - mXmppConnectionService.markMessage(account,fromParts[0], id, Message.STATUS_SEND_RECEIVED); + updateLastseen(packet, account, false); + mXmppConnectionService.markMessage(account, fromParts[0], id, + Message.STATUS_SEND_RECEIVED); } else if (packet.hasChild("x")) { Element x = packet.findChild("x"); if (x.hasChild("invite")) { - Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, packet.getAttribute("from"), - true); + Conversation conversation = mXmppConnectionService + .findOrCreateConversation(account, + packet.getAttribute("from"), true); mXmppConnectionService.updateUi(conversation, false); } @@ -219,7 +234,7 @@ public class MessageParser extends AbstractParser { return child.getContent(); } } - + private String getMarkableMessageId(Element message) { if (message.hasChild("markable", "urn:xmpp:chat-markers:0")) { return message.getAttribute("id"); @@ -228,5 +243,81 @@ public class MessageParser extends AbstractParser { } } - + @Override + public void onMessagePacketReceived(Account account, MessagePacket packet) { + Message message = null; + boolean notify = true; + if (mXmppConnectionService.getPreferences().getBoolean( + "notification_grace_period_after_carbon_received", true)) { + notify = (SystemClock.elapsedRealtime() - lastCarbonMessageReceived) > XmppConnectionService.CARBON_GRACE_PERIOD; + } + + if ((packet.getType() == MessagePacket.TYPE_CHAT)) { + if ((packet.getBody() != null) + && (packet.getBody().startsWith("?OTR"))) { + message = this.parseOtrChat(packet, account); + if (message != null) { + message.markUnread(); + } + } else if (packet.hasChild("body")) { + message = this.parseChat(packet, account); + message.markUnread(); + } else if (packet.hasChild("received") || (packet.hasChild("sent"))) { + message = this.parseCarbonMessage(packet, account); + if (message != null) { + if (message.getStatus() == Message.STATUS_SEND) { + lastCarbonMessageReceived = SystemClock + .elapsedRealtime(); + notify = false; + message.getConversation().markRead(); + } else { + message.markUnread(); + } + } + } + + } else if (packet.getType() == MessagePacket.TYPE_GROUPCHAT) { + message = this.parseGroupchat(packet, account); + if (message != null) { + if (message.getStatus() == Message.STATUS_RECIEVED) { + message.markUnread(); + } else { + message.getConversation().markRead(); + notify = false; + } + } + } else if (packet.getType() == MessagePacket.TYPE_ERROR) { + this.parseError(packet, account); + return; + } else if (packet.getType() == MessagePacket.TYPE_NORMAL) { + this.parseNormal(packet, account); + } + if ((message == null) || (message.getBody() == null)) { + return; + } + if ((mXmppConnectionService.confirmMessages()) + && ((packet.getId() != null))) { + MessagePacket receivedPacket = new MessagePacket(); + receivedPacket.setType(MessagePacket.TYPE_NORMAL); + receivedPacket.setTo(message.getCounterpart()); + receivedPacket.setFrom(account.getFullJid()); + if (packet.hasChild("markable", "urn:xmpp:chat-markers:0")) { + Element received = receivedPacket.addChild("received", + "urn:xmpp:chat-markers:0"); + received.setAttribute("id", packet.getId()); + account.getXmppConnection().sendMessagePacket(receivedPacket); + } else if (packet.hasChild("request", "urn:xmpp:receipts")) { + Element received = receivedPacket.addChild("received", + "urn:xmpp:receipts"); + received.setAttribute("id", packet.getId()); + account.getXmppConnection().sendMessagePacket(receivedPacket); + } + } + Conversation conversation = message.getConversation(); + conversation.getMessages().add(message); + if (packet.getType() != MessagePacket.TYPE_ERROR) { + mXmppConnectionService.databaseBackend.createMessage(message); + } + mXmppConnectionService.updateUi(conversation, notify); + } } |