parse jmi proposals from MAM reloads. fixes #3778

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/parser/MessageParser.java | 40 +++
1 file changed, 35 insertions(+), 5 deletions(-)

Detailed changes

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

@@ -836,6 +836,10 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
                 for (Element child : packet.getChildren()) {
                     if (Namespace.JINGLE_MESSAGE.equals(child.getNamespace()) && JINGLE_MESSAGE_ELEMENT_NAMES.contains(child.getName())) {
                         final String action = child.getName();
+                        final String sessionId = child.getAttribute("id");
+                            if (sessionId == null) {
+                                break;
+                            }
                         if (query == null) {
                             if (serverMsgId == null) {
                                 serverMsgId = extractStanzaId(account, packet);
@@ -845,10 +849,6 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
                                 processMessageReceipts(account, packet, query);
                             }
                         } else if (query.isCatchup()) {
-                            final String sessionId = child.getAttribute("id");
-                            if (sessionId == null) {
-                                break;
-                            }
                             if ("propose".equals(action)) {
                                 final Element description = child.findChild("description");
                                 final String namespace = description == null ? null : description.getNamespace();
@@ -872,7 +872,6 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
                                     c.add(message);
                                     mXmppConnectionService.databaseBackend.createMessage(message);
                                 }
-
                             } else if ("proceed".equals(action)) {
                                 //status needs to be flipped to find the original propose
                                 final Conversation c = mXmppConnectionService.findOrCreateConversation(account, counterpart.asBareJid(), false, false);
@@ -890,6 +889,37 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
                                 }
 
                             }
+                        } else {
+                            //MAM reloads (non catchups
+                            if ("propose".equals(action)) {
+                                final Element description = child.findChild("description");
+                                final String namespace = description == null ? null : description.getNamespace();
+                                if (Namespace.JINGLE_APPS_RTP.equals(namespace)) {
+                                    final Conversation c = mXmppConnectionService.findOrCreateConversation(account, counterpart.asBareJid(), false, false);
+                                    final Message preExistingMessage = c.findRtpSession(sessionId, status);
+                                    if (preExistingMessage != null) {
+                                        preExistingMessage.setServerMsgId(serverMsgId);
+                                        mXmppConnectionService.updateMessage(preExistingMessage);
+                                        break;
+                                    }
+                                    final Message message = new Message(
+                                            c,
+                                            status,
+                                            Message.TYPE_RTP_SESSION,
+                                            sessionId
+                                    );
+                                    message.setServerMsgId(serverMsgId);
+                                    message.setTime(timestamp);
+                                    message.setBody(new RtpSessionStatus(true, 0).toString());
+                                    if (query.getPagingOrder() == MessageArchiveService.PagingOrder.REVERSE) {
+                                        c.prepend(query.getActualInThisQuery(), message);
+                                    } else {
+                                        c.add(message);
+                                    }
+                                    query.incrementActualMessageCount();
+                                    mXmppConnectionService.databaseBackend.createMessage(message);
+                                }
+                            }
                         }
                         break;
                     }