summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/isode/stroke/elements/DiscoInfo.java3
-rw-r--r--src/com/isode/stroke/muc/MUCImpl.java8
-rw-r--r--src/com/isode/stroke/network/Connector.java4
-rw-r--r--src/com/isode/stroke/network/JavaTimer.java47
-rw-r--r--src/com/isode/stroke/presence/PresenceOracle.java10
-rw-r--r--src/com/isode/stroke/queries/requests/EnableCarbonsRequest.java22
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/CarbonsEnableSerializer.java4
7 files changed, 65 insertions, 33 deletions
diff --git a/src/com/isode/stroke/elements/DiscoInfo.java b/src/com/isode/stroke/elements/DiscoInfo.java
index 78e43ff..83a36b4 100644
--- a/src/com/isode/stroke/elements/DiscoInfo.java
+++ b/src/com/isode/stroke/elements/DiscoInfo.java
@@ -3,7 +3,7 @@
* All rights reserved.
*/
/*
- * Copyright (c) 2010-2016, Isode Limited, London, England.
+ * Copyright (c) 2010-2017, Isode Limited, London, England.
* All rights reserved.
*/
package com.isode.stroke.elements;
@@ -34,6 +34,7 @@ public class DiscoInfo extends Payload {
public static final String Bytestream = "http://jabber.org/protocol/bytestreams";
public static final String MessageDeliveryReceiptsFeature = "urn:xmpp:receipts";
public static final String WhiteboardFeature = "http://swift.im/whiteboard";
+ public static final String MessageCarbonsFeature = "urn:xmpp:carbons:2";
public static class Identity implements Comparable<Identity> {
private final String name_;
diff --git a/src/com/isode/stroke/muc/MUCImpl.java b/src/com/isode/stroke/muc/MUCImpl.java
index 26be309..2a45926 100644
--- a/src/com/isode/stroke/muc/MUCImpl.java
+++ b/src/com/isode/stroke/muc/MUCImpl.java
@@ -106,7 +106,9 @@ public class MUCImpl extends MUC {
/**
* Change the affiliation of the given Jabber ID.
* It must be called with the real JID, not the room JID.
- * @param jid real jabber ID, not null
+ * @param jid real jabber ID, not null. NOTE: This method does not
+ strip any resource from the JID, as expected by XEP-0045. Callers
+ wanting to be strictly XEP-0045 conformant should pass in a bare JID
* @param affiliation new affiliation, not null
*/
@Override
@@ -114,7 +116,9 @@ public class MUCImpl extends MUC {
final MUCAdminPayload mucPayload = new MUCAdminPayload();
MUCItem item = new MUCItem();
item.affiliation = affiliation;
- item.realJID = jid.toBare();
+ // According to XEP-0045 the JID should be bare, but this isn't being done here because
+ // to provide support for applications where we do want to set affilations on a per resource basis
+ item.realJID = jid;
mucPayload.addItem(item);
GenericRequest<MUCAdminPayload> request = new GenericRequest<MUCAdminPayload>(
IQ.Type.Set, getJID(), mucPayload, iqRouter_);
diff --git a/src/com/isode/stroke/network/Connector.java b/src/com/isode/stroke/network/Connector.java
index 2823679..73a478b 100644
--- a/src/com/isode/stroke/network/Connector.java
+++ b/src/com/isode/stroke/network/Connector.java
@@ -218,9 +218,9 @@ public class Connector {
addressQuery.onResult.disconnectAll();
addressQuery = null;
}
- if (currentConnection != null) {
+ if (currentConnectionConnectFinishedConnection != null) {
currentConnectionConnectFinishedConnection.disconnect();
- currentConnection = null;
+ currentConnectionConnectFinishedConnection = null;
}
onConnectFinished.emit(connection, (connection != null || foundSomeDNS) ? null : new DomainNameResolveError());
diff --git a/src/com/isode/stroke/network/JavaTimer.java b/src/com/isode/stroke/network/JavaTimer.java
index ac9e219..2baae3d 100644
--- a/src/com/isode/stroke/network/JavaTimer.java
+++ b/src/com/isode/stroke/network/JavaTimer.java
@@ -4,21 +4,20 @@
* See Documentation/Licenses/GPLv3.txt for more information.
*/
/*
- * Copyright (c) 2010, Isode Limited, London, England.
+ * Copyright (c) 2010-2018, Isode Limited, London, England.
* All rights reserved.
*/
package com.isode.stroke.network;
-import java.util.Date;
-
import com.isode.stroke.eventloop.Event;
import com.isode.stroke.eventloop.EventLoop;
+import com.isode.stroke.eventloop.EventOwner;
class JavaTimer extends Timer {
- private class TimerRunnable implements Runnable {
+ private class TimerRunnable implements Runnable,EventOwner {
- boolean running_ = true;
+ private boolean running_ = true;
private final EventLoop eventLoop_;
private final long milliseconds_;
@@ -28,25 +27,27 @@ class JavaTimer extends Timer {
}
public void run() {
- long endTime = new Date().getTime() + milliseconds_;
- while (shouldEmit() && new Date().getTime() < endTime) {
+ long endTime = System.currentTimeMillis() + milliseconds_;
+ while (shouldEmit() && System.currentTimeMillis() < endTime) {
try {
- long timeToWait = endTime - new Date().getTime();
+ long timeToWait = endTime - System.currentTimeMillis();
if (timeToWait > 0) {
- Thread.sleep(milliseconds_);
+ Thread.sleep(timeToWait);
}
} catch (InterruptedException ex) {
// Needs to be caught, but won't break out of the loop
// unless end time reached or stop() has been called.
}
- }
- if (shouldEmit()) {
- eventLoop_.postEvent(new Event.Callback() {
- public void run() {
- onTick.emit();
- }
- });
- }
+ }
+ synchronized(this) {
+ if (shouldEmit()) {
+ eventLoop_.postEvent(new Event.Callback() {
+ public void run() {
+ onTick.emit();
+ }
+ },this);
+ }
+ }
}
@@ -56,6 +57,7 @@ class JavaTimer extends Timer {
public synchronized void stop() {
running_ = false;
+ timer_.eventLoop_.removeEventsFromOwner(this);
}
}
@@ -85,14 +87,15 @@ class JavaTimer extends Timer {
@Override
public void stop() {
timer_.stop();
- //FIXME: This needs to clear any remaining events out of the EventLoop queue.
}
-
+
@Override
public String toString() {
- return "JavaTimer for " + timer_.milliseconds_ +
- " milliseconds " +
- (timer_.running_ ? "running" : "not running");
+ synchronized (timer_) {
+ return "JavaTimer for " + timer_.milliseconds_ +
+ " milliseconds " +
+ (timer_.running_ ? "running" : "not running");
+ }
}
private final TimerRunnable timer_;
}
diff --git a/src/com/isode/stroke/presence/PresenceOracle.java b/src/com/isode/stroke/presence/PresenceOracle.java
index e983d51..f1710a6 100644
--- a/src/com/isode/stroke/presence/PresenceOracle.java
+++ b/src/com/isode/stroke/presence/PresenceOracle.java
@@ -199,10 +199,14 @@ public class PresenceOracle {
* @return The relevant presence.
*/
public static Presence getActivePresence(Collection<? extends Presence> presences) {
+
+ PresenceAccountCmp comparator = new PresenceAccountCmp();
+ int size = presences.size();
+ if (size < 1) size = 1;
- PriorityQueue<Presence> online = new PriorityQueue<Presence>(presences.size(),new PresenceAccountCmp());
- PriorityQueue<Presence> away = new PriorityQueue<Presence>(presences.size(),new PresenceAccountCmp());
- PriorityQueue<Presence> offline = new PriorityQueue<Presence>(presences.size(),new PresenceAccountCmp());
+ PriorityQueue<Presence> online = new PriorityQueue<Presence>(size, comparator);
+ PriorityQueue<Presence> away = new PriorityQueue<Presence>(size, comparator);
+ PriorityQueue<Presence> offline = new PriorityQueue<Presence>(size, comparator);
for (Presence presence : presences) {
switch (presence.getShow()) {
diff --git a/src/com/isode/stroke/queries/requests/EnableCarbonsRequest.java b/src/com/isode/stroke/queries/requests/EnableCarbonsRequest.java
new file mode 100644
index 0000000..cbc8109
--- /dev/null
+++ b/src/com/isode/stroke/queries/requests/EnableCarbonsRequest.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2016-2017, Isode Limited, London, England.
+ * All rights reserved.
+ */
+package com.isode.stroke.queries.requests;
+
+import com.isode.stroke.elements.CarbonsEnable;
+import com.isode.stroke.elements.IQ;
+import com.isode.stroke.jid.JID;
+import com.isode.stroke.queries.GenericRequest;
+import com.isode.stroke.queries.IQRouter;
+
+public class EnableCarbonsRequest extends GenericRequest<CarbonsEnable> {
+
+ public EnableCarbonsRequest(IQRouter router) {
+ super(IQ.Type.Set, new JID(), new CarbonsEnable(), router);
+ }
+
+ public static EnableCarbonsRequest create(IQRouter router) {
+ return new EnableCarbonsRequest(router);
+ }
+} \ No newline at end of file
diff --git a/src/com/isode/stroke/serializer/payloadserializers/CarbonsEnableSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/CarbonsEnableSerializer.java
index f88e461..10c483a 100644
--- a/src/com/isode/stroke/serializer/payloadserializers/CarbonsEnableSerializer.java
+++ b/src/com/isode/stroke/serializer/payloadserializers/CarbonsEnableSerializer.java
@@ -11,11 +11,9 @@
package com.isode.stroke.serializer.payloadserializers;
+import com.isode.stroke.elements.CarbonsEnable;
import com.isode.stroke.serializer.GenericPayloadSerializer;
-import com.isode.stroke.serializer.xml.XMLTextNode;
import com.isode.stroke.serializer.xml.XMLElement;
-import com.isode.stroke.elements.CarbonsEnable;
-import com.isode.stroke.base.NotNull;
public class CarbonsEnableSerializer extends GenericPayloadSerializer<CarbonsEnable> {