mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2025-09-11 11:19:41 +02:00
Allows PacketCollector's to cancel each other
This is useful for cases where a result set is requested, as it's the case in XEP-13 and XEP-313. Also adds XMPPConnection.createPacketCollector(PacketCollector.Configuration).
This commit is contained in:
parent
d099e7b16d
commit
2e23a6f150
5 changed files with 117 additions and 46 deletions
|
@ -61,7 +61,7 @@ public class OfflineMessageManager {
|
|||
private final XMPPConnection connection;
|
||||
|
||||
private static final PacketFilter PACKET_FILTER = new AndFilter(new PacketExtensionFilter(
|
||||
new OfflineMessageInfo()), new PacketTypeFilter(Message.class));
|
||||
new OfflineMessageInfo()), PacketTypeFilter.MESSAGE);
|
||||
|
||||
public OfflineMessageManager(XMPPConnection connection) {
|
||||
this.connection = connection;
|
||||
|
@ -182,36 +182,30 @@ public class OfflineMessageManager {
|
|||
* @throws NotConnectedException
|
||||
*/
|
||||
public List<Message> getMessages() throws NoResponseException, XMPPErrorException, NotConnectedException {
|
||||
List<Message> messages = new ArrayList<Message>();
|
||||
OfflineMessageRequest request = new OfflineMessageRequest();
|
||||
request.setFetch(true);
|
||||
|
||||
PacketCollector messageCollector = connection.createPacketCollector(PACKET_FILTER);
|
||||
PacketCollector resultCollector = connection.createPacketCollectorAndSend(request);
|
||||
PacketCollector.Configuration messageCollectorConfiguration = PacketCollector.newConfiguration().setPacketFilter(PACKET_FILTER).setCollectorToReset(resultCollector);
|
||||
PacketCollector messageCollector = connection.createPacketCollector(messageCollectorConfiguration);
|
||||
|
||||
List<Message> messages = null;
|
||||
try {
|
||||
// Collect the received offline messages
|
||||
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();
|
||||
// Be extra safe, cancel the message collector right here so that it does not collector
|
||||
// other messages that eventually match (although I've no idea how this could happen in
|
||||
// case of XEP-13).
|
||||
messageCollector.cancel();
|
||||
messages = new ArrayList<>(messageCollector.getCollectedCount());
|
||||
Message message;
|
||||
while ((message = messageCollector.pollResult()) != null) {
|
||||
messages.add(message);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
// Ensure that the message collector is canceled even if nextResultOrThrow threw. It
|
||||
// doesn't matter if we cancel the message collector twice
|
||||
messageCollector.cancel();
|
||||
resultCollector.cancel();
|
||||
}
|
||||
return messages;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue