package uk.co.mmscomputing.device.capi.ncc; import uk.co.mmscomputing.device.capi.*; public class DataB3Req extends MsgOut{ private int nptr=0; private int handle; private int nlen; private int flags; private long n64ptr=0; private byte[] payload; static private int getStructSize(int nlen){ if(jcapi.ptrSize==4){ // local 32 bit return 10; }else if(jcapi.ptrSize==8){ // local 64 bit return 18; }else{ // send via network return 18+nlen; } } public DataB3Req(int appid, int ncci, int handle, int flags, byte[] payload,int nlen){ super(getStructSize(nlen),appid,CAPI_DATA_B3,CAPI_REQ,ncci); if(jcapi.ptrSize==4){ nptr=jcapi.acquireNative32bitDataPtr(payload); // need to keep native pointer valid until DataB3Conf writeDWord(nptr); // 0: space for 32 bit pointer writeWord(nlen); // 4: payload len writeWord(handle); // 6: referenced in DATA_B3_CONF writeWord(flags); // 8: // 10: 22 bytes up until here }else if(jcapi.ptrSize==8){ n64ptr=jcapi.acquireNative64bitDataPtr(payload); // need to keep native pointer valid until DataB3Conf writeDWord(0); // 0: space for 32 bit pointer writeWord(nlen); // 4: payload len writeWord(handle); // 6: referenced in DATA_B3_CONF writeWord(flags); // 8: writeQWord(n64ptr); // 10: space for 64 bit pointer // 18: 30 bytes up until here }else{ // does not work yet writeDWord(0); // 0: space for 32 bit pointer writeWord(nlen); // 4: payload len writeWord(handle); // 6: referenced in DATA_B3_CONF writeWord(flags); // 8: writeQWord(0); // 10: space for 64 bit pointer writeData(payload,0,nlen); // 18: 30 bytes up until here } this.handle =handle; this.nlen =nlen; this.flags =flags; this.payload =payload; } public void release(){ // call when DataB3Conf received if(nptr!=0){ jcapi.releaseNative32bitDataPtr(payload,nptr); nptr=0; }else if(n64ptr!=0){ jcapi.releaseNative64bitDataPtr(payload,n64ptr); n64ptr=0; } } protected void finalize()throws Throwable{release();} public String toString(){ String s=super.toString(); if(n64ptr!=0){ s+="n64ptr = 0x"+Long.toHexString(n64ptr)+"\n"; }else{ s+="nptr = 0x"+Integer.toHexString(nptr)+"\n"; } s+="nlen = "+nlen+"\n"; s+="handle = "+handle+"\n"; s+="flags = 0"+Integer.toBinaryString(flags)+"b\n"; return s; } public int getHandle(){ return handle;} public byte[] getData(){return payload;} }