/* * Jicofo, the Jitsi Conference Focus. * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jitsi.jicofo; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; import org.jitsi.jicofo.util.*; import org.osgi.framework.*; /** * Class takes care of creating and removing temporary XMPP account while * exposing protocol provider service to end user. * * @author Pawel Domas */ public class ProtocolProviderHandler implements RegistrationStateChangeListener { /** * XMPP provider factory used to create and destroy XMPP account used by * the focus. */ private ProtocolProviderFactory xmppProviderFactory; /** * XMPP account used by the focus. */ private AccountID xmppAccount; /** * XMPP protocol provider service used by the focus. */ private ProtocolProviderService protocolService; /** * Registration listener notified about encapsulated protocol service * instance registration state changes. */ private RegistrationStateChangeListener regListener; /** * Start this instance by created XMPP account using igven parameters. * @param serverAddress XMPP server address. * @param xmppDomain XMPP authentication domain. * @param xmppLoginPassword XMPP login(optional). * @param nickName authentication login. * @param listener the listener that will be notified about created protocol * provider's registration state changes. */ public void start(String serverAddress, String xmppDomain, String xmppLoginPassword, String nickName, RegistrationStateChangeListener listener) { this.regListener = listener; xmppProviderFactory = ProtocolProviderFactory.getProtocolProviderFactory( FocusBundleActivator.bundleContext, ProtocolNames.JABBER); if (xmppLoginPassword != null) { xmppAccount = xmppProviderFactory.createAccount( FocusAccountFactory.createFocusAccountProperties( serverAddress, xmppDomain, nickName, xmppLoginPassword)); } else { xmppAccount = xmppProviderFactory.createAccount( FocusAccountFactory.createFocusAccountProperties( serverAddress, xmppDomain, nickName)); } if (!xmppProviderFactory.loadAccount(xmppAccount)) { throw new RuntimeException( "Failed to load account: " + xmppAccount); } ServiceReference protoRef = xmppProviderFactory.getProviderForAccount(xmppAccount); protocolService = (ProtocolProviderService) FocusBundleActivator.bundleContext.getService(protoRef); protocolService.addRegistrationStateChangeListener(this); } /** * Stops this instance and removes temporary XMPP account. */ public void stop() { protocolService.removeRegistrationStateChangeListener(this); xmppProviderFactory.uninstallAccount(xmppAccount); } /** * Passes registration state changes of encapsulated protocol provider to * registered {@lnik #regListener}. * * {@inheritDoc} */ @Override public void registrationStateChanged(RegistrationStateChangeEvent evt) { if (regListener != null) { regListener.registrationStateChanged(evt); } } /** * Utility method for obtaining operation sets from underlying protocol * provider service. */ public <T extends OperationSet> T getOperationSet(Class<T> opSetClass) { return protocolService.getOperationSet(opSetClass); } /** * Returns <tt>true</tt> if underlying protocol provider service has * registered. */ public boolean isRegistered() { return protocolService.isRegistered(); } /** * Starts registration process of underlying protocol provider service. */ public void register() { // FIXME: not pooled thread created new RegisterThread(protocolService).start(); } /** * Returns underlying protocol provider service instance if this * <tt>ProtocolProviderHandler</tt> has been started or <tt>null</tt> * otherwise. */ public ProtocolProviderService getProtocolProvider() { return protocolService; } /** * {@inheritDoc} */ @Override public String toString() { return protocolService != null ? protocolService.toString() : super.toString(); } }