/* * 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.server; import com.sun.voip.CallParticipant; import java.text.ParseException; import com.sun.voip.*; public class DirectCallHandler extends Thread implements CallEventListener { private CallParticipant cp; private DirectCallEventListener listener; public DirectCallHandler(CallParticipant cp, DirectCallEventListener ln) { this.cp = cp; listener = ln; } /* * start a two party call */ private DirectOutgoingCallHandler ch1, ch2; private int callState; public static final int INITIATED = 1; public static final int ESTABLISHED = 2; public static final int FAILED = 3; public static final int TERMINATED = 4; public static final int MIGRATED = 5; private Object stateLock = new Object(); public void run() { setState(INITIATED); ch1 = new DirectOutgoingCallHandler(cp); ch1.sendInvite(null); String sdp = null; try{ sdp = ch1.waitForOK(); } catch(Exception ex){ setState(FAILED); return; } CallParticipant cp2 = new CallParticipant(); cp2.setCallAnswerTimeout(cp.getCallAnswerTimeout()); cp2.setCallAnsweredTreatment(cp.getSecondPartyTreatment()); cp2.setCallEndTreatment(cp.getSecondPartyCallEndTreatment()); cp2.setCallId(cp.getSecondPartyCallId()); cp2.setConferenceId(cp.getConferenceId()); if (cp.getSecondPartyName() != null) { cp2.setName(cp.getSecondPartyName()); } else { cp2.setName(cp.getSecondPartyNumber()); } cp2.setDisplayName(cp.getName()); if (cp2.getCallId() == null) { cp2.setCallId(CallHandler.getNewCallId()); } cp2.setPhoneNumber(cp.getSecondPartyNumber()); cp2.setVoiceDetection(cp.getSecondPartyVoiceDetection()); ch2 = new DirectOutgoingCallHandler(cp2); ch1.setOtherCall(ch2); ch2.setOtherCall(ch1); ch2.sendInvite(sdp); try{ sdp = ch2.waitForOK(); ch1.sendAck(sdp); ch2.sendAck(null); setState(ESTABLISHED); ch1.waitForTerminate(); ch2.waitForTerminate(); setState(TERMINATED); } catch(Exception ex){ setState(FAILED); if(ch1.getState() != ch1.TERMINATED){ ch1.sendBye(); } if(ch2.getState() != ch2.TERMINATED){ ch2.sendBye(); } return; } } public void setState(int state){ synchronized(stateLock){ callState = state; stateLock.notifyAll(); } if(listener != null){ switch(state){ case INITIATED: listener.initiated(cp.getCallOwner(), cp.getCallId()); break; case ESTABLISHED: listener.established(cp.getCallOwner(), cp.getCallId()); break; case FAILED: listener.failed(cp.getCallOwner(), cp.getCallId()); break; case TERMINATED: listener.terminated(cp.getCallOwner(), cp.getCallId()); break; } } } public int stateChanged(){ synchronized(stateLock){ try { stateLock.wait(); } catch (InterruptedException ex) { ex.printStackTrace(); } return callState; } } public void migrateToBridge(){ terminate(); TwoPartyCallHandler tch = new TwoPartyCallHandler(this, cp); tch.start(); setState(MIGRATED); } public void terminate(){ if(callState != MIGRATED){ ch1.sendBye(); ch2.sendBye(); } else{ try{ ConferenceManager.endConference(cp.getConferenceId()); } catch(ParseException e){ Logger.println("Could not end conference"); } } } public void callEventNotification(CallEvent event) { } }