package org.chartsy.chatsy.chat; import org.jivesoftware.smack.ConnectionListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smackx.PrivateDataManager; import org.jivesoftware.smackx.ServiceDiscoveryManager; import org.jivesoftware.smackx.packet.DiscoverItems; import org.chartsy.chatsy.chat.ui.PresenceListener; import org.chartsy.chatsy.chat.util.log.Log; import javax.swing.SwingUtilities; import java.util.ArrayList; import java.util.List; import org.jivesoftware.smack.Roster.SubscriptionMode; public final class SessionManager implements ConnectionListener { private XMPPConnection connection; private PrivateDataManager personalDataManager; private String serverAddress; private String username; private String password; private String JID; private List<PresenceListener> presenceListeners = new ArrayList<PresenceListener>(); private String userBareAddress; private DiscoverItems discoverItems; public SessionManager() { } public void initializeSession(XMPPConnection connection, String username, String password) { this.connection = connection; this.username = username; this.password = password; this.userBareAddress = StringUtils.parseBareAddress(connection.getUser()); personalDataManager = new PrivateDataManager(getConnection()); discoverItems(); } private void discoverItems() { ServiceDiscoveryManager disco = ServiceDiscoveryManager.getInstanceFor(ChatsyManager.getConnection()); try { discoverItems = disco.discoverItems(ChatsyManager.getConnection().getServiceName()); } catch (XMPPException e) { Log.error(e); discoverItems = new DiscoverItems(); } } public XMPPConnection getConnection() { return connection; } public PrivateDataManager getPersonalDataManager() { return personalDataManager; } public String getServerAddress() { return serverAddress; } public void setServerAddress(String address) { this.serverAddress = address; } public void connectionClosedOnError(final Exception ex) { SwingUtilities.invokeLater(new Runnable() { public void run() { final Presence presence = new Presence(Presence.Type.unavailable); changePresence(presence); Log.debug("Connection closed on error.: " + ex.getMessage()); } }); } public void connectionClosed() { } public String getUsername() { return StringUtils.unescapeNode(username); } public String getPassword() { return password; } public void changePresence(Presence presence) { for (PresenceListener listener : new ArrayList<PresenceListener>(this.presenceListeners)) listener.presenceChanged(presence); if (ChatsyManager.getConnection().isConnected()) ChatsyManager.getConnection().sendPacket(presence); } public String getJID() { return JID; } public void setJID(String jid) { this.JID = jid; } public void addPresenceListener(PresenceListener listener) { presenceListeners.add(listener); } public void removePresenceListener(PresenceListener listener) { presenceListeners.remove(listener); } public String getBareAddress() { return userBareAddress; } public DiscoverItems getDiscoveredItems() { return discoverItems; } public void setConnection(XMPPConnection con) { this.connection = con; connection.getRoster().setSubscriptionMode(SubscriptionMode.accept_all); } public void reconnectingIn(int i) { } public void reconnectionSuccessful() { } public void reconnectionFailed(Exception exception) { } }