/* * 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.sametime; import java.util.ArrayList; 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.jivesoftware.util.JiveGlobals; import org.xmpp.packet.JID; import com.lotus.sametime.awareness.AwarenessService; import com.lotus.sametime.awareness.WatchList; import com.lotus.sametime.buddylist.BLService; import com.lotus.sametime.community.CommunityService; import com.lotus.sametime.core.comparch.DuplicateObjectException; import com.lotus.sametime.core.comparch.STSession; import com.lotus.sametime.core.constants.ImTypes; import com.lotus.sametime.im.Im; import com.lotus.sametime.im.InstantMessagingService; /** * Represents a SameTime session. * * This is the interface with which the base transport functionality will * communicate with SameTime. * * @author Daniel Henninger */ public class SameTimeSession extends TransportSession<SameTimeBuddy> { static Logger Log = Logger.getLogger(SameTimeSession.class); /** * Create a SameTime Session instance. * * @param registration Registration information 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 SameTimeSession(Registration registration, JID jid, SameTimeTransport transport, Integer priority) { super(registration, jid, transport, priority); } /* Session instance */ private STSession stSession; /* Community service instance */ private CommunityService communityService; /* Instant Messaging service instance */ private InstantMessagingService imService; /* Buddy List service instance */ private BLService blService; /* Awareness service instance */ private AwarenessService awarenessService; /* Awareness watch list instance */ private WatchList watchList; /* Listener */ private SameTimeListener listener; /** * @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()) { try { stSession = new STSession("Kraken - "+jid); stSession.loadSemanticComponents(); stSession.start(); listener = new SameTimeListener(this); communityService = (CommunityService) stSession.getCompApi(CommunityService.COMP_NAME); communityService.addLoginListener(listener); communityService.disableAutomaticReconnect(); imService = (InstantMessagingService) stSession.getCompApi(InstantMessagingService.COMP_NAME); imService.addImServiceListener(listener); imService.registerImType(ImTypes.IM_TYPE_CHAT); blService = (BLService) stSession.getCompApi(BLService.COMP_NAME); blService.addBLServiceListener(listener); awarenessService = (AwarenessService) stSession.getCompApi(AwarenessService.COMP_NAME); awarenessService.addAwarenessServiceListener(listener); watchList = awarenessService.createWatchList(); watchList.addStatusListener(listener); communityService.loginByPassword( JiveGlobals.getProperty("plugin.gateway.sametime.connecthost", "stdemo3.dfw.ibm.com"), getRegistration().getUsername(), getRegistration().getPassword() ); } catch (DuplicateObjectException e) { Log.error("SameTime: Tried to start up duplicate session for: "+jid); setFailureStatus(ConnectionFailureReason.UNKNOWN); sessionDisconnected("Duplicate session."); } } } /** * @see net.sf.kraken.session.TransportSession#logOut() */ @Override public void logOut() { communityService.logout(); cleanUp(); sessionDisconnectedNoReconnect(null); } /** * @see net.sf.kraken.session.TransportSession#cleanUp() */ @Override public void cleanUp() { // Shut down services if (watchList != null) { try { watchList.close(); } catch (Exception e) { // Ignore } } watchList = null; awarenessService = null; blService = null; imService = null; try { stSession.stop(); stSession.unloadSession(); } catch (Exception e) { // Ignore } if (listener != null) { try { } catch (Exception e) { // Ignore } listener = null; } stSession = 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) { } /** * @see net.sf.kraken.session.TransportSession#removeContact(net.sf.kraken.roster.TransportBuddy) */ @Override public void removeContact(SameTimeBuddy contact) { } /** * @see net.sf.kraken.session.TransportSession#updateContact(net.sf.kraken.roster.TransportBuddy) */ @Override public void updateContact(SameTimeBuddy contact) { } /** * @see net.sf.kraken.session.TransportSession#acceptAddContact(JID) */ @Override public void acceptAddContact(JID jid) { final String userID = getTransport().convertJIDToID(jid); Log.debug("SameTime: 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) { Im im = listener.getIMSession(jid); if (im != null) { im.sendText(false, message); } } /** * @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) { } }