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.*; import uk.co.mmscomputing.device.capi.protocol.BProtocol; public class SimpleModemDataReceiver implements MetadataListener, Runnable{ static CapiMetadata md = new CapiMetadata(); static final private int DefaultB3DataBlockSize=128; CapiServerApplication server; public SimpleModemDataReceiver()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{ int size; InputStream in =channel.getInputStream(); OutputStream out=new FileOutputStream(destfile); size = (in.read()&0x00FF)<<24; size |= (in.read()&0x00FF)<<16; size |= (in.read()&0x00FF)<< 8; size |= (in.read()&0x00FF); int maxBlocks = size/DefaultB3DataBlockSize; int residue = size%DefaultB3DataBlockSize; System.out.println("Expect "+size+" bytes 0x"+Integer.toHexString(size)); int len; int count = 0; byte[] buffer = new byte[DefaultB3DataBlockSize]; for(int i=0;(i<maxBlocks)&&((len=in.read(buffer))!=-1);i++){ out.write(buffer,0,len); count+=len; System.out.println("Received "+count+" bytes of "+size); } len=in.read(buffer,0,residue); out.write(buffer,0,len); count+=len; System.out.println("Received "+count+" bytes of "+size); System.err.println((count==size)?"Successful Transfer":"Unsuccessful Transfer"); out.close(); out=channel.getOutputStream(); out.write(count&0x00FF);count>>=8; out.write(count&0x00FF);count>>=8; out.write(count&0x00FF);count>>=8; out.write(count&0x00FF); out.flush(); out.close(); // channel.close(); }catch(Exception ioe){ ioe.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); } } public void handleIndication(CapiMetadata.Indication mdi){ mdi.setAccept(0); // 0=don't wait // network layer : 7 : modem with all negotiations // data link layer: 7 : modem with full negotiation V.42 // network layer : 7 : modem /*Eicon Diva -> Eicon Diva uk.co.mmscomputing.device.capi.parameter.NCPI$Modem rate = 33600 protocol = 0x11 V.42/V.42 bis successfully negotiated. Compression successfully negotiated. AVM Fritz doesn't support this */ // physical layer : 8 : modem async start/stop byte framing // data link layer: 1 : transparent // network layer : 7 : modem /*Eicon Diva -> Eicon Diva uk.co.mmscomputing.device.capi.parameter.NCPI$Modem rate = 33600 protocol = 0x4 Transparent mode successfully negotiated. AVM Fritz -> Eicon Diva uk.co.mmscomputing.device.capi.parameter.NCPI$Modem rate = 14400 protocol = 0x4 Transparent mode successfully negotiated. Eicon Diva -> AVM Fritz Doesn't seem to work AVM Fritz -> AVM Fritz uk.co.mmscomputing.device.capi.parameter.NCPI$Modem rate = 22284 protocol = 0x1 V.42/V.42 bis successfully negotiated. */ mdi.protocol=new BProtocol(8,1,7,StructOut.empty,StructOut.empty,StructOut.empty,StructOut.empty); } public void run(){ 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/SMDRTest.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("SimpleModemDataReceiver"); try{ SimpleModemDataReceiver app=new SimpleModemDataReceiver(); new Thread(app).start(); app.checkInput(); }catch(Exception e){ System.err.println(e); } } }