/*
* JSoftPhone.java
*
* Created on February 24, 2002, 8:48 AM
*/
import javax.telephony.*;
import javax.telephony.events.*;
import javax.telephony.media.events.*;
/*
* XTAPI JTapi implementation
* Copyright (C) 2002 Steven A. Frare
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* @author Steven A. Frare
* @version .01
*/
// Provider around line 584
public class JSoftPhone2 extends javax.swing.JFrame implements CallObserver{
private Provider myprovider = null;
private Terminal m_terminal = null;
private Call m_call = null;
private Connection m_connections[] = null;
private TerminalConnection m_terminalConnection = null;
private TerminalConnection m_destTerminalConnection = null;
private boolean bOrig = false; // Did we originate this call?
/** Creates new form JSoftPhone */
public JSoftPhone2() {
initComponents ();
btnCall.setMnemonic('c');
btnAnswer.setMnemonic('a');
btnHangup.setMnemonic('h');
pack ();
java.awt.Rectangle r = getBounds();
setBounds(r);
setResizable(false);
java.awt.Toolkit oToolkit = java.awt.Toolkit.getDefaultToolkit();
java.awt.Dimension d = oToolkit.getScreenSize();
setLocation((d.width / 2) - (r.width / 2),(d.height / 2) - (r.height / 2));
setTitle("JSoftPhone");
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the FormEditor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
jPanel1 = new javax.swing.JPanel();
btn1 = new javax.swing.JButton();
btn2 = new javax.swing.JButton();
btn3 = new javax.swing.JButton();
btn4 = new javax.swing.JButton();
btn5 = new javax.swing.JButton();
btn6 = new javax.swing.JButton();
btn7 = new javax.swing.JButton();
btn8 = new javax.swing.JButton();
btn9 = new javax.swing.JButton();
btnPound = new javax.swing.JButton();
btn0 = new javax.swing.JButton();
btnStar = new javax.swing.JButton();
jPanel2 = new javax.swing.JPanel();
lstLines = new javax.swing.JComboBox();
jPanel9 = new javax.swing.JPanel();
txtPhone = new javax.swing.JTextField();
lblMisc = new javax.swing.JLabel();
jPanel3 = new javax.swing.JPanel();
btnCall = new javax.swing.JButton();
btnAnswer = new javax.swing.JButton();
btnHangup = new javax.swing.JButton();
jPanel4 = new javax.swing.JPanel();
jPanel7 = new javax.swing.JPanel();
lblOrigConnState = new javax.swing.JLabel();
jPanel8 = new javax.swing.JPanel();
lblOrigTConnState = new javax.swing.JLabel();
jPanel5 = new javax.swing.JPanel();
lblConnState = new javax.swing.JLabel();
jPanel6 = new javax.swing.JPanel();
lblTermConnState = new javax.swing.JLabel();
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
public void windowActivated(java.awt.event.WindowEvent evt) {
formWindowActivated(evt);
}
}
);
jPanel1.setLayout(new java.awt.GridLayout(4, 3));
btn1.setText("1");
btn1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
}
);
jPanel1.add(btn1);
btn2.setText("2");
btn2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
}
);
jPanel1.add(btn2);
btn3.setText("3");
btn3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton3ActionPerformed(evt);
}
}
);
jPanel1.add(btn3);
btn4.setText("4");
btn4.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton4ActionPerformed(evt);
}
}
);
jPanel1.add(btn4);
btn5.setText("5");
btn5.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton5ActionPerformed(evt);
}
}
);
jPanel1.add(btn5);
btn6.setText("6");
btn6.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton6ActionPerformed(evt);
}
}
);
jPanel1.add(btn6);
btn7.setText("7");
btn7.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton7ActionPerformed(evt);
}
}
);
jPanel1.add(btn7);
btn8.setText("8");
btn8.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton8ActionPerformed(evt);
}
}
);
jPanel1.add(btn8);
btn9.setText("9");
btn9.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton9ActionPerformed(evt);
}
}
);
jPanel1.add(btn9);
btnPound.setText("#");
btnPound.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton10ActionPerformed(evt);
}
}
);
jPanel1.add(btnPound);
btn0.setText("0");
btn0.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton11ActionPerformed(evt);
}
}
);
jPanel1.add(btn0);
btnStar.setText("*");
btnStar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton12ActionPerformed(evt);
}
}
);
jPanel1.add(btnStar);
getContentPane().add(jPanel1, java.awt.BorderLayout.WEST);
jPanel2.setLayout(new java.awt.GridLayout(2, 1));
lstLines.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
lstLinesActionPerformed(evt);
}
}
);
lstLines.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
lstLinesPropertyChange(evt);
}
}
);
jPanel2.add(lstLines);
jPanel9.setLayout(new java.awt.GridLayout(1, 2));
jPanel9.add(txtPhone);
lblMisc.setText("N/A");
jPanel9.add(lblMisc);
jPanel2.add(jPanel9);
getContentPane().add(jPanel2, java.awt.BorderLayout.NORTH);
jPanel3.setLayout(new java.awt.GridLayout(3, 1));
btnCall.setText("Call");
btnCall.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCallActionPerformed(evt);
}
}
);
jPanel3.add(btnCall);
btnAnswer.setText("Answer");
btnAnswer.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnAnswerActionPerformed(evt);
}
}
);
jPanel3.add(btnAnswer);
btnHangup.setText("Hangup");
btnHangup.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnHangupActionPerformed(evt);
}
}
);
jPanel3.add(btnHangup);
getContentPane().add(jPanel3, java.awt.BorderLayout.EAST);
jPanel4.setLayout(new java.awt.GridLayout(2, 2));
jPanel7.setBorder(new javax.swing.border.SoftBevelBorder(1));
lblOrigConnState.setText("N/A");
jPanel7.add(lblOrigConnState);
jPanel4.add(jPanel7);
jPanel8.setBorder(new javax.swing.border.SoftBevelBorder(1));
lblOrigTConnState.setText("N/A");
jPanel8.add(lblOrigTConnState);
jPanel4.add(jPanel8);
jPanel5.setBorder(new javax.swing.border.SoftBevelBorder(1));
lblConnState.setText("N/A");
jPanel5.add(lblConnState);
jPanel4.add(jPanel5);
jPanel6.setBorder(new javax.swing.border.SoftBevelBorder(1));
lblTermConnState.setText("N/A");
jPanel6.add(lblTermConnState);
jPanel4.add(jPanel6);
getContentPane().add(jPanel4, java.awt.BorderLayout.SOUTH);
}//GEN-END:initComponents
private void btnHangupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnHangupActionPerformed
// Add your handling code here:
/*
for(int loop = 0; loop < m_connections.length; loop++)
{
try{
m_connections[loop].disconnect();
}catch(Exception e){
System.out.println("Disconnect exception.");
}
}
*/
try{
if(true == bOrig)
m_connections[0].disconnect();
else
m_connections[1].disconnect();
}catch(Exception e){
System.out.println("Hangup Error: " + e.toString());
}
// Take a nap for an arbitrary amount of time and see if we get any events.
int timeOut = 0;
while(timeOut < 10)
{
try{
Thread.currentThread().sleep(20);
timeOut++;
} catch (Exception excp) {
System.out.println("Event wait error: " + excp.toString());
}
}
// Reset our member vars.
m_call = null;
m_connections = null;
m_terminalConnection = null;
m_destTerminalConnection = null;
lstLines.enable(true);
}//GEN-LAST:event_btnHangupActionPerformed
private void btnAnswerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAnswerActionPerformed
// Add your handling code here:
if(null == m_terminalConnection)
{
javax.swing.JOptionPane.showMessageDialog(
this, "No TerminalConnection is available.");
}
else
{
/* Answer the telephone Call using "inner class" thread */
try {
final TerminalConnection _tc = m_destTerminalConnection;
Runnable r = new Runnable() {
public void run(){
try{
_tc.answer();
} catch (Exception excp){
// handle answer exceptions
System.out.println(excp.toString());
}
};
};
Thread T = new Thread(r);
T.start();
} catch (Exception excp) {
// Handle Exceptions;
System.out.println("Exception in btnAnswerActionPerformed: " + excp.toString()) ;
}
}
}//GEN-LAST:event_btnAnswerActionPerformed
private void formWindowActivated(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowActivated
// Add your handling code here:
txtPhone.requestFocus();
}//GEN-LAST:event_formWindowActivated
private void btnCallActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCallActionPerformed
// Add your handling code here:
// Create the telephone call object and add an observer.
if(null != m_terminal)
{
if(null == m_call)
{
try {
m_call = myprovider.createCall();
m_call.addObserver(this);
} catch (Exception excp) {
// Handle exceptions
System.err.println("Exception creating call: " + excp) ;
}
try {
Address[] a = m_terminal.getAddresses();
m_connections = m_call.connect(m_terminal, a[0], txtPhone.getText());
} catch (Exception excp) {
System.out.println("Exception placing call: " + excp.toString());
}
try{
// wait for event to come in
Thread.currentThread().sleep(4000); // hack -- should wait for event
TerminalConnection[] tc = m_connections[0].getTerminalConnections();
m_terminalConnection = tc[0];
tc = m_connections[1].getTerminalConnections();
m_destTerminalConnection = tc[0];
Terminal t = m_destTerminalConnection.getTerminal();
t.addCallObserver(this);
}catch(Exception e){
//e.printStackTrace();
System.out.println("Exception getting remote terminal");
}
bOrig = true;
lstLines.enable(false);
}
else
{
javax.swing.JOptionPane.showMessageDialog(
this, "Please hangup the current call first.");
}
}
else
{
javax.swing.JOptionPane.showMessageDialog(
this, "Please select a valid Terminal first.");
}
}//GEN-LAST:event_btnCallActionPerformed
private void lstLinesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lstLinesActionPerformed
// Add your handling code here:
javax.swing.JComboBox j = (javax.swing.JComboBox)evt.getSource();
try{
if(null != m_terminal)
m_terminal.removeCallObserver(this);
}catch(Exception e){}//ignore the error
m_terminal = (Terminal)j.getSelectedItem();
try{
m_terminal.addCallObserver(this);
}catch(Exception e){
javax.swing.JOptionPane.showMessageDialog(
this, "Unable to add a CallObserver to the selected Terminal.");
}
//System.out.println("Selected Terminal " + m_terminal);
}//GEN-LAST:event_lstLinesActionPerformed
private void lstLinesPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_lstLinesPropertyChange
// Add your handling code here:
}//GEN-LAST:event_lstLinesPropertyChange
private void jButton12ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton12ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "*");
}//GEN-LAST:event_jButton12ActionPerformed
private void jButton11ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton11ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "0");
}//GEN-LAST:event_jButton11ActionPerformed
private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton10ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "#");
}//GEN-LAST:event_jButton10ActionPerformed
private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton9ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "9");
}//GEN-LAST:event_jButton9ActionPerformed
private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton8ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "8");
}//GEN-LAST:event_jButton8ActionPerformed
private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton7ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "7");
}//GEN-LAST:event_jButton7ActionPerformed
private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton6ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "6");
}//GEN-LAST:event_jButton6ActionPerformed
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton5ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "5");
}//GEN-LAST:event_jButton5ActionPerformed
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "4");
}//GEN-LAST:event_jButton4ActionPerformed
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "3");
}//GEN-LAST:event_jButton3ActionPerformed
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "2");
}//GEN-LAST:event_jButton2ActionPerformed
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
// Add your handling code here:
txtPhone.setText(txtPhone.getText() + "1");
}//GEN-LAST:event_jButton1ActionPerformed
/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
myprovider.shutdown();
System.exit (0);
}//GEN-LAST:event_exitForm
/**
* @param args the command line arguments
*/
public static void main (String args[]) {
JSoftPhone2 o = new JSoftPhone2 ();
java.awt.Cursor cursor = o.getCursor();
o.show ();
o.setCursor(WAIT_CURSOR);
o.initJTapi();
o.setCursor(cursor);
}
private void initJTapi()
{
try {
JtapiPeer peer = JtapiPeerFactory.getJtapiPeer(
//"net.xtapi.XJtapiPeer");
"net.sourceforge.gjtapi.GenericJtapiPeer");
//myprovider = peer.getProvider(null);
//myprovider = peer.getProvider("Serial");
myprovider = peer.getProvider("net.sourceforge.gjtapi.raw.xtapi.XtapiProvider; XtapiSp = TAPI");
Terminal[] t = myprovider.getTerminals();
for(int loop = 0; loop < t.length; loop++)
{
lstLines.insertItemAt(t[loop],loop);
}
} catch (Exception excp) {
excp.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(
this, "Can not get a provider.");
}
}
/**
* Reports all events associated with the Call object. This method passes
* an array of CallEv objects as its arguments which correspond to the list
* of events representing the changes to the Call object as well as changes
* to all of the Connection and TerminalConnection objects associated with
* this Call.
* <p>
* @param eventList The list of Call events.
*/
public void callChangedEvent(CallEv[] eventList)
{
if(m_call == null)
{
bOrig = false;
setMVars(eventList[0].getCall());
}
//System.out.println("callChangedEvent");
for (int i = 0; i < eventList.length; i++)
{
if (eventList[i] instanceof TermConnEv)
terminalEvent(eventList[i],true);
else if
(eventList[i] instanceof ConnEv)
connectionEvent(eventList[i]);
else
System.out.println("Unknown callChangedEvent");
}
}
private void setMVars(Call c)
{
m_call = c;
try{
m_connections = c.getConnections();
TerminalConnection[] tc;
if(bOrig == false)
{
m_call.addObserver(this);
tc = m_connections[0].getTerminalConnections();
m_terminalConnection = tc[0];
Terminal t = m_terminalConnection.getTerminal();
t.addCallObserver(this);
}
// We already have the m_terminalConnection var, we now need the
// remote terminal connection. Since m_call had to be null for us
// to get here we did not place this call. So the remote connection
// is the origination connection which is always the first connection
// the the m_connections array.
tc = m_connections[1].getTerminalConnections();
m_destTerminalConnection = tc[0];
setConnectionLabel(false, m_connections[1].getState());
setConnectionLabel(true, m_connections[0].getState());
lstLines.enable(false);
}catch(Exception e){
System.out.println("Error in setMVars: " + e.toString());
}
}
private void connectionEvent(CallEv evt)
{
try{
if(m_connections != null)
{
setConnectionLabel(false, m_connections[1].getState());
setConnectionLabel(true, m_connections[0].getState());
}
}catch(Exception e){
System.out.println("Exception in connectionEvent: " + e.toString());
}
}
public void terminalEvent(CallEv evt, boolean bEvent)
{
// We want to display the Origination and destination
// TerminalConnection events.
//Origination
setTerminalConnLabel(true, m_terminalConnection.getState());
//Destination
if (m_destTerminalConnection != null)
setTerminalConnLabel(false, m_destTerminalConnection.getState());
}
private void setConnectionLabel(boolean orig, int state)
{
switch(state)
{
case ConnAlertingEv.ID:
if(!orig)
lblConnState.setText("ALERTING");
else
lblOrigConnState.setText("ALERTING");
break;
case ConnInProgressEv.ID:
if(!orig)
lblConnState.setText("INPROGRESS");
else
lblOrigConnState.setText("INPROGRESS");
break;
case ConnConnectedEv.ID:
if(!orig)
lblConnState.setText("CONNECTED");
else
lblOrigConnState.setText("CONNECTED");
break;
case ConnDisconnectedEv.ID:
if(!orig)
lblConnState.setText("DISCONNECTED");
else
{
lblOrigConnState.setText("DISCONNECTED");
m_call = null;
}
break;
case ConnUnknownEv.ID:
if(!orig)
lblConnState.setText("UNKNOWN");
else
{
lblOrigConnState.setText("UNKNOWN");
m_call = null;
}
break;
// Connections start out in the IDLE state when they
// are created.
case ConnCreatedEv.ID:
if(!orig)
lblConnState.setText("IDLE");
else
lblOrigConnState.setText("IDLE");
break;
default:
if(!orig)
lblConnState.setText("UNKNOWN ID: " + state );
else
lblOrigConnState.setText("UNKNOWN ID: " + state );
break;
}
}
private void setTerminalConnLabel(boolean orig, int state)
{
switch(state)
{
case TermConnActiveEv.ID:
if(!orig)
lblTermConnState.setText("ACTIVE");
else
lblOrigTConnState.setText("ACTIVE");
break;
case TermConnRingingEv.ID:
if(!orig)
lblTermConnState.setText("RINGING");
else
lblOrigTConnState.setText("RINGING");
break;
case TermConnDroppedEv.ID:
if(!orig)
lblTermConnState.setText("DROPPED");
else
lblOrigTConnState.setText("DROPPED");
break;
case TermConnUnknownEv.ID:
if(!orig)
lblTermConnState.setText("UNKNOWN");
else
lblOrigTConnState.setText("UNKNOWN");
break;
// Terminal Connections start out in the IDLE state when they
// are created.
case TermConnCreatedEv.ID:
if(!orig)
lblTermConnState.setText("IDLE");
else
lblOrigTConnState.setText("IDLE");
break;
default:
if(!orig)
lblTermConnState.setText("UNKNOWN ID: " + state );
else
lblOrigTConnState.setText("UNKNOWN ID: " + state );
break;
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel jPanel1;
private javax.swing.JButton btn1;
private javax.swing.JButton btn2;
private javax.swing.JButton btn3;
private javax.swing.JButton btn4;
private javax.swing.JButton btn5;
private javax.swing.JButton btn6;
private javax.swing.JButton btn7;
private javax.swing.JButton btn8;
private javax.swing.JButton btn9;
private javax.swing.JButton btnPound;
private javax.swing.JButton btn0;
private javax.swing.JButton btnStar;
private javax.swing.JPanel jPanel2;
private javax.swing.JComboBox lstLines;
private javax.swing.JPanel jPanel9;
private javax.swing.JTextField txtPhone;
private javax.swing.JLabel lblMisc;
private javax.swing.JPanel jPanel3;
private javax.swing.JButton btnCall;
private javax.swing.JButton btnAnswer;
private javax.swing.JButton btnHangup;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel7;
private javax.swing.JLabel lblOrigConnState;
private javax.swing.JPanel jPanel8;
private javax.swing.JLabel lblOrigTConnState;
private javax.swing.JPanel jPanel5;
private javax.swing.JLabel lblConnState;
private javax.swing.JPanel jPanel6;
private javax.swing.JLabel lblTermConnState;
// End of variables declaration//GEN-END:variables
}