/* * Copyright 2007 Sun Microsystems, Inc. * * This file is part of jVoiceBridge. * * jVoiceBridge is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation and distributed hereunder * to you. * * jVoiceBridge is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Sun designates this particular file as subject to the "Classpath" * exception as provided by Sun in the License file that accompanied this * code. */ package com.sun.voip.client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.util.Vector; import com.sun.voip.CallEvent; import com.sun.voip.CallEventListener; import com.sun.voip.Logger; /** * Connect to the bridge */ public class BridgeConnector extends Thread { private Socket socket; private OutputStream output; private BufferedReader bufferedReader; private CallEvent event; private boolean connected; public BridgeConnector() throws IOException { this(null, 0); } public BridgeConnector(String serverName, int serverPort) throws IOException { this(serverName, serverPort, 0); } public BridgeConnector(String serverName, int serverPort, int timeout) throws IOException { if (serverName == null) { serverName = System.getProperty( "com.sun.voip.server.BRIDGE_SERVER_NAME", "escher.east.sun.com"); } if (serverPort == 0) { serverPort = Integer.getInteger( "com.sun.voip.server.Bridge.PORT", 6666).intValue(); } InetSocketAddress isa = new InetSocketAddress(serverName, serverPort); if (isa.isUnresolved()) { throw new IOException("BridgeConnector can't resolve hostname " + serverName); } Logger.println("Connecting to remote host " + serverName + ", port " + serverPort); // // Open a tcp connection to the remote host at the well-known port. // socket = new Socket(); socket.connect(isa, timeout); output = socket.getOutputStream(); bufferedReader = new BufferedReader( new InputStreamReader(socket.getInputStream())); start(); synchronized(this) { try { wait(); } catch(InterruptedException e) { } } } public Socket getSocket() { return socket; } public void sendCommand(String command) throws IOException { if (socket == null || connected == false) { throw new IOException("BridgeConnector: not connected"); } command += "\n"; output.write(command.getBytes()); } private Vector listeners = new Vector(); public void addCallEventListener(CallEventListener listener) { synchronized(listeners) { listeners.add(listener); } } public void removeCallEventListener(CallEventListener listener) { synchronized (listeners) { listeners.remove(listener); } } private void callEventNotification(CallEvent event) { this.event = event; synchronized(this) { notifyAll(); } Logger.println(event.toString()); synchronized(listeners) { for (int i = 0; i < listeners.size(); i++) { CallEventListener listener = (CallEventListener) listeners.get(i); listener.callEventNotification(event); } } } private boolean done; public void done() { if (done) { return; } done = true; if (socket != null) { try { socket.close(); } catch (IOException e) { Logger.println("Close failed for socket " + socket + " " + e.getMessage()); } socket = null; } if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { Logger.println("Close failed for bufferedReader for socket " + socket + " " + e.getMessage()); } bufferedReader = null; } } public void run() { connected = true; while (!done) { String s = null; try { s = bufferedReader.readLine(); } catch (IOException e) { if (done == false) { System.err.println("can't read socket! " + socket + " " + e.getMessage()); } break; } if (s == null && done == false) { Logger.println("can't read socket! " + socket); break; } callEventNotification(new CallEvent(s)); } connected = false; } public String toString() { if (socket != null && connected) { return socket.toString(); } return "not connected"; } }