diff options
author | Kevin Smith <git@kismith.co.uk> | 2011-07-01 09:19:49 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2011-07-01 09:19:49 (GMT) |
commit | 2da71a8a85486a494343f1662d64fb5ae5a2a44e (patch) | |
tree | 23992f9f2a00bac23b345e5c2cc9c1194efc25be /src/com/isode/stroke/streammanagement | |
download | stroke-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.java | 55 | ||||
-rw-r--r-- | src/com/isode/stroke/streammanagement/StanzaAckResponder.java | 29 |
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; +} |