summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2011-07-01 09:19:49 (GMT)
committerKevin Smith <git@kismith.co.uk>2011-07-01 09:19:49 (GMT)
commit2da71a8a85486a494343f1662d64fb5ae5a2a44e (patch)
tree23992f9f2a00bac23b345e5c2cc9c1194efc25be /src/com/isode/stroke/streammanagement
downloadstroke-2da71a8a85486a494343f1662d64fb5ae5a2a44e.zip
stroke-2da71a8a85486a494343f1662d64fb5ae5a2a44e.tar.bz2
Initial import
Diffstat (limited to 'src/com/isode/stroke/streammanagement')
-rw-r--r--src/com/isode/stroke/streammanagement/StanzaAckRequester.java55
-rw-r--r--src/com/isode/stroke/streammanagement/StanzaAckResponder.java29
2 files changed, 84 insertions, 0 deletions
diff --git a/src/com/isode/stroke/streammanagement/StanzaAckRequester.java b/src/com/isode/stroke/streammanagement/StanzaAckRequester.java
new file mode 100644
index 0000000..d698e89
--- /dev/null
+++ b/src/com/isode/stroke/streammanagement/StanzaAckRequester.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2011 Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010 Remko Tron¨on.
+ * All rights reserved.
+ */
+package com.isode.stroke.streammanagement;
+
+import com.isode.stroke.elements.Message;
+import com.isode.stroke.elements.Stanza;
+import com.isode.stroke.signals.Signal;
+import com.isode.stroke.signals.Signal1;
+import java.util.ArrayList;
+import java.util.List;
+
+public class StanzaAckRequester {
+
+ static final long MAX_HANDLED_STANZA_COUNT = Long.parseLong("4294967295"); //boost::numeric_cast<unsigned int>((1ULL<<32) - 1);
+
+ public StanzaAckRequester() {
+
+ }
+
+ public void handleStanzaSent(Stanza stanza) {
+ unackedStanzas.add(stanza);
+ if (stanza instanceof Message) {
+ onRequestAck.emit();
+ }
+ }
+
+ public void handleAckReceived(long handledStanzasCount) {
+ long i = lastHandledStanzasCount;
+ while (i != handledStanzasCount) {
+ if (unackedStanzas.isEmpty()) {
+ //std::cerr << "Warning: Server acked more stanzas than we sent" << std::endl;
+ break;
+ }
+ Stanza ackedStanza = unackedStanzas.get(0);
+ unackedStanzas.remove(0);
+ onStanzaAcked.emit(ackedStanza);
+ i = (i == MAX_HANDLED_STANZA_COUNT ? 0 : i + 1);
+ }
+ lastHandledStanzasCount = handledStanzasCount;
+ }
+
+ public Signal onRequestAck = new Signal();
+
+ public Signal1<Stanza> onStanzaAcked = new Signal1<Stanza>();
+
+ private long lastHandledStanzasCount;
+
+ private List<Stanza> unackedStanzas = new ArrayList<Stanza>();
+}
diff --git a/src/com/isode/stroke/streammanagement/StanzaAckResponder.java b/src/com/isode/stroke/streammanagement/StanzaAckResponder.java
new file mode 100644
index 0000000..e0de87a
--- /dev/null
+++ b/src/com/isode/stroke/streammanagement/StanzaAckResponder.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2011 Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010 Remko Tron¨on.
+ * All rights reserved.
+ */
+package com.isode.stroke.streammanagement;
+
+import com.isode.stroke.signals.Signal1;
+
+public class StanzaAckResponder {
+
+ static final long MAX_HANDLED_STANZA_COUNT = Long.parseLong("4294967295"); //boost::numeric_cast<unsigned int>((1ULL<<32) - 1);
+
+ public StanzaAckResponder() {
+ }
+
+ public void handleStanzaReceived() {
+ handledStanzasCount = (handledStanzasCount == MAX_HANDLED_STANZA_COUNT ? 0 : handledStanzasCount + 1);
+ }
+
+ public void handleAckRequestReceived() {
+ onAck.emit(handledStanzasCount);
+ }
+ public Signal1<Long> onAck = new Signal1<Long>();
+ private long handledStanzasCount = 0;
+}