summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/client/ClientSessionStanzaChannel.java')
-rw-r--r--src/com/isode/stroke/client/ClientSessionStanzaChannel.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/com/isode/stroke/client/ClientSessionStanzaChannel.java b/src/com/isode/stroke/client/ClientSessionStanzaChannel.java
new file mode 100644
index 0000000..531ff62
--- /dev/null
+++ b/src/com/isode/stroke/client/ClientSessionStanzaChannel.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2010, Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010, Remko Tron?on.
+ * All rights reserved.
+ */
+package com.isode.stroke.client;
+
+import com.isode.stroke.base.Error;
+import com.isode.stroke.elements.IQ;
+import com.isode.stroke.elements.Message;
+import com.isode.stroke.elements.Presence;
+import com.isode.stroke.elements.Stanza;
+import com.isode.stroke.signals.SignalConnection;
+import com.isode.stroke.signals.Slot;
+import com.isode.stroke.signals.Slot1;
+import java.util.logging.Logger;
+
+/**
+ * StanzaChannel implementation around a ClientSession.
+ */
+public class ClientSessionStanzaChannel extends StanzaChannel {
+ private SignalConnection sessionInitializedConnection;
+ private SignalConnection sessionFinishedConnection;
+ private SignalConnection sessionStanzaReceivedConnection;
+ private SignalConnection sessionStanzaAckedConnection;
+
+ public void setSession(ClientSession session) {
+ assert this.session == null;
+ this.session = session;
+ sessionInitializedConnection = session.onInitialized.connect(new Slot() {
+
+ public void call() {
+ handleSessionInitialized();
+ }
+ });
+ sessionFinishedConnection = session.onFinished.connect(new Slot1<com.isode.stroke.base.Error>() {
+
+ public void call(com.isode.stroke.base.Error p1) {
+ handleSessionFinished(p1);
+ }
+ });
+ sessionStanzaReceivedConnection = session.onStanzaReceived.connect(new Slot1<Stanza>() {
+
+ public void call(Stanza p1) {
+ handleStanza(p1);
+ }
+ });
+ sessionStanzaAckedConnection = session.onStanzaAcked.connect(new Slot1<Stanza>() {
+
+ public void call(Stanza p1) {
+ handleStanzaAcked(p1);
+ }
+ });
+ }
+
+ public void sendIQ(IQ iq) {
+ send(iq);
+ }
+
+ public void sendMessage(Message message) {
+ send(message);
+ }
+
+ public void sendPresence(Presence presence) {
+ send(presence);
+ }
+
+ public boolean getStreamManagementEnabled() {
+ if (session != null) {
+ return session.getStreamManagementEnabled();
+ }
+ return false;
+ }
+
+ public boolean isAvailable() {
+ return session != null && ClientSession.State.Initialized.equals(session.getState());
+ }
+
+ public String getNewIQID() {
+ return idGenerator.generateID();
+ }
+
+ private void send(Stanza stanza) {
+ if (!isAvailable()) {
+ logger_.warning("Warning: Client: Trying to send a stanza while disconnected.");
+ return;
+ }
+ session.sendStanza(stanza);
+ }
+
+ private void handleSessionFinished(Error error) {
+ sessionFinishedConnection.disconnect();
+ sessionStanzaReceivedConnection.disconnect();
+ sessionStanzaAckedConnection.disconnect();
+ sessionInitializedConnection.disconnect();
+ session = null;
+ onAvailableChanged.emit(false);
+ }
+
+ private void handleStanza(Stanza stanza) {
+ if (stanza instanceof Message) {
+ onMessageReceived.emit((Message)stanza);
+ }
+ if (stanza instanceof Presence) {
+ onPresenceReceived.emit((Presence)stanza);
+ }
+ if (stanza instanceof IQ) {
+ onIQReceived.emit((IQ)stanza);
+ }
+ }
+
+ private void handleStanzaAcked(Stanza stanza) {
+ onStanzaAcked.emit(stanza);
+ }
+
+ private void handleSessionInitialized() {
+ onAvailableChanged.emit(true);
+ }
+ private IDGenerator idGenerator = new IDGenerator();
+ private ClientSession session;
+ private static final Logger logger_ = Logger.getLogger(ClientSessionStanzaChannel.class.getName());
+}