package uk.co.mmscomputing.device.capi;
import uk.co.mmscomputing.device.capi.exception.*;
public class CapiSystem extends Thread{
private CapiMetadata md = null;
private CapiServerApplication server = null;
private CapiSystem()throws CapiException{
md=new CapiMetadata();
md.useMaxLogicalConnections(CapiEnumerator.getNoOfBChannels());
md.useALaw(); // set some defaults
md.use64kBit();
md.acceptAllCalls();
md.setController(1);
server=new CapiServerApplication(md); // registers capi application, otherwise throws exception
server.start(); // start listening to incoming capi calls
}
public int getController(){ return md.getController();}
public void setController(int no){ md.setController(no);}
public CapiCallApplication getCaller(){ return server;}
public CapiServerApplication getServer(){ return server;}
public CapiPanel getGUI()throws CapiInformation{ return new CapiPanel(md);}
public void run(){
try{
while(server.isRunning()){
CapiChannel channel=server.accept(); // accept incoming calls here
if(!server.isRunning()){break;}
channel.getPlugin().serve(channel); // call plugin
}
}catch(InterruptedException ie){
}finally{
server=null;
}
// System.err.println(getClass().getName()+".run: CLOSED");
}
public void close(){if(server!=null){server.close();}}
public void addPlugin(CapiPlugin plugin){
md.addListener(0,plugin);
}
public void addPlugin(int index,CapiPlugin plugin){
md.addListener(index,plugin);
printPlugins();
}
public void removePlugin(CapiPlugin plugin){
md.removeListener(plugin);
}
public void printPlugins(){
System.err.println(md);
}
static private CapiSystem system = null;
synchronized static public CapiSystem getSystem()throws CapiException{
if(system!=null){return system;} // if a capi system is already running return
system=new CapiSystem();
system.start();
system.addPlugin(new CapiInfoPlugin()); // first plugin: will make capi application ignore calls by default
return system;
}
}