@@ -37,7 +37,7 @@ class NxdtUsbAbi1 {
3737 private final String saveToPath ;
3838 private final NxdtTask parent ;
3939
40- private boolean isWindows ;
40+ private final boolean isWindows ;
4141 private boolean isWindows10 ;
4242
4343 private static final int NXDT_MAX_DIRECTIVE_SIZE = 0x1000 ;
@@ -77,6 +77,8 @@ class NxdtUsbAbi1 {
7777 0x00 , 0x00 , 0x00 , 0x00 ,
7878 0x00 , 0x00 , 0x00 , 0x00 };
7979
80+ private static final long W_MAX_PACKET_SIZE = 0x200 ;
81+
8082 public NxdtUsbAbi1 (DeviceHandle handler ,
8183 ILogPrinter logPrinter ,
8284 String saveToPath ,
@@ -136,7 +138,7 @@ private void readLoop(){
136138 logPrinter .print (e .getMessage (), EMsgType .INFO );
137139 logPrinter .print ("Terminating now" , EMsgType .FAIL );
138140 }
139- };
141+ }
140142
141143 private boolean isInvalidDirective (byte [] message ) throws Exception {
142144 if (message .length < 0x10 ){
@@ -256,52 +258,66 @@ private void createPath(String path) throws Exception{
256258 }
257259
258260 private void dumpFile (File file , long size ) throws Exception {
259- BufferedOutputStream bos = new BufferedOutputStream (new FileOutputStream (file , false ));
260-
261- byte [] readBuffer ;
262- long received = 0 ;
263- int bufferSize ;
264-
265- while (received < size ){
266- readBuffer = readUsbFile ();
267- bos .write (readBuffer );
268- bufferSize = readBuffer .length ;
269- received += bufferSize ;
270- logPrinter .updateProgress ((received + bufferSize ) / (size / 100.0 ) / 100.0 );
261+ try (BufferedOutputStream bos = new BufferedOutputStream (new FileOutputStream (file , false ))) {
262+ byte [] readBuffer ;
263+ long received = 0 ;
264+ int bufferSize ;
265+
266+ boolean zlt_expected = isAligned (size );
267+
268+ while (received < size ) {
269+ readBuffer = readUsbFile ();
270+ bos .write (readBuffer );
271+ bufferSize = readBuffer .length ;
272+ received += bufferSize ;
273+ logPrinter .updateProgress ((received + bufferSize ) / (size / 100.0 ) / 100.0 );
274+ }
275+
276+ if (zlt_expected ) {
277+ logPrinter .print ("Finishing with ZLT packet request" , EMsgType .INFO );
278+ readUsbFile ();
279+ }
280+ } finally {
281+ logPrinter .updateProgress (1.0 );
271282 }
272- logPrinter .updateProgress (1.0 );
273- bos .close ();
274283 }
275284
276285 // @see https://bugs.openjdk.java.net/browse/JDK-8146538
277286 private void dumpFileOnWindowsTen (File file , long size ) throws Exception {
278287 FileOutputStream fos = new FileOutputStream (file , true );
279- BufferedOutputStream bos = new BufferedOutputStream (fos );
280- FileDescriptor fd = fos .getFD ();
281288
282- byte [] readBuffer ;
283- long received = 0 ;
284- int bufferSize ;
289+ try (BufferedOutputStream bos = new BufferedOutputStream (fos )) {
290+ FileDescriptor fd = fos .getFD ();
291+ byte [] readBuffer ;
292+ long received = 0 ;
293+ int bufferSize ;
285294
286- while (received < size ){
287- readBuffer = readUsbFile ();
288- bos .write (readBuffer );
289- fd .sync (); // Fixes flushing under Windows (unharmful for other OS)
290- bufferSize = readBuffer .length ;
291- received += bufferSize ;
295+ boolean zlt_expected = isAligned (size );
292296
293- logPrinter .updateProgress ((received + bufferSize ) / (size / 100.0 ) / 100.0 );
294- }
297+ while (received < size ) {
298+ readBuffer = readUsbFile ();
299+ bos .write (readBuffer );
300+ fd .sync (); // Fixes flushing under Windows (unharmful for other OS)
301+ bufferSize = readBuffer .length ;
302+ received += bufferSize ;
295303
296- logPrinter .updateProgress (1.0 );
297- bos .close ();
304+ logPrinter .updateProgress ((received + bufferSize ) / (size / 100.0 ) / 100.0 );
305+ }
306+
307+ if (zlt_expected ) {
308+ logPrinter .print ("Finishing with ZLT packet request" , EMsgType .INFO );
309+ readUsbFile ();
310+ }
311+ } finally {
312+ logPrinter .updateProgress (1.0 );
313+ }
314+ }
315+ /** Handle Zero-length terminator **/
316+ private boolean isAligned (long size ){
317+ return ((size & (W_MAX_PACKET_SIZE - 1 )) == 0 );
298318 }
299319
300- /**
301- * Sending any byte array to USB device
302- * @return 'false' if no issues
303- * 'true' if errors happened
304- * */
320+ /** Sending any byte array to USB device **/
305321 private void writeUsb (byte [] message ) throws Exception {
306322 ByteBuffer writeBuffer = ByteBuffer .allocateDirect (message .length );
307323 writeBuffer .put (message );
@@ -312,18 +328,16 @@ private void writeUsb(byte[] message) throws Exception{
312328
313329 int result = LibUsb .bulkTransfer (handlerNS , (byte ) 0x01 , writeBuffer , writeBufTransferred , 5050 );
314330
315- switch (result ){
316- case LibUsb .SUCCESS :
317- if (writeBufTransferred .get () == message .length )
318- return ;
319- throw new Exception ("Data transfer issue [write]" +
320- "\n Requested: " +message .length +
321- "\n Transferred: " +writeBufTransferred .get ());
322- default :
323- throw new Exception ("Data transfer issue [write]" +
324- "\n Returned: " + UsbErrorCodes .getErrCode (result ) +
325- "\n (execution stopped)" );
331+ if (result == LibUsb .SUCCESS ) {
332+ if (writeBufTransferred .get () == message .length )
333+ return ;
334+ throw new Exception ("Data transfer issue [write]" +
335+ "\n Requested: " + message .length +
336+ "\n Transferred: " + writeBufTransferred .get ());
326337 }
338+ throw new Exception ("Data transfer issue [write]" +
339+ "\n Returned: " + UsbErrorCodes .getErrCode (result ) +
340+ "\n (execution stopped)" );
327341
328342 }
329343 /**
0 commit comments