package org.chartsy.chatsy.chatimpl.plugin.gateways.transports;
import org.jivesoftware.smack.PacketCollector;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketIDFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.packet.Registration;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.PrivateDataManager;
import org.jivesoftware.smackx.ServiceDiscoveryManager;
import org.jivesoftware.smackx.packet.DiscoverInfo;
import org.chartsy.chatsy.chat.ChatsyManager;
import org.chartsy.chatsy.chat.util.TaskEngine;
import org.chartsy.chatsy.chat.util.log.Log;
import org.chartsy.chatsy.chatimpl.plugin.gateways.GatewayPrivateData;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class TransportUtils
{
private static Map<String, Transport> transports = new HashMap<String, Transport>();
private static GatewayPrivateData gatewayPreferences;
private TransportUtils()
{
}
static
{
PrivateDataManager.addPrivateDataProvider(
GatewayPrivateData.ELEMENT,
GatewayPrivateData.NAMESPACE,
new GatewayPrivateData.ConferencePrivateDataProvider());
final Runnable loadGateways = new Runnable()
{
public void run()
{
try
{
PrivateDataManager pdm = ChatsyManager.getSessionManager().getPersonalDataManager();
gatewayPreferences = (GatewayPrivateData)pdm.getPrivateData(GatewayPrivateData.ELEMENT, GatewayPrivateData.NAMESPACE);
}
catch (XMPPException e)
{
Log.error("Unable to load private data for Gateways", e);
}
}
};
TaskEngine.getInstance().submit(loadGateways);
}
public static boolean autoJoinService(String serviceName)
{
return gatewayPreferences.autoLogin(serviceName);
}
public static void setAutoJoin(String serviceName, boolean autoJoin)
{
gatewayPreferences.addService(serviceName, autoJoin);
PrivateDataManager pdm = ChatsyManager.getSessionManager().getPersonalDataManager();
try
{
pdm.setPrivateData(gatewayPreferences);
}
catch (XMPPException e)
{
Log.error(e);
}
}
public static Transport getTransport(String serviceName)
{
if (transports.containsKey(serviceName))
return transports.get(serviceName);
return null;
}
public static boolean isFromGateway(String jid)
{
jid = StringUtils.parseBareAddress(jid);
String serviceName = StringUtils.parseServer(jid);
return transports.containsKey(serviceName);
}
public static void addTransport(String serviceName, Transport transport)
{
transports.put(serviceName, transport);
}
public static Collection<Transport> getTransports()
{
return transports.values();
}
public static boolean isRegistered(XMPPConnection con, Transport transport)
{
if (!con.isConnected())
return false;
ServiceDiscoveryManager discoveryManager = ServiceDiscoveryManager.getInstanceFor(con);
try
{
DiscoverInfo info = discoveryManager.discoverInfo(transport.getServiceName());
return info.containsFeature("jabber:iq:registered");
}
catch (XMPPException e)
{
Log.error(e);
}
return false;
}
public static void registerUser(XMPPConnection con, String gatewayDomain,
String username, String password, String nickname) throws XMPPException
{
Registration registration = new Registration();
registration.setType(IQ.Type.SET);
registration.setTo(gatewayDomain);
registration.addExtension(new GatewayRegisterExtension());
Map<String, String> attributes = new HashMap<String, String>();
if (username != null)
attributes.put("username", username);
if (password != null)
attributes.put("password", password);
if (nickname != null)
attributes.put("nick", nickname);
registration.setAttributes(attributes);
PacketCollector collector = con.createPacketCollector(new PacketIDFilter(registration.getPacketID()));
con.sendPacket(registration);
IQ response = (IQ)collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
collector.cancel();
if (response == null)
{
throw new XMPPException("Server timed out");
}
if (response.getType() == IQ.Type.ERROR)
{
throw new XMPPException("Error registering user", response.getError());
}
}
public static void unregister(XMPPConnection con, String gatewayDomain)
throws XMPPException
{
Registration registration = new Registration();
registration.setType(IQ.Type.SET);
registration.setTo(gatewayDomain);
Map<String,String> map = new HashMap<String,String>();
map.put("remove", "");
registration.setAttributes(map);
PacketCollector collector = con.createPacketCollector(new PacketIDFilter(registration.getPacketID()));
con.sendPacket(registration);
IQ response = (IQ)collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
collector.cancel();
if (response == null)
{
throw new XMPPException("Server timed out");
}
if (response.getType() == IQ.Type.ERROR)
{
throw new XMPPException("Error registering user", response.getError());
}
}
static class GatewayRegisterExtension implements PacketExtension
{
public String getElementName()
{
return "x";
}
public String getNamespace()
{
return "jabber:iq:gateway:register";
}
public String toXML()
{
StringBuilder builder = new StringBuilder();
builder.append("<").append(getElementName()).append(" xmlns=\"")
.append(getNamespace()).append("\"/>");
return builder.toString();
}
}
}