package uk.co.mmscomputing.device.capi.samples;
import java.io.*;
import uk.co.mmscomputing.util.metadata.*;
import uk.co.mmscomputing.device.capi.*;
import uk.co.mmscomputing.device.capi.ncc.DisconnectB3Req;
import uk.co.mmscomputing.device.capi.protocol.BProtocol;
public class TerminalEchoServer implements MetadataListener, Runnable{
private CapiServerApplication server;
public TerminalEchoServer()throws IOException{
// CapiEnumerator e=new CapiEnumerator();
// System.out.println("CapiEnumerator:\n\n"+e.toString()+"\n\n");
}
private void receive(final CapiChannel channel,final String destfile){
new Thread(){ // read capi input as byte data
public void run(){
try{
InputStream in =channel.getInputStream();
OutputStream out=channel.getOutputStream();
OutputStream fout=new FileOutputStream(destfile);
int count=0,b;
while((b=in.read())!=-1){
if(b==0x1B){break;} // ESC quit
System.out.println("Received Byte ["+count+"]"+((char)b)+" "+Integer.toHexString(b));
out.write(b);out.flush(); // send received characters straight back
fout.write(b); // save data to file
count++;
}
fout.close();
channel.close();
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
public void update(Object data, Metadata metadata){
if(data instanceof CapiMetadata.Indication){
handleIndication((CapiMetadata.Indication)data);
}else if(data instanceof Exception){
System.err.println(data);
// System.err.println(((Exception)data).getMessage());
((Exception)data).printStackTrace();
}else{
System.err.println(data);
}
System.out.println(data);
}
public void handleIndication(CapiMetadata.Indication mdi){
// minicom default is 8N1 8bit; no parity; 1 stop bit
mdi.setAccept(0); // 0=don't wait
// physical layer : 8 : modem async start/stop byte framing
// data link layer: 1 : transparent
// network layer : 7 : modem
StructOut b1=new StructOut(12); // B1 configuration protocol 8; Modem asynch start/stop byte frames; [1]p.113
b1.writeWord(0); // max bit rate 1200,2400...; 0=adaptive
b1.writeWord(8); // bits per character
b1.writeWord(0); // parity 0=>None 1=>Odd 2=>even
b1.writeWord(0); // stop bits 0=>1bit, 1=>2bit
b1.writeWord(2); // options
b1.writeWord(3); // 0: none; 2: V.100; 3: speed negotiation - V.8
/*
If I use 8,1,7 I get a lot of random data first.
*/
// mdi.protocol=new BProtocol(8,1,7,b1,StructOut.empty,StructOut.empty,StructOut.empty);
// mdi.protocol=new BProtocol(8,1,7,StructOut.empty,StructOut.empty,StructOut.empty,StructOut.empty);
// network layer : 7 : modem with all negotiations
// data link layer: 7 : modem with full negotiation V.42
// network layer : 7 : modem
// mdi.protocol=new BProtocol(7,7,7,StructOut.empty,StructOut.empty,StructOut.empty,StructOut.empty);
/*
If I use 7,7,7 default I do not get any random data.
uk.co.mmscomputing.device.capi.parameter.NCPI$Modem
rate = 33600
protocol = 0x11
V.42/V.42 bis successfully negotiated.
Compression successfully negotiated.
*/
mdi.protocol=new BProtocol(7,7,7,b1,StructOut.empty,StructOut.empty,StructOut.empty);
}
public void run(){
CapiMetadata md = new CapiMetadata();
md.useMaxLogicalConnections(CapiEnumerator.getNoOfBChannels());
md.useALaw(); // set some defaults
md.use64kBit();
md.acceptAllCalls();
md.useController(1);
md.addListener(this);
try{
server=new CapiServerApplication(md);
server.start();
while(true){
CapiChannel channel=server.accept();
if(channel==null){break;}
receive(channel,"uk/co/mmscomputing/TESTest.txt");
}
}catch(Exception e){
e.printStackTrace();
}
}
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:)
server.close();
break;
}
}
is.close();
}
public static void main(String[] args){
System.err.println("TerminalEchoServer");
try{
TerminalEchoServer app=new TerminalEchoServer();
new Thread(app).start();
app.checkInput();
System.err.println("Stopped TerminalEchoServer");
}catch(Exception e){
e.printStackTrace();
}
}
}