From 0d890623c7e3e4ced58a93feec6eb028b7fa4412 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Sun, 10 Aug 2014 17:16:08 +0200 Subject: [PATCH] Make getMultipleRecipientServiceAddress more robust to avoid feature-not-implemented at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:182) at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:161) at org.jivesoftware.smackx.disco.ServiceDiscoveryManager.discoverItems(ServiceDiscoveryManager.java:573) at org.jivesoftware.smackx.address.MultipleRecipientManager.getMultipleRecipienServiceAddress(MultipleRecipientManager.java:310) at org.jivesoftware.smackx.address.MultipleRecipientManager.send$7a184d34(MultipleRecipientManager.java:82) for e.g. Google Apps XMPP services. This is not to be merged in master/4.1 branch as it already contains a similar fix. --- .../address/MultipleRecipientManager.java | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/address/MultipleRecipientManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/address/MultipleRecipientManager.java index 3fe189fee..760e1d6c2 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/address/MultipleRecipientManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/address/MultipleRecipientManager.java @@ -300,29 +300,39 @@ public class MultipleRecipientManager { if (serviceAddress == null) { ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection); // Send the disco packet to the server itself - DiscoverInfo info = sdm.discoverInfo(serviceName); + DiscoverInfo info = null; + try { + info = sdm.discoverInfo(serviceName); + } catch (XMPPErrorException e) { + LOGGER.log(Level.WARNING, "Exception while discovering info of service", e); + } // Check if the server supports XEP-33 - if (info.containsFeature(MultipleAddresses.NAMESPACE)) { + if (info != null && info.containsFeature(MultipleAddresses.NAMESPACE)) { serviceAddress = serviceName; } else { // Get the disco items and send the disco packet to each server item - DiscoverItems items = sdm.discoverItems(serviceName); - for (DiscoverItems.Item item : items.getItems()) { - try { - info = sdm.discoverInfo(item.getEntityID(), item.getNode()); - } - catch (XMPPErrorException|NoResponseException e) { - // Don't throw this exceptions if one of the server's items fail - LOGGER.log(Level.WARNING, - "Exception while discovering info of " + item.getEntityID() - + " node: " + item.getNode(), e); - continue; - } - if (info.containsFeature(MultipleAddresses.NAMESPACE)) { - serviceAddress = serviceName; - break; + DiscoverItems items; + try { + items = sdm.discoverItems(serviceName); + for (DiscoverItems.Item item : items.getItems()) { + try { + info = sdm.discoverInfo(item.getEntityID(), item.getNode()); + } + catch (XMPPErrorException|NoResponseException e) { + // Don't throw this exceptions if one of the server's items fail + LOGGER.log(Level.WARNING, + "Exception while discovering info of " + item.getEntityID() + + " node: " + item.getNode(), e); + continue; + } + if (info.containsFeature(MultipleAddresses.NAMESPACE)) { + serviceAddress = serviceName; + break; + } } + } catch (XMPPErrorException e) { + LOGGER.log(Level.WARNING, "Exception while disvering items of service", e); } } // Use the empty string to indicate that no service is known for this connection