/*
* Copyright 2006-2010 Daniel Henninger. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package net.sf.kraken.protocols.xmpp;
import net.sf.kraken.BaseTransport;
import net.sf.kraken.protocols.xmpp.packet.AttentionExtension;
import net.sf.kraken.registration.Registration;
import net.sf.kraken.session.TransportSession;
import net.sf.kraken.type.PresenceType;
import net.sf.kraken.type.TransportLoginStatus;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.util.LocaleUtils;
import org.xmpp.packet.JID;
/**
* XMPP Transport Interface.
*
* This handles the bulk of the XMPP work via BaseTransport and provides
* some gateway specific interactions.
*
* @author Daniel Henninger
* @author Mehmet Ecevit
*/
public class XMPPTransport extends BaseTransport<XMPPBuddy> {
static {
final ProviderManager pm = ProviderManager.getInstance();
pm.addExtensionProvider(AttentionExtension.ELEMENT_NAME, AttentionExtension.NAMESPACE, new AttentionExtension.Provider());
}
/*
* @see net.sf.kraken.BaseTransport#getTerminologyUsername()
*/
@Override
public String getTerminologyUsername() {
return LocaleUtils.getLocalizedString("gateway."+getType().toString()+".username", "kraken");
}
/*
* @see net.sf.kraken.BaseTransport#getTerminologyPassword()
*/
@Override
public String getTerminologyPassword() {
return LocaleUtils.getLocalizedString("gateway.xmpp.password", "kraken");
}
/*
* @see net.sf.kraken.BaseTransport#getTerminologyNickname()
*/
@Override
public String getTerminologyNickname() {
return null;
}
/*
* @see net.sf.kraken.BaseTransport#getTerminologyRegistration()
*/
@Override
public String getTerminologyRegistration() {
return LocaleUtils.getLocalizedString("gateway."+getType().toString()+".registration", "kraken");
}
/*
* @see net.sf.kraken.BaseTransport#isPasswordRequired()
*/
@Override
public Boolean isPasswordRequired() { return true; }
/*
* @see net.sf.kraken.BaseTransport#isNicknameRequired()
*/
@Override
public Boolean isNicknameRequired() { return false; }
/*
* @see net.sf.kraken.BaseTransport#isUsernameValid(String)
*/
@Override
public Boolean isUsernameValid(String username) {
return true;
}
/**
* Handles creating an OSCAR session and triggering a login.
*
* @param registration Registration information to be used to log in.
* @param jid JID that is logged into the transport.
* @param presenceType Type of presence.
* @param verboseStatus Longer status description.
*/
@Override
public TransportSession<XMPPBuddy> registrationLoggedIn(Registration registration, JID jid, PresenceType presenceType, String verboseStatus, Integer priority) {
TransportSession<XMPPBuddy> session = new XMPPSession(registration, jid, this, priority);
session.setLoginStatus(TransportLoginStatus.LOGGING_IN);
session.logIn(presenceType, verboseStatus);
return session;
}
/**
* Handles logging out of a Yahoo session.
*
* @param session The session to be disconnected.
*/
@Override
public void registrationLoggedOut(TransportSession<XMPPBuddy> session) {
session.setLoginStatus(TransportLoginStatus.LOGGING_OUT);
session.logOut();
}
/**
* Converts an XMPP/Smack status to a Gateway status.
*
* @param type Smack presence type.
* @param mode Smack presence mode (show).
* @return Gateway status.
*/
public PresenceType convertXMPPStatusToGateway(org.jivesoftware.smack.packet.Presence.Type type, org.jivesoftware.smack.packet.Presence.Mode mode) {
if (mode == Presence.Mode.away) {
return PresenceType.away;
}
else if (mode == Presence.Mode.dnd) {
return PresenceType.dnd;
}
else if (mode == Presence.Mode.xa) {
return PresenceType.xa;
}
else if (mode == Presence.Mode.chat) {
return PresenceType.chat;
}
else if (type == Presence.Type.unavailable) {
return PresenceType.unavailable;
}
else if (type == Presence.Type.error) {
return PresenceType.unavailable;
}
else {
return PresenceType.available;
}
}
/**
* Converts a Gateway status to an XMPP/Smack status.
*
* Returns null if the status is "unavailable".
*
* @param type Gateway status.
* @return Smack presence mode.
*/
public Presence.Mode convertGatewayStatusToXMPP(PresenceType type) {
if (type == PresenceType.available) {
return Presence.Mode.available;
}
else if (type == PresenceType.away) {
return Presence.Mode.away;
}
else if (type == PresenceType.chat) {
return Presence.Mode.chat;
}
else if (type == PresenceType.dnd) {
return Presence.Mode.dnd;
}
else if (type == PresenceType.unavailable) {
return null;
}
else if (type == PresenceType.xa) {
return Presence.Mode.xa;
}
else if (type == PresenceType.unknown) {
return Presence.Mode.available;
}
else {
return Presence.Mode.available;
}
}
}