Package org.eclipse.ecf.internal.provider.xmpp.ui.wizards

Source Code of org.eclipse.ecf.internal.provider.xmpp.ui.wizards.XMPPConnectWizard

/****************************************************************************
* Copyright (c) 2007, 2009 Remy Suen, Composent Inc., and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*    Remy Suen <remy.suen@gmail.com> - initial API and implementation
*****************************************************************************/
package org.eclipse.ecf.internal.provider.xmpp.ui.wizards;

import java.io.*;
import org.eclipse.ecf.core.*;
import org.eclipse.ecf.core.events.IContainerConnectedEvent;
import org.eclipse.ecf.core.events.IContainerEvent;
import org.eclipse.ecf.core.identity.*;
import org.eclipse.ecf.core.security.ConnectContextFactory;
import org.eclipse.ecf.core.security.IConnectContext;
import org.eclipse.ecf.filetransfer.*;
import org.eclipse.ecf.filetransfer.events.*;
import org.eclipse.ecf.internal.provider.xmpp.ui.Activator;
import org.eclipse.ecf.internal.provider.xmpp.ui.Messages;
import org.eclipse.ecf.presence.*;
import org.eclipse.ecf.presence.im.*;
import org.eclipse.ecf.presence.ui.MessagesView;
import org.eclipse.ecf.presence.ui.MultiRosterView;
import org.eclipse.ecf.ui.IConnectWizard;
import org.eclipse.ecf.ui.actions.AsynchContainerConnectAction;
import org.eclipse.ecf.ui.dialogs.IDCreateErrorDialog;
import org.eclipse.ecf.ui.util.PasswordCacheHelper;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;

public class XMPPConnectWizard extends Wizard implements IConnectWizard,
    INewWizard {

  XMPPConnectWizardPage page;

  private Shell shell;

  // private IContainer container;
  protected IContainer container;

  private ID targetID;

  private IConnectContext connectContext;

  protected String usernameAtHost;

  public XMPPConnectWizard() {
    super();
  }

  public XMPPConnectWizard(String usernameAtHost) {
    this();
    this.usernameAtHost = usernameAtHost;
  }

  protected IIncomingFileTransferRequestListener requestListener = new IIncomingFileTransferRequestListener() {
    public void handleFileTransferRequest(
        final IFileTransferRequestEvent event) {
      Display.getDefault().asyncExec(new Runnable() {
        public void run() {
          final String username = event.getRequesterID().getName();
          final IFileTransferInfo transferInfo = event
              .getFileTransferInfo();
          final String fileName = transferInfo.getFile().getName();
          final Object[] bindings = new Object[] { username,
              fileName,
              ((transferInfo.getFileSize() == -1) ? "unknown" //$NON-NLS-1$
                  : (transferInfo.getFileSize() + " bytes")), //$NON-NLS-1$
              (transferInfo.getDescription() == null) ? "none" //$NON-NLS-1$
                  : transferInfo.getDescription() };
          if (MessageDialog.openQuestion(shell, NLS.bind(
              Messages.XMPPConnectWizard_FILE_RECEIVE_TITLE,
              username), NLS.bind(
              Messages.XMPPConnectWizard_FILE_RECEIVE_MESSAGE,
              bindings))) {
            final FileDialog fd = new FileDialog(shell, SWT.OPEN);
            // XXX this should be some default path gotten from
            // preference. For now we'll have it be the user.home
            // system property
            fd.setFilterPath(System.getProperty("user.home")); //$NON-NLS-1$
            fd.setFileName(fileName);
            final int suffixLoc = fileName.lastIndexOf('.');
            if (suffixLoc != -1) {
              final String ext = fileName.substring(fileName
                  .lastIndexOf('.'));
              fd.setFilterExtensions(new String[] { ext });
            }
            fd.setText(NLS.bind(
                Messages.XMPPConnectWizard_FILE_SAVE_TITLE,
                username));
            final String res = fd.open();
            if (res == null)
              event.reject();
            else {
              try {
                final FileOutputStream fos = new FileOutputStream(
                    new File(res));
                event.accept(fos, new IFileTransferListener() {
                  public void handleTransferEvent(
                      IFileTransferEvent event) {
                    // XXX Should have some some UI
                    // for transfer events
                    if (event instanceof IIncomingFileTransferReceiveDoneEvent) {
                      try {
                        fos.close();
                      } catch (final IOException e) {
                      }
                    }
                  }
                });
              } catch (final Exception e) {
                MessageDialog
                    .openError(
                        shell,
                        Messages.XMPPConnectWizard_RECEIVE_ERROR_TITLE,
                        NLS.bind(
                            Messages.XMPPConnectWizard_RECEIVE_ERROR_MESSAGE,
                            new Object[] {
                                fileName,
                                username,
                                e.getLocalizedMessage() }));
              }
            }
          } else
            event.reject();
        }
      });
    }

  };

  public void addPages() {
    page = new XMPPConnectWizardPage(usernameAtHost);
    addPage(page);
  }

  public void init(IWorkbench workbench, IContainer container) {
    shell = workbench.getActiveWorkbenchWindow().getShell();
    this.container = container;
    this.workbench = workbench;

    setWindowTitle(Messages.XMPPConnectWizard_WIZARD_TITLE);
  }

  public void init(IWorkbench workbench, IStructuredSelection selection) {
    shell = workbench.getActiveWorkbenchWindow().getShell();
    this.workbench = workbench;
    this.container = null;
    try {
      this.container = ContainerFactory.getDefault().createContainer(
          "ecf.xmpp.smack");
    } catch (final ContainerCreateException e) {
      // None
    }

    setWindowTitle(Messages.XMPPConnectWizard_WIZARD_TITLE);
  }

  private IWorkbench workbench;
  private IChatMessageSender icms;
  private ITypingMessageSender itms;

  private void openView() {
    try {
      final MultiRosterView view = (MultiRosterView) workbench
          .getActiveWorkbenchWindow().getActivePage()
          .showView(MultiRosterView.VIEW_ID);
      view.addContainer(container);
    } catch (final PartInitException e) {
      e.printStackTrace();
    }
  }

  private void displayMessage(IChatMessageEvent e) {
    final IChatMessage message = e.getChatMessage();
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        MessagesView view = (MessagesView) workbench
            .getActiveWorkbenchWindow().getActivePage()
            .findView(MessagesView.VIEW_ID);
        if (view != null) {
          final IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService) view
              .getSite().getAdapter(
                  IWorkbenchSiteProgressService.class);
          view.openTab(icms, itms, targetID, message.getFromID());
          view.showMessage(message);
          service.warnOfContentChange();
        } else {
          try {

            final IWorkbenchPage page = workbench
                .getActiveWorkbenchWindow().getActivePage();
            view = (MessagesView) page.showView(
                MessagesView.VIEW_ID, null,
                IWorkbenchPage.VIEW_CREATE);
            if (!page.isPartVisible(view)) {
              final IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService) view
                  .getSite()
                  .getAdapter(
                      IWorkbenchSiteProgressService.class);
              service.warnOfContentChange();
            }
            view.openTab(icms, itms, targetID, message.getFromID());
            view.showMessage(message);
          } catch (final PartInitException e) {
            e.printStackTrace();
          }
        }
      }
    });
  }

  private void displayTypingNotification(final ITypingMessageEvent e) {
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        final MessagesView view = (MessagesView) workbench
            .getActiveWorkbenchWindow().getActivePage()
            .findView(MessagesView.VIEW_ID);
        if (view != null)
          view.displayTypingNotification(e);
      }
    });
  }

  public boolean performCancel() {
    if (container != null) {
      container.dispose();

      IContainerManager containerManager = Activator.getDefault()
          .getContainerManager();
      if (containerManager != null) {
        containerManager.removeContainer(container);
      }
    }

    return super.performCancel();
  }

  public boolean performFinish() {
    final String connectID = page.getConnectID();
    final String password = page.getPassword();

    // Save combo text even if we don't successfully login
    page.saveComboText();

    connectContext = createConnectContext();

    try {
      targetID = IDFactory.getDefault().createID(
          container.getConnectNamespace(), connectID);
    } catch (final IDCreateException e) {
      new IDCreateErrorDialog(null, connectID, e).open();
      return false;
    }

    // Save combo items if targetID created successfully
    page.saveComboItems();

    final IPresenceContainerAdapter adapter = (IPresenceContainerAdapter) container
        .getAdapter(IPresenceContainerAdapter.class);

    container.addListener(new IContainerListener() {
      public void handleEvent(IContainerEvent event) {
        if (event instanceof IContainerConnectedEvent) {
          Display.getDefault().asyncExec(new Runnable() {
            public void run() {
              openView();
            }
          });
        }
      }
    });

    final IChatManager icm = adapter.getChatManager();
    icms = icm.getChatMessageSender();
    itms = icm.getTypingMessageSender();

    icm.addMessageListener(new IIMMessageListener() {
      public void handleMessageEvent(IIMMessageEvent e) {
        if (e instanceof IChatMessageEvent) {
          displayMessage((IChatMessageEvent) e);
        } else if (e instanceof ITypingMessageEvent) {
          displayTypingNotification((ITypingMessageEvent) e);
        }
      }
    });

    final ISendFileTransferContainerAdapter ioftca = (ISendFileTransferContainerAdapter) container
        .getAdapter(ISendFileTransferContainerAdapter.class);
    ioftca.addListener(requestListener);
    // Connect
    new AsynchContainerConnectAction(container, targetID, connectContext,
        null, new Runnable() {
          public void run() {
            cachePassword(connectID, password);
          }
        }).run();

    return true;
  }

  protected void cachePassword(final String connectID, String password) {
    if (password != null && !password.equals("")) {
      final PasswordCacheHelper pwStorage = new PasswordCacheHelper(
          connectID);
      pwStorage.savePassword(password);
    }
  }

  protected IConnectContext createConnectContext() {
    return ConnectContextFactory.createPasswordConnectContext(page
        .getPassword());
  }
}
TOP

Related Classes of org.eclipse.ecf.internal.provider.xmpp.ui.wizards.XMPPConnectWizard

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.