From 187e158260c5837286fe511d585519c700148bed Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Sun, 7 Dec 2014 23:41:17 +0100 Subject: [PATCH] Improve OfflineMessages.getMessages() poll the result before waiting for a message (with nextResult()), in order to prevent waiting unnecessarily. Add PacketCollector.pollResultOrThrow() --- .../jivesoftware/smack/PacketCollector.java | 19 +++++++++++++++++++ .../smackx/offline/OfflineMessageManager.java | 11 +++++++++++ 2 files changed, 30 insertions(+) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/PacketCollector.java b/smack-core/src/main/java/org/jivesoftware/smack/PacketCollector.java index 21294e8ae..7c7422961 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/PacketCollector.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/PacketCollector.java @@ -112,6 +112,25 @@ public class PacketCollector { return (P) resultQueue.poll(); } + /** + * Polls to see if a packet is currently available and returns it, or + * immediately returns null if no packets are currently in the + * result queue. + *

+ * Throws an XMPPErrorException in case the polled stanzas did contain an XMPPError. + *

+ * + * @return the next available packet. + * @throws XMPPErrorException in case an error response. + */ + public

P pollResultOrThrow() throws XMPPErrorException { + P result = pollResult(); + if (result != null) { + XMPPErrorException.ifHasErrorThenThrow(result); + } + return result; + } + /** * Returns the next available packet. The method call will block (not return) until a packet is * available. diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/offline/OfflineMessageManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/offline/OfflineMessageManager.java index bbdc8f2de..1ac34e590 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/offline/OfflineMessageManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/offline/OfflineMessageManager.java @@ -194,6 +194,17 @@ public class OfflineMessageManager { Message message = messageCollector.nextResult(); while (message != null) { messages.add(message); + // It is important that we query the resultCollector before the messageCollector + Packet result = resultCollector.pollResultOrThrow(); + message = messageCollector.pollResult(); + if (message == null && result != null) { + // No new messages, but we have a non-error IQ response, we are done + return messages; + } else if (message != null) { + // We have received a message without waiting, great, continue to add this message and proceed with + // the loop + continue; + } message = messageCollector.nextResult(); } resultCollector.nextResultOrThrow();