mirror of
https://github.com/vanitasvitae/Smack.git
synced 2025-12-12 14:01:08 +01:00
Add IQ request handler API
This also moves the logic to send error IQ replies from "when there is no IQ provider registerd" to "when there is no IQ request handler registered". Which has for example the advantage that IQ parsing no longer asks for a connection instance.
This commit is contained in:
parent
fcb4844d10
commit
bb8dcc9874
28 changed files with 533 additions and 317 deletions
|
|
@ -16,13 +16,9 @@
|
|||
*/
|
||||
package org.jivesoftware.smackx.bytestreams.ibb;
|
||||
|
||||
import org.jivesoftware.smack.PacketListener;
|
||||
import org.jivesoftware.smack.SmackException.NotConnectedException;
|
||||
import org.jivesoftware.smack.filter.AndFilter;
|
||||
import org.jivesoftware.smack.filter.IQTypeFilter;
|
||||
import org.jivesoftware.smack.filter.PacketFilter;
|
||||
import org.jivesoftware.smack.filter.PacketTypeFilter;
|
||||
import org.jivesoftware.smack.packet.Packet;
|
||||
import org.jivesoftware.smack.iqrequest.AbstractIqRequestHandler;
|
||||
import org.jivesoftware.smack.packet.IQ;
|
||||
import org.jivesoftware.smackx.bytestreams.ibb.packet.Close;
|
||||
|
||||
/**
|
||||
|
|
@ -34,45 +30,44 @@ import org.jivesoftware.smackx.bytestreams.ibb.packet.Close;
|
|||
*
|
||||
* @author Henning Staib
|
||||
*/
|
||||
class CloseListener implements PacketListener {
|
||||
class CloseListener extends AbstractIqRequestHandler {
|
||||
|
||||
/* manager containing the listeners and the XMPP connection */
|
||||
private final InBandBytestreamManager manager;
|
||||
|
||||
/* packet filter for all In-Band Bytestream close requests */
|
||||
private final PacketFilter closeFilter = new AndFilter(new PacketTypeFilter(
|
||||
Close.class), IQTypeFilter.SET);
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param manager the In-Band Bytestream manager
|
||||
*/
|
||||
protected CloseListener(InBandBytestreamManager manager) {
|
||||
super(Close.ELEMENT, Close.NAMESPACE, IQ.Type.set, Mode.async);
|
||||
this.manager = manager;
|
||||
}
|
||||
|
||||
public void processPacket(Packet packet) throws NotConnectedException {
|
||||
Close closeRequest = (Close) packet;
|
||||
@Override
|
||||
public IQ handleIQRequest(IQ iqRequest) {
|
||||
Close closeRequest = (Close) iqRequest;
|
||||
InBandBytestreamSession ibbSession = this.manager.getSessions().get(
|
||||
closeRequest.getSessionID());
|
||||
if (ibbSession == null) {
|
||||
this.manager.replyItemNotFoundPacket(closeRequest);
|
||||
try {
|
||||
this.manager.replyItemNotFoundPacket(closeRequest);
|
||||
}
|
||||
catch (NotConnectedException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else {
|
||||
ibbSession.closeByPeer(closeRequest);
|
||||
try {
|
||||
ibbSession.closeByPeer(closeRequest);
|
||||
}
|
||||
catch (NotConnectedException e) {
|
||||
return null;
|
||||
}
|
||||
this.manager.getSessions().remove(closeRequest.getSessionID());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the packet filter for In-Band Bytestream close requests.
|
||||
*
|
||||
* @return the packet filter for In-Band Bytestream close requests
|
||||
*/
|
||||
protected PacketFilter getFilter() {
|
||||
return this.closeFilter;
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -210,8 +210,7 @@ public class InBandBytestreamManager implements BytestreamManager {
|
|||
|
||||
// register bytestream open packet listener
|
||||
this.initiationListener = new InitiationListener(this);
|
||||
this.connection.addAsyncPacketListener(this.initiationListener,
|
||||
this.initiationListener.getFilter());
|
||||
connection.registerIQRequestHandler(initiationListener);
|
||||
|
||||
// register bytestream data packet listener
|
||||
this.dataListener = new DataListener(this);
|
||||
|
|
@ -219,8 +218,7 @@ public class InBandBytestreamManager implements BytestreamManager {
|
|||
|
||||
// register bytestream close packet listener
|
||||
this.closeListener = new CloseListener(this);
|
||||
this.connection.addSyncPacketListener(this.closeListener, this.closeListener.getFilter());
|
||||
|
||||
connection.registerIQRequestHandler(closeListener);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -543,9 +541,9 @@ public class InBandBytestreamManager implements BytestreamManager {
|
|||
managers.remove(connection);
|
||||
|
||||
// remove all listeners registered by this manager
|
||||
this.connection.removeAsyncPacketListener(this.initiationListener);
|
||||
connection.unregisterIQRequestHandler(initiationListener);
|
||||
this.connection.removeSyncPacketListener(this.dataListener);
|
||||
this.connection.removeSyncPacketListener(this.closeListener);
|
||||
connection.unregisterIQRequestHandler(closeListener);
|
||||
|
||||
// shutdown threads
|
||||
this.initiationListener.shutdown();
|
||||
|
|
|
|||
|
|
@ -21,12 +21,9 @@ import java.util.concurrent.Executors;
|
|||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.jivesoftware.smack.PacketListener;
|
||||
import org.jivesoftware.smack.SmackException.NotConnectedException;
|
||||
import org.jivesoftware.smack.filter.AndFilter;
|
||||
import org.jivesoftware.smack.filter.IQTypeFilter;
|
||||
import org.jivesoftware.smack.filter.PacketFilter;
|
||||
import org.jivesoftware.smack.filter.PacketTypeFilter;
|
||||
import org.jivesoftware.smack.iqrequest.AbstractIqRequestHandler;
|
||||
import org.jivesoftware.smack.packet.IQ;
|
||||
import org.jivesoftware.smack.packet.Packet;
|
||||
import org.jivesoftware.smackx.bytestreams.BytestreamListener;
|
||||
import org.jivesoftware.smackx.bytestreams.ibb.packet.Open;
|
||||
|
|
@ -44,16 +41,12 @@ import org.jivesoftware.smackx.bytestreams.ibb.packet.Open;
|
|||
*
|
||||
* @author Henning Staib
|
||||
*/
|
||||
class InitiationListener implements PacketListener {
|
||||
class InitiationListener extends AbstractIqRequestHandler {
|
||||
private static final Logger LOGGER = Logger.getLogger(InitiationListener.class.getName());
|
||||
|
||||
/* manager containing the listeners and the XMPP connection */
|
||||
private final InBandBytestreamManager manager;
|
||||
|
||||
/* packet filter for all In-Band Bytestream requests */
|
||||
private final PacketFilter initFilter = new AndFilter(new PacketTypeFilter(Open.class),
|
||||
IQTypeFilter.SET);
|
||||
|
||||
/* executor service to process incoming requests concurrently */
|
||||
private final ExecutorService initiationListenerExecutor;
|
||||
|
||||
|
|
@ -63,11 +56,13 @@ class InitiationListener implements PacketListener {
|
|||
* @param manager the In-Band Bytestream manager
|
||||
*/
|
||||
protected InitiationListener(InBandBytestreamManager manager) {
|
||||
super(Open.ELEMENT, Open.NAMESPACE, IQ.Type.set, Mode.async);
|
||||
this.manager = manager;
|
||||
initiationListenerExecutor = Executors.newCachedThreadPool();
|
||||
}
|
||||
}
|
||||
|
||||
public void processPacket(final Packet packet) {
|
||||
@Override
|
||||
public IQ handleIQRequest(final IQ packet) {
|
||||
initiationListenerExecutor.execute(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
|
|
@ -79,6 +74,7 @@ class InitiationListener implements PacketListener {
|
|||
}
|
||||
}
|
||||
});
|
||||
return null;
|
||||
}
|
||||
|
||||
private void processRequest(Packet packet) throws NotConnectedException {
|
||||
|
|
@ -120,15 +116,6 @@ class InitiationListener implements PacketListener {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the packet filter for In-Band Bytestream open requests.
|
||||
*
|
||||
* @return the packet filter for In-Band Bytestream open requests
|
||||
*/
|
||||
protected PacketFilter getFilter() {
|
||||
return this.initFilter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shuts down the listeners executor service.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -21,12 +21,9 @@ import java.util.concurrent.Executors;
|
|||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.jivesoftware.smack.PacketListener;
|
||||
import org.jivesoftware.smack.SmackException.NotConnectedException;
|
||||
import org.jivesoftware.smack.filter.AndFilter;
|
||||
import org.jivesoftware.smack.filter.IQTypeFilter;
|
||||
import org.jivesoftware.smack.filter.PacketFilter;
|
||||
import org.jivesoftware.smack.filter.PacketTypeFilter;
|
||||
import org.jivesoftware.smack.iqrequest.AbstractIqRequestHandler;
|
||||
import org.jivesoftware.smack.packet.IQ;
|
||||
import org.jivesoftware.smack.packet.Packet;
|
||||
import org.jivesoftware.smackx.bytestreams.BytestreamListener;
|
||||
import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
|
||||
|
|
@ -39,16 +36,12 @@ import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
|
|||
*
|
||||
* @author Henning Staib
|
||||
*/
|
||||
final class InitiationListener implements PacketListener {
|
||||
final class InitiationListener extends AbstractIqRequestHandler {
|
||||
private static final Logger LOGGER = Logger.getLogger(InitiationListener.class.getName());
|
||||
|
||||
/* manager containing the listeners and the XMPP connection */
|
||||
private final Socks5BytestreamManager manager;
|
||||
|
||||
/* packet filter for all SOCKS5 Bytestream requests */
|
||||
private final PacketFilter initFilter = new AndFilter(new PacketTypeFilter(Bytestream.class),
|
||||
IQTypeFilter.SET);
|
||||
|
||||
/* executor service to process incoming requests concurrently */
|
||||
private final ExecutorService initiationListenerExecutor;
|
||||
|
||||
|
|
@ -58,11 +51,14 @@ final class InitiationListener implements PacketListener {
|
|||
* @param manager the SOCKS5 Bytestream manager
|
||||
*/
|
||||
protected InitiationListener(Socks5BytestreamManager manager) {
|
||||
super(Bytestream.ELEMENT, Bytestream.NAMESPACE, IQ.Type.set, Mode.async);
|
||||
this.manager = manager;
|
||||
initiationListenerExecutor = Executors.newCachedThreadPool();
|
||||
}
|
||||
|
||||
public void processPacket(final Packet packet) {
|
||||
|
||||
@Override
|
||||
public IQ handleIQRequest(final IQ packet) {
|
||||
initiationListenerExecutor.execute(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
|
|
@ -74,6 +70,8 @@ final class InitiationListener implements PacketListener {
|
|||
}
|
||||
}
|
||||
});
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void processRequest(Packet packet) throws NotConnectedException {
|
||||
|
|
@ -111,15 +109,6 @@ final class InitiationListener implements PacketListener {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the packet filter for SOCKS5 Bytestream initialization requests.
|
||||
*
|
||||
* @return the packet filter for SOCKS5 Bytestream initialization requests
|
||||
*/
|
||||
protected PacketFilter getFilter() {
|
||||
return this.initFilter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shuts down the listeners executor service.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -284,7 +284,7 @@ public final class Socks5BytestreamManager implements BytestreamManager {
|
|||
public synchronized void disableService() {
|
||||
|
||||
// remove initiation packet listener
|
||||
this.connection.removeAsyncPacketListener(this.initiationListener);
|
||||
connection.unregisterIQRequestHandler(initiationListener);
|
||||
|
||||
// shutdown threads
|
||||
this.initiationListener.shutdown();
|
||||
|
|
@ -713,8 +713,7 @@ public final class Socks5BytestreamManager implements BytestreamManager {
|
|||
*/
|
||||
private void activate() {
|
||||
// register bytestream initiation packet listener
|
||||
this.connection.addAsyncPacketListener(this.initiationListener,
|
||||
this.initiationListener.getFilter());
|
||||
connection.registerIQRequestHandler(initiationListener);
|
||||
|
||||
// enable SOCKS5 feature
|
||||
enableService();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue