/* * 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.util.*; import net.sf.kraken.pseudoroster.PseudoRoster; import net.sf.kraken.pseudoroster.PseudoRosterItem; import net.sf.kraken.pseudoroster.PseudoRosterManager; import net.sf.kraken.registration.Registration; import net.sf.kraken.session.TransportSession; import net.sf.kraken.type.ChatStateType; import net.sf.kraken.type.ConnectionFailureReason; import net.sf.kraken.type.PresenceType; import org.apache.log4j.Logger; import org.xmpp.packet.JID; import pl.mn.communicator.GGConfiguration; import pl.mn.communicator.GGException; import pl.mn.communicator.IServer; import pl.mn.communicator.ISession; import pl.mn.communicator.LocalStatus; import pl.mn.communicator.LocalUser; import pl.mn.communicator.LoginContext; import pl.mn.communicator.OutgoingMessage; import pl.mn.communicator.Session; import pl.mn.communicator.User; /** * Represents a Gadu-Gadu session. * * This is the interface with which the base transport functionality will * communicate with Gadu-Gadu. * * @author Daniel Henninger */ public class GaduGaduSession extends TransportSession<GaduGaduBuddy> { static Logger Log = Logger.getLogger(GaduGaduSession.class); /** * Create a Gadu-Gadu Session instance. * * @param registration Registration informationed used for logging in. * @param jid JID associated with this session. * @param transport Transport instance associated with this session. * @param priority Priority of this session. */ public GaduGaduSession(Registration registration, JID jid, GaduGaduTransport transport, Integer priority) { super(registration, jid, transport, priority); idNumber = Integer.parseInt(registration.getUsername()); pseudoRoster = PseudoRosterManager.getInstance().getPseudoRoster(registration); } /* Session instance */ ISession iSession; /* Login context */ LoginContext loginContext; /* Listener */ GaduGaduListener listener; /* ID number of account */ int idNumber; /* Locally stored roster -- GaduGadu's own roster doesn't work well */ private PseudoRoster pseudoRoster; public PseudoRoster getPseudoRoster() { return pseudoRoster; } /** * Loads the stored roster and adds them to have their presence monitored. */ void loadRoster() { for (String contact : pseudoRoster.getContacts()) { User user = new User(Integer.valueOf(contact)); // Load actual buddy roster getBuddyManager().storeBuddy(new GaduGaduBuddy(getBuddyManager(), pseudoRoster.getItem(contact))); // Set up each roster item to be monitored for presence try { iSession.getPresenceService().addMonitoredUser(user); } catch (GGException e) { Log.debug("GaduGadu: Error while setting up user to be monitored during add:", e); } } } /** * @see net.sf.kraken.session.TransportSession#logIn(net.sf.kraken.type.PresenceType, String) */ @Override public void logIn(PresenceType presenceType, String verboseStatus) { setPendingPresenceAndStatus(presenceType, verboseStatus); if (!isLoggedIn()) { loginContext = new LoginContext(idNumber, registration.getPassword()); listener = new GaduGaduListener(this); iSession = new Session(new GGConfiguration()); iSession.getConnectionService().addConnectionListener(listener); iSession.getLoginService().addLoginListener(listener); iSession.getMessageService().addMessageListener(listener); iSession.getContactListService().addContactListListener(listener); iSession.getPresenceService().addUserListener(listener); try { IServer iServer = iSession.getConnectionService().lookupServer(idNumber); iSession.getConnectionService().connect(iServer); } catch (GGException e) { Log.debug("GaduGadu: Unable to establish connection:", e); setFailureStatus(ConnectionFailureReason.CAN_NOT_CONNECT); sessionDisconnected("Unable to establish connection."); } } } /** * @see net.sf.kraken.session.TransportSession#logOut() */ @Override public void logOut() { try { iSession.getLoginService().logout(); } catch (Exception e) { // Ignore } cleanUp(); sessionDisconnectedNoReconnect(null); } /** * @see net.sf.kraken.session.TransportSession#cleanUp() */ @Override public void cleanUp() { try { iSession.getConnectionService().disconnect(); } catch (Exception e) { // Ignore } if (listener != null) { try { iSession.getConnectionService().removeConnectionListener(listener); } catch (Exception e) { // Ignore } try { iSession.getLoginService().removeLoginListener(listener); } catch (Exception e) { // Ignore } try { iSession.getMessageService().removeMessageListener(listener); } catch (Exception e) { // Ignore } try { iSession.getContactListService().removeContactListlistener(listener); } catch (Exception e) { // Ignore } try { iSession.getPresenceService().removeUserListener(listener); } catch (Exception e) { // Ignore } listener = null; } iSession = null; loginContext = null; } /** * @see net.sf.kraken.session.TransportSession#addContact(org.xmpp.packet.JID, String, java.util.ArrayList) */ @Override public void addContact(JID jid, String nickname, ArrayList<String> groups) { String contact = getTransport().convertJIDToID(jid); if (nickname == null || nickname.length() < 1) { nickname = jid.toBareJID(); } LocalUser newUser = new LocalUser(); newUser.setUin(Integer.parseInt(contact)); newUser.setDisplayName(nickname); if (groups.size() > 0) { newUser.setGroup(groups.get(0)); } PseudoRosterItem rosterItem; if (pseudoRoster.hasItem(contact)) { rosterItem = pseudoRoster.getItem(contact); rosterItem.setNickname(nickname); rosterItem.setGroups(groups); } else { rosterItem = pseudoRoster.createItem(contact, nickname, groups); } getBuddyManager().storeBuddy(new GaduGaduBuddy(getBuddyManager(), newUser, rosterItem)); try { iSession.getPresenceService().addMonitoredUser(new User(newUser.getUin())); } catch (GGException e) { Log.debug("GaduGadu: Error while setting up user to be monitored during add:", e); } } /** * @see net.sf.kraken.session.TransportSession#removeContact(net.sf.kraken.roster.TransportBuddy) */ @Override public void removeContact(GaduGaduBuddy contact) { String ggContact = getTransport().convertJIDToID(contact.getJID()); pseudoRoster.removeItem(ggContact); for (GaduGaduBuddy buddy : getBuddyManager().getBuddies()) { if (buddy.getJID().equals(contact.getJID())) { LocalUser byeUser = buddy.toLocalUser(); try { iSession.getPresenceService().removeMonitoredUser(new User(byeUser.getUin())); } catch (GGException e) { Log.debug("GaduGadu: Error while removing user from being monitored during delete:", e); } break; } } } /** * @see net.sf.kraken.session.TransportSession#updateContact(net.sf.kraken.roster.TransportBuddy) */ @Override public void updateContact(GaduGaduBuddy contact) { String ggContact = getTransport().convertJIDToID(contact.getJID()); if (pseudoRoster.hasItem(ggContact)) { PseudoRosterItem rosterItem = pseudoRoster.getItem(ggContact); rosterItem.setNickname(contact.getNickname()); rosterItem.setGroups((List<String>)contact.getGroups()); } else { PseudoRosterItem rosterItem = pseudoRoster.createItem(ggContact, contact.getNickname(), (List<String>)contact.getGroups()); getBuddyManager().storeBuddy(new GaduGaduBuddy(getBuddyManager(), rosterItem)); } } /** * @see net.sf.kraken.session.TransportSession#acceptAddContact(JID) */ @Override public void acceptAddContact(JID jid) { final String userID = getTransport().convertJIDToID(jid); Log.debug("GaduGadu: accept-adding is currently not implemented." + " Cannot accept-add: " + userID); // TODO: Currently unimplemented } /** * @see net.sf.kraken.session.TransportSession#sendMessage(org.xmpp.packet.JID, String) */ @Override public void sendMessage(JID jid, String message) { try { iSession.getMessageService().sendMessage(OutgoingMessage.createNewMessage(Integer.parseInt(getTransport().convertJIDToID(jid)), message)); } catch (GGException e) { Log.debug("GaduGadu: Exception while sending message:", e); } } /** * @see net.sf.kraken.session.TransportSession#sendChatState(org.xmpp.packet.JID,net.sf.kraken.type.ChatStateType) */ @Override public void sendChatState(JID jid, ChatStateType chatState) { } /** * @see net.sf.kraken.session.TransportSession#sendBuzzNotification(org.xmpp.packet.JID, String) */ @Override public void sendBuzzNotification(JID jid, String message) { } /** * @see net.sf.kraken.session.TransportSession#updateLegacyAvatar(String, byte[]) */ @Override public void updateLegacyAvatar(String type, byte[] data) { } /** * @see net.sf.kraken.session.TransportSession#updateStatus(net.sf.kraken.type.PresenceType, String) */ @Override public void updateStatus(PresenceType presenceType, String verboseStatus) { try { iSession.getPresenceService().setStatus(new LocalStatus(((GaduGaduTransport)getTransport()).convertXMPPStatusToGaduGadu(presenceType, (verboseStatus != null && !verboseStatus.equals(""))), verboseStatus, new Date())); } catch (GGException e) { Log.debug("GaduGadu: Exception while setting status:", e); } } }