diff --git a/src/main/java/nsusbloader/COM/NET/NETCommunications.java b/src/main/java/nsusbloader/COM/NET/NETCommunications.java index 39fbfab..60c9dc3 100644 --- a/src/main/java/nsusbloader/COM/NET/NETCommunications.java +++ b/src/main/java/nsusbloader/COM/NET/NETCommunications.java @@ -307,7 +307,7 @@ public class NETCommunications implements Runnable { private void handleSplitFile(File file, long start, long end) throws Exception{ long count = end - start + 1; - int readPice = 8388608; + int readPice = 1024;// NOTE: keep it small for better speed byte[] byteBuf; long currentOffset = 0; @@ -333,7 +333,7 @@ public class NETCommunications implements Runnable { private void handleRegularFile(File file, long start, long end) throws Exception{ long count = end - start + 1; - int readPice = 8388608; + int readPice = 1024; // NOTE: keep it small for better speed byte[] byteBuf; long currentOffset = 0; diff --git a/src/main/java/nsusbloader/Controllers/SplitMergeController.java b/src/main/java/nsusbloader/Controllers/SplitMergeController.java index cbe937b..0236a08 100644 --- a/src/main/java/nsusbloader/Controllers/SplitMergeController.java +++ b/src/main/java/nsusbloader/Controllers/SplitMergeController.java @@ -33,7 +33,8 @@ import nsusbloader.AppPreferences; import nsusbloader.MediatorControl; import nsusbloader.NSLDataTypes.EModule; import nsusbloader.ServiceWindow; -import nsusbloader.Utilities.SplitMergeTool; +import nsusbloader.Utilities.splitmerge.MergeTask; +import nsusbloader.Utilities.splitmerge.SplitTask; import java.io.File; import java.net.URL; @@ -204,9 +205,9 @@ public class SplitMergeController implements Initializable { } if (splitRad.isSelected()) - smTask = SplitMergeTool.splitFile(fileFolderActualPathLbl.getText(), saveToPathLbl.getText()); + smTask = new SplitTask(fileFolderActualPathLbl.getText(), saveToPathLbl.getText()); else - smTask = SplitMergeTool.mergeFile(fileFolderActualPathLbl.getText(), saveToPathLbl.getText()); + smTask = new MergeTask(fileFolderActualPathLbl.getText(), saveToPathLbl.getText()); smTask.setOnCancelled(event -> statusLbl.setText(resourceBundle.getString("failure_txt"))); smTask.setOnSucceeded(event -> { if (smTask.getValue()) diff --git a/src/main/java/nsusbloader/Utilities/splitmerge/MergeTask.java b/src/main/java/nsusbloader/Utilities/splitmerge/MergeTask.java new file mode 100644 index 0000000..fdf30f9 --- /dev/null +++ b/src/main/java/nsusbloader/Utilities/splitmerge/MergeTask.java @@ -0,0 +1,150 @@ +/* + Copyright 2019-2020 Dmitry Isaenko + + This file is part of NS-USBloader. + + NS-USBloader is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + NS-USBloader is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with NS-USBloader. If not, see . +*/ +package nsusbloader.Utilities.splitmerge; + +import javafx.concurrent.Task; +import nsusbloader.ModelControllers.ILogPrinter; +import nsusbloader.ModelControllers.Log; +import nsusbloader.NSLDataTypes.EModule; +import nsusbloader.NSLDataTypes.EMsgType; + +import java.io.*; +import java.util.Arrays; + +public class MergeTask extends Task { + + private final ILogPrinter logPrinter; + private final String saveToPath; + private final String filePath; + + public MergeTask(String filePath, String saveToPath) { + this.filePath = filePath; + this.saveToPath = saveToPath; + logPrinter = Log.getPrinter(EModule.SPLIT_MERGE_TOOL); + } + @Override + protected Boolean call() { + logPrinter.print("Merge file: "+filePath, EMsgType.INFO); + + File folder = new File(filePath); + + long cnkTotalSize = 0; + + File[] chunkFiles = folder.listFiles((file, s) -> s.matches("^[0-9][0-9]$")); + + if (chunkFiles == null || chunkFiles.length == 0){ + logPrinter.print("Selected folder doesn't have any chunks. Nothing to do here.", EMsgType.FAIL); + logPrinter.close(); + return false; + } + + Arrays.sort(chunkFiles); + + logPrinter.print("Next files will be merged in following order: ", EMsgType.INFO); + for (File cnk : chunkFiles){ + logPrinter.print(" "+cnk.getName(), EMsgType.INFO); + cnkTotalSize += cnk.length(); + } + + double chunkPercent = (4194240.0 / (cnkTotalSize / 100.0) / 100.0); + long totalSizeCnt = 0; + + File resultFile = new File(saveToPath+File.separator+"!_"+folder.getName()); + //******* + for (int i = 0; ; i++){ + if (this.isCancelled()){ + logPrinter.print("Split task interrupted!", EMsgType.PASS); + logPrinter.close(); + return false; + } + + if (resultFile.exists()){ + if (i >= 50){ + logPrinter.print("Can't create new file.", EMsgType.FAIL); + logPrinter.close(); + return false; + } + + logPrinter.print("Trying to create a good new file...", EMsgType.WARNING); + resultFile = new File(saveToPath+File.separator+"!_"+i+"_"+folder.getName()); + continue; + } + logPrinter.print("Save results to: "+resultFile.getAbsolutePath(), EMsgType.INFO); + break; + } + //******* + + try { + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(resultFile)); + + BufferedInputStream bis; + byte[] chunk; + int readBytesCnt; + + for (File cnk : chunkFiles){ + bis = new BufferedInputStream(new FileInputStream(cnk)); + while (true){ + + if (this.isCancelled()){ + bos.close(); + bis.close(); + boolean isDeleted = resultFile.delete(); + logPrinter.print("Split task interrupted and file "+(isDeleted?"deleted.":"is not deleted."), EMsgType.PASS); + logPrinter.close(); + return false; + } + + chunk = new byte[4194240]; + readBytesCnt = bis.read(chunk); + + logPrinter.updateProgress(chunkPercent * totalSizeCnt); + totalSizeCnt++; + + if (readBytesCnt < 4194240){ + if (readBytesCnt > 0) + bos.write(chunk, 0, readBytesCnt); + break; + } + + bos.write(chunk); + } + bis.close(); + } + bos.close(); + //=============== let's check what we have ============== + long resultFileSize = resultFile.length(); + logPrinter.print("Total chunks size: " + cnkTotalSize, EMsgType.INFO); + logPrinter.print("Merged file size: " + resultFileSize, EMsgType.INFO); + + if (cnkTotalSize != resultFileSize){ + logPrinter.print("Sizes are different! Do NOT use this file for installations!", EMsgType.FAIL); + return false; + } + logPrinter.print("Sizes are the same! Split file should be good!", EMsgType.PASS); + } + catch (Exception e){ + e.printStackTrace(); + logPrinter.print("Error: "+e.getMessage(), EMsgType.FAIL); + } + + logPrinter.print("Merge task complete!", EMsgType.INFO); + logPrinter.close(); + return true; + } +} diff --git a/src/main/java/nsusbloader/Utilities/SplitMergeTool.java b/src/main/java/nsusbloader/Utilities/splitmerge/SplitTask.java similarity index 56% rename from src/main/java/nsusbloader/Utilities/SplitMergeTool.java rename to src/main/java/nsusbloader/Utilities/splitmerge/SplitTask.java index 66a8160..b6152e0 100644 --- a/src/main/java/nsusbloader/Utilities/SplitMergeTool.java +++ b/src/main/java/nsusbloader/Utilities/splitmerge/SplitTask.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with NS-USBloader. If not, see . */ -package nsusbloader.Utilities; +package nsusbloader.Utilities.splitmerge; import javafx.concurrent.Task; import nsusbloader.ModelControllers.ILogPrinter; @@ -27,24 +27,13 @@ import nsusbloader.NSLDataTypes.EMsgType; import java.io.*; import java.util.Arrays; -public class SplitMergeTool { +public class SplitTask extends Task { - public static Task splitFile(String filePath, String saveToPath){ - return new SplitTask(filePath, saveToPath); - }; + private final ILogPrinter logPrinter; + private final String saveToPath; + private final String filePath; - public static Task mergeFile(String filePath, String saveToPath){ - return new MergeTask(filePath, saveToPath); - } -} - -class SplitTask extends Task{ - - private ILogPrinter logPrinter; - private String saveToPath; - private String filePath; - - SplitTask(String filePath, String saveToPath){ + public SplitTask(String filePath, String saveToPath){ this.filePath = filePath; this.saveToPath = saveToPath; logPrinter = Log.getPrinter(EModule.SPLIT_MERGE_TOOL); @@ -177,128 +166,6 @@ class SplitTask extends Task{ logPrinter.print("Split task complete!", EMsgType.INFO); logPrinter.close(); - return true; - } -} - -class MergeTask extends Task { - - private ILogPrinter logPrinter; - private String saveToPath; - private String filePath; - - MergeTask(String filePath, String saveToPath) { - this.filePath = filePath; - this.saveToPath = saveToPath; - logPrinter = Log.getPrinter(EModule.SPLIT_MERGE_TOOL); - } - @Override - protected Boolean call() { - logPrinter.print("Merge file: "+filePath, EMsgType.INFO); - - File folder = new File(filePath); - - long cnkTotalSize = 0; - - File[] chunkFiles = folder.listFiles((file, s) -> s.matches("^[0-9][0-9]$")); - - if (chunkFiles == null || chunkFiles.length == 0){ - logPrinter.print("Selected folder doesn't have any chunks. Nothing to do here.", EMsgType.FAIL); - logPrinter.close(); - return false; - } - - Arrays.sort(chunkFiles); - - logPrinter.print("Next files will be merged in following order: ", EMsgType.INFO); - for (File cnk : chunkFiles){ - logPrinter.print(" "+cnk.getName(), EMsgType.INFO); - cnkTotalSize += cnk.length(); - } - - double chunkPercent = (4194240.0 / (cnkTotalSize / 100.0) / 100.0); - long totalSizeCnt = 0; - - File resultFile = new File(saveToPath+File.separator+"!_"+folder.getName()); - //******* - for (int i = 0; ; i++){ - if (this.isCancelled()){ - logPrinter.print("Split task interrupted!", EMsgType.PASS); - logPrinter.close(); - return false; - } - - if (resultFile.exists()){ - if (i >= 50){ - logPrinter.print("Can't create new file.", EMsgType.FAIL); - logPrinter.close(); - return false; - } - - logPrinter.print("Trying to create a good new file...", EMsgType.WARNING); - resultFile = new File(saveToPath+File.separator+"!_"+i+"_"+folder.getName()); - continue; - } - logPrinter.print("Save results to: "+resultFile.getAbsolutePath(), EMsgType.INFO); - break; - } - //******* - - try { - BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(resultFile)); - - BufferedInputStream bis; - byte[] chunk; - int readBytesCnt; - - for (File cnk : chunkFiles){ - bis = new BufferedInputStream(new FileInputStream(cnk)); - while (true){ - - if (this.isCancelled()){ - bos.close(); - bis.close(); - boolean isDeleted = resultFile.delete(); - logPrinter.print("Split task interrupted and file "+(isDeleted?"deleted.":"is not deleted."), EMsgType.PASS); - logPrinter.close(); - return false; - } - - chunk = new byte[4194240]; - readBytesCnt = bis.read(chunk); - - logPrinter.updateProgress(chunkPercent * totalSizeCnt); - totalSizeCnt++; - - if (readBytesCnt < 4194240){ - if (readBytesCnt > 0) - bos.write(chunk, 0, readBytesCnt); - break; - } - - bos.write(chunk); - } - bis.close(); - } - bos.close(); - //=============== let's check what we have ============== - long resultFileSize = resultFile.length(); - logPrinter.print("Total chunks size: " + cnkTotalSize, EMsgType.INFO); - logPrinter.print("Merged file size: " + resultFileSize, EMsgType.INFO); - - if (cnkTotalSize != resultFileSize){ - logPrinter.print("Sizes are different! Do NOT use this file for installations!", EMsgType.FAIL); - return false; - } - logPrinter.print("Sizes are the same! Split file should be good!", EMsgType.PASS); - } - catch (Exception e){ - e.printStackTrace(); - logPrinter.print("Error: "+e.getMessage(), EMsgType.FAIL); - } - - logPrinter.print("Merge task complete!", EMsgType.INFO); - logPrinter.close(); return true; } } \ No newline at end of file diff --git a/src/main/java/nsusbloader/cli/GoldLeaf.java b/src/main/java/nsusbloader/cli/GoldLeaf.java index e6a1cd7..f37b138 100644 --- a/src/main/java/nsusbloader/cli/GoldLeaf.java +++ b/src/main/java/nsusbloader/cli/GoldLeaf.java @@ -128,6 +128,7 @@ public class GoldLeaf { "GoldLeaf"+goldLeafVersion, filterForNsp); Thread thread = new Thread(task); + thread.setDaemon(true); thread.start(); thread.join(); } diff --git a/src/main/java/nsusbloader/cli/NXDT.java b/src/main/java/nsusbloader/cli/NXDT.java index 90dc675..b30d618 100644 --- a/src/main/java/nsusbloader/cli/NXDT.java +++ b/src/main/java/nsusbloader/cli/NXDT.java @@ -52,6 +52,7 @@ public class NXDT { private void runBackend() throws InterruptedException{ NxdtTask nxdtTask = new NxdtTask(saveTo); Thread thread = new Thread(nxdtTask); + thread.setDaemon(true); thread.start(); thread.join(); } diff --git a/src/main/java/nsusbloader/cli/TinfoilNet.java b/src/main/java/nsusbloader/cli/TinfoilNet.java index f053113..611e598 100644 --- a/src/main/java/nsusbloader/cli/TinfoilNet.java +++ b/src/main/java/nsusbloader/cli/TinfoilNet.java @@ -77,7 +77,7 @@ public class TinfoilNet { + "\tns-usbloader -n nsip= [hostip=] FILE1 ...\n" + "\tns-usbloader --tfn nsip= [hostip=] FILE1 ..." + "\n\nOptions:" - + "\n\tnsip=\t\t\tDefine NS IP address (mandatory)" + + "\n\tnsip=\t\tDefine NS IP address (mandatory)" + "\n\thostip=\tDefine this host IP address. Will be obtained automatically if not set."); } @@ -138,6 +138,7 @@ public class TinfoilNet { hostPortNum, ""); Thread netCommThread = new Thread(netCommunications); + netCommThread.setDaemon(true); netCommThread.start(); netCommThread.join(); } diff --git a/src/main/java/nsusbloader/cli/TinfoilUsb.java b/src/main/java/nsusbloader/cli/TinfoilUsb.java index 6b493f0..b6a9194 100644 --- a/src/main/java/nsusbloader/cli/TinfoilUsb.java +++ b/src/main/java/nsusbloader/cli/TinfoilUsb.java @@ -62,6 +62,7 @@ public class TinfoilUsb { private void runTinfoilBackend() throws InterruptedException{ Runnable task = new UsbCommunications(filesList, "TinFoil", false); Thread thread = new Thread(task); + thread.setDaemon(true); thread.start(); thread.join(); }