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
+
+
+- [SMACK-664] - Invalid IQ error response to OfferRequestPacket and OfferRevokePacket
+
+- [SMACK-668] - ReconnectionManager's value of 'attempts' is not reset after successful reconnection
+
+- [SMACK-669] - Only add Entity Capabilities extension to available presences
+
+- [SMACK-670] - SASLMechanism.authenticate should treat an empty byte array like 'null' byte array
+
+- [SMACK-672] - Memory leak caused by RosterGroup declaring a strong reference to XMPPConnection
+
+- [SMACK-673] - VCard API does not support all elements
+
+- [SMACK-676] - ConcurrentModificationException in ServerPingWithAlarmManager
+
+- [SMACK-678] - Login hangs if starttls advertised, but security is set to 'disabled' and compression is also advertised
+
+
+
+
Improvement
+
+
+- [SMACK-667] - Request Stream Mangement Acknowledgement after re-sending unack'ed stanzas after stream resumption
+
+- [SMACK-671] - Don't disable Scoks5BytestreamManager on connection termination
+
+
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