package call; import java.io.IOException; import java.net.Socket; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Call extends AbstractId { private final Contact contact; private final Socket socket; @SuppressWarnings("unused") private final List<String> headers; private final Set<CallConnection> connections = new HashSet<>(); private ConnectionState state; public Call(Contact contact, Socket socket, List<String> headers) { this.contact = contact; this.socket = socket; this.headers = headers; this.state = ConnectionState.CONNECTING; } public void addConnection(CallConnection connection) { synchronized (connections) { connections.add(connection); } } public Contact getContact() { return contact; } public synchronized void close() { if (!state.equals(ConnectionState.CLOSED)) { state = ConnectionState.CLOSED; List<CallConnection> copy; synchronized (connections) { copy = new ArrayList<>(connections); } for (CallConnection connection : copy) { connection.onCallClose(); } try { socket.close(); } catch (IOException e) {} } } public synchronized void open() { if (!state.equals(ConnectionState.OPEN)) { state = ConnectionState.OPEN; List<CallConnection> copy; synchronized (connections) { copy = new ArrayList<>(connections); } for (CallConnection connection : copy) { connection.onCallOpen(); } } } public ConnectionState getState() { return state; } @Override public String getId() { return "Call<" + contact.getId() + ">"; } }