/*
* 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.gadugadu;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import net.sf.kraken.pseudoroster.PseudoRosterItem;
import net.sf.kraken.type.ConnectionFailureReason;
import net.sf.kraken.type.TransportLoginStatus;
import org.apache.log4j.Logger;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.util.NotFoundException;
import pl.mn.communicator.GGException;
import pl.mn.communicator.IIncommingMessage;
import pl.mn.communicator.ILocalStatus;
import pl.mn.communicator.IOutgoingMessage;
import pl.mn.communicator.IRemoteStatus;
import pl.mn.communicator.IUser;
import pl.mn.communicator.LocalUser;
import pl.mn.communicator.MessageStatus;
import pl.mn.communicator.User;
import pl.mn.communicator.event.ConnectionListener;
import pl.mn.communicator.event.ContactListListener;
import pl.mn.communicator.event.LoginFailedEvent;
import pl.mn.communicator.event.LoginListener;
import pl.mn.communicator.event.MessageListener;
import pl.mn.communicator.event.UserListener;
/**
* @author Daniel Henninger
*/
public class GaduGaduListener implements ConnectionListener, LoginListener, MessageListener, ContactListListener, UserListener {
static Logger Log = Logger.getLogger(GaduGaduListener.class);
GaduGaduListener(GaduGaduSession session) {
this.gadugaduSessionRef = new WeakReference<GaduGaduSession>(session);
}
WeakReference<GaduGaduSession> gadugaduSessionRef;
public GaduGaduSession getSession() {
return gadugaduSessionRef.get();
}
public void connectionEstablished() {
Log.debug("GaduGadu: Connection established");
try {
getSession().iSession.getLoginService().login(getSession().loginContext);
}
catch (GGException e) {
getSession().setLoginStatus(TransportLoginStatus.DISCONNECTED);
getSession().setFailureStatus(ConnectionFailureReason.CAN_NOT_CONNECT);
getSession().sessionDisconnected(LocaleUtils.getLocalizedString("gateway.gadugadu.unabletoconnect", "kraken"));
}
}
public void connectionClosed() {
Log.debug("GaduGadu: Connection closed");
getSession().setLoginStatus(TransportLoginStatus.DISCONNECTED);
}
public void connectionError(Exception exception) {
Log.debug("GaduGadu: Connection error:", exception);
getSession().setLoginStatus(TransportLoginStatus.DISCONNECTED);
getSession().setFailureStatus(ConnectionFailureReason.CAN_NOT_CONNECT);
getSession().sessionDisconnected(LocaleUtils.getLocalizedString("gateway.gadugadu.connectionlost", "kraken"));
}
public void loginOK() {
Log.debug("GaduGadu: Login successful");
getSession().setLoginStatus(TransportLoginStatus.LOGGED_IN);
getSession().loadRoster();
try {
getSession().getTransport().syncLegacyRoster(getSession().getJID(), getSession().getBuddyManager().getBuddies());
}
catch (UserNotFoundException e) {
Log.debug("GaduGadu: User not found while syncing legacy roster:", e);
}
getSession().getBuddyManager().activate();
// If we do not have any pseudo roster items, lets see what we can get from the server.
if (getSession().getPseudoRoster().getContacts().isEmpty()) {
try {
getSession().iSession.getContactListService().importContactList();
}
catch (GGException e) {
Log.debug("GaduGadu: Unable to retrieve contact list.");
}
}
}
public void loginFailed(LoginFailedEvent event) {
Log.debug("GaduGadu: Login failed: "+event);
if (event.getReason() == LoginFailedEvent.INCORRECT_PASSWORD) {
getSession().setLoginStatus(TransportLoginStatus.DISCONNECTED);
getSession().setFailureStatus(ConnectionFailureReason.USERNAME_OR_PASSWORD_INCORRECT);
getSession().sessionDisconnectedNoReconnect(LocaleUtils.getLocalizedString("gateway.gadugadu.passwordincorrect", "kraken"));
}
else {
getSession().setLoginStatus(TransportLoginStatus.DISCONNECTED);
getSession().setFailureStatus(ConnectionFailureReason.UNKNOWN);
getSession().sessionDisconnectedNoReconnect(LocaleUtils.getLocalizedString("gateway.gadugadu.loginfailed", "kraken"));
}
}
public void loggedOut() {
Log.debug("GaduGadu: Logged out");
// We take care of this elsewhere.
}
public void messageSent(IOutgoingMessage message) {
Log.debug("GaduGadu: Message sent: "+message);
// Don't care for now
}
public void messageArrived(IIncommingMessage message) {
Log.debug("GaduGadu: Message arrived: "+message);
getSession().getTransport().sendMessage(
getSession().getJID(),
getSession().getTransport().convertIDToJID(Integer.toString(message.getRecipientUin())),
message.getMessageBody()
);
}
public void messageDelivered(int uin, int messageID, MessageStatus deliveryStatus) {
Log.debug("GaduGadu: Message delivered");
// Don't care for now
}
public void contactListExported() {
Log.debug("GaduGadu: Contact list exported");
// Not really sure what this is
}
@SuppressWarnings("unchecked")
public void contactListReceived(Collection collection) {
Log.debug("GaduGadu: Contact list received: "+collection);
for (Object localUserObj : collection) {
LocalUser localUser = (LocalUser)localUserObj;
if (localUser.getUin() > 0) {
String ggContact = Integer.toString(localUser.getUin());
String nickname = localUser.getDisplayName();
List<String> groups = new ArrayList<String>();
groups.add(localUser.getGroup());
if (getSession().getPseudoRoster().hasItem(ggContact)) {
PseudoRosterItem rosterItem = getSession().getPseudoRoster().getItem(ggContact);
rosterItem.setNickname(nickname);
rosterItem.setGroups(groups);
}
else {
PseudoRosterItem rosterItem = getSession().getPseudoRoster().createItem(ggContact, nickname, groups);
getSession().getBuddyManager().storeBuddy(new GaduGaduBuddy(getSession().getBuddyManager(), localUser, rosterItem));
}
try {
getSession().iSession.getPresenceService().addMonitoredUser(new User(localUser.getUin()));
}
catch (GGException e) {
Log.debug("GaduGadu: Error while setting up user to be monitored:", e);
}
}
else {
Log.debug("GaduGadu: Ignoring user with UIN less than -1: "+localUser);
}
}
}
public void localStatusChanged(ILocalStatus iLocalStatus) {
Log.debug("GaduGadu: Local status changed: "+iLocalStatus);
getSession().setPresenceAndStatus(((GaduGaduTransport)getSession().getTransport()).convertGaduGaduStatusToXMPP(iLocalStatus.getStatusType()), "");
}
public void userStatusChanged(IUser iUser, IRemoteStatus iRemoteStatus) {
Log.debug("GaduGadu: User status changed for "+iUser+" to "+iRemoteStatus);
if (getSession().getBuddyManager().isActivated()) {
try {
GaduGaduBuddy buddy = getSession().getBuddyManager().getBuddy(getSession().getTransport().convertIDToJID(Integer.toString(iUser.getUin())));
buddy.setPresenceAndStatus(((GaduGaduTransport)getSession().getTransport()).convertGaduGaduStatusToXMPP(iRemoteStatus.getStatusType()), iRemoteStatus.getDescription());
}
catch (NotFoundException e) {
// Not in our contact list. Ignore.
Log.debug("GaduGadu: Received presense notification for contact we don't care about: "+iUser.getUin());
}
}
else {
getSession().getBuddyManager().storePendingStatus(getSession().getTransport().convertIDToJID(Integer.toString(iUser.getUin())), ((GaduGaduTransport)getSession().getTransport()).convertGaduGaduStatusToXMPP(iRemoteStatus.getStatusType()), iRemoteStatus.getDescription());
}
}
}