Package org.eclipse.ecf.protocol.msn

Source Code of org.eclipse.ecf.protocol.msn.DispatchSession

/*******************************************************************************
* Copyright (c) 2005, 2008 Remy Suen
* 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
*    Stoyan Boshev <s.boshev@prosyst.com> - [MSN] Session and subclasses needs to handle whitespace and exceptions better
******************************************************************************/
package org.eclipse.ecf.protocol.msn;

import java.io.IOException;
import java.net.ConnectException;
import org.eclipse.ecf.protocol.msn.internal.encode.ResponseCommand;

/**
* <p>
* The DispatchSession class connects to the dispatch server and retrieves the
* address of the notification server for the NotificationSession class
* to connect to. It currently does not serve any other purpose.
* </p>
*
* <p>
* <b>Note:</b> This class/interface is part of an interim API that is still
* under development and expected to change significantly before reaching
* stability. It is being made available at this early stage to solicit feedback
* from pioneering adopters on the understanding that any code that uses this
* API will almost certainly be broken (repeatedly) as the API evolves.
* </p>
*/
class DispatchSession extends Session {

  DispatchSession(MsnClient client) {
    super(client);
  }

  /**
   * Creates a new DispatchSocket to connect to the given hostname and port.
   *
   * @param hostname
   *            the host to be connected to
   * @param port
   *            the corresponding port number
   * @throws IOException
   *             If an I/O error occurs while attempting to open the
   *             SocketChannel
   */
  DispatchSession(String hostname, int port) throws IOException {
    super(hostname, port, null);
  }

  /**
   * Connects to the server specified during this DispatchSession's
   * construction and attempts to retrieve a viable notification server
   * address.
   *
   * @param username
   *            the name to use for authentication
   * @return a ResponseCommand which holds the information received from the
   *         dispatch server
   * @throws ConnectException
   *             If the MSN servers did not respond as expected.
   * @throws IOException
   *             If an I/O error occurs during the read or write operations
   */
  ResponseCommand connect(String username) throws ConnectException, IOException {
    write("VER", "MSNP11 CVR0"); //$NON-NLS-1$ //$NON-NLS-2$
    String input = super.read().trim();
    if (!input.startsWith("VER")) { //$NON-NLS-1$
      // TODO: throw a more descriptive exception
      throw new ConnectException("The server did not respond properly."); //$NON-NLS-1$
    }

    write("CVR", "0x040c winnt 5.1 i386 MSNMSGR 7.0.0813 msmsgs " //$NON-NLS-1$ //$NON-NLS-2$
        + username);
    input = super.read().trim();
    if (!input.startsWith("CVR")) { //$NON-NLS-1$
      // TODO: throw a more descriptive exception
      throw new ConnectException("The server did not respond properly."); //$NON-NLS-1$
    }

    write("USR", "TWN I " + username); //$NON-NLS-1$ //$NON-NLS-2$
    return new ResponseCommand(super.read().trim());
  }

  /**
   * Attempts to authenticate the given username with the MSN dispatch server.
   *
   * @param username
   *            the username to be authenticated with
   * @return the hostname of the notification server
   * @throws ConnectException
   *             If the MSN servers did not respond as expected.
   * @throws IOException
   *             If an I/O error occurs during the read or write operations
   */
  String authenticate(String username) throws ConnectException, IOException {
    final ResponseCommand received = connect(username);
    if (!received.getCommand().equals("XFR")) { //$NON-NLS-1$
      throw new ConnectException("The server did not respond properly."); //$NON-NLS-1$
    }
    return received.getParam(2);
  }

}
TOP

Related Classes of org.eclipse.ecf.protocol.msn.DispatchSession

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.