/** * $RCSfile: ,v $ * $Revision: $ * $Date: $ * * Copyright (C) 2004-2011 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.sparkimpl.plugin.gateways; import org.jivesoftware.resource.Res; import org.jivesoftware.resource.SparkRes; 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.jivesoftware.spark.ChatManager; import org.jivesoftware.spark.PresenceManager; import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.component.MessageDialog; import org.jivesoftware.spark.component.VerticalFlowLayout; import org.jivesoftware.spark.plugin.Plugin; import org.jivesoftware.spark.ui.*; import org.jivesoftware.spark.util.SwingWorker; import org.jivesoftware.spark.util.log.Log; import org.jivesoftware.sparkimpl.plugin.gateways.transports.*; import org.jivesoftware.sparkimpl.settings.local.LocalPreferences; import org.jivesoftware.sparkimpl.settings.local.SettingsManager; import javax.swing.*; import java.awt.Color; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * Handles Gateways/Transports in Spark. * * @author Derek DeMoro */ public class GatewayPlugin implements Plugin, ContactItemHandler { /** * Defined Static Variable for Gateways. * */ public static final String GATEWAY = "gateway"; private boolean useTab; private Map<Transport, GatewayItem> uiMap = new HashMap<Transport, GatewayItem>();; private JPanel transferTab = new JPanel(); public void initialize() { ProviderManager.getInstance().addIQProvider(Gateway.ELEMENT_NAME, Gateway.NAMESPACE, new Gateway.Provider()); LocalPreferences localPref = SettingsManager.getLocalPreferences(); useTab = localPref.getShowTransportTab(); transferTab.setBackground((Color)UIManager.get("ContactItem.background")); SwingWorker thread = new SwingWorker() { public Object construct() { try { // Let's try and avoid any timing issues with the gateway presence. Thread.sleep(5000); populateTransports(); } catch (Exception e) { Log.error(e); return false; } return true; } public void finished() { transferTab.setLayout(new VerticalFlowLayout(0,0,0,true,false)); Boolean transportExists = (Boolean)get(); if (!transportExists) { return; } if (TransportUtils.getTransports().size() > 0 && useTab) { SparkManager.getWorkspace().getWorkspacePane().addTab(Res.getString("title.transports"), SparkRes.getImageIcon(SparkRes.TRANSPORT_ICON), transferTab); } for (final Transport transport : TransportUtils.getTransports()) { addTransport(transport); } // Register presences. registerPresenceListener(); } }; thread.start(); } public void shutdown() { } public boolean canShutDown() { return false; } public void uninstall() { } private void populateTransports() throws Exception { DiscoverItems discoItems = SparkManager.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("aim.")) { AIMTransport aim = new AIMTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), aim); } else if (entityName.startsWith("msn.")) { MSNTransport msn = new MSNTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), msn); } else if (entityName.startsWith("yahoo.")) { YahooTransport yahoo = new YahooTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), yahoo); } else if (entityName.startsWith("icq.")) { ICQTransport icq = new ICQTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), icq); } else if (entityName.startsWith("gtalk.")) { GTalkTransport gtalk = new GTalkTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), gtalk); } else if (entityName.startsWith("xmpp.")) { XMPPTransport xmppTransport = new XMPPTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), xmppTransport); } else if (entityName.startsWith("irc.")) { IRCTransport ircTransport = new IRCTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), ircTransport); } else if (entityName.startsWith("sip.") || entityName.startsWith("simple.")) { SimpleTransport simpleTransport = new SimpleTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), simpleTransport); } else if (entityName.startsWith("gadugadu.")) { GaduGaduTransport gadugaduTransport = new GaduGaduTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), gadugaduTransport); } else if (entityName.startsWith("qq.")) { QQTransport qqTransport = new QQTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), qqTransport); } else if (entityName.startsWith("sametime.")) { SametimeTransport sametimeTransport = new SametimeTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), sametimeTransport); } else if (entityName.startsWith("facebook.")) { FacebookTransport facebookTransport = new FacebookTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), facebookTransport); } else if (entityName.startsWith("myspace.") || entityName.startsWith("myspaceim.")) { MySpaceTransport myspaceTransport = new MySpaceTransport(item.getEntityID()); TransportUtils.addTransport(item.getEntityID(), myspaceTransport); } } } } private void addTransport(final Transport transport) { GatewayItem item = null; if (useTab) { item = new GatewayTabItem(transport); transferTab.add((GatewayTabItem)item); } else { item = new GatewayButton(transport); } uiMap.put(transport, item); // transferTab.add(button); // transferTab.add(new GatewayTabItem(transport)); } private void registerPresenceListener() { PacketFilter orFilter = new OrFilter(new PacketTypeFilter(Presence.class), new PacketTypeFilter(Message.class)); SparkManager.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; } GatewayItem button = uiMap.get(transport); button.signedIn(registered); SwingWorker worker = new SwingWorker() { @Override public Object construct() { transferTab.revalidate(); transferTab.repaint(); return 41; } }; worker.start(); } } 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(); // Show error MessageDialog.showAlert(body, title, "Information", SparkRes.getImageIcon(SparkRes.INFORMATION_IMAGE)); } } } } }, orFilter); ChatManager chatManager = SparkManager.getChatManager(); chatManager.addContactItemHandler(this); // Iterate through Contacts and check for final ContactList contactList = SparkManager.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(); } } } } SparkManager.getSessionManager().addPresenceListener(new PresenceListener() { public void presenceChanged(Presence presence) { for (Transport transport : TransportUtils.getTransports()) { GatewayItem button = uiMap.get(transport); if (button.isLoggedIn()) { if (!presence.isAvailable()) { return; } // Create new presence Presence p = new Presence(presence.getType(), presence.getStatus(), presence.getPriority(), presence.getMode()); p.setTo(transport.getServiceName()); SparkManager.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.setSpecialIcon(transport.getIcon()); } else { item.setSpecialIcon(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; } }