package uk.co.mmscomputing.device.capi;
import uk.co.mmscomputing.sms.*;
import uk.co.mmscomputing.util.metadata.*;
import uk.co.mmscomputing.device.capi.protocol.*;
public class CapiSMSPlugin implements CapiPlugin{
private SMSPluginReceiver receiver;
public CapiSMSPlugin(SMSPluginReceiver receiver){
this.receiver=receiver;
}
public void update(Object data, Metadata metadata){ // called from CapiServerApplication
if(data instanceof CapiMetadata.Indication){ // called from PickUp.indicateCall
CapiMetadata.Indication call=(CapiMetadata.Indication)data;
if(!call.isAccepted()){
SMSMetadata md=new SMSMetadata();
md.setState(SMSConstants.smsRinging);
md.setLocalNo(call.localno);
md.setRemoteNo(call.remoteno);
receiver.update(md.STATE,md); // tell application about call indication
if(md.getAccept()){
call.setPlugin(this); // let us 'serve' call
call.setAccept(0); // pick up now
call.setProtocol(new SpeechProtocol()); // expect voice call
// System.err.println("Accept sms call from "+call.remoteno);
}
}
}
}
public void serve(CapiChannel channel){ // from CapiSystem
new SMSThread(channel).start();
}
private class SMSThread extends Thread{
CapiChannel channel;
public SMSThread(CapiChannel channel){
this.channel=channel;
}
public void run(){
try{
SMSMetadata md=new SMSMetadata();
md.setState(SMSConstants.smsConnected);
receiver.update(md.STATE,md); // tell application accepted call
SMSPluginHandler sh=md.getHandler();
sh.run(
channel.getLocalNo(),
channel.getRemoteNo(),
channel.getPCMInputStream(),
channel.getPCMOutputStream()
);
md.setState(SMSConstants.smsDisconnected);
receiver.update(md.STATE,md); // tell app we are done
}catch(Exception e){
System.out.println("9\b"+getClass().getName()+".run\n\tDisconnected call.\n\t"+e);
e.printStackTrace();
}finally{
try{
channel.close();
}catch(Exception ioe){
System.err.println(getClass().getName()+".run:\n\t"+ioe);
System.out.println("3\b"+getClass().getName()+".run:\n\t"+ioe);
}
}
}
}
}