diff --git a/resources/releasedocs/changelog.html b/resources/releasedocs/changelog.html index 974abf4ab..7a805d5f5 100644 --- a/resources/releasedocs/changelog.html +++ b/resources/releasedocs/changelog.html @@ -141,6 +141,37 @@ hr {
+

4.1.2 -- 2015-06-27

+ +

Bug +

+ + +

Improvement +

+

4.1.1 -- 2015-05-09

diff --git a/smack-android-extensions/src/main/java/org/jivesoftware/smackx/ping/android/ServerPingWithAlarmManager.java b/smack-android-extensions/src/main/java/org/jivesoftware/smackx/ping/android/ServerPingWithAlarmManager.java index fa7b065e5..6d9fe943b 100644 --- a/smack-android-extensions/src/main/java/org/jivesoftware/smackx/ping/android/ServerPingWithAlarmManager.java +++ b/smack-android-extensions/src/main/java/org/jivesoftware/smackx/ping/android/ServerPingWithAlarmManager.java @@ -17,8 +17,10 @@ package org.jivesoftware.smackx.ping.android; -import java.util.Iterator; +import java.util.HashSet; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import java.util.WeakHashMap; import java.util.logging.Logger; @@ -110,10 +112,16 @@ public final class ServerPingWithAlarmManager extends Manager { @Override public void onReceive(Context context, Intent intent) { LOGGER.fine("Ping Alarm broadcast received"); - Iterator it = INSTANCES.keySet().iterator(); - while (it.hasNext()) { - XMPPConnection connection = it.next(); - if (ServerPingWithAlarmManager.getInstanceFor(connection).isEnabled()) { + Set> managers; + synchronized (ServerPingWithAlarmManager.class) { + // Make a copy to avoid ConcurrentModificationException when + // iterating directly over INSTANCES and the Set is modified + // concurrently by creating a new ServerPingWithAlarmManager. + managers = new HashSet<>(INSTANCES.entrySet()); + } + for (Entry entry : managers) { + XMPPConnection connection = entry.getKey(); + if (entry.getValue().isEnabled()) { LOGGER.fine("Calling pingServerIfNecessary for connection " + connection); final PingManager pingManager = PingManager.getInstanceFor(connection); diff --git a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java index 216e0a536..df05dbc61 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java @@ -301,7 +301,12 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { } } - protected ConnectionConfiguration getConfiguration() { + /** + * Get the connection configuration used by this connection. + * + * @return the connection configuration. + */ + public ConnectionConfiguration getConfiguration() { return config; } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java b/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java index 833c92cd1..27b3127e8 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java @@ -20,6 +20,7 @@ import org.jivesoftware.smack.XMPPException.StreamErrorException; import org.jivesoftware.smack.packet.StreamError; import org.jivesoftware.smack.util.Async; +import java.io.IOException; import java.lang.ref.WeakReference; import java.util.Map; import java.util.Random; @@ -239,8 +240,17 @@ public final class ReconnectionManager { if (isReconnectionPossible(connection)) { connection.connect(); } + // TODO Starting with Smack 4.2, connect() will no + // longer login automatically. So change this and the + // previous lines to connection.connect().login() in the + // 4.2, or any later, branch. + if (!connection.isAuthenticated()) { + connection.login(); + } + // Successfully reconnected. + attempts = 0; } - catch (Exception e) { + catch (SmackException | IOException | XMPPException | InterruptedException e) { // Fires the failed reconnection notification for (ConnectionListener listener : connection.connectionListeners) { listener.reconnectionFailed(e); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/vcardtemp/packet/VCard.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/vcardtemp/packet/VCard.java index 747c8adb8..00349600b 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/vcardtemp/packet/VCard.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/vcardtemp/packet/VCard.java @@ -108,6 +108,8 @@ public class VCard extends IQ { private String firstName; private String lastName; private String middleName; + private String prefix; + private String suffix; private String emailHome; private String emailWork; @@ -198,6 +200,24 @@ public class VCard extends IQ { updateFN(); } + public String getPrefix() { + return prefix; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + updateFN(); + } + + public String getSuffix() { + return suffix; + } + + public void setSuffix(String suffix) { + this.suffix = suffix; + updateFN(); + } + public String getNickName() { return otherSimpleFields.get("NICKNAME"); } @@ -572,6 +592,8 @@ public class VCard extends IQ { xml.optElement("FAMILY", lastName); xml.optElement("GIVEN", firstName); xml.optElement("MIDDLE", middleName); + xml.optElement("PREFIX", prefix); + xml.optElement("SUFFIX", suffix); xml.closeElement("N"); } if (hasOrganizationFields()) { @@ -696,7 +718,8 @@ public class VCard extends IQ { } private boolean hasNameField() { - return firstName != null || lastName != null || middleName != null; + return firstName != null || lastName != null || middleName != null + || prefix != null || suffix != null; } private boolean hasOrganizationFields() { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/vcardtemp/provider/VCardProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/vcardtemp/provider/VCardProvider.java index 753805dd2..f4612fd19 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/vcardtemp/provider/VCardProvider.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/vcardtemp/provider/VCardProvider.java @@ -284,6 +284,12 @@ public class VCardProvider extends IQProvider { case "MIDDLE": vCard.setMiddleName(parser.nextText()); break; + case "PREFIX": + vCard.setPrefix(parser.nextText()); + break; + case "SUFFIX": + vCard.setSuffix(parser.nextText()); + break; default: break; } diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/vcardtemp/VCardTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/vcardtemp/VCardTest.java index 68824fef4..8aa4a97b3 100644 --- a/smack-extensions/src/test/java/org/jivesoftware/smackx/vcardtemp/VCardTest.java +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/vcardtemp/VCardTest.java @@ -41,6 +41,8 @@ public class VCardTest extends InitExtensions { + "Name" + "User" + "PJ" + + "Mr." + + "III" + "" + "User dude" + "http://www.igniterealtime.org" @@ -92,6 +94,8 @@ public class VCardTest extends InitExtensions { assertEquals("Name", vCard.getLastName()); assertEquals("PJ", vCard.getMiddleName()); assertEquals("User dude", vCard.getNickName()); + assertEquals("Mr.", vCard.getPrefix()); + assertEquals("III", vCard.getSuffix()); assertEquals("Programmer & tester", vCard.getField("TITLE")); assertEquals("Bug fixer", vCard.getField("ROLE")); diff --git a/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java b/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java index 10f24350b..ca4234ff1 100644 --- a/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java +++ b/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java @@ -846,11 +846,9 @@ public class XMPPTCPConnection extends AbstractXMPPConnection { return; } - if (config.getSecurityMode() == ConnectionConfiguration.SecurityMode.disabled) { - // Do not secure the connection using TLS since TLS was disabled - return; + if (config.getSecurityMode() != ConnectionConfiguration.SecurityMode.disabled) { + send(new StartTls()); } - send(new StartTls()); } // If TLS is required but the server doesn't offer it, disconnect // from the server and throw an error. First check if we've already negotiated TLS