summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/session/Session.java')
-rw-r--r--src/com/isode/stroke/session/Session.java183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/com/isode/stroke/session/Session.java b/src/com/isode/stroke/session/Session.java
new file mode 100644
index 0000000..79132e4
--- /dev/null
+++ b/src/com/isode/stroke/session/Session.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2010 Remko Tron¨on
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+/*
+ * Copyright (c) 2010-2011, Isode Limited, London, England.
+ * All rights reserved.
+ */
+package com.isode.stroke.session;
+
+import com.isode.stroke.base.ByteArray;
+import com.isode.stroke.elements.Element;
+import com.isode.stroke.elements.ProtocolHeader;
+import com.isode.stroke.elements.StreamType;
+import com.isode.stroke.eventloop.EventLoop;
+import com.isode.stroke.jid.JID;
+import com.isode.stroke.network.Connection;
+import com.isode.stroke.parser.PayloadParserFactoryCollection;
+import com.isode.stroke.serializer.PayloadSerializerCollection;
+import com.isode.stroke.signals.Signal1;
+import com.isode.stroke.signals.Slot;
+import com.isode.stroke.signals.Slot1;
+import com.isode.stroke.streamstack.ConnectionLayer;
+import com.isode.stroke.streamstack.StreamStack;
+import com.isode.stroke.streamstack.XMPPLayer;
+
+public abstract class Session {
+
+ public enum SessionError {
+
+ ConnectionReadError,
+ ConnectionWriteError,
+ XMLError,
+ AuthenticationFailedError,
+ NoSupportedAuthMechanismsError,
+ UnexpectedElementError,
+ ResourceBindError,
+ SessionStartError,
+ TLSError,
+ ClientCertificateLoadError,
+ ClientCertificateError
+ };
+
+ public Session(
+ final Connection connection,
+ final PayloadParserFactoryCollection payloadParserFactories,
+ final PayloadSerializerCollection payloadSerializers,
+ final EventLoop eventLoop) {
+ this.connection = connection;
+ this.eventLoop = eventLoop;
+ this.payloadParserFactories = payloadParserFactories;
+ this.payloadSerializers = payloadSerializers;
+ finishing = false;
+ }
+
+
+ public void startSession() {
+ initializeStreamStack();
+ handleSessionStarted();
+ }
+
+ public void finishSession() {
+ finishing = true;
+ connection.disconnect();
+ handleSessionFinished(null);
+ finishing = false;
+ onSessionFinished.emit(null);
+ }
+
+ public void sendElement(Element stanza) {
+ xmppLayer.writeElement(stanza);
+ }
+
+ public JID getLocalJID() {
+ return localJID;
+ }
+
+ public JID getRemoteJID() {
+ return remoteJID;
+ }
+ public final Signal1<Element> onElementReceived = new Signal1<Element>();
+ public final Signal1<SessionError> onSessionFinished = new Signal1<SessionError>();
+ public final Signal1<ByteArray> onDataWritten = new Signal1<ByteArray>();
+ public final Signal1<ByteArray> onDataRead = new Signal1<ByteArray>();
+
+ protected void setRemoteJID(JID j) {
+ remoteJID = j;
+ }
+
+ protected void setLocalJID(JID j) {
+ localJID = j;
+ }
+
+ protected void finishSession(SessionError error) {
+ finishing = true;
+ connection.disconnect();
+ handleSessionFinished(error);
+ finishing = false;
+ onSessionFinished.emit(error);
+ }
+
+ protected void handleSessionStarted() {
+ }
+
+ protected void handleSessionFinished(SessionError error) {
+ }
+
+ protected abstract void handleElement(Element element);
+
+ protected abstract void handleStreamStart(ProtocolHeader header);
+
+ protected void initializeStreamStack() {
+ xmppLayer = new XMPPLayer(payloadParserFactories, payloadSerializers, StreamType.ClientStreamType, eventLoop);
+ xmppLayer.onStreamStart.connect(new Slot1<ProtocolHeader>() {
+
+ public void call(ProtocolHeader header) {
+ handleStreamStart(header);
+ }
+ });
+ xmppLayer.onElement.connect(new Slot1<Element>() {
+
+ public void call(Element p1) {
+ handleElement(p1);
+ }
+ });
+ xmppLayer.onError.connect(new Slot() {
+
+ public void call() {
+ finishSession(SessionError.XMLError);
+ }
+ });
+ xmppLayer.onDataRead.connect(onDataRead);
+ xmppLayer.onWriteData.connect(onDataWritten);
+ connection.onDisconnected.connect(new Slot1<Connection.Error>() {
+
+ public void call(Connection.Error p1) {
+ handleDisconnected(p1);
+ }
+ });
+ connectionLayer = new ConnectionLayer(connection);
+ streamStack = new StreamStack(xmppLayer, connectionLayer);
+ }
+
+ public XMPPLayer getXMPPLayer() {
+ return xmppLayer;
+
+
+ }
+
+ public StreamStack getStreamStack() {
+ return streamStack;
+
+
+ }
+
+ /*void setFinished();*/ /* This seems to be unused in Swiften*/
+
+ private void handleDisconnected(Connection.Error connectionError) {
+ if (connectionError != null) {
+ switch (connectionError) {
+ case ReadError:
+ finishSession(SessionError.ConnectionReadError);
+ break;
+ case WriteError:
+ finishSession(SessionError.ConnectionWriteError);
+ break;
+ }
+ } else {
+ finishSession();
+ }
+ }
+ private JID localJID;
+ private JID remoteJID;
+ private Connection connection;
+ private PayloadParserFactoryCollection payloadParserFactories;
+ private PayloadSerializerCollection payloadSerializers;
+ private XMPPLayer xmppLayer;
+ private ConnectionLayer connectionLayer;
+ private StreamStack streamStack;
+ private boolean finishing;
+ private final EventLoop eventLoop;
+}