src/main/java/de/unixwork/im/Xmpp.java

Thu, 26 Dec 2024 12:53:02 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 26 Dec 2024 12:53:02 +0100
changeset 2
94c6a715fa44
parent 1
42d0d099492b
child 4
856befba7674
permissions
-rw-r--r--

handle presence messages

0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 package de.unixwork.im;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 import java.io.IOException;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 import java.util.ArrayList;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 import java.util.List;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 import java.util.concurrent.BlockingQueue;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 import java.util.concurrent.LinkedBlockingQueue;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 import java.util.logging.Level;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 import java.util.logging.Logger;
1
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
11 import net.java.otr4j.OtrException;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
12 import net.java.otr4j.OtrPolicy;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
13 import net.java.otr4j.OtrPolicyImpl;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
14 import net.java.otr4j.OtrSessionManager;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
15 import net.java.otr4j.OtrSessionManagerImpl;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
16 import net.java.otr4j.session.InstanceTag;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
17 import net.java.otr4j.session.Session;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
18 import net.java.otr4j.session.SessionID;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
19 import net.java.otr4j.session.SessionImpl;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
20 import net.java.otr4j.session.TLV;
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 import org.jivesoftware.smack.ConnectionConfiguration;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 import org.jivesoftware.smack.SmackException;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 import org.jivesoftware.smack.XMPPException;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 import org.jivesoftware.smack.filter.MessageWithBodiesFilter;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 import org.jivesoftware.smack.packet.Message;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 import org.jivesoftware.smack.packet.MessageBuilder;
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
27 import org.jivesoftware.smack.packet.Presence;
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28 import org.jivesoftware.smack.roster.Roster;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 import org.jivesoftware.smack.roster.RosterEntry;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 import org.jivesoftware.smack.tcp.XMPPTCPConnection;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
32 import org.jxmpp.jid.Jid;
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 import org.jxmpp.stringprep.XmppStringprepException;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 public class Xmpp extends Thread {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 private final XMPPTCPConnectionConfiguration config;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 private XMPPTCPConnection connection = null;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39
1
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
40 private final OTR otr;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
41
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
42 private final OtrSessionManager otrSM;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
43
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 // BlockingQueue for event-driven communication
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 private final BlockingQueue<XmppEvent> eventQueue = new LinkedBlockingQueue<>();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 public Xmpp(XMPPTCPConnectionConfiguration xmppConfig) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 config = xmppConfig;
1
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
49 otr = new OTR(this);
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
50 otrSM = new OtrSessionManagerImpl(otr);
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
51 }
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
52
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
53 public OTR getOTR() {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
54 return otr;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
55 }
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
56
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
57 public OtrSessionManager getOtrSM() {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
58 return otrSM;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
59 }
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
60
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
61 public void startOTR(String xid) {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
62 String account = config.getUsername() + "@" + config.getHostString() + "/IM5";
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
63 SessionID sid = new SessionID(account, xid, "xmpp");
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
64
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
65 Session session = new SessionImpl(sid, otr);
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
66 String[] outgoingMessage;
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
67 try {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
68 session.startSession();
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
69 } catch (OtrException ex) {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
70 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
71 }
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
72
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 // Method to send a message (this will be called from another thread)
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 public void sendMessage(String to, String message, boolean encrypted) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 try {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 XmppMessage event = new XmppMessage(to, message, encrypted);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 eventQueue.put(event); // Block if the queue is full
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 } catch (InterruptedException e) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, "Error adding event to queue", e);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84
1
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
85 public void send(String to, String message) {
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
86 sendMessage(to, message, false);
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
87 }
42d0d099492b add incomplete otr code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
88
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 private void connect() throws SmackException, IOException, XMPPException, InterruptedException {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 connection = new XMPPTCPConnection(config);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 connection.setUseStreamManagement(false);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 connection.connect();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 connection.login();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 public List<RosterEntry> getRosterItems() throws SmackException.NotLoggedInException, SmackException.NotConnectedException, InterruptedException {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 try {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 // Ensure we are connected
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 if (connection != null && connection.isConnected()) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 // Get the roster instance
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 Roster roster = Roster.getInstanceFor(connection);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 // Fetch all roster entries (contacts)
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 roster.reload();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 // Add all roster entries to the list
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 ArrayList<RosterEntry> rosterList = new ArrayList<>(16);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 roster.getEntries().forEach(entry -> rosterList.add(entry));
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 // Optionally, print the list to verify
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 System.out.println("Roster List: ");
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 for (RosterEntry entry : rosterList) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113 System.out.println("Contact: " + entry.getUser());
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 return rosterList;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 } else {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 System.out.println("Not connected to XMPP server.");
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 } catch (SmackException e) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, "Error getting roster items", e);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 return null;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 @Override
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 public void run() {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 try {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 connect();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
131 connection.addAsyncStanzaListener((stanza -> {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132 var jid = stanza.getFrom();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
133 if(jid != null) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134 String body = ((Message)stanza).getBody();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
135 App.getInstance().dispatchMessage(jid, body, true);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136 }
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
137 }), MessageWithBodiesFilter.INSTANCE);
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
138 connection.addAsyncStanzaListener(stanza -> {
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
139 if (stanza instanceof Presence) {
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
140 Presence presence = (Presence) stanza;
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
141 Jid from = presence.getFrom();
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
142 Presence.Type type = presence.getType();
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
143 App.getInstance().handlePresence(from, type);
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
144 }
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1
diff changeset
145 }, stanza -> stanza instanceof Presence);
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
146 List<RosterEntry> roster = getRosterItems();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 if(roster != null) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 App.getInstance().setContacts(roster);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 while (true) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
152 // Wait for an event (message to send)
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153 XmppEvent event = eventQueue.take(); // This will block until an event is available
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 event.exec(this, connection);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
156 } catch (SmackException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
157 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 } catch (IOException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 } catch (XMPPException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
162 } catch (InterruptedException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163 Logger.getLogger(Xmpp.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
164 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168 class XmppMessage implements XmppEvent {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 String to;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170 String message;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171 boolean encrypted;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 XmppMessage(String to, String message, boolean encrypted) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174 this.to = to;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 this.message = message;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
176 this.encrypted = encrypted;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
179 public void exec(Xmpp xmpp, XMPPTCPConnection conn) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
180 final Message msg;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
181 try {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
182 msg = MessageBuilder.buildMessage()
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
183 .to(to)
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
184 .setBody(message)
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
185 .build();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
186 conn.sendStanza(msg);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187 } catch (XmppStringprepException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
188 Logger.getLogger(XmppMessage.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189 } catch (SmackException.NotConnectedException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
190 Logger.getLogger(XmppMessage.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
191 } catch (InterruptedException ex) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192 Logger.getLogger(XmppMessage.class.getName()).log(Level.SEVERE, null, ex);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
193 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
194 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195 }

mercurial