/* * IncallDTMFReferTransfer.java * * Copyright (c) 2004-2007 Brekeke Software, Inc. All rights reserved. * * BREKEKE JTAPI SDK Sample Program */ /******************************************************************/ /* This sample program will receive a call at a number "1234" */ /* and play an anouncement, catch DTMF, transfer the call to the */ /* DTMF number. */ /* This program uses REFER method for uattended transfer. */ /* Caller's phone needs to support REFER method. */ /* */ /* please make sure that there is the line */ /* use_refer_for_blind_transfer = true */ /* in provider.properties file. */ /******************************************************************/ import java.util.*; import javax.telephony.*; import javax.telephony.media.*; import javax.telephony.callcontrol.*; import com.brekeke.jtapi.*; public class IncallDTMFReferTransfer { static Hashtable transHash = new Hashtable(); // Hashtable for saving the call transfer statuses for each call public static void main(String args[]) { Provider myprovider = null; try { JtapiPeer peer = JtapiPeerFactory.getJtapiPeer("com.brekeke.jtapi.BrPeer"); // MUST HAVE /* Set your work directory of JTAPI in the second argument */ myprovider = peer.getProvider("BrProvider; pdir=C:/JTAPI1.0/work"); /* Add this if you need to know Register is successful or not */ myprovider.addProviderListener(new IncallDTMFReferTransfer.MyProviderListener()); /* * Start provider and register this Provider's number (1234) to OnDO * SIP Server */ myprovider.start(); } catch (Exception excp) { System.out.println("Can't get Provider: " + excp.toString()); System.exit(0); } try { /* Choose one address from the addresses this application has */ Terminal terminal = myprovider.getTerminal("1234"); terminal.addCallListener(new MyCallListener()); } catch (Exception excp) { System.out.println("Can't get Terminal: " + excp.toString()); System.exit(0); } } /* Listener for checking Register request result */ static class MyProviderListener implements com.brekeke.jtapi.BrProviderListener { public void eventRegistFail(BrProviderEvent event) { System.out.println("Register failed:" + event.getSourceUrl()); } public void eventRegistSuccess(BrProviderEvent event) { System.out.println("Register successful:" + event.getSourceUrl()); } public void providerInService(ProviderEvent event) { System.out.println("Provider bacame In Service"); } public void providerEventTransmissionEnded(ProviderEvent event) { } /* Not supported */ public void providerOutOfService(ProviderEvent event) { } /* Not supported */ public void providerShutdown(ProviderEvent event) { } } static class MyCallListener implements javax.telephony.TerminalConnectionListener { public void callActive(CallEvent event) { } public void callEventTransmissionEnded(CallEvent event) { } public void callInvalid(CallEvent event) { } public void multiCallMetaMergeEnded(MetaEvent event) { } /* Not supported */ public void multiCallMetaMergeStarted(MetaEvent event) { } /* Not supported */ public void multiCallMetaTransferEnded(MetaEvent event) { } /* Not supported */ public void multiCallMetaTransferStarted(MetaEvent event) { } /* Not supported */ public void singleCallMetaProgressEnded(MetaEvent event) { } /* Not supported */ public void singleCallMetaProgressStarted(MetaEvent event) { } /* Not supported */ public void singleCallMetaSnapshotEnded(MetaEvent event) { } /* Not supported */ public void singleCallMetaSnapshotStarted(MetaEvent event) { } /* Not supported */ public void connectionAlerting(ConnectionEvent event) { } public void connectionConnected(ConnectionEvent event) { Connection con = event.getConnection(); Address addr = con.getAddress(); String addr_name = addr.getName(); CallControlCall call = (CallControlCall) con.getCall(); TransferStatus stat = (TransferStatus) transHash.get(call); if (stat != null) { System.out.println("Status=" + stat.getStatus()); } System.out.println("Connection Connected:" + addr_name); if (addr_name.compareTo("1234") == 0) { if (stat != null) { if (stat.getStatus() <= TransferStatus.AnsweredCall) { //If 1234 answers a call, call playCall method. try { playCall(call, false); } catch (Exception e) { System.out.println("Exception when playCall: " + e); } } } else { System.out.println("Can't find the call from transHash"); } } } public void connectionCreated(ConnectionEvent event) { Connection con = event.getConnection(); Address addr = con.getAddress(); String addr_name = addr.getName(); System.out.println("Connection Created:" + addr_name); } public void connectionDisconnected(ConnectionEvent event) { Connection con = event.getConnection(); Address addr = con.getAddress(); String addr_name = addr.getName(); Call call = con.getCall(); System.out.println("Connection Disconnected:" + addr_name); TransferStatus stat = (TransferStatus) transHash.get(call); if (stat != null) { transHash.remove(call); call.removeCallListener(this); } } public void connectionFailed(ConnectionEvent event) { Connection con = event.getConnection(); Address addr = con.getAddress(); String addr_name = addr.getName(); System.out.println("Connection Failed:" + addr_name); CallControlCall _call = (CallControlCall) con.getCall(); TransferStatus stat = (TransferStatus) transHash.get(_call); if (stat == null) System.out.println("stat = null"); if (addr != null && stat != null) { System.out.println("Caller Name:" + stat.getCallerName()); System.out.println("Stat status:" + stat.getStatus()); if ((addr.getName()).compareTo(stat.getTransferAddr()) == 0) { if (stat.getStatus() == TransferStatus.CallTransferDst) { try { CallControlCall origcall = (CallControlCall) stat.getOrigCall(); playCall(origcall, true); //Transfer retry } catch (Exception e) { e.printStackTrace(); } } } } } public void connectionInProgress(ConnectionEvent event) { } public void connectionUnknown(ConnectionEvent event) { } public void terminalConnectionActive(TerminalConnectionEvent event) { final TerminalConnection _tc = event.getTerminalConnection(); Terminal term = _tc.getTerminal(); System.out.println("Terminal Connection is active!! :" + term.getName()); } public void terminalConnectionCreated(TerminalConnectionEvent event) { final TerminalConnection _tc = event.getTerminalConnection(); Terminal term = _tc.getTerminal(); System.out.println("Terminal Connection is created!! :" + term.getName()); } public void terminalConnectionDropped(TerminalConnectionEvent event) { TerminalConnection _tc = event.getTerminalConnection(); Terminal term = _tc.getTerminal(); System.out.println("Terminal Connection is dropped:" + term.getName()); Connection _c = _tc.getConnection(); CallControlCall _call = (CallControlCall) _c.getCall(); TransferStatus stat = (TransferStatus) transHash.get(_call); if (stat == null) System.out.println("stat = null"); if (term != null && stat != null) { System.out.println("Caller Name:" + stat.getCallerName()); System.out.println("Stat status:" + stat.getStatus()); if ((term.getName()).compareTo(stat.getTransferAddr()) == 0 && stat.getStatus() >= TransferStatus.CallTransferDst) { // Transfer failed and disconnect if (_call != null) { try { System.out.println("Disconnect original call."); _call.drop(); } catch (Exception e) { e.printStackTrace(); } } CallControlCall dstcall = (CallControlCall) stat.getDstCall(); if (dstcall != null) { try { System.out.println("Disconnect dst call."); dstcall.drop(); } catch (Exception e) { e.printStackTrace(); } } Address lastaddr = _call.getLastRedirectedAddress(); if (lastaddr != null) { System.out.println("lastaddr=" + lastaddr.getName()); } } } } public void terminalConnectionPassive(TerminalConnectionEvent event) { } //When 12345 receive INVITE request public void terminalConnectionRinging(TerminalConnectionEvent event) { try { final TerminalConnection _tc = event.getTerminalConnection(); Terminal term = _tc.getTerminal(); Call call = event.getCall(); Connection[] cons; String callerAddr = null; TransferStatus stat; System.out.println("Terminal Connection is Ringing!! :" + term.getName()); //When 1234 receives INVITE request if (term.getName().compareTo("1234") == 0) { if (call != null) { cons = call.getConnections(); if (cons.length > 0) { for (int i = 0; i < cons.length; ++i) { callerAddr = cons[i].getAddress().getName(); if (callerAddr.compareTo("1234") != 0) break; } } } stat = new TransferStatus(call, TransferStatCode.CallReceived); System.out.println("callerAddress=" + callerAddr); stat.setCallerName(callerAddr); transHash.put(call, stat); stat.setOrigTC((CallControlTerminalConnection) _tc); Runnable r = new Runnable() { public void run() { try { _tc.answer(); // Answer the call } catch (Exception excp) { System.out.println("Failed to answer:" + excp); excp.printStackTrace(); } }; }; Thread T = new Thread(r); T.start(); } } catch (Exception excp) { System.out.println("Failed in terminalConnectionRinging"); } } public void terminalConnectionUnknown(TerminalConnectionEvent event) { } } /** * Play an anouncement, receive DTMF, call the DTMF number ** */ static void playCall(Call call, boolean retry) throws Exception { new Thread(new CallPlayer(call, retry)).start(); } static class CallPlayer extends BasicMediaService implements Runnable { static RTC[] promptRTC = { RTC.SigDet_StopPlay }; CallControlCall call = null; TransferStatus transstat; boolean retry = false; static final Symbol stop = SignalDetector.p_Pattern[1]; static Hashtable patterns = new Hashtable(); static{ patterns.put(stop,"#"); } static RTC[] stopRTC = { new RTC(stop, SignalDetectorConstants.rtca_Stop)}; CallPlayer(Call call, boolean retry) { super((MediaProvider) call.getProvider()); this.call = (CallControlCall) call; this.retry = retry; } public void run() { try { bindToCall(ConfigSpec.basicConfig, call); /*** DTMF test ***/ setParameters(patterns); PlayerEvent playev = null; if (call != null) { transstat = (TransferStatus) transHash.get(call); transstat.setStatus(TransferStatus.Announce); //flushBuffer(); if (retry == false) // Play greeting playev = play("/sound/exgreeting.ul", 4, promptRTC, null); else{ // Play retry message playev = play("/sound/exreentering.ul", 4, promptRTC, null); } if (playev.getQualifier().equals(MediaConstants.q_Standard) || playev.getQualifier().equals(MediaConstants.q_Stop)) { transstat.setStatus(TransferStatus.AnnouncePlayed); System.out.println("status="+ ((TransferStatus) transHash.get(call)).getStatus()); SignalDetectorEvent sdev = null; while (true) { if (call != null) { try { transstat.setStatus(TransferStatus.DTMFwait); if(retry == false) sdev = retrieveSignals(5,null, stopRTC , null); else sdev = retrieveSignals(5,null, stopRTC , null); //Get DTMF signals (MAX 5 signals). If // caller push # (sprcified by stopRTC), DTMF detect will be // stopped. } catch (Exception ex) { ex.printStackTrace(); System.out.println("Failed to retrieve signals1:" + ex); ex.printStackTrace(); System.exit(0); } } try { System.out.println("signal qual = " + sdev.getQualifier()); if (sdev.getQualifier().equals( SignalDetectorConstants.q_NumSignals) || sdev.getQualifier().equals(SignalDetectorEvent.q_RTC )) { String sdtmf = sdev.getSignalString(); System.out.println("Detected DTMF =" + sdtmf); transstat.setTransferAddr(sdtmf); transstat.setStatus(TransferStatus.DTMFreceived); playev = null; // Play the number pushed for (int i = 0; i < sdtmf.length(); ++i) { if (playev == null || playev.getQualifier().equals( MediaConstants.q_Standard)) playev = play("/sound/char/" + sdtmf.charAt(i) + ".ul", 4, null, null); else break; } if (playev.getQualifier().equals(MediaConstants.q_Standard)) { //Make a call from 1234 to the pushed // DTMF number transstat.setStatus(TransferStatus.CallTransferDst); System.out.println("Transfer will be attempt:"+sdtmf); try{ call.transfer(sdtmf); } catch(ResourceUnavailableException re){ System.out.println("Transfer failed"); call.drop(); } } } else { playev = play("/sound/exreentering.ul", 4, promptRTC, null); if (playev.getQualifier().equals( MediaConstants.q_Standard) == false) { break; } // loop to try again. } } catch (Exception ex) { ex.printStackTrace(); System.out.println("Failed to retrieve signals2:" + ex); } } } if (isBound()) try { release(); } catch (Exception ex3) { } } } catch (Exception ex) { System.err.println(ex); } } } } /* * TransferStatus.java * * Copyright (c) 2004-2007 Brekeke Software, Inc. All rights reserved. * * BREKEKE JTAPI SDK Sample Program */ /** This is for storing the transfer status of each call **/ import javax.telephony.*; import javax.telephony.callcontrol.*; public class TransferStatus { public static final int CallReceived = 1; public static final int AnsweredCall = 2; public static final int Announce = 3; public static final int AnnouncePlayed = 4; public static final int DTMFwait = 5; public static final int DTMFreceived = 6; public static final int CallTransferDst = 7; private Call origcall; // Originator's call private CallControlTerminalConnection origtc; //Originator's terminal connction private int status; // Status private Call dstcall; // Call of Transfer destination private String transferadd; // Transfer destination's name (number) private String callername; // Caller's name (number) public TransferStatus(Call origcall, int stat){ this.origcall = origcall; this.status = stat; } public void setCallerName(String name){ callername = name; } public String getCallerName(){ return callername; } public void setOrigCall(Call origcall){ this.origcall = origcall; } public Call getOrigCall(){ return origcall; } public void setOrigTC(CallControlTerminalConnection tc){ this.origtc = tc; } public CallControlTerminalConnection getOrigTC(){ return origtc; } public void setStatus(int status){ this.status = status; } public int getStatus(){ return status; } public void setDstCall(Call dstcall){ this.dstcall = dstcall; } public Call getDstCall(){ return dstcall; } public void setTransferAddr(String addr){ this.transferadd = addr; } public String getTransferAddr(){ return transferadd; } }