package uk.co.mmscomputing.device.capi.samples; import java.io.*; import java.util.*; import javax.sound.sampled.*; import uk.co.mmscomputing.util.metadata.*; import uk.co.mmscomputing.sound.*; import uk.co.mmscomputing.device.capi.*; import uk.co.mmscomputing.device.capi.sound.*; import uk.co.mmscomputing.device.capi.ctrl.*; import uk.co.mmscomputing.device.capi.protocol.*; import uk.co.mmscomputing.device.capi.plc.*; import uk.co.mmscomputing.device.capi.parameter.*; import uk.co.mmscomputing.device.capi.q931.*; import uk.co.mmscomputing.device.capi.exception.*; public class KeypadCodeSender implements MetadataListener, Runnable{ static AudioFormat pcmformat = new AudioFormat(8000,16,1,true,false); static int bufsize = 512; CapiCallApplication appl; CapiMetadata md; Thread thread; String keypadcode; public KeypadCodeSender(String localno, String keypadcode)throws IOException{ this.keypadcode=keypadcode; // phone number to accept md=new CapiMetadata(); md.useMaxLogicalConnections(1); // need only one connection md.useController(1); // use first controller md.useALaw(); // set some defaults md.use64kBit(); md.addListener(this); // want to listen; md.putString("capi.localno",localno); // your local number appl=new CapiCallApplication(md); appl.start(); // start capi thread } private CapiChannel connectKeyPad(String keypadcode)throws IOException{ int bandwidth = md.getInt("capi.bandwidth"); int ctrlid = md.getInt("capi.controller.id"); String localno = md.getString("capi.localno"); System.out.println("msn = "+localno+" dial keypad code = "+keypadcode); KeypadFacility.Out kpf=new KeypadFacility.Out(keypadcode); AdditionalInfo.Out addInfo=new AdditionalInfo.Out(kpf); StructOut calling=new CallingPartyNumber.Out(localno); ConnectReq msg=new ConnectReq( appl.getApplID(),ctrlid,appl.CIP_SPEECH, StructOut.empty, calling, StructOut.empty, StructOut.empty, new SpeechProtocol(), StructOut.empty,StructOut.empty,StructOut.empty, addInfo ); return appl.connect(msg,20000); } public void run(){ try{ System.err.println("Try connecting to "+keypadcode+". Will wait for 20 sec."); final CapiChannel channel=connectKeyPad(keypadcode); // send connect request and wait for connection (max 20 sec.) System.err.println("Connected to "+keypadcode); try{ SourceDataLine out=SoundMixerEnumerator.getOutputLine(pcmformat,bufsize); // get default sound output i.e. speaker CapiInputStream input=channel.getInputStream(); InputStream in=new PCMInputStream(input,channel.isALaw());; int count, bytesWritten=0; byte[] buffer = new byte[bufsize]; out.start(); while(channel.isOpen()&&((count=in.read(buffer))!=-1)){ out.write(buffer,0,count); bytesWritten+=count; } in.close(); out.drain(); out.stop(); out.close(); System.err.println("wrote input "+bytesWritten+" byte(s)"); }catch(Exception e){ e.printStackTrace(); System.err.println(e.getMessage()); } channel.close(); }catch(Exception e){ e.printStackTrace(); System.err.println(e.getMessage()); }finally{ appl.close(); } } public void update(Object data, Metadata metadata){ if(data instanceof DisconnectInd){ // disconnected -> close application }else if(data instanceof Exception){ System.err.println(data); // System.err.println(((Exception)data).getMessage()); ((Exception)data).printStackTrace(); }else{ System.err.println(data); } } public void checkInput()throws IOException{ BufferedReader is=new BufferedReader(new InputStreamReader(System.in)); String inputline; while((inputline=is.readLine())!=null){ // System.out.println("input: "+inputline); if(inputline.equals("quit")){ // type 'quit' on command line to quit:) appl.close(); break; } } is.close(); } /* BT-Land: PSTN *#001# "No services are in operation on this line" ISDN keypad facility does not seem to exist Germany: ISDN *21*NumberToForwardTo# program & activate call forwarding *21# activate call forwarding #21# deactivate call forwarding *#21# interrogate about call forwarding many more */ public static void main(String[] argv){ try{ String localno="12345"; if(argv.length>0){localno=argv[0];} String keypadcode="*#001#"; if(argv.length>1){keypadcode=argv[1];} System.err.println("\nStart KeypadCodeSender : msn="+localno+" keypad code="+keypadcode); System.err.println("\n\tType 'quit' on command line to quit:)\n"); KeypadCodeSender phone=new KeypadCodeSender(localno,keypadcode); new Thread(phone).start(); phone.checkInput(); }catch(ArrayIndexOutOfBoundsException aioobe){ System.err.println("\n\nInvalid arguments:\nUsage: java uk.co.mmscomputing.device.capi.samples.KeypadCodeSender localno keypadcode\n\n"); }catch(Exception e){ e.printStackTrace(); } System.err.println("End KeypadCodeSender."); } }