|
1 /* |
|
2 * otr4j, the open source java otr librar |
|
3 * |
|
4 * Distributable under LGPL license. |
|
5 * See terms of license at gnu.org. |
|
6 */ |
|
7 |
|
8 package net.java.otr4j; |
|
9 |
|
10 import java.security.PublicKey; |
|
11 import java.util.Hashtable; |
|
12 import java.util.List; |
|
13 import java.util.Map; |
|
14 import java.util.Vector; |
|
15 |
|
16 import net.java.otr4j.session.Session; |
|
17 import net.java.otr4j.session.SessionID; |
|
18 import net.java.otr4j.session.SessionImpl; |
|
19 import net.java.otr4j.session.SessionStatus; |
|
20 |
|
21 /** |
|
22 * |
|
23 * @author George Politis |
|
24 * |
|
25 */ |
|
26 public class OtrEngineImpl implements OtrEngine { |
|
27 |
|
28 public OtrEngineImpl(OtrEngineHost listener) { |
|
29 if (listener == null) |
|
30 throw new IllegalArgumentException("OtrEgineHost is required."); |
|
31 |
|
32 this.setListener(listener); |
|
33 } |
|
34 |
|
35 private OtrEngineHost listener; |
|
36 private Map<SessionID, Session> sessions; |
|
37 |
|
38 private Session getSession(SessionID sessionID) { |
|
39 |
|
40 if (sessionID == null || sessionID.equals(SessionID.Empty)) |
|
41 throw new IllegalArgumentException(); |
|
42 |
|
43 if (sessions == null) |
|
44 sessions = new Hashtable<SessionID, Session>(); |
|
45 |
|
46 if (!sessions.containsKey(sessionID)) { |
|
47 Session session = new SessionImpl(sessionID, getListener()); |
|
48 sessions.put(sessionID, session); |
|
49 |
|
50 session.addOtrEngineListener(new OtrEngineListener() { |
|
51 |
|
52 public void sessionStatusChanged(SessionID sessionID) { |
|
53 for (OtrEngineListener l : listeners) |
|
54 l.sessionStatusChanged(sessionID); |
|
55 } |
|
56 }); |
|
57 |
|
58 } |
|
59 |
|
60 return sessions.get(sessionID); |
|
61 } |
|
62 |
|
63 public SessionStatus getSessionStatus(SessionID sessionID) { |
|
64 return this.getSession(sessionID).getSessionStatus(); |
|
65 } |
|
66 |
|
67 public String transformReceiving(SessionID sessionID, String msgText) { |
|
68 try { |
|
69 return this.getSession(sessionID).transformReceiving(msgText); |
|
70 } catch (OtrException e) { |
|
71 listener.showError(sessionID, e.getMessage()); |
|
72 return null; |
|
73 } |
|
74 } |
|
75 |
|
76 public String transformSending(SessionID sessionID, String msgText) { |
|
77 try { |
|
78 return this.getSession(sessionID).transformSending(msgText, null); |
|
79 } catch (OtrException e) { |
|
80 listener.showError(sessionID, e.getMessage()); |
|
81 return null; |
|
82 } |
|
83 } |
|
84 |
|
85 public void endSession(SessionID sessionID) { |
|
86 try { |
|
87 this.getSession(sessionID).endSession(); |
|
88 } catch (OtrException e) { |
|
89 listener.showError(sessionID, e.getMessage()); |
|
90 } |
|
91 } |
|
92 |
|
93 public void startSession(SessionID sessionID) { |
|
94 try { |
|
95 this.getSession(sessionID).startSession(); |
|
96 } catch (OtrException e) { |
|
97 listener.showError(sessionID, e.getMessage()); |
|
98 } |
|
99 } |
|
100 |
|
101 private void setListener(OtrEngineHost listener) { |
|
102 this.listener = listener; |
|
103 } |
|
104 |
|
105 private OtrEngineHost getListener() { |
|
106 return listener; |
|
107 } |
|
108 |
|
109 public void refreshSession(SessionID sessionID) { |
|
110 try { |
|
111 this.getSession(sessionID).refreshSession(); |
|
112 } catch (OtrException e) { |
|
113 listener.showError(sessionID, e.getMessage()); |
|
114 } |
|
115 } |
|
116 |
|
117 public PublicKey getRemotePublicKey(SessionID sessionID) { |
|
118 return this.getSession(sessionID).getRemotePublicKey(); |
|
119 } |
|
120 |
|
121 private List<OtrEngineListener> listeners = new Vector<OtrEngineListener>(); |
|
122 |
|
123 public void addOtrEngineListener(OtrEngineListener l) { |
|
124 synchronized (listeners) { |
|
125 if (!listeners.contains(l)) |
|
126 listeners.add(l); |
|
127 } |
|
128 |
|
129 } |
|
130 |
|
131 public void removeOtrEngineListener(OtrEngineListener l) { |
|
132 synchronized (listeners) { |
|
133 listeners.remove(l); |
|
134 } |
|
135 } |
|
136 } |