/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Distributable under LGPL license. * See terms of license at gnu.org. */ package net.java.sip.communicator.plugin.jabberaccregwizz; import java.awt.*; import java.util.*; import javax.swing.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.jabber.*; import net.java.sip.communicator.util.Logger; import org.jitsi.util.*; import org.osgi.framework.*; /** * The JabberAccountRegistrationWizard is an implementation of the * AccountRegistrationWizard for the Jabber protocol. It should allow * the user to create and configure a new Jabber account. * * @author Yana Stamcheva */ public class JabberAccountRegistrationWizard extends DesktopAccountRegistrationWizard { /** * The logger. */ private static final Logger logger = Logger.getLogger(JabberAccountRegistrationWizard.class); /** * The first wizard page. */ private FirstWizardPage firstWizardPage; /** * The registration object, where all properties related to the account * are stored. */ private JabberAccountRegistration registration; /** * The ProtocolProviderService of this account. */ private ProtocolProviderService protocolProvider; /** * The create account form. */ private JabberAccountCreationForm createAccountService; /** * Creates an instance of JabberAccountRegistrationWizard. * @param wizardContainer the wizard container, where this wizard * is added */ public JabberAccountRegistrationWizard(WizardContainer wizardContainer) { setWizardContainer(wizardContainer); wizardContainer .setFinishButtonText(Resources.getString("service.gui.SIGN_IN")); } /** * Implements the AccountRegistrationWizard.getIcon method. * Returns the icon to be used for this wizard. * @return byte[] */ @Override public byte[] getIcon() { return Resources.getImage(Resources.PROTOCOL_ICON); } /** * Implements the AccountRegistrationWizard.getPageImage method. * Returns the image used to decorate the wizard page * * @return byte[] the image used to decorate the wizard page */ @Override public byte[] getPageImage() { return Resources.getImage(Resources.PAGE_IMAGE); } /** * Implements the AccountRegistrationWizard.getProtocolName * method. Returns the protocol name for this wizard. * @return String */ @Override public String getProtocolName() { return Resources.getString("plugin.jabberaccregwizz.PROTOCOL_NAME"); } /** * Implements the AccountRegistrationWizard.getProtocolDescription * method. Returns the description of the protocol for this wizard. * @return String */ @Override public String getProtocolDescription() { return Resources .getString("plugin.jabberaccregwizz.PROTOCOL_DESCRIPTION"); } /** * Returns the set of pages contained in this wizard. * @return Iterator */ @Override public Iterator getPages() { return getPages(new JabberAccountRegistration()); } /** * Returns the set of pages contained in this wizard. * * @param registration the registration object * @return Iterator */ public Iterator getPages(JabberAccountRegistration registration) { java.util.List pages = new ArrayList(); // create new registration, our container needs the pages // this means this is a new wizard and we must reset all data // it will be invoked and when the wizard cleans and unregister // our pages, but this fix don't hurt in this situation. this.registration = registration; if (firstWizardPage == null) firstWizardPage = new FirstWizardPage(this); pages.add(firstWizardPage); return pages.iterator(); } /** * Returns the set of data that user has entered through this wizard. * @return Iterator */ @Override public Iterator> getSummary() { Hashtable summaryTable = new Hashtable(); summaryTable.put( Resources.getString("plugin.jabberaccregwizz.USERNAME"), registration.getUserID()); summaryTable.put( Resources.getString("service.gui.REMEMBER_PASSWORD"), Boolean.toString(registration.isRememberPassword())); summaryTable.put( Resources.getString("plugin.jabberaccregwizz.SERVER"), registration.getServerAddress()); summaryTable.put( Resources.getString("service.gui.PORT"), String.valueOf(registration.getServerPort())); summaryTable.put( Resources.getString("plugin.jabberaccregwizz.ENABLE_KEEP_ALIVE"), String.valueOf(registration.isSendKeepAlive())); summaryTable.put( Resources.getString( "plugin.jabberaccregwizz.ENABLE_GMAIL_NOTIFICATIONS"), String.valueOf(registration.isGmailNotificationEnabled())); summaryTable.put( Resources.getString("plugin.jabberaccregwizz.RESOURCE"), registration.getResource()); summaryTable.put( Resources.getString("plugin.jabberaccregwizz.PRIORITY"), String.valueOf(registration.getPriority())); summaryTable.put( Resources.getString("plugin.sipaccregwizz.DTMF_METHOD"), registration.getDTMFMethod()); summaryTable.put( Resources.getString( "plugin.sipaccregwizz.DTMF_MINIMAL_TONE_DURATION"), registration.getDtmfMinimalToneDuration()); return summaryTable.entrySet().iterator(); } /** * Installs the account defined in this wizard. * @return the created ProtocolProviderService corresponding to the * new account * @throws OperationFailedException if the operation didn't succeed */ @Override public ProtocolProviderService signin() throws OperationFailedException { firstWizardPage.commitPage(); return firstWizardPage.isCommitted() ? signin(registration.getUserID(), registration.getPassword()) : null; } /** * Installs the account defined in this wizard. * * @param userName the user name to sign in with * @param password the password to sign in with * @return the created ProtocolProviderService corresponding to the * new account * @throws OperationFailedException if the operation didn't succeed */ public ProtocolProviderService signin( final String userName, final String password) throws OperationFailedException { /* * If firstWizardPage is null we are requested sign-in from initial * account registration form we must init firstWizardPage in order to * init default values * Pawel: firstWizardPage is never null, and commitPage fails with no * user ID provided for simple account wizard. Now userName and password * are reentered here. */ final AccountPanel accPanel = (AccountPanel) firstWizardPage.getSimpleForm(); /* * XXX Swing is not thread safe! We've experienced deadlocks on OS X * upon invoking accPanel's setters. In order to address them, (1) * invoke accPanel's setters on the AWT event dispatching thread and (2) * do it only if absolutely necessary. */ String accPanelUsername = accPanel.getUsername(); boolean equals = false; final boolean rememberPassword = (password != null); if (StringUtils.isEquals(accPanelUsername, userName)) { char[] accPanelPasswordChars = accPanel.getPassword(); char[] passwordChars = (password == null) ? null : password.toCharArray(); if (accPanelPasswordChars == null) equals = ((passwordChars == null) || passwordChars.length == 0); else if (passwordChars == null) equals = (accPanelPasswordChars.length == 0); else equals = Arrays.equals(accPanelPasswordChars, passwordChars); if (equals) { boolean accPanelRememberPassword = accPanel.isRememberPassword(); equals = (accPanelRememberPassword == rememberPassword); } } if (!equals) { try { if(SwingUtilities.isEventDispatchThread()) { accPanel.setUsername(userName); accPanel.setPassword(password); accPanel.setRememberPassword(rememberPassword); } else { SwingUtilities.invokeAndWait( new Runnable() { public void run() { accPanel.setUsername(userName); accPanel.setPassword(password); accPanel.setRememberPassword( rememberPassword); } }); } } catch (Exception e) { if (e instanceof OperationFailedException) { throw (OperationFailedException) e; } else { throw new OperationFailedException( "Failed to set username and password on " + accPanel.getClass().getName(), OperationFailedException.INTERNAL_ERROR, e); } } } if(!firstWizardPage.isCommitted()) firstWizardPage.commitPage(); if(!firstWizardPage.isCommitted()) { throw new OperationFailedException( "Could not confirm data.", OperationFailedException.GENERAL_ERROR); } ProtocolProviderFactory factory = JabberAccRegWizzActivator.getJabberProtocolProviderFactory(); return installAccount( factory, registration.getUserID(), // The user id may get changed. // Server part can be added in the // data commit. password); } /** * Creates an account for the given user and password. * * @param providerFactory the ProtocolProviderFactory which will create * the account * @param userName the user identifier * @param passwd the password * @return the ProtocolProviderService for the new account. * @throws OperationFailedException if the operation didn't succeed */ protected ProtocolProviderService installAccount( ProtocolProviderFactory providerFactory, String userName, String passwd) throws OperationFailedException { if(logger.isTraceEnabled()) { logger.trace("Preparing to install account for user " + userName); } Hashtable accountProperties = new Hashtable(); String protocolIconPath = getProtocolIconPath(); String accountIconPath = getAccountIconPath(); registration.storeProperties( userName, passwd, protocolIconPath, accountIconPath, accountProperties); accountProperties.put(ProtocolProviderFactory.IS_PREFERRED_PROTOCOL, Boolean.toString(isPreferredProtocol())); accountProperties.put(ProtocolProviderFactory.PROTOCOL, getProtocol()); if (isModification()) { providerFactory.modifyAccount( protocolProvider, accountProperties); setModification(false); return protocolProvider; } try { if(logger.isTraceEnabled()) { logger.trace("Will install account for user " + userName + " with the following properties." + accountProperties); } AccountID accountID = providerFactory.installAccount( userName, accountProperties); ServiceReference serRef = providerFactory .getProviderForAccount(accountID); protocolProvider = (ProtocolProviderService) JabberAccRegWizzActivator.bundleContext .getService(serRef); } catch (IllegalArgumentException exc) { logger.warn(exc.getMessage()); throw new OperationFailedException( "Username, password or server is null.", OperationFailedException.ILLEGAL_ARGUMENT); } catch (IllegalStateException exc) { logger.warn(exc.getMessage()); throw new OperationFailedException( "Account already exists.", OperationFailedException.IDENTIFICATION_CONFLICT); } catch (Throwable exc) { logger.warn(exc.getMessage()); throw new OperationFailedException( "Failed to add account.", OperationFailedException.GENERAL_ERROR); } return protocolProvider; } /** * Fills the User ID and Password fields in this panel with the data coming * from the given protocolProvider. * @param protocolProvider The ProtocolProviderService to load the * data from. */ @Override public void loadAccount(ProtocolProviderService protocolProvider) { setModification(true); this.protocolProvider = protocolProvider; this.registration = new JabberAccountRegistration(); this.firstWizardPage.loadAccount(protocolProvider); } /** * Returns the registration object, which will store all the data through * the wizard. * * @return the registration object, which will store all the data through * the wizard */ public JabberAccountRegistration getRegistration() { if (registration == null) registration = new JabberAccountRegistration(); return registration; } /** * Returns the size of this wizard. * @return the size of this wizard */ @Override public Dimension getSize() { return new Dimension(300, 480); } /** * Returns the identifier of the page to show first in the wizard. * @return the identifier of the page to show first in the wizard. */ @Override public Object getFirstPageIdentifier() { return firstWizardPage.getIdentifier(); } /** * Returns the identifier of the page to show last in the wizard. * @return the identifier of the page to show last in the wizard. */ @Override public Object getLastPageIdentifier() { return firstWizardPage.getIdentifier(); } /** * Returns an example string, which should indicate to the user how the * user name should look like. * @return an example string, which should indicate to the user how the * user name should look like. */ @Override public String getUserNameExample() { return "Ex: johnsmith@jabber.org"; } /** * Opens the Gmail signup URI in the OS's default browser. */ @Override public void webSignup() { } /** * Returns true if the web sign up is supported by the current * implementation, false - otherwise. * @return true if the web sign up is supported by the current * implementation, false - otherwise */ @Override public boolean isWebSignupSupported() { return false; } /** * Returns a simple account registration form that would be the first form * shown to the user. Only if the user needs more settings she'll choose * to open the advanced wizard, consisted by all pages. * * @param isCreateAccount indicates if the simple form should be opened as * a create account form or as a login form * @return a simple account registration form */ @Override public Object getSimpleForm(boolean isCreateAccount) { // when creating first wizard page, create and new // AccountRegistration to avoid reusing old instances and // data left from old registrations return getSimpleForm(new JabberAccountRegistration(), isCreateAccount); } /** * Returns the first wizard page. * * @param registration the registration object * @param isCreateAccount indicates if the simple form should be opened as * a create account form or as a login form * @return the first wizard page. */ public Object getSimpleForm(JabberAccountRegistration registration, boolean isCreateAccount) { this.registration = registration; firstWizardPage = new FirstWizardPage(this); return firstWizardPage.getSimpleForm(); } /** * Returns the protocol name as listed in "ProtocolNames" or just the name * of the service. * @return the protocol name */ public String getProtocol() { return ProtocolNames.JABBER; } /** * Returns the protocol icon path. * @return the protocol icon path */ public String getProtocolIconPath() { return null; } /** * Returns the account icon path. * @return the account icon path */ public String getAccountIconPath() { return null; } /** * Returns an instance of CreateAccountService through which the * user could create an account. This method is meant to be implemented by * specific protocol provider wizards. * @return an instance of CreateAccountService */ protected JabberAccountCreationFormService getCreateAccountService() { if (createAccountService == null) createAccountService = new JabberAccountCreationForm(); return createAccountService; } /** * Returns the display label used for the jabber id field. * @return the jabber id display label string. */ protected String getUsernameLabel() { return Resources.getString("plugin.jabberaccregwizz.USERNAME"); } /** * Return the string for add existing account button. * @return the string for add existing account button. */ protected String getCreateAccountButtonLabel() { return Resources.getString( "plugin.jabberaccregwizz.NEW_ACCOUNT_TITLE"); } /** * Return the string for create new account button. * @return the string for create new account button. */ protected String getCreateAccountLabel() { return Resources.getString( "plugin.jabberaccregwizz.REGISTER_NEW_ACCOUNT_TEXT"); } /** * Return the string for add existing account button. * @return the string for add existing account button. */ protected String getExistingAccountLabel() { return Resources.getString("plugin.jabberaccregwizz.EXISTING_ACCOUNT"); } /** * Return the string for home page link label. * @return the string for home page link label */ protected String getHomeLinkLabel() { return null; } /** * Return the wizard's protocolProvider, if the wizard modifies an * account, null if it creates a new one * @return the wizard's protocolProvider */ public ProtocolProviderService getProtocolProvider() { if(isModification()) return protocolProvider; return null; } }