package uk.co.mmscomputing.device.capi; import java.io.*; import uk.co.mmscomputing.concurrent.TimeUnit; import uk.co.mmscomputing.concurrent.Semaphore; import uk.co.mmscomputing.util.metadata.Metadata; import uk.co.mmscomputing.device.capi.ctrl.ConnectReq; import uk.co.mmscomputing.device.capi.protocol.*; import uk.co.mmscomputing.device.capi.exception.*; public class CapiCallApplication extends CapiApplication{ public CapiCallApplication(Metadata md)throws CapiException{ super(md); } // ---- connect methods ---- public CapiChannel connect(ConnectReq msg,Semaphore blocker,long msecs)throws IOException{ // main application thread : wait for connection int reason; if(blocker==null){throw new CapiInformation(getClass().getName()+".connect:\n\tConnection request timed out.");} CapiPLC plc=newPLC(msg); // create new plc plc.setPickupBlocker(blocker); put(msg); // send ConnectReq to capi-controller; It should ring now somewhere ! try{ if(msecs<3000){msecs=3000;} // try at least 3 secs; gives us some time to receive ConnectConf blocker.tryAcquire(msecs,TimeUnit.MILLISECONDS); // wait until plc releases semaphore }catch(InterruptedException ie){} try{ CapiNCC ncc = plc.getNCC(); // throws ArrayIndexOutOfBoundsException if no ncc available if(ncc.isOpen()){return ncc;} // return open ncc plc.close(); // otherwise active disconnect reason = ncc.getDisconnectReason(); }catch(ArrayIndexOutOfBoundsException aioobe){ // no logical connection yet plc.close(); // active disconnect reason = plc.getDisconnectReason(); } if(reason==0x3490){throw new CapiInformation(getClass().getName()+".connect:\n\tConnection request timed out.");} throw new CapiIOException(reason); } public CapiChannel connect(ConnectReq msg,long msecs)throws IOException{ // main application thread : wait for connection return connect(msg,new Semaphore(0,true),msecs); } public CapiChannel connect(String remote,Semaphore s,long millisecs, BProtocol protocol)throws IOException{ String local=md.getString("capi.localno"); ConnectReq msg=new ConnectReq(appid,getControllerId(),CIP_SPEECH,remote,local,"","",protocol); return connect(msg,s,millisecs); } public CapiChannel connect(String remote,long millisecs, BProtocol protocol)throws IOException{ return connect(remote,new Semaphore(0,true),millisecs,protocol); } public CapiChannel connect(String remote,long millisecs)throws IOException{ int bandwidth=md.getInt("capi.bandwidth"); return connect(remote,millisecs,new SpeechProtocol(bandwidth)); } public CapiChannel faxconnect(String remote,Semaphore s,long millisecs,String header)throws IOException{ CapiController ctrl=getController(); if(!ctrl.isSupportingGroup3Fax()){ throw new CapiException(getClass().getName()+".faxconnect:\n\tController ["+ctrl.getId()+"] does not support fax T.30 protocol."); } String local=md.getString("capi.localno"); return connect(remote,s,millisecs,new FaxBProtocol(0,0,local,header)); } public CapiChannel faxconnect(String remote,long millisecs,String header)throws IOException{ return faxconnect(remote,new Semaphore(0,true),millisecs,header); } public CapiChannel faxconnect(String remote,Semaphore s,long millisecs,String local,String header)throws IOException{ CapiController ctrl=getController(); if(!ctrl.isSupportingGroup3Fax()){ throw new CapiException(getClass().getName()+".faxconnect:\n\tController ["+ctrl.getId()+"] does not support fax T.30 protocol."); } return connect(remote,s,millisecs,new FaxBProtocol(0,0,local,header)); } public CapiChannel faxconnect(String remote,long millisecs,String local,String header)throws IOException{ return faxconnect(remote,new Semaphore(0,true),millisecs,local,header); } }