1
0
Fork 0
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:
Florian Schmaus 2015-01-08 11:01:35 +01:00
parent fcb4844d10
commit bb8dcc9874
28 changed files with 533 additions and 317 deletions

View file

@ -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;
}
}

View file

@ -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();

View file

@ -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.
*/

View file

@ -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.
*/

View file

@ -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();