summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/component/ComponentSessionStanzaChannel.java')
-rw-r--r--src/com/isode/stroke/component/ComponentSessionStanzaChannel.java127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/com/isode/stroke/component/ComponentSessionStanzaChannel.java b/src/com/isode/stroke/component/ComponentSessionStanzaChannel.java
new file mode 100644
index 0000000..8d97bef
--- /dev/null
+++ b/src/com/isode/stroke/component/ComponentSessionStanzaChannel.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2010-2015 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+/*
+ * Copyright (c) 2015 Tarun Gupta.
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+package com.isode.stroke.component;
+
+import com.isode.stroke.base.IDGenerator;
+import com.isode.stroke.component.ComponentSession;
+import com.isode.stroke.client.StanzaChannel;
+import com.isode.stroke.elements.Message;
+import com.isode.stroke.elements.IQ;
+import com.isode.stroke.elements.Presence;
+import com.isode.stroke.elements.Stanza;
+import com.isode.stroke.tls.Certificate;
+import com.isode.stroke.signals.SignalConnection;
+import com.isode.stroke.signals.Slot;
+import com.isode.stroke.signals.Slot1;
+import java.util.Vector;
+
+public class ComponentSessionStanzaChannel extends StanzaChannel {
+
+ private IDGenerator idGenerator;
+ private ComponentSession session;
+ private SignalConnection onInitializedConnection;
+ private SignalConnection onFinishedConnection;
+ private SignalConnection onStanzaReceivedConnection;
+
+ public void setSession(ComponentSession session) {
+ assert(this.session == null);
+ this.session = session;
+ onInitializedConnection = session.onInitialized.connect(new Slot() {
+ @Override
+ public void call() {
+ handleSessionInitialized();
+ }
+ });
+ onFinishedConnection = session.onFinished.connect(new Slot1<com.isode.stroke.base.Error>() {
+ @Override
+ public void call(com.isode.stroke.base.Error e1) {
+ handleSessionFinished(e1);
+ }
+ });
+ onStanzaReceivedConnection = session.onStanzaReceived.connect(new Slot1<Stanza>() {
+ @Override
+ public void call(Stanza s1) {
+ handleStanza(s1);
+ }
+ });
+ }
+
+ public void sendIQ(IQ iq) {
+ send(iq);
+ }
+
+ public void sendMessage(Message message) {
+ send(message);
+ }
+
+ public void sendPresence(Presence presence) {
+ send(presence);
+ }
+
+ public boolean getStreamManagementEnabled() {
+ return false;
+ }
+
+ public Vector<Certificate> getPeerCertificateChain() {
+ // TODO: actually implement this method
+ return (Vector<Certificate>)null;
+ }
+
+ public boolean isAvailable() {
+ return (session != null) && (ComponentSession.State.Initialized.equals(session.getState()));
+ }
+
+ public String getNewIQID() {
+ return idGenerator.generateID();
+ }
+
+ private void send(Stanza stanza) {
+ if (!isAvailable()) {
+ System.err.println("Warning: Component: Trying to send a stanza while disconnected.\n");
+ return;
+ }
+ session.sendStanza(stanza);
+ }
+
+ private void handleSessionFinished(com.isode.stroke.base.Error error) {
+ onFinishedConnection.disconnect();
+ onStanzaReceivedConnection.disconnect();
+ onInitializedConnection.disconnect();
+ session = null;
+
+ onAvailableChanged.emit(false);
+ }
+
+ private void handleStanza(Stanza stanza) {
+ if(stanza instanceof Message) {
+ Message message = (Message)(stanza);
+ onMessageReceived.emit(message);
+ return;
+ }
+
+ if(stanza instanceof Presence) {
+ Presence presence = (Presence)(stanza);
+ onPresenceReceived.emit(presence);
+ return;
+ }
+
+ if(stanza instanceof IQ) {
+ IQ iq = (IQ)(stanza);
+ onIQReceived.emit(iq);
+ return;
+ }
+ }
+
+ private void handleSessionInitialized() {
+ onAvailableChanged.emit(true);
+ }
+} \ No newline at end of file