@@ -37,7 +37,7 @@ class NxdtUsbAbi1 {
37
37
private final String saveToPath ;
38
38
private final NxdtTask parent ;
39
39
40
- private boolean isWindows ;
40
+ private final boolean isWindows ;
41
41
private boolean isWindows10 ;
42
42
43
43
private static final int NXDT_MAX_DIRECTIVE_SIZE = 0x1000 ;
@@ -77,6 +77,8 @@ class NxdtUsbAbi1 {
77
77
0x00 , 0x00 , 0x00 , 0x00 ,
78
78
0x00 , 0x00 , 0x00 , 0x00 };
79
79
80
+ private static final long W_MAX_PACKET_SIZE = 0x200 ;
81
+
80
82
public NxdtUsbAbi1 (DeviceHandle handler ,
81
83
ILogPrinter logPrinter ,
82
84
String saveToPath ,
@@ -136,7 +138,7 @@ private void readLoop(){
136
138
logPrinter .print (e .getMessage (), EMsgType .INFO );
137
139
logPrinter .print ("Terminating now" , EMsgType .FAIL );
138
140
}
139
- };
141
+ }
140
142
141
143
private boolean isInvalidDirective (byte [] message ) throws Exception {
142
144
if (message .length < 0x10 ){
@@ -256,52 +258,66 @@ private void createPath(String path) throws Exception{
256
258
}
257
259
258
260
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 );
271
282
}
272
- logPrinter .updateProgress (1.0 );
273
- bos .close ();
274
283
}
275
284
276
285
// @see https://bugs.openjdk.java.net/browse/JDK-8146538
277
286
private void dumpFileOnWindowsTen (File file , long size ) throws Exception {
278
287
FileOutputStream fos = new FileOutputStream (file , true );
279
- BufferedOutputStream bos = new BufferedOutputStream (fos );
280
- FileDescriptor fd = fos .getFD ();
281
288
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 ;
285
294
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 );
292
296
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 ;
295
303
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 );
298
318
}
299
319
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 **/
305
321
private void writeUsb (byte [] message ) throws Exception {
306
322
ByteBuffer writeBuffer = ByteBuffer .allocateDirect (message .length );
307
323
writeBuffer .put (message );
@@ -312,18 +328,16 @@ private void writeUsb(byte[] message) throws Exception{
312
328
313
329
int result = LibUsb .bulkTransfer (handlerNS , (byte ) 0x01 , writeBuffer , writeBufTransferred , 5050 );
314
330
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 ());
326
337
}
338
+ throw new Exception ("Data transfer issue [write]" +
339
+ "\n Returned: " + UsbErrorCodes .getErrCode (result ) +
340
+ "\n (execution stopped)" );
327
341
328
342
}
329
343
/**
0 commit comments