More refactoring

This commit is contained in:
Dmitry Isaenko 2020-05-10 02:51:31 +03:00
parent dfcc2c9927
commit 0307eaaa90
3 changed files with 62 additions and 49 deletions

View file

@ -47,6 +47,18 @@ public class RainbowHexDump {
+ "\n"); + "\n");
} }
public static void hexDumpUTF8ForWin(byte[] byteArray){
for (int i=0; i < byteArray.length; i++)
System.out.print(String.format("%02d-", i%100));
System.out.println(">"+byteArray.length);
for (byte b: byteArray)
System.out.print(String.format("%02x ", b));
System.out.println();
System.out.print("\t\t\t"
+ new String(byteArray, StandardCharsets.UTF_8)
+ "\n");
}
public static void hexDumpUTF16LE(byte[] byteArray){ public static void hexDumpUTF16LE(byte[] byteArray){
System.out.print(ANSI_BLUE); System.out.print(ANSI_BLUE);
for (int i=0; i < byteArray.length; i++) for (int i=0; i < byteArray.length; i++)

View file

@ -104,8 +104,8 @@ class NxdtUsbAbi1 {
while (true){ while (true){
directive = readUsbDirective(); directive = readUsbDirective();
RainbowHexDump.hexDumpUTF8(directive); RainbowHexDump.hexDumpUTF8ForWin(directive);
if (isInvalidDirective(directive)) if (isInvalidDirective(directive))
continue; continue;
@ -123,6 +123,7 @@ class NxdtUsbAbi1 {
return; return;
default: default:
writeUsb(USBSTATUS_UNSUPPORTED_CMD); writeUsb(USBSTATUS_UNSUPPORTED_CMD);
logPrinter.print("Unsupported command: " + command, EMsgType.FAIL);
} }
} }
} }
@ -142,7 +143,7 @@ class NxdtUsbAbi1 {
logPrinter.print("Invalid 'MAGIC'", EMsgType.INFO); logPrinter.print("Invalid 'MAGIC'", EMsgType.INFO);
return true; return true;
} }
if (message.length != NXDT_COMMAND_SIZE){ if (message.length < 0x10){
writeUsb(USBSTATUS_MALFORMED_REQUEST); writeUsb(USBSTATUS_MALFORMED_REQUEST);
logPrinter.print("Invalid directive size. Expected size is 4096 while received is "+message.length, EMsgType.INFO); logPrinter.print("Invalid directive size. Expected size is 4096 while received is "+message.length, EMsgType.INFO);
return true; return true;
@ -160,10 +161,9 @@ class NxdtUsbAbi1 {
if (ABI_VERSION != versionABI){ if (ABI_VERSION != versionABI){
writeUsb(USBSTATUS_UNSUPPORTED_ABI); writeUsb(USBSTATUS_UNSUPPORTED_ABI);
throw new Exception("ABI v"+message[11]+" is not supported in current version."); throw new Exception("ABI v"+versionABI+" is not supported in current version.");
} }
writeUsb(USBSTATUS_SUCCESS); writeUsb(USBSTATUS_SUCCESS);
// consider refactoring: create sub-classes for various ABI versions and check if it's supported or not
} }
private void handleSendFileProperties(byte[] message) throws Exception{ private void handleSendFileProperties(byte[] message) throws Exception{
@ -171,25 +171,15 @@ class NxdtUsbAbi1 {
final int fileNameLen = getLEint(message, 0x18); final int fileNameLen = getLEint(message, 0x18);
String filename = new String(message, 0x20, fileNameLen, StandardCharsets.UTF_8); String filename = new String(message, 0x20, fileNameLen, StandardCharsets.UTF_8);
// TODO: In here should be also a field with NSP Header size that would be transmitted after the end of main data transfer; NOTE: Handle with RandomAccessFile.
logPrinter.print("Write request for: '"+filename+"' ("+fileSize+" bytes)", EMsgType.INFO); logPrinter.print("Write request for: '"+filename+"' ("+fileSize+" bytes)", EMsgType.INFO);
// If RomFs related // If RomFs related
if (filename.startsWith("/")) { if (isRomFs(filename)) {
if (isWindows) if (isWindows)
filename = saveToPath + filename.replaceAll("/", "\\\\"); filename = saveToPath + filename.replaceAll("/", "\\\\");
else else
filename = saveToPath + filename; filename = saveToPath + filename;
try { createPath(filename);
createPath(filename);
}
catch (Exception e){
writeUsb(USBSTATUS_HOSTIOERROR);
logPrinter.print("Unable to create dir(s) for file in "+filename+
"\n Returned: "+e.getMessage(), EMsgType.FAIL);
return;
}
} }
else else
filename = saveToPath + filename; filename = saveToPath + filename;
@ -197,9 +187,9 @@ class NxdtUsbAbi1 {
File fileToDump = new File(filename); File fileToDump = new File(filename);
// Check if enough space // Check if enough space
if (fileToDump.getFreeSpace() <= fileSize){ if (fileToDump.getParentFile().getFreeSpace() <= fileSize){
writeUsb(USBSTATUS_HOSTIOERROR); writeUsb(USBSTATUS_HOSTIOERROR);
logPrinter.print("Not enough space on selected volume. Need: "+fileSize+" while available: "+fileToDump.getFreeSpace(), EMsgType.FAIL); logPrinter.print("Not enough space on selected volume. Need: "+fileSize+" while available: "+fileToDump.getParentFile().getFreeSpace(), EMsgType.FAIL);
return; return;
} }
// Check if FS is NOT read-only // Check if FS is NOT read-only
@ -209,42 +199,14 @@ class NxdtUsbAbi1 {
return; return;
} }
writeUsb(USBSTATUS_SUCCESS);
dumpFile(fileToDump, fileSize); dumpFile(fileToDump, fileSize);
writeUsb(USBSTATUS_SUCCESS); writeUsb(USBSTATUS_SUCCESS);
// TODO: check if NSP_SIZE != 0 then go dump header
} }
private void createPath(String path) throws Exception{
// QA NOTE: Clarify if exception is even possible on RO FS.
File resultingFile = new File(path);
File folderForTheFile = resultingFile.getParentFile();
folderForTheFile.mkdirs();
}
private void dumpFile(File file, long size) throws Exception{
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file, false));
byte[] readBuffer;
long received = 0;
int bufferSize;
while (received < size){
readBuffer = readUsbFile();
bos.write(readBuffer);
bufferSize = readBuffer.length;
received += bufferSize;
logPrinter.updateProgress((received + bufferSize) / (size / 100.0) / 100.0);
}
logPrinter.updateProgress(1.0);
bos.close();
}
private int getLEint(byte[] bytes, int fromOffset){ private int getLEint(byte[] bytes, int fromOffset){
return ByteBuffer.wrap(bytes, fromOffset, 0x4).order(ByteOrder.LITTLE_ENDIAN).getInt(); return ByteBuffer.wrap(bytes, fromOffset, 0x4).order(ByteOrder.LITTLE_ENDIAN).getInt();
} }
@ -253,6 +215,45 @@ class NxdtUsbAbi1 {
return ByteBuffer.wrap(bytes, fromOffset, 0x8).order(ByteOrder.LITTLE_ENDIAN).getLong(); return ByteBuffer.wrap(bytes, fromOffset, 0x8).order(ByteOrder.LITTLE_ENDIAN).getLong();
} }
private boolean isRomFs(String filename){
return filename.startsWith("/");
}
private void createPath(String path) throws Exception{
File resultingFile = new File(path);
File folderForTheFile = resultingFile.getParentFile();
if (folderForTheFile.exists())
return;
if (folderForTheFile.mkdirs())
return;
writeUsb(USBSTATUS_HOSTIOERROR);
throw new Exception("Unable to create dir(s) for file in "+folderForTheFile);
}
private void dumpFile(File file, long size) throws Exception{
RandomAccessFile raf = new RandomAccessFile(file, "rw");
byte[] readBuffer;
long received = 0;
int bufferSize;
while (received < size){
readBuffer = readUsbFile();
raf.write(readBuffer);
bufferSize = readBuffer.length;
received += bufferSize;
logPrinter.updateProgress((received + bufferSize) / (size / 100.0) / 100.0);
}
logPrinter.updateProgress(1.0);
raf.close();
}
/** /**
* Sending any byte array to USB device * Sending any byte array to USB device
* @return 'false' if no issues * @return 'false' if no issues

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB