summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/streammanagement/StanzaAckRequester.java')
-rw-r--r--src/com/isode/stroke/streammanagement/StanzaAckRequester.java55
1 files changed, 55 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>();
+}