package org.chartsy.chatsy.chatimpl.plugin.gateways; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.filter.OrFilter; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.filter.PacketTypeFilter; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.provider.ProviderManager; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smackx.packet.DiscoverItems; import org.jivesoftware.smackx.packet.DiscoverItems.Item; import org.chartsy.chatsy.chat.ChatManager; import org.chartsy.chatsy.chat.PresenceManager; import org.chartsy.chatsy.chat.ChatsyManager; import org.chartsy.chatsy.chat.component.MessageDialog; import org.chartsy.chatsy.chat.plugin.Plugin; import org.chartsy.chatsy.chat.ui.*; import org.chartsy.chatsy.chat.util.SwingWorker; import org.chartsy.chatsy.chat.util.log.Log; import org.chartsy.chatsy.chatimpl.plugin.gateways.transports.*; import javax.swing.*; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class GatewayPlugin implements Plugin, ContactItemHandler { public static final String GATEWAY = "gateway"; private Map<Transport, GatewayButton> uiMap = new HashMap<Transport, GatewayButton>(); public void initialize() { ProviderManager.getInstance().addIQProvider(Gateway.ELEMENT_NAME, Gateway.NAMESPACE, new Gateway.Provider()); SwingWorker thread = new SwingWorker() { public Object construct() { try { Thread.sleep(5000); populateTransports(); } catch (Exception e) { Log.error(e); return false; } return true; } public void finished() { Boolean transportExists = (Boolean) get(); if (!transportExists) return; if (TransportUtils.getTransports().size() > 0) { final JPanel commandPanel = ChatsyManager.getWorkspace().getCommandPanel(); final JLabel dividerLabel = new JLabel("div"); commandPanel.add(dividerLabel); } for (final Transport transport : TransportUtils.getTransports()) addTransport(transport); registerPresenceListener(); } }; thread.start(); } public void shutdown() { } public boolean canShutDown() { return false; } public void uninstall() { } private void populateTransports() throws Exception { DiscoverItems discoItems = ChatsyManager.getSessionManager().getDiscoveredItems(); DiscoverItems.Item item; Iterator<DiscoverItems.Item> items = discoItems.getItems(); while (items.hasNext()) { item = (Item)items.next(); String entityName = item.getEntityID(); if (entityName != null) { if (entityName.startsWith("xmpp.")) { XMPPTransport xmppTransport = new XMPPTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), xmppTransport); } else if (entityName.startsWith("sip.")) { SimpleTransport simpleTransport = new SimpleTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), simpleTransport); } } } } private void addTransport(final Transport transport) { final GatewayButton button = new GatewayButton(transport); uiMap.put(transport, button); } private void registerPresenceListener() { PacketFilter orFilter = new OrFilter(new PacketTypeFilter(Presence.class), new PacketTypeFilter(Message.class)); ChatsyManager.getConnection().addPacketListener(new PacketListener() { public void processPacket(Packet packet) { if (packet instanceof Presence) { Presence presence = (Presence)packet; Transport transport = TransportUtils.getTransport(packet.getFrom()); if (transport != null) { boolean registered = true; if (presence.getType() == Presence.Type.unavailable) registered = false; GatewayButton button = uiMap.get(transport); button.signedIn(registered); } } else if (packet instanceof Message) { Message message = (Message)packet; String from = message.getFrom(); boolean hasError = message.getType() == Message.Type.error; String body = message.getBody(); if (from != null && hasError) { Transport transport = TransportUtils.getTransport(from); if (transport != null) { String title = "Alert from " + transport.getName(); MessageDialog.showAlert(body, title, "Information", null); } } } } }, orFilter); ChatManager chatManager = ChatsyManager.getChatManager(); chatManager.addContactItemHandler(this); final ContactList contactList = ChatsyManager.getWorkspace().getContactList(); for (ContactGroup contactGroup : contactList.getContactGroups()) { for (ContactItem contactItem : contactGroup.getContactItems()) { Presence presence = contactItem.getPresence(); if (presence.isAvailable()) { String domain = StringUtils.parseServer(presence.getFrom()); Transport transport = TransportUtils.getTransport(domain); if (transport != null) { handlePresence(contactItem, presence); contactGroup.fireContactGroupUpdated(); } } } } ChatsyManager.getSessionManager().addPresenceListener(new PresenceListener() { public void presenceChanged(Presence presence) { for (Transport transport : TransportUtils.getTransports()) { GatewayButton button = uiMap.get(transport); if (button.isLoggedIn()) { if (!presence.isAvailable()) return; Presence p = new Presence(presence.getType(), presence.getStatus(), presence.getPriority(), presence.getMode()); p.setTo(transport.getServiceName()); ChatsyManager.getConnection().sendPacket(p); } } } }); } public boolean handlePresence(ContactItem item, Presence presence) { if (presence.isAvailable()) { String domain = StringUtils.parseServer(presence.getFrom()); Transport transport = TransportUtils.getTransport(domain); if (transport != null) { if (presence.getType() == Presence.Type.available) { item.setAvatarImage(transport.getIcon()); } else { item.setAvatarImage(transport.getInactiveIcon()); } return false; } } return false; } public boolean handleDoubleClick(ContactItem item) { return false; } public Icon getIcon(String jid) { String domain = StringUtils.parseServer(jid); Transport transport = TransportUtils.getTransport(domain); if (transport != null) { if (PresenceManager.isOnline(jid)) { return transport.getIcon(); } else { return transport.getInactiveIcon(); } } return null; } public Icon getTabIcon(Presence presence) { return null; } }