diff -r 6cbb9b3117b7 -r 9d3a7af41ec2 src/net/java/otr4j/OtrEngineImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/net/java/otr4j/OtrEngineImpl.java Sun Dec 05 18:45:54 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 sessions; + + private Session getSession(SessionID sessionID) { + + if (sessionID == null || sessionID.equals(SessionID.Empty)) + throw new IllegalArgumentException(); + + if (sessions == null) + sessions = new Hashtable(); + + 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 listeners = new Vector(); + + public void addOtrEngineListener(OtrEngineListener l) { + synchronized (listeners) { + if (!listeners.contains(l)) + listeners.add(l); + } + + } + + public void removeOtrEngineListener(OtrEngineListener l) { + synchronized (listeners) { + listeners.remove(l); + } + } +}