mirror of
https://github.com/vanitasvitae/Smack.git
synced 2025-09-10 17:49:38 +02:00
Add XMPPConnection.createPacketcollectorAndSend(PacketFilter, Packet)
Using createPacketCollector(filter); sendPacket(packet); was error prone, i.e. the PacketCollector could leak if sendPacket() would throw an exception and the user forgot to call PacketCollector.cancel(). For cases where createPacketCollectorAndSend(IQ) is not sufficient (because we don't send IQs), createPacketCollectorAndSend(PacketFilter, Packet) is now used, which does take care that the PacketCollector does not leak if sendPacket() throws an Exception.
This commit is contained in:
parent
8ce474b0df
commit
98a3c46e9a
8 changed files with 47 additions and 47 deletions
|
@ -422,26 +422,14 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
|
|||
// Note that we can not use IQReplyFilter here, since the users full JID is not yet
|
||||
// available. It will become available right after the resource has been successfully bound.
|
||||
Bind bindResource = Bind.newSet(resource);
|
||||
PacketCollector packetCollector = createPacketCollector(new PacketIDFilter(bindResource));
|
||||
try {
|
||||
sendPacket(bindResource);
|
||||
} catch (NotConnectedException e) {
|
||||
packetCollector.cancel();
|
||||
throw e;
|
||||
}
|
||||
PacketCollector packetCollector = createPacketCollectorAndSend(new PacketIDFilter(bindResource), bindResource);
|
||||
Bind response = packetCollector.nextResultOrThrow();
|
||||
user = response.getJid();
|
||||
setServiceName(XmppStringUtils.parseDomain(user));
|
||||
|
||||
if (hasFeature(Session.ELEMENT, Session.NAMESPACE) && !getConfiguration().isLegacySessionDisabled()) {
|
||||
Session session = new Session();
|
||||
packetCollector = createPacketCollector(new PacketIDFilter(session));
|
||||
try {
|
||||
sendPacket(session);
|
||||
} catch (NotConnectedException e) {
|
||||
packetCollector.cancel();
|
||||
throw e;
|
||||
}
|
||||
packetCollector = createPacketCollectorAndSend(new PacketIDFilter(session), session);
|
||||
packetCollector.nextResultOrThrow();
|
||||
}
|
||||
}
|
||||
|
@ -639,12 +627,20 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
|
|||
public PacketCollector createPacketCollectorAndSend(IQ packet) throws NotConnectedException {
|
||||
PacketFilter packetFilter = new IQReplyFilter(packet, this);
|
||||
// Create the packet collector before sending the packet
|
||||
PacketCollector packetCollector = createPacketCollectorAndSend(packetFilter, packet);
|
||||
return packetCollector;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketCollector createPacketCollectorAndSend(PacketFilter packetFilter, Packet packet)
|
||||
throws NotConnectedException {
|
||||
// Create the packet collector before sending the packet
|
||||
PacketCollector packetCollector = createPacketCollector(packetFilter);
|
||||
try {
|
||||
// Now we can send the packet as the collector has been created
|
||||
sendPacket(packet);
|
||||
}
|
||||
catch (NotConnectedException e) {
|
||||
catch (NotConnectedException | RuntimeException e) {
|
||||
packetCollector.cancel();
|
||||
throw e;
|
||||
}
|
||||
|
|
|
@ -208,6 +208,26 @@ public interface XMPPConnection {
|
|||
* a specific result.
|
||||
*
|
||||
* @param packetFilter the packet filter to use.
|
||||
* @param packet the packet to send right after the collector got created
|
||||
* @return a new packet collector.
|
||||
*/
|
||||
public PacketCollector createPacketCollectorAndSend(PacketFilter packetFilter, Packet packet)
|
||||
throws NotConnectedException;
|
||||
|
||||
/**
|
||||
* Creates a new packet collector for this connection. A packet filter
|
||||
* determines which packets will be accumulated by the collector. A
|
||||
* PacketCollector is more suitable to use than a {@link PacketListener}
|
||||
* when you need to wait for a specific result.
|
||||
* <p>
|
||||
* <b>Note:</b> If you send a Packet right after using this method, then
|
||||
* consider using
|
||||
* {@link #createPacketCollectorAndSend(PacketFilter, Packet)} instead.
|
||||
* Otherwise make sure cancel the PacketCollector in every case, e.g. even
|
||||
* if an exception is thrown, or otherwise you may leak the PacketCollector.
|
||||
* </p>
|
||||
*
|
||||
* @param packetFilter the packet filter to use.
|
||||
* @return a new packet collector.
|
||||
*/
|
||||
public PacketCollector createPacketCollector(PacketFilter packetFilter);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue