src/net/java/otr4j/OtrEngineImpl.java
changeset 810 0ff0059f2ec3
child 815 ca323cff3ac9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/java/otr4j/OtrEngineImpl.java	Sun Dec 05 18:43:51 2010 +0100
@@ -0,0 +1,136 @@
+/*
+ * otr4j, the open source java otr librar
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package net.java.otr4j;
+
+import java.security.PublicKey;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import net.java.otr4j.session.Session;
+import net.java.otr4j.session.SessionID;
+import net.java.otr4j.session.SessionImpl;
+import net.java.otr4j.session.SessionStatus;
+
+/**
+ * 
+ * @author George Politis
+ * 
+ */
+public class OtrEngineImpl implements OtrEngine {
+
+	public OtrEngineImpl(OtrEngineHost listener) {
+		if (listener == null)
+			throw new IllegalArgumentException("OtrEgineHost is required.");
+
+		this.setListener(listener);
+	}
+
+	private OtrEngineHost listener;
+	private Map<SessionID, Session> sessions;
+
+	private Session getSession(SessionID sessionID) {
+
+		if (sessionID == null || sessionID.equals(SessionID.Empty))
+			throw new IllegalArgumentException();
+
+		if (sessions == null)
+			sessions = new Hashtable<SessionID, Session>();
+
+		if (!sessions.containsKey(sessionID)) {
+			Session session = new SessionImpl(sessionID, getListener());
+			sessions.put(sessionID, session);
+
+			session.addOtrEngineListener(new OtrEngineListener() {
+
+				public void sessionStatusChanged(SessionID sessionID) {
+					for (OtrEngineListener l : listeners)
+						l.sessionStatusChanged(sessionID);
+				}
+			});
+
+		}
+
+		return sessions.get(sessionID);
+	}
+
+	public SessionStatus getSessionStatus(SessionID sessionID) {
+		return this.getSession(sessionID).getSessionStatus();
+	}
+
+	public String transformReceiving(SessionID sessionID, String msgText) {
+		try {
+			return this.getSession(sessionID).transformReceiving(msgText);
+		} catch (OtrException e) {
+			listener.showError(sessionID, e.getMessage());
+			return null;
+		}
+	}
+
+	public String transformSending(SessionID sessionID, String msgText) {
+		try {
+			return this.getSession(sessionID).transformSending(msgText, null);
+		} catch (OtrException e) {
+			listener.showError(sessionID, e.getMessage());
+			return null;
+		}
+	}
+
+	public void endSession(SessionID sessionID) {
+		try {
+			this.getSession(sessionID).endSession();
+		} catch (OtrException e) {
+			listener.showError(sessionID, e.getMessage());
+		}
+	}
+
+	public void startSession(SessionID sessionID) {
+		try {
+			this.getSession(sessionID).startSession();
+		} catch (OtrException e) {
+			listener.showError(sessionID, e.getMessage());
+		}
+	}
+
+	private void setListener(OtrEngineHost listener) {
+		this.listener = listener;
+	}
+
+	private OtrEngineHost getListener() {
+		return listener;
+	}
+
+	public void refreshSession(SessionID sessionID) {
+		try {
+			this.getSession(sessionID).refreshSession();
+		} catch (OtrException e) {
+			listener.showError(sessionID, e.getMessage());
+		}
+	}
+
+	public PublicKey getRemotePublicKey(SessionID sessionID) {
+		return this.getSession(sessionID).getRemotePublicKey();
+	}
+
+	private List<OtrEngineListener> listeners = new Vector<OtrEngineListener>();
+
+	public void addOtrEngineListener(OtrEngineListener l) {
+		synchronized (listeners) {
+			if (!listeners.contains(l))
+				listeners.add(l);
+		}
+
+	}
+
+	public void removeOtrEngineListener(OtrEngineListener l) {
+		synchronized (listeners) {
+			listeners.remove(l);
+		}
+	}
+}