Few more fixes

This commit is contained in:
Dmitry Isaenko 2020-05-10 20:06:13 +03:00
parent c78fdcdf12
commit 9871510547
2 changed files with 44 additions and 12 deletions

View file

@ -73,10 +73,8 @@ public class NxdtController implements Initializable {
dc.setTitle(rb.getString("tabSplMrg_Btn_SelectFolder"));
dc.setInitialDirectory(new File(saveToLocationLbl.getText()));
File saveToDir = dc.showDialog(saveToLocationLbl.getScene().getWindow());
if (saveToDir != null) {
if (saveToDir != null)
saveToLocationLbl.setText(saveToDir.getAbsolutePath());
statusLbl.setText("FreeSpace: "+saveToDir.getParentFile().getFreeSpace()); //TODO:REMOVE DEBUG
}
}
/**
* Start reading commands from NXDT button handler

View file

@ -40,6 +40,7 @@ class NxdtUsbAbi1 {
private String saveToPath;
private boolean isWindows;
private boolean isWindows10;
private static final int NXDT_MAX_COMMAND_SIZE = 0x1000;
private static final int NXDT_FILE_CHUNK_SIZE = 0x800000;
@ -87,6 +88,9 @@ class NxdtUsbAbi1 {
this.logPrinter = logPrinter;
this.isWindows = System.getProperty("os.name").toLowerCase().contains("windows");
if (isWindows)
isWindows10 = System.getProperty("os.name").toLowerCase().contains("windows 10");
if (! saveToPath.endsWith(File.separator))
this.saveToPath = saveToPath + File.separator;
else
@ -119,11 +123,11 @@ class NxdtUsbAbi1 {
handleSendFileProperties(directive);
break;
case CMD_ENDSESSION:
logPrinter.print("Session successfully ended", EMsgType.PASS);
logPrinter.print("Session successfully ended.", EMsgType.PASS);
return;
default:
writeUsb(USBSTATUS_UNSUPPORTED_CMD);
logPrinter.print("Unsupported command: " + command, EMsgType.FAIL);
logPrinter.print(String.format("Unsupported command 0x%08x", command), EMsgType.FAIL);
}
}
}
@ -138,21 +142,22 @@ class NxdtUsbAbi1 {
};
private boolean isInvalidDirective(byte[] message) throws Exception{
if (message.length < 0x10){
writeUsb(USBSTATUS_MALFORMED_REQUEST);
logPrinter.print("Directive is too small. Only "+message.length+" bytes received.", EMsgType.FAIL);
return true;
}
if (! Arrays.equals(Arrays.copyOfRange(message, 0,4), MAGIC_NXDT)){
writeUsb(USBSTATUS_INVALID_MAGIC);
logPrinter.print("Invalid 'MAGIC'", EMsgType.FAIL);
return true;
}
if (message.length < 0x10){
writeUsb(USBSTATUS_MALFORMED_REQUEST);
logPrinter.print("Directive is too small to be a command. Only "+message.length+" bytes received.", EMsgType.FAIL);
return true;
}
int payloadSize = getLEint(message, 0x8);
if (payloadSize + 0x10 != message.length){
writeUsb(USBSTATUS_MALFORMED_REQUEST);
logPrinter.print("Invalid directive size. "+message.length+" bytes received while "+payloadSize+" expected.", EMsgType.FAIL);
logPrinter.print("Invalid directive info block size. "+message.length+" bytes received while "+payloadSize+" expected.", EMsgType.FAIL);
return true;
}
return false;
@ -207,6 +212,9 @@ class NxdtUsbAbi1 {
writeUsb(USBSTATUS_SUCCESS);
if (isWindows10)
dumpFileOnWindowsTen(fileToDump, fileSize);
else
dumpFile(fileToDump, fileSize);
writeUsb(USBSTATUS_SUCCESS);
@ -259,6 +267,32 @@ class NxdtUsbAbi1 {
bos.close();
}
// @see https://bugs.openjdk.java.net/browse/JDK-8146538
private void dumpFileOnWindowsTen(File file, long size) throws Exception{
FileOutputStream fos = new FileOutputStream(file, true);
BufferedOutputStream bos = new BufferedOutputStream(fos);
FileDescriptor fd = fos.getFD();
byte[] readBuffer;
long received = 0;
int bufferSize;
while (received < size){
readBuffer = readUsbFile();
bos.write(readBuffer);
fd.sync(); // Fixes flushing under Windows (unharmful for other OS)
bufferSize = readBuffer.length;
received += bufferSize;
logPrinter.updateProgress((received + bufferSize) / (size / 100.0) / 100.0);
}
logPrinter.updateProgress(1.0);
bos.close();
}
/**
* Sending any byte array to USB device
* @return 'false' if no issues