diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/ServiceDiscoveryManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/ServiceDiscoveryManager.java
index 9f6e98174..636ea90d8 100644
--- a/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/ServiceDiscoveryManager.java
+++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/ServiceDiscoveryManager.java
@@ -24,6 +24,8 @@ import org.jivesoftware.smack.Manager;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.XMPPConnectionRegistry;
import org.jivesoftware.smack.XMPPException.XMPPErrorException;
+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.IQ;
@@ -63,9 +65,14 @@ import java.util.logging.Logger;
public class ServiceDiscoveryManager extends Manager {
private static final Logger LOGGER = Logger.getLogger(ServiceDiscoveryManager.class.getName());
+
+ private static final PacketFilter GET_DISCOVER_ITEMS = new AndFilter(IQTypeFilter.GET, new PacketTypeFilter(DiscoverItems.class));
+ private static final PacketFilter GET_DISCOVER_INFO = new AndFilter(IQTypeFilter.GET, new PacketTypeFilter(DiscoverInfo.class));
+
private static final String DEFAULT_IDENTITY_NAME = "Smack";
private static final String DEFAULT_IDENTITY_CATEGORY = "client";
private static final String DEFAULT_IDENTITY_TYPE = "pc";
+
private static DiscoverInfo.Identity defaultIdentity = new Identity(DEFAULT_IDENTITY_CATEGORY,
DEFAULT_IDENTITY_NAME, DEFAULT_IDENTITY_TYPE);
@@ -117,87 +124,72 @@ public class ServiceDiscoveryManager extends Manager {
addFeature(DiscoverItems.NAMESPACE);
// Listen for disco#items requests and answer with an empty result
- PacketFilter packetFilter = new PacketTypeFilter(DiscoverItems.class);
PacketListener packetListener = new PacketListener() {
public void processPacket(Packet packet) throws NotConnectedException {
- XMPPConnection connection = connection();
- if (connection == null) return;
DiscoverItems discoverItems = (DiscoverItems) packet;
- // Send back the items defined in the client if the request is of type GET
- if (discoverItems != null && discoverItems.getType() == IQ.Type.get) {
- DiscoverItems response = new DiscoverItems();
- response.setType(IQ.Type.result);
- response.setTo(discoverItems.getFrom());
- response.setPacketID(discoverItems.getPacketID());
- response.setNode(discoverItems.getNode());
+ DiscoverItems response = new DiscoverItems();
+ response.setType(IQ.Type.result);
+ response.setTo(discoverItems.getFrom());
+ response.setPacketID(discoverItems.getPacketID());
+ response.setNode(discoverItems.getNode());
- // Add the defined items related to the requested node. Look for
- // the NodeInformationProvider associated with the requested node.
- NodeInformationProvider nodeInformationProvider =
- getNodeInformationProvider(discoverItems.getNode());
- if (nodeInformationProvider != null) {
- // Specified node was found, add node items
- response.addItems(nodeInformationProvider.getNodeItems());
- // Add packet extensions
- response.addExtensions(nodeInformationProvider.getNodePacketExtensions());
- } else if(discoverItems.getNode() != null) {
- // Return error since client doesn't contain
- // the specified node
- response.setType(IQ.Type.error);
- response.setError(new XMPPError(XMPPError.Condition.item_not_found));
- }
- connection.sendPacket(response);
+ // Add the defined items related to the requested node. Look for
+ // the NodeInformationProvider associated with the requested node.
+ NodeInformationProvider nodeInformationProvider = getNodeInformationProvider(discoverItems.getNode());
+ if (nodeInformationProvider != null) {
+ // Specified node was found, add node items
+ response.addItems(nodeInformationProvider.getNodeItems());
+ // Add packet extensions
+ response.addExtensions(nodeInformationProvider.getNodePacketExtensions());
+ } else if(discoverItems.getNode() != null) {
+ // Return error since client doesn't contain
+ // the specified node
+ response.setType(IQ.Type.error);
+ response.setError(new XMPPError(XMPPError.Condition.item_not_found));
}
+ connection().sendPacket(response);
}
};
- connection.addPacketListener(packetListener, packetFilter);
+ connection.addPacketListener(packetListener, GET_DISCOVER_ITEMS);
// Listen for disco#info requests and answer the client's supported features
// To add a new feature as supported use the #addFeature message
- packetFilter = new PacketTypeFilter(DiscoverInfo.class);
packetListener = new PacketListener() {
public void processPacket(Packet packet) throws NotConnectedException {
- XMPPConnection connection = connection();
- if (connection == null) return;
DiscoverInfo discoverInfo = (DiscoverInfo) packet;
// Answer the client's supported features if the request is of the GET type
- if (discoverInfo != null && discoverInfo.getType() == IQ.Type.get) {
- DiscoverInfo response = new DiscoverInfo();
- response.setType(IQ.Type.result);
- response.setTo(discoverInfo.getFrom());
- response.setPacketID(discoverInfo.getPacketID());
- response.setNode(discoverInfo.getNode());
- // Add the client's identity and features only if "node" is null
- // and if the request was not send to a node. If Entity Caps are
- // enabled the client's identity and features are may also added
- // if the right node is chosen
- if (discoverInfo.getNode() == null) {
- addDiscoverInfoTo(response);
+ DiscoverInfo response = new DiscoverInfo();
+ response.setType(IQ.Type.result);
+ response.setTo(discoverInfo.getFrom());
+ response.setPacketID(discoverInfo.getPacketID());
+ response.setNode(discoverInfo.getNode());
+ // Add the client's identity and features only if "node" is null
+ // and if the request was not send to a node. If Entity Caps are
+ // enabled the client's identity and features are may also added
+ // if the right node is chosen
+ if (discoverInfo.getNode() == null) {
+ addDiscoverInfoTo(response);
+ } else {
+ // Disco#info was sent to a node. Check if we have information of the
+ // specified node
+ NodeInformationProvider nodeInformationProvider = getNodeInformationProvider(discoverInfo.getNode());
+ if (nodeInformationProvider != null) {
+ // Node was found. Add node features
+ response.addFeatures(nodeInformationProvider.getNodeFeatures());
+ // Add node identities
+ response.addIdentities(nodeInformationProvider.getNodeIdentities());
+ // Add packet extensions
+ response.addExtensions(nodeInformationProvider.getNodePacketExtensions());
+ } else {
+ // Return error since specified node was not found
+ response.setType(IQ.Type.error);
+ response.setError(new XMPPError(XMPPError.Condition.item_not_found));
}
- else {
- // Disco#info was sent to a node. Check if we have information of the
- // specified node
- NodeInformationProvider nodeInformationProvider =
- getNodeInformationProvider(discoverInfo.getNode());
- if (nodeInformationProvider != null) {
- // Node was found. Add node features
- response.addFeatures(nodeInformationProvider.getNodeFeatures());
- // Add node identities
- response.addIdentities(nodeInformationProvider.getNodeIdentities());
- // Add packet extensions
- response.addExtensions(nodeInformationProvider.getNodePacketExtensions());
- }
- else {
- // Return error since specified node was not found
- response.setType(IQ.Type.error);
- response.setError(new XMPPError(XMPPError.Condition.item_not_found));
- }
- }
- connection.sendPacket(response);
}
+ connection().sendPacket(response);
}
};
- connection.addPacketListener(packetListener, packetFilter);
+ connection.addPacketListener(packetListener, GET_DISCOVER_INFO);
}
/**