diff --git a/build.xml b/build.xml index 452fedde5..7ac7c5ac6 100644 --- a/build.xml +++ b/build.xml @@ -751,6 +751,9 @@ + + @@ -1367,6 +1370,11 @@ javax.swing.event, javax.swing.border"/> manifest="src/net/java/sip/communicator/plugin/jabberaccregwizz/jabberaccregwizz.manifest.mf"> + + + + + diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java index c35eca49a..b60e78325 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java @@ -107,6 +107,8 @@ public class OperationSetPersistentPresenceJabberImpl private JabberSubscriptionListener subscribtionPacketListener = null; + private int resourcePriority = 10; + public OperationSetPersistentPresenceJabberImpl( ProtocolProviderServiceJabberImpl provider) { @@ -416,7 +418,7 @@ public void publishPresenceStatus(PresenceStatus status, { presence = new Presence(Presence.Type.available); presence.setMode(presenceStatusToJabberMode((JabberStatusEnum)status)); - + presence.setPriority(resourcePriority); presence.setStatus(statusMessage); presence.addExtension(new Version()); @@ -1167,4 +1169,24 @@ else if (presence != null && presence.getType() == Presence.Type.subscribed) } } } + + /** + * Returns the jabber account resource priority property value. + * + * @return the jabber account resource priority property value + */ + public int getResourcePriority() + { + return resourcePriority; + } + + /** + * Updates the jabber account resource priority property value. + * + * @param resourcePriority the new priority to set + */ + public void setResourcePriority(int resourcePriority) + { + this.resourcePriority = resourcePriority; + } } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java index 6de59601e..7f2d55b77 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java @@ -11,6 +11,7 @@ import org.jivesoftware.smack.*; import org.jivesoftware.smack.util.*; +import org.jivesoftware.smack.packet.*; import net.java.sip.communicator.impl.protocol.gibberish.*; import net.java.sip.communicator.service.protocol.*; @@ -261,6 +262,10 @@ private void connectAndLogin(SecurityAuthority authority) getAccountProperties().get( ProtocolProviderFactory.SERVER_PORT); + String accountResource = (String)getAccountID(). + getAccountProperties().get( + ProtocolProviderFactory.RESOURCE); + // check to see is there SRV records for this server domain try { @@ -314,7 +319,11 @@ private void connectAndLogin(SecurityAuthority authority) , RegistrationState.REGISTERING , RegistrationStateChangeEvent.REASON_NOT_SPECIFIED , null); - connection.login(userID, password, "sip-comm"); + + if(accountResource == null || accountResource == "") + accountResource = "sip-comm"; + + connection.login(userID, password, accountResource); if(connection.isAuthenticated()) { @@ -447,10 +456,19 @@ protected void initialize(String screenname, String keepAliveStrValue = (String)accountID.getAccountProperties(). get("SEND_KEEP_ALIVE"); + String resourcePriority = (String)accountID.getAccountProperties(). + get(ProtocolProviderFactory.RESOURCE_PRIORITY); + //initialize the presence operationset - OperationSetPersistentPresence persistentPresence = + OperationSetPersistentPresenceJabberImpl persistentPresence = new OperationSetPersistentPresenceJabberImpl(this); + if(resourcePriority != null) + { + persistentPresence.setResourcePriority( + new Integer(resourcePriority).intValue()); + } + supportedOperationSets.put( OperationSetPersistentPresence.class.getName(), persistentPresence); diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/FirstWizardPage.java b/src/net/java/sip/communicator/plugin/jabberaccregwizz/FirstWizardPage.java index 11874f739..df4641b2b 100644 --- a/src/net/java/sip/communicator/plugin/jabberaccregwizz/FirstWizardPage.java +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/FirstWizardPage.java @@ -15,23 +15,32 @@ import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.util.*; /** - * The FirstWizardPage is the page, where user could enter the user ID - * and the password of the account. - * + * The FirstWizardPage is the page, where user could enter the user + * ID and the password of the account. + * * @author Yana Stamcheva * @author Damian Minkov */ public class FirstWizardPage - extends JPanel implements WizardPage, DocumentListener + extends JPanel + implements + WizardPage, + DocumentListener { + private static final Logger logger = Logger + .getLogger(FirstWizardPage.class); public static final String FIRST_PAGE_IDENTIFIER = "FirstPageIdentifier"; private static final String GOOGLE_USER_SUFFIX = "gmail.com"; + private static final String GOOGLE_CONNECT_SRV = "talk.google.com"; + private JabberNewAccountDialog jabberNewAccountDialog; + private JPanel userIDPassPanel = new JPanel(new BorderLayout(10, 10)); private JPanel labelsPanel = new JPanel(); @@ -42,8 +51,8 @@ public class FirstWizardPage private JLabel passLabel = new JLabel(Resources.getString("password")); - private JLabel existingAccountLabel - = new JLabel(Resources.getString("existingAccount")); + private JLabel existingAccountLabel = new JLabel(Resources + .getString("existingAccount")); private JPanel emptyPanel = new JPanel(); @@ -53,8 +62,8 @@ public class FirstWizardPage private JPasswordField passField = new JPasswordField(); - private JCheckBox rememberPassBox = new JCheckBox( - Resources.getString("rememberPassword")); + private JCheckBox rememberPassBox = new JCheckBox(Resources + .getString("rememberPassword")); private JPanel advancedOpPanel = new JPanel(new BorderLayout(10, 10)); @@ -62,18 +71,38 @@ public class FirstWizardPage private JPanel valuesAdvOpPanel = new JPanel(new GridLayout(0, 1, 10, 10)); - private JCheckBox sendKeepAliveBox = new JCheckBox( - Resources.getString("sendKeepAlive")); + private JCheckBox sendKeepAliveBox = new JCheckBox(Resources + .getString("sendKeepAlive")); + + private JCheckBox enableAdvOpButton = new JCheckBox(Resources + .getString("ovverideServerOps"), false); + + private JLabel resourceLabel = new JLabel("Resource"); + + private JTextField resourceField = new JTextField("sip-comm"); - private JCheckBox enableAdvOpButton = new JCheckBox( - Resources.getString("ovverideServerOps"), false); + private JLabel priorityLabel = new JLabel("Priority"); + + private JTextField priorityField = new JTextField("10"); private JLabel serverLabel = new JLabel(Resources.getString("server")); + private JTextField serverField = new JTextField(); private JLabel portLabel = new JLabel(Resources.getString("port")); + private JTextField portField = new JTextField("5222"); + private JPanel registerPanel = new JPanel(new GridLayout(0, 1)); + + private JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); + + private JTextArea registerArea = new JTextArea(Resources + .getString("registerNewAccountText")); + + private JButton registerButton = new JButton(Resources + .getString("registerNewAccount")); + private JPanel mainPanel = new JPanel(); private Object nextPageIdentifier = WizardPage.SUMMARY_PAGE_IDENTIFIER; @@ -84,13 +113,13 @@ public class FirstWizardPage /** * Creates an instance of FirstWizardPage. - * @param registration the JabberAccountRegistration, where - * all data through the wizard are stored - * @param wizardContainer the wizardContainer, where this page will - * be added + * + * @param registration the JabberAccountRegistration, where all + * data through the wizard are stored + * @param wizardContainer the wizardContainer, where this page will be added */ public FirstWizardPage(JabberAccountRegistration registration, - WizardContainer wizardContainer) + WizardContainer wizardContainer) { super(new BorderLayout()); @@ -99,7 +128,7 @@ public FirstWizardPage(JabberAccountRegistration registration, this.registration = registration; - this.setPreferredSize(new Dimension(300, 150)); + this.setPreferredSize(new Dimension(300, 480)); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); @@ -107,9 +136,11 @@ public FirstWizardPage(JabberAccountRegistration registration, this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - this.labelsPanel.setLayout(new BoxLayout(labelsPanel, BoxLayout.Y_AXIS)); + this.labelsPanel + .setLayout(new BoxLayout(labelsPanel, BoxLayout.Y_AXIS)); - this.valuesPanel.setLayout(new BoxLayout(valuesPanel, BoxLayout.Y_AXIS)); + this.valuesPanel + .setLayout(new BoxLayout(valuesPanel, BoxLayout.Y_AXIS)); } /** @@ -118,13 +149,14 @@ public FirstWizardPage(JabberAccountRegistration registration, private void init() { this.userIDField.getDocument().addDocumentListener(this); + this.resourceField.getDocument().addDocumentListener(this); this.rememberPassBox.setSelected(true); this.existingAccountLabel.setForeground(Color.RED); this.userIDExampleLabel.setForeground(Color.GRAY); - this.userIDExampleLabel.setFont(userIDExampleLabel.getFont().deriveFont( - 8)); + this.userIDExampleLabel.setFont(userIDExampleLabel.getFont() + .deriveFont(8)); this.emptyPanel.setMaximumSize(new Dimension(40, 35)); this.userIDExampleLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 8, 0)); @@ -141,14 +173,15 @@ private void init() userIDPassPanel.add(valuesPanel, BorderLayout.CENTER); userIDPassPanel.add(rememberPassBox, BorderLayout.SOUTH); - userIDPassPanel.setBorder(BorderFactory - .createTitledBorder(Resources.getString( - "userIDAndPassword"))); + userIDPassPanel.setBorder(BorderFactory.createTitledBorder(Resources + .getString("userIDAndPassword"))); mainPanel.add(userIDPassPanel); serverField.setEditable(false); portField.setEditable(false); + resourceField.setEditable(false); + priorityField.setEditable(false); enableAdvOpButton.addActionListener(new ActionListener() { @@ -159,30 +192,54 @@ public void actionPerformed(ActionEvent evt) serverField.setEditable(cb.isSelected()); portField.setEditable(cb.isSelected()); + resourceField.setEditable(cb.isSelected()); + priorityField.setEditable(cb.isSelected()); } }); portField.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent evt) - {} + { + } + + public void insertUpdate(DocumentEvent evt) + { + setNextButtonAccordingToPortAndPriority(); + } + + public void removeUpdate(DocumentEvent evt) + { + setNextButtonAccordingToPortAndPriority(); + } + }); + + priorityField.getDocument().addDocumentListener(new DocumentListener() + { + public void changedUpdate(DocumentEvent evt) + { + } public void insertUpdate(DocumentEvent evt) { - setNextButtonAccordingToPort(); + setNextButtonAccordingToPortAndPriority(); } public void removeUpdate(DocumentEvent evt) { - setNextButtonAccordingToPort(); + setNextButtonAccordingToPortAndPriority(); } }); labelsAdvOpPanel.add(serverLabel); labelsAdvOpPanel.add(portLabel); + labelsAdvOpPanel.add(resourceLabel); + labelsAdvOpPanel.add(priorityLabel); valuesAdvOpPanel.add(serverField); valuesAdvOpPanel.add(portField); + valuesAdvOpPanel.add(resourceField); + valuesAdvOpPanel.add(priorityField); JPanel checkBoxesPanel = new JPanel(new GridLayout(0, 1, 10, 10)); checkBoxesPanel.add(sendKeepAliveBox); @@ -192,19 +249,58 @@ public void removeUpdate(DocumentEvent evt) advancedOpPanel.add(labelsAdvOpPanel, BorderLayout.WEST); advancedOpPanel.add(valuesAdvOpPanel, BorderLayout.CENTER); - advancedOpPanel.setBorder(BorderFactory - .createTitledBorder(Resources.getString( - "advancedOptions"))); + advancedOpPanel.setBorder(BorderFactory.createTitledBorder(Resources + .getString("advancedOptions"))); mainPanel.add(advancedOpPanel); + registerButton.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent evt) + { + logger.debug("Reg OK"); + + // Open the new account dialog. + + jabberNewAccountDialog = new JabberNewAccountDialog(); + + if (jabberNewAccountDialog.isOK == true) + { + serverField.setText(jabberNewAccountDialog.server); + portField.setText(jabberNewAccountDialog.port); + + // This userIDField contains the username "@" the server. + userIDField.setText(jabberNewAccountDialog.userID + "@" + + jabberNewAccountDialog.server); + + passField.setText(jabberNewAccountDialog.password); + } + logger.debug("Reg End"); + } + }); + + buttonPanel.add(registerButton); + + registerArea.setEditable(false); + registerArea.setOpaque(false); + registerArea.setLineWrap(true); + registerArea.setWrapStyleWord(true); + + registerPanel.add(registerArea); + registerPanel.add(buttonPanel); + + registerPanel.setBorder(BorderFactory.createTitledBorder(Resources + .getString("registerNewAccount"))); + + mainPanel.add(registerPanel); + this.add(mainPanel, BorderLayout.NORTH); } /** - * Implements the WizardPage.getIdentifier to return - * this page identifier. - * + * Implements the WizardPage.getIdentifier to return this + * page identifier. + * * @return the id of the first wizard page. */ public Object getIdentifier() @@ -215,7 +311,7 @@ public Object getIdentifier() /** * Implements the WizardPage.getNextPageIdentifier to return * the next page identifier - the summary page. - * + * * @return the id of the next wizard page. */ public Object getNextPageIdentifier() @@ -226,7 +322,7 @@ public Object getNextPageIdentifier() /** * Implements the WizardPage.getBackPageIdentifier to return * the next back identifier - the default page. - * + * * @return the id of the default wizard page. */ public Object getBackPageIdentifier() @@ -235,9 +331,9 @@ public Object getBackPageIdentifier() } /** - * Implements the WizardPage.getWizardForm to return - * this panel. - * + * Implements the WizardPage.getWizardForm to return this + * panel. + * * @return this wizard page. */ public Object getWizardForm() @@ -251,7 +347,7 @@ public Object getWizardForm() */ public void pageShowing() { - this.setNextButtonAccordingToUserID(); + this.setNextButtonAccordingToUserIDAndResource(); } /** @@ -278,12 +374,16 @@ public void pageNext() registration.setServerAddress(serverField.getText()); registration.setSendKeepAlive(sendKeepAliveBox.isSelected()); + registration.setResource(resourceField.getText()); try { registration.setPort(Integer.parseInt(portField.getText())); + registration.setPriority(Integer.parseInt(priorityField + .getText())); } catch (NumberFormatException ex) - {} + { + } } } @@ -291,9 +391,11 @@ public void pageNext() * Enables or disables the "Next" wizard button according to whether the * UserID field is empty. */ - private void setNextButtonAccordingToUserID() + private void setNextButtonAccordingToUserIDAndResource() { - if (userIDField.getText() == null || userIDField.getText().equals("")) + if (userIDField.getText() == null || userIDField.getText().equals("") + || resourceField.getText() == null + || resourceField.getText().equals("")) { wizardContainer.setNextFinishButtonEnabled(false); } @@ -307,12 +409,12 @@ private void setNextButtonAccordingToUserID() * Handles the DocumentEvent triggered when user types in the * UserID field. Enables or disables the "Next" wizard button according to * whether the UserID field is empty. - * + * * @param evt the document event that has triggered this method call. */ public void insertUpdate(DocumentEvent evt) { - this.setNextButtonAccordingToUserID(); + this.setNextButtonAccordingToUserIDAndResource(); this.setServerFieldAccordingToUserID(); } @@ -320,12 +422,12 @@ public void insertUpdate(DocumentEvent evt) * Handles the DocumentEvent triggered when user deletes letters * from the User ID field. Enables or disables the "Next" wizard button * according to whether the User ID field is empty. - * + * * @param evt the document event that has triggered this method call. */ public void removeUpdate(DocumentEvent evt) { - this.setNextButtonAccordingToUserID(); + this.setNextButtonAccordingToUserIDAndResource(); this.setServerFieldAccordingToUserID(); } @@ -348,14 +450,15 @@ public void pageBack() /** * Fills the User ID and Password fields in this panel with the data comming * from the given protocolProvider. - * @param protocolProvider The ProtocolProviderService to load the - * data from. + * + * @param protocolProvider The ProtocolProviderService to load + * the data from. */ public void loadAccount(ProtocolProviderService protocolProvider) { AccountID accountID = protocolProvider.getAccountID(); - String password = (String) accountID.getAccountProperties() - .get(ProtocolProviderFactory.PASSWORD); + String password = (String) accountID.getAccountProperties().get( + ProtocolProviderFactory.PASSWORD); this.userIDField.setText(accountID.getUserID()); @@ -367,8 +470,8 @@ public void loadAccount(ProtocolProviderService protocolProvider) } /** - * Parse the server part from the jabber id and set it to server - * as default value. If Advanced option is enabled Do nothing. + * Parse the server part from the jabber id and set it to server as default + * value. If Advanced option is enabled Do nothing. */ private void setServerFieldAccordingToUserID() { @@ -394,12 +497,12 @@ private void setServerFieldAccordingToUserID() /** * Disables Next Button if Port field value is incorrect */ - private void setNextButtonAccordingToPort() + private void setNextButtonAccordingToPortAndPriority() { try { - String portValue = portField.getText(); new Integer(portField.getText()); + new Integer(priorityField.getText()); wizardContainer.setNextFinishButtonEnabled(true); } catch (NumberFormatException ex) @@ -408,10 +511,17 @@ private void setNextButtonAccordingToPort() } } + /** + * Checks if the accountName corresponds to an already existing account. + * + * @param accountName the name of the account to check + * @return TRUE if an account with the specified name already exists, FALSE - + * otherwise. + */ private boolean isExistingAccount(String accountName) { - ProtocolProviderFactory factory - = JabberAccRegWizzActivator.getJabberProtocolProviderFactory(); + ProtocolProviderFactory factory = JabberAccRegWizzActivator + .getJabberProtocolProviderFactory(); ArrayList registeredAccounts = factory.getRegisteredAccounts(); diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistration.java b/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistration.java index 2b337d58d..c5dd32efd 100755 --- a/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistration.java +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistration.java @@ -25,6 +25,10 @@ public class JabberAccountRegistration private int port; + private String resource; + + private int priority; + private boolean sendKeepAlive; /** @@ -135,4 +139,24 @@ public void setSendKeepAlive(boolean sendKeepAlive) { this.sendKeepAlive = sendKeepAlive; } + + public String getResource() + { + return resource; + } + + public void setResource(String resource) + { + this.resource = resource; + } + + public int getPriority() + { + return priority; + } + + public void setPriority(int priority) + { + this.priority = priority; + } } diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistrationWizard.java b/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistrationWizard.java index aff44dd07..7643a3b31 100644 --- a/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistrationWizard.java +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistrationWizard.java @@ -6,14 +6,17 @@ */ package net.java.sip.communicator.plugin.jabberaccregwizz; +import java.awt.*; import java.util.*; -import org.osgi.framework.*; +import javax.swing.*; + import net.java.sip.communicator.impl.gui.customcontrols.*; -import net.java.sip.communicator.plugin.gibberishaccregwizz.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; +import org.osgi.framework.*; + /** * The JabberAccountRegistrationWizard is an implementation of the * AccountRegistrationWizard for the Jabber protocol. It should allow @@ -46,7 +49,7 @@ public class JabberAccountRegistrationWizard */ public JabberAccountRegistrationWizard(WizardContainer wizardContainer) { - this.wizardContainer = wizardContainer; + this.wizardContainer = wizardContainer; } /** @@ -121,6 +124,7 @@ public Iterator getSummary() /** * Installs the account created through this wizard. + * * @return ProtocolProviderService */ public ProtocolProviderService finish() @@ -136,6 +140,7 @@ public ProtocolProviderService finish() /** * Creates an account for the given user and password. + * * @param providerFactory the ProtocolProviderFactory which will create * the account * @param user the user identifier @@ -164,6 +169,12 @@ public ProtocolProviderService installAccount( accountProperties.put("SEND_KEEP_ALIVE", String.valueOf(registration.isSendKeepAlive())); + accountProperties.put("RESOURCE", + registration.getResource()); + + accountProperties.put("PRIORITY", + String.valueOf(registration.getPriority())); + if (isModification) { providerFactory.uninstallAccount(protocolProvider.getAccountID()); @@ -202,11 +213,11 @@ public ProtocolProviderService installAccount( */ public void loadAccount(ProtocolProviderService protocolProvider) { - this.protocolProvider = protocolProvider; this.firstWizardPage.loadAccount(protocolProvider); isModification = true; } + } diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberNewAccountDialog.java b/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberNewAccountDialog.java new file mode 100644 index 000000000..f5aed1fbc --- /dev/null +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberNewAccountDialog.java @@ -0,0 +1,372 @@ +/* + * SIP Communicator, 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.awt.event.*; +import java.io.*; + +import javax.imageio.*; +import javax.swing.*; +import javax.swing.border.*; +import javax.swing.event.*; + +import net.java.sip.communicator.util.*; + +import org.jivesoftware.smack.*; + +/** + * Dialog for adding a new Jabber account. + * + * @author Nicolas Grandclaude + */ +public class JabberNewAccountDialog + extends JDialog + implements + DocumentListener +{ + private static final Logger logger = Logger + .getLogger(JabberNewAccountDialog.class); + + private JabberServerChooserDialog jabberServerChooserDialog; + + // Panels + private JPanel userIDPassPanel = new JPanel(new BorderLayout(10, 10)); + + private JPanel labelsPanel = new JPanel(new GridLayout(0, 1, 10, 10)); + + private JPanel valuesPanel = new JPanel(new GridLayout(0, 1, 10, 10)); + + private JPanel serverPanel = new JPanel(new BorderLayout(10, 10)); + + private JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + + private Box buttonBox = new Box(BoxLayout.X_AXIS); + + private JPanel mainPanel = new JPanel(new BorderLayout()); + + private JPanel westPanel = new JPanel(new BorderLayout(10, 10)); + + // Labels + private JLabel serverLabel = new JLabel(Resources.getString("cserver")); + + private JLabel userIDLabel = new JLabel(Resources.getString("userID")); + + private JLabel passLabel = new JLabel(Resources.getString("password")); + + private JLabel pass2Label = new JLabel(Resources.getString("password2")); + + private JLabel portLabel = new JLabel(Resources.getString("port")); + + private JLabel westIconLabel = new JLabel(); + + // Textfield + private JTextField serverField = new JTextField(); + + private JTextField userIDField = new JTextField(); + + private JPasswordField passField = new JPasswordField(); + + private JPasswordField pass2Field = new JPasswordField(); + + private JTextField portField = new JTextField("5222"); + + // Button + private JButton chooseButton = new JButton(); + + private JButton okButton = new JButton(); + + private JButton cancelButton = new JButton(); + + // Smack objects + private XMPPConnection xmppConnection = null; + + private AccountManager accountManager = null; + + // Variables for FirstWizardPage + public boolean isOK = false; + + public String userID = null; + + public String password = null; + + public String server = null; + + public String port = null; + + private LoadingAccountGlassPane loadingAccountGlassPane + = new LoadingAccountGlassPane(); + + /** + * Creates an instance of JabberNewAccountDialog. + */ + public JabberNewAccountDialog() + { + this.setSize(new Dimension(450, 250)); + this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + this.setTitle(Resources.getString("newAccountTitle")); + this.setModal(true); + this.setGlassPane(loadingAccountGlassPane); + + // Place the window in the screen center + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + this.setLocation(screenSize.width / 2 - this.getWidth() / 2, + screenSize.height / 2 - this.getHeight() / 2); + + this.init(); + } + + /** + * Connect to the choose server and create a new account with Smack + * + * @param server the server domain + * @param port TCP port to connect + * @param username username + * @param password password + */ + private boolean addNewAccount(String server, int port, String username, + String password) + { + try + { + ConnectionConfiguration config = new ConnectionConfiguration( + server, port); + + xmppConnection = new XMPPConnection(config); + xmppConnection.connect(); + + accountManager = new AccountManager(xmppConnection); + accountManager.createAccount(username, password); + return true; + } + catch (XMPPException exc) + { + if (exc.getXMPPError().getCode() == 409) + { + JOptionPane.showMessageDialog(null, Resources + .getString("userExist"), Resources.getString("xmppError"), + JOptionPane.ERROR_MESSAGE); + + logger.error( + "Error when created a new Jabber account : user already exist"); + } + else + { + JOptionPane.showMessageDialog(null, Resources + .getString("unknownXmppError"), Resources + .getString("xmppError"), JOptionPane.ERROR_MESSAGE); + } + return false; + } + } + + /** + * Initializes all panels, buttons, etc. + */ + private void init() + { + + labelsPanel.add(serverLabel); + labelsPanel.add(userIDLabel); + labelsPanel.add(passLabel); + labelsPanel.add(pass2Label); + labelsPanel.add(portLabel); + + userIDField.setColumns(30); + + serverPanel.add(serverField, BorderLayout.CENTER); + serverPanel.add(chooseButton, BorderLayout.EAST); + valuesPanel.add(serverPanel); + valuesPanel.add(userIDField); + valuesPanel.add(passField); + valuesPanel.add(pass2Field); + valuesPanel.add(portField); + + serverField.getDocument().addDocumentListener(this); + userIDField.getDocument().addDocumentListener(this); + passField.getDocument().addDocumentListener(this); + pass2Field.getDocument().addDocumentListener(this); + portField.getDocument().addDocumentListener(this); + + userIDPassPanel.add(labelsPanel, BorderLayout.WEST); + userIDPassPanel.add(valuesPanel, BorderLayout.CENTER); + + chooseButton.setText(Resources.getString("chooseLabel")); + chooseButton.setMnemonic(Resources.getMnemonic("chooseLabel")); + + westIconLabel.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createEmptyBorder(20, 20, 20, 20), BorderFactory + .createTitledBorder(""))); + try + { + westIconLabel.setIcon(new ImageIcon(ImageIO + .read(new ByteArrayInputStream(Resources + .getImage(Resources.PAGE_IMAGE))))); + } + catch (IOException e) + { + logger.error("Could not read image.", e); + } + + westPanel.add(westIconLabel, BorderLayout.NORTH); + this.mainPanel.add(westPanel, BorderLayout.WEST); + + // Choose button open the JabberServerChooserDialog + chooseButton.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent evt) + { + jabberServerChooserDialog = new JabberServerChooserDialog(); + if (jabberServerChooserDialog.isOK) // OK pressed in + // JabberServerChooserDialog + { + serverField + .setText(jabberServerChooserDialog.serverSelected); + } + } + }); + + // Ok button + okButton.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent evt) + { + if (new String(passField.getPassword()).equals(new String( + pass2Field.getPassword()))) + { // the two password fields are the same + new Thread() + { + public void run() + { + boolean result = addNewAccount(serverField.getText(), + Integer.parseInt(portField.getText()), + userIDField.getText(), + new String(passField.getPassword())); + + if (result == true) + { + // Update FirstWizardDialog field + isOK = true; + userID = new String(userIDField.getText()); + password = new String(passField.getPassword()); + server = new String(serverField.getText()); + port = new String(portField.getText()); + dispose(); + } + } + }.start(); + + loadingAccountGlassPane.setVisible(true); + } + else + { + JOptionPane.showMessageDialog(null, Resources + .getString("notSamePassword"), Resources + .getString("xmppError"), JOptionPane.ERROR_MESSAGE); + } + } + }); + + // Cancel button + cancelButton.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent evt) + { + dispose(); + } + }); + + okButton.setText(Resources.getString("okLabel")); + okButton.setMnemonic(Resources.getMnemonic("okLabel")); + okButton.setEnabled(false); + + cancelButton.setText(Resources.getString("cancelLabel")); + cancelButton.setMnemonic(Resources.getMnemonic("cancelLabel")); + + buttonBox.setBorder(new EmptyBorder(new Insets(5, 10, 5, 10))); + buttonBox.add(okButton); + buttonBox.add(Box.createHorizontalStrut(10)); + buttonBox.add(cancelButton); + + buttonPanel.add(buttonBox); + + this.mainPanel.add(userIDPassPanel, BorderLayout.CENTER); + this.mainPanel.add(buttonPanel, BorderLayout.SOUTH); + + mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + this.getContentPane().add(mainPanel, BorderLayout.NORTH); + + this.setVisible(true); + } + + /** + * Sets the "Ok" button enabled if all fields are filled. + */ + private void enableOKButton() + { + okButton.setEnabled(false); + try + { + Integer.parseInt(portField.getText()); + } + catch (NumberFormatException ex) + { + okButton.setEnabled(false); + return; + } + + if (serverField.getText().equals("") + || userIDField.getText().equals("") + || (new String(passField.getPassword())).equals("") + || (new String(pass2Field.getPassword())).equals("")) + { + okButton.setEnabled(false); + } + else + { + okButton.setEnabled(true); + } + } + + public void insertUpdate(DocumentEvent evt) + { + this.enableOKButton(); + } + + public void removeUpdate(DocumentEvent evt) + { + this.enableOKButton(); + } + + public void changedUpdate(DocumentEvent evt) + { + } + + public void pageHiding() + { + } + + public void pageShown() + { + } + + public void pageBack() + { + } + + /** + * A GlassPane that would change the cursor to a waiting cursor until the + * new account is registered. + */ + private class LoadingAccountGlassPane extends JComponent + { + public LoadingAccountGlassPane() + { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + } + } +} diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberServerChooserDialog.java b/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberServerChooserDialog.java new file mode 100644 index 000000000..17f569e99 --- /dev/null +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberServerChooserDialog.java @@ -0,0 +1,378 @@ +/* + * SIP Communicator, 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.awt.event.*; +import java.io.*; +import java.net.*; +import java.util.*; + +import javax.imageio.*; +import javax.swing.*; +import javax.swing.border.*; +import javax.swing.event.*; +import javax.swing.table.*; +import javax.xml.parsers.*; + +import net.java.sip.communicator.service.fileaccess.*; +import net.java.sip.communicator.util.*; + +import org.osgi.framework.*; +import org.w3c.dom.*; +import org.xml.sax.*; + +/** + * A dialog that shows the list of available Jabber servers. + * + * @author Nicolas Grandclaude + */ +public class JabberServerChooserDialog + extends JDialog + implements ListSelectionListener +{ + private static final Logger logger = Logger + .getLogger(JabberServerChooserDialog.class); + + private static final String DEFAULT_FILE_NAME = "jabberservers.xml"; + + // Servers Table + private JTable serversTable; + + private JTextArea chooseArea = new JTextArea(Resources + .getString("chooseServerText")); + + // Panel + private JPanel mainPanel = new JPanel(new BorderLayout()); + + private JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + + private Box buttonBox = new Box(BoxLayout.X_AXIS); + + private JPanel chooseAreaPanel = new JPanel(new BorderLayout()); + + private JPanel westPanel = new JPanel(new BorderLayout(10, 10)); + + private JPanel eastPanel = new JPanel(new BorderLayout(10, 10)); + + private JLabel westIconLabel = new JLabel(); + + private JButton okButton = new JButton(Resources.getString("okLabel")); + + private JButton cancelButton = new JButton(Resources + .getString("cancelLabel")); + + private Vector servers = new Vector(); + + private FileAccessService faService = null; + + private String[] columnNames = + { Resources.getString("serverColumn"), Resources.getString("commentColumn") }; + + public boolean isOK = false; + + public String serverSelected; + + /** + * Creates an instance of JabberServerChooserDialog. + */ + public JabberServerChooserDialog() + { + this.setSize(new Dimension(550, 450)); + this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + this.setTitle(Resources.getString("chooseTitle")); + this.setModal(true); + + // Place the window in the center + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + this.setLocation(screenSize.width / 2 - this.getWidth() / 2, + screenSize.height / 2 - this.getHeight() / 2); + + this.init(); + } + /** + * Initializes all panels, buttons, etc. + */ + private void init() + { + chooseArea.setEditable(false); + chooseArea.setOpaque(false); + chooseArea.setLineWrap(true); + chooseArea.setWrapStyleWord(true); + + chooseAreaPanel + .setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 10)); + + chooseAreaPanel.add(chooseArea, BorderLayout.NORTH); + + eastPanel.add(chooseAreaPanel, BorderLayout.NORTH); + + // West Jabber icon + westIconLabel.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createEmptyBorder(20, 20, 20, 20), BorderFactory + .createTitledBorder(""))); + try + { + westIconLabel.setIcon(new ImageIcon(ImageIO + .read(new ByteArrayInputStream(Resources + .getImage(Resources.PAGE_IMAGE))))); + } + catch (IOException e) + { + logger.error("Could not read image.", e); + } + + this.westPanel.add(westIconLabel, BorderLayout.NORTH); + this.mainPanel.add(westPanel, BorderLayout.WEST); + + // Table with servers and comments + serversTable = new JTable(new ServerChooserTableModel()); + serversTable.setRowHeight(22); + serversTable.getSelectionModel().addListSelectionListener(this); + serversTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + serversTable.setPreferredScrollableViewportSize(new Dimension(500, 70)); + + // Fill the servers array with servers from servers.xml + fillTable(); + + JScrollPane scrollPane = new JScrollPane(serversTable); + eastPanel.add(scrollPane, BorderLayout.CENTER); + + // Ok button + okButton.setText(Resources.getString("okLabel")); + okButton.setMnemonic(Resources.getMnemonic("okLabel")); + okButton.setEnabled(false); + + // Cancel button + cancelButton.setText(Resources.getString("cancelLabel")); + cancelButton.setMnemonic(Resources.getMnemonic("cancelLabel")); + + // Box with Ok and Cancel + buttonBox.setBorder(new EmptyBorder(new Insets(5, 10, 5, 10))); + buttonBox.add(okButton); + buttonBox.add(Box.createHorizontalStrut(10)); + buttonBox.add(cancelButton); + buttonPanel.add(buttonBox); + + okButton.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent evt) + { + isOK = true; + dispose(); + } + }); + + cancelButton.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent evt) + { + dispose(); + } + }); + + this.mainPanel.add(eastPanel, BorderLayout.CENTER); + this.mainPanel.add(buttonPanel, BorderLayout.SOUTH); + + mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + this.getContentPane().add(mainPanel, BorderLayout.CENTER); + + this.setVisible(true); + } + + + /** + * Fill the servers array variable with data from the remote servers.xml + */ + public void fillTable() + { + BundleContext bc = JabberAccRegWizzActivator.bundleContext; + + ServiceReference faServiceReference = bc + .getServiceReference(FileAccessService.class.getName()); + + faService = (FileAccessService) bc.getService(faServiceReference); + + try + { + File localServersListFile = faService + .getPrivatePersistentFile(DEFAULT_FILE_NAME); + + // Get the file containing the servers list. + if (!localServersListFile.exists()) + { + try + { + localServersListFile.createNewFile(); + } + catch (IOException e) + { + logger.error("Failed to create file" + + localServersListFile.getAbsolutePath(), e); + } + } + + try + { + URL file = new URL("http://www.jabber.org/servers.xml"); + InputStream stream = file.openStream(); + + try + { + // Copy the remote file to the disk + byte[] buf = new byte[2048]; + int len; + if (stream.available() > 0) + { + FileOutputStream fos + = new FileOutputStream(localServersListFile); + + while ((len = stream.read(buf)) > 0) + { + fos.write(buf, 0, len); + } + fos.close(); + } + } finally + { + stream.close(); + } + } + catch (Exception e) + { + logger.error(""); + } + + FileInputStream fis = new FileInputStream(localServersListFile); + DocumentBuilderFactory factory = DocumentBuilderFactory + .newInstance(); + DocumentBuilder constructor = factory.newDocumentBuilder(); + Document document = constructor.parse(fis); + Element root = document.getDocumentElement(); + + NodeList list = root.getElementsByTagName("item"); + + // Read the xml and fill servers variable for the JTable + for (int i = 0; i < list.getLength(); i++) + { + Element e = (Element) list.item(i); + servers.add(new String(e.getAttribute("jid"))); + } + fis.close(); + + } + catch (Exception e) + { + logger.error( + "Failed to get a reference to the Jabber servers list file.", e); + } + } + + /** + * When a table row is selected enable the "Ok" button, otherwise disable it. + */ + public void valueChanged(ListSelectionEvent e) + { + int row = serversTable.getSelectedRow(); + if (row != -1) + { + okButton.setEnabled(true); + serverSelected = (String) serversTable.getValueAt(row, 0); + } + else + { + okButton.setEnabled(false); + } + + } + + /** + * The table model used for the table containing all servers. + */ + private class ServerChooserTableModel extends AbstractTableModel + { + private Document serverComments; + + private NodeList commentsList; + + public ServerChooserTableModel() + { + try + { + // Create a builder factory + DocumentBuilderFactory factory + = DocumentBuilderFactory.newInstance(); + + // Create the builder and parse the file + serverComments = factory.newDocumentBuilder() + .parse(new File(Resources.getString("commentsFile"))); + } + catch (SAXException e) + { + logger.error("Failed to parse: " + DEFAULT_FILE_NAME, e); + } + catch (ParserConfigurationException e) + { + logger.error("Failed to parse: " + DEFAULT_FILE_NAME, e); + } + catch (IOException e) + { + logger.error("Failed to parse: " + DEFAULT_FILE_NAME, e); + } + + + Element root = serverComments.getDocumentElement(); + + commentsList = root.getElementsByTagName("item"); + + } + + public int getColumnCount() + { + return 2; + } + + public int getRowCount() + { + return servers.size(); + } + + public String getColumnName(int col) + { + return columnNames[col]; + } + + public Object getValueAt(int row, int col) + { + String commentString = new String(""); + if (col == 0) // Column 1 (Server name) + { + return servers.get(row); + } + else + { // Column 2 (Comment) + + int i = 0; + Element e = (Element) commentsList.item(i); + + while ((i < commentsList.getLength()) + && (e.getAttribute("jid").equals(servers.get(row)) == false)) + { + e = (Element) commentsList.item(i); + i++; + } + + if (e.getAttribute("jid").equals(servers.get(row))) + { + commentString = e.getAttribute("comment"); + } + + return commentString; + } + } + } +} diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/Resources.java b/src/net/java/sip/communicator/plugin/jabberaccregwizz/Resources.java index d2bc9f13f..2fa705310 100644 --- a/src/net/java/sip/communicator/plugin/jabberaccregwizz/Resources.java +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/Resources.java @@ -39,18 +39,56 @@ public class Resources */ public static String getString(String key) { + String resourceString; try { - return RESOURCE_BUNDLE.getString(key); - - } + resourceString = RESOURCE_BUNDLE.getString(key); + + int mnemonicIndex = resourceString.indexOf('&'); + + if(mnemonicIndex > -1) + { + String firstPart = resourceString.substring(0, mnemonicIndex); + String secondPart = resourceString.substring(mnemonicIndex + 1); + + resourceString = firstPart.concat(secondPart); + } + } catch (MissingResourceException e) { - - return '!' + key + '!'; + resourceString = '!' + key + '!'; } + + return resourceString; } + /** + * Returns an internationalized string corresponding to the given key. + * @param key The key of the string. + * @return An internationalized string corresponding to the given key. + */ + public static char getMnemonic(String key) + { + String resourceString; + try { + resourceString = RESOURCE_BUNDLE.getString(key); + + int mnemonicIndex = resourceString.indexOf('&'); + + if(mnemonicIndex > -1) + { + return resourceString.charAt(mnemonicIndex + 1); + } + + } + catch (MissingResourceException e) + { + return '!'; + } + + return '!'; + } + /** * Loads an image from a given image identifier. * @param imageID The identifier of the image. diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/jabberaccregwizz.manifest.mf b/src/net/java/sip/communicator/plugin/jabberaccregwizz/jabberaccregwizz.manifest.mf index db43c8df4..542c13563 100755 --- a/src/net/java/sip/communicator/plugin/jabberaccregwizz/jabberaccregwizz.manifest.mf +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/jabberaccregwizz.manifest.mf @@ -14,6 +14,12 @@ Import-Package: org.osgi.framework, net.java.sip.communicator.service.contactlist.event, net.java.sip.communicator.service.gui, net.java.sip.communicator.service.gui.event, + net.java.sip.communicator.service.fileaccess, + javax.naming, + javax.naming.directory, + javax.xml.parsers, + org.w3c.dom, + org.xml.sax, javax.swing, javax.swing.event, javax.swing.table, @@ -27,4 +33,5 @@ Import-Package: org.osgi.framework, javax.swing.filechooser, javax.swing.tree, javax.swing.undo, - javax.swing.border + javax.swing.border, + javax.net.ssl diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/resources.properties b/src/net/java/sip/communicator/plugin/jabberaccregwizz/resources.properties index e58336049..32e192b68 100755 --- a/src/net/java/sip/communicator/plugin/jabberaccregwizz/resources.properties +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/resources.properties @@ -1,15 +1,35 @@ protocolName=Jabber protocolDescription=The Jabber protocol -userID=Jabber id: -password=Password: +userID=Jabber id +username=Jabber username +password=Password +password2=Confirm password rememberPassword=Remember password userIDAndPassword=ID and Password advancedOptions=Advanced Options ovverideServerOps=Override server default options +cserver=Server server=Connect Server port=Port sendKeepAlive=Send keep alive packets existingAccount=* The account you entered is already installed. +newAccountTitle=Jabber new account registration +registerNewAccount=Register new account +registerNewAccountText=In case you don't have a Jabber account, click on this button to create a new one. +chooseTitle=Jabber new account server chooser +chooseServerText=Choose the server for your new account in the list below. +okLabel=&Ok +cancelLabel=C&ancel +chooseLabel=&Choose +serverColumn=Server +commentColumn=Comment + +xmppError=XMPP Error +userExist=This user already exist on this server. Choose another user or server. +unknownXmppError=Unknown XMPP error. Verify that the server name is correct. +notSamePassword=The two entered password aren't the same. + +commentsFile=classes/net/java/sip/communicator/plugin/jabberaccregwizz/resources/servercomments.xml protocolIcon=resources/images/jabber/jabber16x16-online.png pageImage=resources/images/jabber/jabber48x48.png diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/resources/servercomments.xml b/src/net/java/sip/communicator/plugin/jabberaccregwizz/resources/servercomments.xml new file mode 100644 index 000000000..3c6f40915 --- /dev/null +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/resources/servercomments.xml @@ -0,0 +1,5 @@ + + + + +