blob: 98a9a5921afc401e035e41407109443f63858002 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}