/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.plugin.sipaccregwizz;
import java.awt.*;
import java.util.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.sip.*;
import net.java.sip.communicator.util.Logger;
import org.jitsi.util.*;
import org.osgi.framework.*;
/**
* The <tt>IPPIAccountRegistrationWizard</tt> is an implementation of the
* <tt>AccountRegistrationWizard</tt> for the SIP protocol. It should allow
* the user to create and configure a new SIP account.
*
* @author Yana Stamcheva
* @author Grigorii Balutsel
*/
public class SIPAccountRegistrationWizard
extends ExtendedDesktopAccountRegWizard
{
/**
* The first wizard page.
*/
private FirstWizardPage firstWizardPage;
/**
* Account registration instance holding the data.
*/
private SIPAccountRegistration registration
= new SIPAccountRegistration();
/**
* The protocol provider.
*/
private ProtocolProviderService protocolProvider;
/**
* The logger.
*/
private static final Logger logger
= Logger.getLogger(SIPAccountRegistrationWizard.class);
/**
* Creates an instance of <tt>IPPIAccountRegistrationWizard</tt>.
* @param wizardContainer the wizard container, where this wizard
* is added
*/
public SIPAccountRegistrationWizard(WizardContainer wizardContainer)
{
setWizardContainer(wizardContainer);
wizardContainer.setFinishButtonText(
Resources.getString("service.gui.SIGN_IN"));
}
/**
* Implements the <code>AccountRegistrationWizard.getIcon</code> method.
* Returns the icon to be used for this wizard.
* @return byte[]
*/
@Override
public byte[] getIcon()
{
return Resources.getImage(Resources.SIP_LOGO);
}
/**
* Implements the <code>AccountRegistrationWizard.getPageImage</code> 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 <code>AccountRegistrationWizard.getProtocolName</code>
* method. Returns the protocol name for this wizard.
* @return String
*/
@Override
public String getProtocolName()
{
return Resources.getString("plugin.sipaccregwizz.PROTOCOL_NAME");
}
/**
* Implements the <code>AccountRegistrationWizard.getProtocolDescription
* </code> method. Returns the description of the protocol for this wizard.
* @return String
*/
@Override
public String getProtocolDescription()
{
return Resources.getString("plugin.sipaccregwizz.PROTOCOL_DESCRIPTION");
}
/**
* Returns the set of pages contained in this wizard.
* @return Iterator
*/
@Override
public Iterator<WizardPage> getPages()
{
// create new accountID, 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.
return getPages(new SIPAccountRegistration());
}
/**
* Returns the set of pages contained in this wizard.
*
* @param registration the registration object
* @return Iterator
*/
public Iterator<WizardPage> getPages(SIPAccountRegistration registration)
{
java.util.List<WizardPage> pages = new ArrayList<WizardPage>();
setRegistration(registration);
// If the first wizard page was already created
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<Map.Entry<String, String>> getSummary()
{
LinkedHashMap<String, String> summaryTable
= new LinkedHashMap<String, String>();
boolean rememberPswd = registration.isRememberPassword();
String rememberPswdString = Resources.getString(
rememberPswd ? "service.gui.YES" : "service.gui.NO");
String displayName = registration.getAccountPropertyString(
ProtocolProviderFactory.DISPLAY_NAME);
if(displayName != null && displayName.length() > 0)
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.DISPLAY_NAME"),
displayName);
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.USERNAME"),
registration.getId());
summaryTable.put(
Resources.getString("service.gui.REMEMBER_PASSWORD"),
rememberPswdString);
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.REGISTRAR"),
registration.getServerAddress());
String authName = registration.getAuthorizationName();
if(authName != null)
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.AUTH_NAME"),
authName);
String serverPort = registration.getServerPort();
if(serverPort != null && serverPort.length() > 0)
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.SERVER_PORT"),
serverPort);
if(registration.isProxyAutoConfigure())
{
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.PROXY_AUTO"),
Resources.getString("service.gui.YES"));
}
else
{
String proxy = registration.getProxy();
if(proxy != null && proxy.length() >0)
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.PROXY"),
proxy);
String proxyPort = registration.getProxyPort();
if(proxyPort != null && proxyPort.length() > 0)
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.PROXY_PORT"),
proxyPort);
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.PREFERRED_TRANSPORT"),
registration.getPreferredTransport());
}
if (registration.isEnablePresence())
{
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.ENABLE_PRESENCE"),
Resources.getString("service.gui.YES"));
}
else
{
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.ENABLE_PRESENCE"),
Resources.getString("service.gui.NO"));
}
if (registration.isForceP2PMode())
{
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.FORCE_P2P_PRESENCE"),
Resources.getString("service.gui.YES"));
}
else
{
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.FORCE_P2P_PRESENCE"),
Resources.getString("service.gui.NO"));
}
SecurityAccountRegistration securityReg
= registration.getSecurityRegistration();
if (securityReg.isDefaultEncryption())
{
summaryTable.put(Resources.getString(
"plugin.sipaccregwizz.ENABLE_DEFAULT_ENCRYPTION"),
Resources.getString("service.gui.YES"));
}
else
{
summaryTable.put(Resources.getString(
"plugin.sipaccregwizz.ENABLE_DEFAULT_ENCRYPTION"),
Resources.getString("service.gui.NO"));
}
if (securityReg.isSipZrtpAttribute())
{
summaryTable.put(Resources.getString(
"plugin.sipaccregwizz.ENABLE_SIPZRTP_ATTRIBUTE"),
Resources.getString("service.gui.YES"));
}
else
{
summaryTable.put(Resources.getString(
"plugin.sipaccregwizz.ENABLE_SIPZRTP_ATTRIBUTE"),
Resources.getString("service.gui.NO"));
}
summaryTable.put(Resources.getString(
"plugin.sipaccregwizz.OFFLINE_CONTACT_POLLING_PERIOD"),
registration.getPollingPeriod());
summaryTable.put(Resources.getString(
"plugin.sipaccregwizz.SUBSCRIPTION_EXPIRATION"),
registration.getSubscriptionExpiration());
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.KEEP_ALIVE_METHOD"),
registration.getKeepAliveMethod());
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.KEEP_ALIVE_INTERVAL"),
registration.getKeepAliveInterval());
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.DTMF_METHOD"),
registration.getDTMFMethod());
summaryTable.put(
Resources.getString(
"plugin.sipaccregwizz.DTMF_MINIMAL_TONE_DURATION"),
registration.getDtmfMinimalToneDuration());
if (registration.isXCapEnable() || registration.isXiVOEnable())
{
summaryTable.put("XCAP " + Resources.getString(
"plugin.sipaccregwizz.XCAP_SERVER_URI"),
registration.getClistOptionServerUri());
if (registration.isClistOptionUseSipCredentials())
{
summaryTable.put("XCAP " + Resources.getString(
"plugin.sipaccregwizz.XCAP_USE_SIP_CREDENTIALS"),
Resources.getString("service.gui.YES"));
}
else
{
summaryTable.put("XCAP " + Resources.getString(
"plugin.sipaccregwizz.XCAP_USER"),
registration.getClistOptionUser());
}
}
if(registration.isMessageWaitingIndicationsEnabled())
{
if(!StringUtils.isNullOrEmpty(registration.getVoicemailURI(), true))
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.VOICEMAIL_URI"),
registration.getVoicemailURI());
if(!StringUtils.isNullOrEmpty(
registration.getVoicemailCheckURI(), true))
summaryTable.put(
Resources.getString("plugin.sipaccregwizz.VOICEMAIL_CHECK_URI"),
registration.getVoicemailURI());
}
return summaryTable.entrySet().iterator();
}
/**
* Installs the account created through this wizard.
* @return ProtocolProviderService
* @throws OperationFailedException problem signing in.
*/
@Override
public ProtocolProviderService signin()
throws OperationFailedException
{
firstWizardPage.commitPage();
if (firstWizardPage.isCommitted())
return signin(registration.getId(), registration.getPassword());
return null;
}
/**
* Installs the account with the given user name and password.
* @param userName the account user name
* @param password the password
* @return the <tt>ProtocolProviderService</tt> corresponding to the newly
* created account.
* @throws OperationFailedException problem signing in.
*/
@Override
public ProtocolProviderService signin(String userName, String password)
throws OperationFailedException
{
if(userName.startsWith("sip:"))
userName = userName.substring(4);
ProtocolProviderFactory factory
= SIPAccRegWizzActivator.getSIPProtocolProviderFactory();
ProtocolProviderService pps = null;
if (factory != null)
pps = this.installAccount( factory,
userName,
password);
return pps;
}
/**
* 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 <tt>ProtocolProviderService</tt> for the new account.
* @throws OperationFailedException problem installing account
*/
private ProtocolProviderService installAccount(
ProtocolProviderFactory providerFactory,
String userName,
String passwd)
throws OperationFailedException
{
HashMap<String, String> accountProperties
= new HashMap<String, String>();
String protocolIconPath = getProtocolIconPath();
String accountIconPath = getAccountIconPath();
registration.storeProperties(
userName, passwd,
protocolIconPath, accountIconPath,
isModification(),
accountProperties);
accountProperties.put(ProtocolProviderFactory.PROTOCOL, getProtocol());
if(isModification())
{
accountProperties.put(ProtocolProviderFactory.USER_ID, userName);
providerFactory.modifyAccount( protocolProvider,
accountProperties);
setModification(false);
return protocolProvider;
}
try
{
AccountID accountID = providerFactory.installAccount(
userName, accountProperties);
ServiceReference serRef = providerFactory
.getProviderForAccount(accountID);
protocolProvider
= (ProtocolProviderService) SIPAccRegWizzActivator.bundleContext
.getService(serRef);
}
catch (IllegalStateException exc)
{
logger.warn(exc.getMessage());
throw new OperationFailedException(
"Account already exists.",
OperationFailedException.IDENTIFICATION_CONFLICT);
}
catch (Exception exc)
{
logger.warn(exc.getMessage());
throw new OperationFailedException(
exc.getMessage(),
OperationFailedException.GENERAL_ERROR);
}
return protocolProvider;
}
/**
* Fills the id and Password fields in this panel with the data coming
* from the given protocolProvider.
* @param protocolProvider The <tt>ProtocolProviderService</tt> to load the
* data from.
*/
@Override
public void loadAccount(ProtocolProviderService protocolProvider)
{
setModification(true);
this.protocolProvider = protocolProvider;
setRegistration(new SIPAccountRegistration());
AccountID currentAccountID = protocolProvider.getAccountID();
String password = SIPAccRegWizzActivator.getSIPProtocolProviderFactory()
.loadPassword(currentAccountID);
// Loads account properties into accountID object
registration.loadAccount(
protocolProvider.getAccountID(),
password,
SIPAccRegWizzActivator.bundleContext);
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 SIPAccountRegistration getRegistration()
{
return registration;
}
/**
* Sets the registration object, which will store all the data through
* the wizard.
*
* @param registration the registration object, which will store all the
* data through the wizard
*/
protected void setRegistration(SIPAccountRegistration registration)
{
this.registration = registration;
}
/**
* Returns the size of this wizard.
* @return the size of this wizard
*/
@Override
public Dimension getSize()
{
return new Dimension(600, 500);
}
/**
* 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: john@voiphone.net or simply \"john\" for no server";
}
/**
* Returns the name of the web sign up link.
* @return the name of the web sign up link
*/
public String getWebSignupLinkName()
{
return null;
}
/**
* Indicates if a sign up form is supported by this wizard.
*
* @return <tt>true</tt> if a sign up form is supported by this wizard,
* <tt>false</tt> - otherwise
*/
@Override
public boolean isSignupSupported()
{
if (getCreateAccountService() != null)
return true;
return false;
}
/**
* Returns <code>true</code> if the web sign up is supported by the current
* implementation, <code>false</code> - otherwise.
* @return <code>true</code> if the web sign up is supported by the current
* implementation, <code>false</code> - otherwise
*/
@Override
public boolean isWebSignupSupported()
{
String webSignupLinkName = getWebSignupLinkName();
return webSignupLinkName != null && webSignupLinkName.length() > 0;
}
/**
* Sets the create account view of this registration wizard.
*/
@Override
public void setCreateAccountView()
{
if (getCreateAccountService() != null)
{
firstWizardPage.getRegistrationForm().setCreateButtonSelected();
}
}
/**
* 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)
{
return getSimpleForm(new SIPAccountRegistration(), isCreateAccount);
}
/**
* Returns the simple form.
*
* @param registration the registration object
* @return the simple form
*/
public Object getSimpleForm(SIPAccountRegistration registration,
boolean isCreateAccount)
{
setRegistration(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.SIP;
}
/**
* 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 <tt>CreateAccountService</tt> through which the
* user could create an account. This method is meant to be implemented by
* specific protocol provider wizards.
* @return an instance of <tt>CreateAccountService</tt>
*/
protected SIPAccountCreationFormService getCreateAccountService()
{
return null;
}
/**
* Returns the display label used for the sip id field.
* @return the sip id display label string.
*/
protected String getUsernameLabel()
{
return Resources.getString("plugin.sipaccregwizz.USERNAME");
}
/**
* Return the string for add existing account button.
* @return the string for add existing account button.
*/
protected String getExistingAccountLabel()
{
return Resources.getString("plugin.sipaccregwizz.EXISTING_ACCOUNT");
}
/**
* Return the string for create new account button.
* @return the string for create new account button.
*/
protected String getCreateAccountLabel()
{
return Resources.getString("plugin.sipaccregwizz.CREATE_ACCOUNT");
}
}