// file: $ISIP_IFC/class/java/ConnectionManager/ConnectionManager.java // version: $Id: ConnectionManager.java 10231 2005-09-13 14:29:38Z stanley $ // import necessary java libraries // import java.awt.*; import java.awt.image.*; import javax.swing.*; import java.awt.event.*; import java.util.*; import java.net.*; /** * Uses a DemoNetworkHandler to connect to the specified network * and then processes network messages. */ public class ConnectionManager extends JFrame implements Runnable, DemoEventProcessable, DemoNetworkListener, DemoProtocol { //------------------------------------------------------------------------- // // public constants // //------------------------------------------------------------------------- /** * The name represents this client. */ public static String player_name_d; /** * Default delay time (40 milliseconds). */ public static int DELAY_TIME = 1000/25; //------------------------------------------------------------------------ // // protected data // //----------------------------------------------------------------------- /** * Thread for this client. */ protected Thread thread_d; /** * Process events */ protected DemoEventProcessor event_processor_d; /** * Network handler for this client. */ protected DemoNetworkHandler network_handler_d; /** * The player represents the client. */ protected DemoPlayer player_d; /** * Default IP address for the Control Server. */ protected String process_manager_ip_d ; /** * Default port number of Control Server. */ protected int process_manager_port_d; /** * IP address for the client to run. */ protected static InetAddress local_ip_address_d; /** * Port number of the Hub. Retrieved from the server. */ protected int hub_port_d = HUB_PORT_UNDEFINED; /** * Port number used by Galaxy Communicator Hub to connect to this * client * * This number is used by the galaxy hub to listen also on server side */ protected int client_port_d ; /** * A boolean value indicate the mode of the UI: client or server */ protected boolean server_mode_d = true; /** * A string value that stores the type of demo that is running. */ protected String demo_type_d; /** * A boolean value to indicate if we are connected */ protected boolean connected_d = false; /** * A string value to popup to the user in case something bad happens */ protected String error_str_d = "Unable to connect to network or " + "server is down!"; protected final static int HUB_PORT_UNDEFINED = -1; //------------------------------------------------------------------------- // // public methods // //------------------------------------------------------------------------- /** * Initializes the DemoEventProcessor and * DemoNetworkHandler using default parameters values. */ public ConnectionManager() { // Just make the object // an empty constructor } /** * Initializes the DemoEventProcessor and * DemoNetworkHandler using the specified parameter * values. * * @param client_port_a port number of this client * @param process_manager_port_a port number the control server * are listening server * @param process_manager_ip_a an IP address for the control * @param server_mode_a a boolean value indicating the mode (true: * server; false: client) */ public ConnectionManager(int client_port_a, int process_manager_port_a, String process_manager_ip_a, boolean server_mode_a, String demo_type_a) { System.out.println("A connection manager has been created to handle " + "a [" + demo_type_a + "] demo. Proccess manager " + "ip[" + process_manager_ip_a + "] and port[" + process_manager_port_a + "]"); demo_type_d = demo_type_a; process_manager_ip_d = process_manager_ip_a; process_manager_port_d = process_manager_port_a; client_port_d = client_port_a; server_mode_d = server_mode_a; event_processor_d = new DemoEventProcessor(this); network_handler_d = new DemoNetworkHandler(); network_handler_d.init(process_manager_ip_d, process_manager_port_d, this); connected_d = true; } /** * Initializes the DemoEventProcessor and * DemoNetworkHandler using the specified parameter * values. * * @param client_port_a port number of this client * @param process_manager_port_a port number the control server * are listening server * @param process_manager_ip_a an IP address for the control * @param server_mode_a a boolean value indicating the mode (true: * server; false: client) * * @return a boolean value indictating status. */ public boolean init(int client_port_a, int process_manager_port_a, String process_manager_ip_a, boolean server_mode_a, String demo_type_a) { System.out.println("A connection manager has been init'd to handle " + "a [" + demo_type_a + "] demo. Proccess manager " + "ip[" + process_manager_ip_a + "] and port[" + process_manager_port_a + "]"); demo_type_d = demo_type_a; process_manager_ip_d = process_manager_ip_a; process_manager_port_d = process_manager_port_a; client_port_d = client_port_a; server_mode_d = server_mode_a; event_processor_d = new DemoEventProcessor(this); // Create one of these guys and test to make sure it worked ok // network_handler_d = new DemoNetworkHandler(); boolean returnval = network_handler_d.init(process_manager_ip_d, process_manager_port_d, this); if (returnval = false) { return false; } connected_d = true; return true; } //------------------------------------------------------------------------- // // class-specific public methods: // set methods // //------------------------------------------------------------------------- /** * Set the thread for this client. * * @param thread_a a thread object. * * @return a boolean value indicating status. */ public boolean setThread(Thread thread_a) { thread_d = thread_a; // exit gracefully // return true; } //------------------------------------------------------------------------- // // class-specific public methods: // get methods // //------------------------------------------------------------------------- /** * Get the thread for this client. * * @return a thread object of the current client. */ public Thread getThread() { return thread_d; } /** * Get the hub port of the server. * * @return the port number of the hub running on the server */ public synchronized int getHubPort() { while (hub_port_d == HUB_PORT_UNDEFINED && connected_d == true) { try { wait(100); } catch (Exception e) { System.out.println(" wait satement throw a exception"); } } return hub_port_d; } /** * Get the error message for this client. * * @return a String object with an error message. */ public String getDisconnectErrorMessage() { return error_str_d; } /** * This is the threaded part of the class. This method is * automatically called after calling start() on the * loop member data. It processes the received * network events, sleeps for 40 milliseconds, and then starts * over processing events again. */ public void run() { // local variables // long startTime; long waitTime; long elapsedTime; Thread thisThread = Thread.currentThread(); while (thread_d == thisThread) { startTime = System.currentTimeMillis(); // process received events // event_processor_d.processEventList(); // handle frame rate // elapsedTime = System.currentTimeMillis() - startTime; waitTime = Math.max(DELAY_TIME - elapsedTime, 5); try { Thread.sleep(waitTime); } catch (InterruptedException e) { } } System.out.println("Connection Manager Thread ended"); dispose(); } /** * This method is required by the DemoEventProcessable * interface. The networkMessageReceived() * method of this class adds the events to the * DemoEventProcessor 's event list. The * DemoEventProcessor will remove the events and send them * to its associated DemoEventProcessable handler * (this class) by calling the handleEvent() method * of the handler. * * @param event_a the network event sent by the * DemoEventProcessor . * * @return a boolean value indicating status. */ public boolean handleEvent(AWTEvent event_a) { switch(event_a.getID()) { case DemoNetworkEvent.NETWORK_MESSAGE_RECEIVED: System.out.println("Network Message Received:" + ((DemoNetworkEvent)event_a).getMessage()); handleNetworkMessage(((DemoNetworkEvent)event_a).getMessage()); break; case DemoNetworkEvent.NETWORK_DISCONNECTED: System.out.println("Network Disconnected"); exitProgram(); break; default: System.out.println("Unknown event given to Connection Manager" + "handleEvent()"); System.out.println("Event is " + event_a.getID()); break; } // exit gracefully // return true; } /** * This method is where the specific network events are processed. * The handleEvent() method sends all * DemoNetworkEvents except for * NETWORK_DISCONNECTED to this method. * * @param message_a the String message describing a * network event. * * @return a boolean value indicating status. */ public boolean handleNetworkMessage(String message_a) { // extract message type // StringTokenizer st = new StringTokenizer(message_a, "|"); int type = -10; try { type = Integer.parseInt(st.nextToken()); } catch (Exception ex) { System.out.println("ConnnectManager-handleNetworkMessage(): " + "unable to parse integer. Value of message " + "is [" + message_a + "]"); ex.printStackTrace(); return false; } // branch according to different types // switch (type) { case MSG_INIT_PLAYER: player_d = new DemoPlayer(Integer.parseInt(st.nextToken())); if (server_mode_d) { player_name_d = "true"; } else { player_name_d = "false"; } if (demo_type_d == "SPEECH_ANALYSIS") { network_handler_d.sendMessage(DEMO_SPEECH_ANALYSIS + "|" + player_name_d); } else if (demo_type_d == "SPEECH_RECOGNITION") { network_handler_d.sendMessage(DEMO_SPEECH_RECOGNITION + "|" + player_name_d); } else if (demo_type_d == "DIALOG_NAVIGATION") { network_handler_d.sendMessage(DEMO_DIALOG_NAVIGATION + "|" + player_name_d); } else if (demo_type_d == "SPEAKER_VERIFICATION") { network_handler_d.sendMessage(DEMO_SPEAKER_VERIFICATION + "|" + player_name_d); } else { System.out.println("Unknown demo type given to Connection " + "Manager handleNetworkMessage()"); System.out.println("Type is " + demo_type_d); } network_handler_d.sendMessage(MSG_SET_NAME + "|" + player_name_d); try { local_ip_address_d = InetAddress.getLocalHost(); network_handler_d.sendMessage(MSG_CLIENT_IP_ADDRESS + "|" + local_ip_address_d.getHostAddress()); network_handler_d.sendMessage(MSG_CLIENT_PORT + "|" + client_port_d); // set the ip address // player_d.setIPAddress(local_ip_address_d.getHostAddress()); // set port number // player_d.setPortNumber(client_port_d); } catch (UnknownHostException uhe) { System.out.println("Error - unable to resolve localhost" + uhe); } try { thread_d.sleep(1000); } catch(InterruptedException e) { } network_handler_d.sendMessage(MSG_START_DEMO + "|" + player_name_d); System.out.println("Finished sending MSG_START_DEMO signal"); break; case MSG_SET_NAME: player_d.setName(st.nextToken()); System.out.println("Player's name set to[" + player_d.getName() + "]"); break; case MSG_SET_HUB_PORT: try { hub_port_d = Integer.parseInt(st.nextToken()); } catch (Exception e) { System.out.println("Client failed to retrive the Hub port" + ", so demo needs to be restarted!"); exitProgram(); disconnect(); } break; case MSG_CLIENT_IP_ADDRESS: System.out.println("Client already knows it's own IP address. " + "So why send it from server->client?"); break; case MSG_CLIENT_PORT: System.out.println("Client already knows it's own port address. " + "So why send it from server->client?"); break; case MSG_SERVER_FAILURE: System.out.println("Server had a problem! Pop up a box and " + "exit demo"); System.err.println("Server had a problem! Pop up a box and " + "exit demo"); // Setup saying there is no longer a connection // exitProgram(); // Find the error message and set as ConnectionManager error msg. // String error = st.nextToken(); if (error == null) error = "None Given"; error_str_d = "Server reported failure of [" + error + "]. Exiting client"; dispose(); break; default: System.out.println("Unknown message given to Connection " + "Manager: handleNetworkMessage()"); System.out.println("Message is[" + message_a + "] and type is [" + type + "]"); break; } // exit gracefully // return true; } /** * Adds the received network event to the event processor's * event list. * * @param event_a the received network event. * * @return a boolean value indicating status. */ public boolean networkMessageReceived(DemoNetworkEvent event_a) { event_processor_d.addEvent(event_a); // exit gracefully // return true; } /** * Adds the received NETWORK_DISCONNECTED event to * the event processor's event list. * * @param event_a the received network event. * * @return a boolean value indicating status. */ public boolean networkDisconnected(DemoNetworkEvent event_a) { // This is about to go ahead and disconnect this so short-cut it // a bit and set connected to false // connected_d = false; event_processor_d.addEvent(event_a); // exit gracefully // return true; } /** * Sets the Thread named loop equal * to null . This will end the while loop in the * run() method. * * @return a boolean value indicating status. */ public boolean exitProgram() { thread_d = null; connected_d = false; // exit gracefully // return true; } /** * Returns the value of whether the Connection Manager is still connected * to the server side. * * @return a boolean value indicating status. */ public boolean isStillConnected() { return connected_d; } /** * Sends a network message using the associated * DemoNetworkHandler . * * @param server_name_a the name of the server to add to the server list * @param server_pid_a the PID of the server * * @return a boolean value indicating status. */ public boolean addServerList(String server_name_a, int server_pid_a) { System.out.println("in ConnectionManager.addServerList() with " + "server[" + server_name_a + "] pid[" + server_pid_a + "]"); network_handler_d.sendMessage(MSG_SET_SERVER + "|" + server_name_a + "|" + server_pid_a); // exit gracefully // return true; } /** * Disconnect the network connection. * * @return a boolean value indicating status. */ public boolean disconnect() { return network_handler_d.disconnect(); } }