Skip to content

Commit 6993b89

Browse files
committed
Split 'SplitMerge' class into 2 normal
Update NETCommunications: installation speed now 2x faster
1 parent 267ffcf commit 6993b89

File tree

8 files changed

+167
-145
lines changed

8 files changed

+167
-145
lines changed

src/main/java/nsusbloader/COM/NET/NETCommunications.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ private void writeToSocket(String fileName, long start, long end) throws Excepti
307307
private void handleSplitFile(File file, long start, long end) throws Exception{
308308
long count = end - start + 1;
309309

310-
int readPice = 8388608;
310+
int readPice = 1024;// NOTE: keep it small for better speed
311311
byte[] byteBuf;
312312
long currentOffset = 0;
313313

@@ -333,7 +333,7 @@ private void handleSplitFile(File file, long start, long end) throws Exception{
333333
private void handleRegularFile(File file, long start, long end) throws Exception{
334334
long count = end - start + 1;
335335

336-
int readPice = 8388608;
336+
int readPice = 1024; // NOTE: keep it small for better speed
337337
byte[] byteBuf;
338338
long currentOffset = 0;
339339

src/main/java/nsusbloader/Controllers/SplitMergeController.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
import nsusbloader.MediatorControl;
3434
import nsusbloader.NSLDataTypes.EModule;
3535
import nsusbloader.ServiceWindow;
36-
import nsusbloader.Utilities.SplitMergeTool;
36+
import nsusbloader.Utilities.splitmerge.MergeTask;
37+
import nsusbloader.Utilities.splitmerge.SplitTask;
3738

3839
import java.io.File;
3940
import java.net.URL;
@@ -204,9 +205,9 @@ private void setConvertBtnAction(){
204205
}
205206

206207
if (splitRad.isSelected())
207-
smTask = SplitMergeTool.splitFile(fileFolderActualPathLbl.getText(), saveToPathLbl.getText());
208+
smTask = new SplitTask(fileFolderActualPathLbl.getText(), saveToPathLbl.getText());
208209
else
209-
smTask = SplitMergeTool.mergeFile(fileFolderActualPathLbl.getText(), saveToPathLbl.getText());
210+
smTask = new MergeTask(fileFolderActualPathLbl.getText(), saveToPathLbl.getText());
210211
smTask.setOnCancelled(event -> statusLbl.setText(resourceBundle.getString("failure_txt")));
211212
smTask.setOnSucceeded(event -> {
212213
if (smTask.getValue())
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
/*
2+
Copyright 2019-2020 Dmitry Isaenko
3+
4+
This file is part of NS-USBloader.
5+
6+
NS-USBloader is free software: you can redistribute it and/or modify
7+
it under the terms of the GNU General Public License as published by
8+
the Free Software Foundation, either version 3 of the License, or
9+
(at your option) any later version.
10+
11+
NS-USBloader is distributed in the hope that it will be useful,
12+
but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
GNU General Public License for more details.
15+
16+
You should have received a copy of the GNU General Public License
17+
along with NS-USBloader. If not, see <https://www.gnu.org/licenses/>.
18+
*/
19+
package nsusbloader.Utilities.splitmerge;
20+
21+
import javafx.concurrent.Task;
22+
import nsusbloader.ModelControllers.ILogPrinter;
23+
import nsusbloader.ModelControllers.Log;
24+
import nsusbloader.NSLDataTypes.EModule;
25+
import nsusbloader.NSLDataTypes.EMsgType;
26+
27+
import java.io.*;
28+
import java.util.Arrays;
29+
30+
public class MergeTask extends Task<Boolean> {
31+
32+
private final ILogPrinter logPrinter;
33+
private final String saveToPath;
34+
private final String filePath;
35+
36+
public MergeTask(String filePath, String saveToPath) {
37+
this.filePath = filePath;
38+
this.saveToPath = saveToPath;
39+
logPrinter = Log.getPrinter(EModule.SPLIT_MERGE_TOOL);
40+
}
41+
@Override
42+
protected Boolean call() {
43+
logPrinter.print("Merge file: "+filePath, EMsgType.INFO);
44+
45+
File folder = new File(filePath);
46+
47+
long cnkTotalSize = 0;
48+
49+
File[] chunkFiles = folder.listFiles((file, s) -> s.matches("^[0-9][0-9]$"));
50+
51+
if (chunkFiles == null || chunkFiles.length == 0){
52+
logPrinter.print("Selected folder doesn't have any chunks. Nothing to do here.", EMsgType.FAIL);
53+
logPrinter.close();
54+
return false;
55+
}
56+
57+
Arrays.sort(chunkFiles);
58+
59+
logPrinter.print("Next files will be merged in following order: ", EMsgType.INFO);
60+
for (File cnk : chunkFiles){
61+
logPrinter.print(" "+cnk.getName(), EMsgType.INFO);
62+
cnkTotalSize += cnk.length();
63+
}
64+
65+
double chunkPercent = (4194240.0 / (cnkTotalSize / 100.0) / 100.0);
66+
long totalSizeCnt = 0;
67+
68+
File resultFile = new File(saveToPath+File.separator+"!_"+folder.getName());
69+
//*******
70+
for (int i = 0; ; i++){
71+
if (this.isCancelled()){
72+
logPrinter.print("Split task interrupted!", EMsgType.PASS);
73+
logPrinter.close();
74+
return false;
75+
}
76+
77+
if (resultFile.exists()){
78+
if (i >= 50){
79+
logPrinter.print("Can't create new file.", EMsgType.FAIL);
80+
logPrinter.close();
81+
return false;
82+
}
83+
84+
logPrinter.print("Trying to create a good new file...", EMsgType.WARNING);
85+
resultFile = new File(saveToPath+File.separator+"!_"+i+"_"+folder.getName());
86+
continue;
87+
}
88+
logPrinter.print("Save results to: "+resultFile.getAbsolutePath(), EMsgType.INFO);
89+
break;
90+
}
91+
//*******
92+
93+
try {
94+
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(resultFile));
95+
96+
BufferedInputStream bis;
97+
byte[] chunk;
98+
int readBytesCnt;
99+
100+
for (File cnk : chunkFiles){
101+
bis = new BufferedInputStream(new FileInputStream(cnk));
102+
while (true){
103+
104+
if (this.isCancelled()){
105+
bos.close();
106+
bis.close();
107+
boolean isDeleted = resultFile.delete();
108+
logPrinter.print("Split task interrupted and file "+(isDeleted?"deleted.":"is not deleted."), EMsgType.PASS);
109+
logPrinter.close();
110+
return false;
111+
}
112+
113+
chunk = new byte[4194240];
114+
readBytesCnt = bis.read(chunk);
115+
116+
logPrinter.updateProgress(chunkPercent * totalSizeCnt);
117+
totalSizeCnt++;
118+
119+
if (readBytesCnt < 4194240){
120+
if (readBytesCnt > 0)
121+
bos.write(chunk, 0, readBytesCnt);
122+
break;
123+
}
124+
125+
bos.write(chunk);
126+
}
127+
bis.close();
128+
}
129+
bos.close();
130+
//=============== let's check what we have ==============
131+
long resultFileSize = resultFile.length();
132+
logPrinter.print("Total chunks size: " + cnkTotalSize, EMsgType.INFO);
133+
logPrinter.print("Merged file size: " + resultFileSize, EMsgType.INFO);
134+
135+
if (cnkTotalSize != resultFileSize){
136+
logPrinter.print("Sizes are different! Do NOT use this file for installations!", EMsgType.FAIL);
137+
return false;
138+
}
139+
logPrinter.print("Sizes are the same! Split file should be good!", EMsgType.PASS);
140+
}
141+
catch (Exception e){
142+
e.printStackTrace();
143+
logPrinter.print("Error: "+e.getMessage(), EMsgType.FAIL);
144+
}
145+
146+
logPrinter.print("Merge task complete!", EMsgType.INFO);
147+
logPrinter.close();
148+
return true;
149+
}
150+
}

src/main/java/nsusbloader/Utilities/SplitMergeTool.java renamed to src/main/java/nsusbloader/Utilities/splitmerge/SplitTask.java

Lines changed: 6 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
You should have received a copy of the GNU General Public License
1717
along with NS-USBloader. If not, see <https://www.gnu.org/licenses/>.
1818
*/
19-
package nsusbloader.Utilities;
19+
package nsusbloader.Utilities.splitmerge;
2020

2121
import javafx.concurrent.Task;
2222
import nsusbloader.ModelControllers.ILogPrinter;
@@ -27,24 +27,13 @@
2727
import java.io.*;
2828
import java.util.Arrays;
2929

30-
public class SplitMergeTool {
30+
public class SplitTask extends Task<Boolean> {
3131

32-
public static Task<Boolean> splitFile(String filePath, String saveToPath){
33-
return new SplitTask(filePath, saveToPath);
34-
};
32+
private final ILogPrinter logPrinter;
33+
private final String saveToPath;
34+
private final String filePath;
3535

36-
public static Task<Boolean> mergeFile(String filePath, String saveToPath){
37-
return new MergeTask(filePath, saveToPath);
38-
}
39-
}
40-
41-
class SplitTask extends Task<Boolean>{
42-
43-
private ILogPrinter logPrinter;
44-
private String saveToPath;
45-
private String filePath;
46-
47-
SplitTask(String filePath, String saveToPath){
36+
public SplitTask(String filePath, String saveToPath){
4837
this.filePath = filePath;
4938
this.saveToPath = saveToPath;
5039
logPrinter = Log.getPrinter(EModule.SPLIT_MERGE_TOOL);
@@ -177,128 +166,6 @@ protected Boolean call() {
177166
logPrinter.print("Split task complete!", EMsgType.INFO);
178167
logPrinter.close();
179168

180-
return true;
181-
}
182-
}
183-
184-
class MergeTask extends Task<Boolean> {
185-
186-
private ILogPrinter logPrinter;
187-
private String saveToPath;
188-
private String filePath;
189-
190-
MergeTask(String filePath, String saveToPath) {
191-
this.filePath = filePath;
192-
this.saveToPath = saveToPath;
193-
logPrinter = Log.getPrinter(EModule.SPLIT_MERGE_TOOL);
194-
}
195-
@Override
196-
protected Boolean call() {
197-
logPrinter.print("Merge file: "+filePath, EMsgType.INFO);
198-
199-
File folder = new File(filePath);
200-
201-
long cnkTotalSize = 0;
202-
203-
File[] chunkFiles = folder.listFiles((file, s) -> s.matches("^[0-9][0-9]$"));
204-
205-
if (chunkFiles == null || chunkFiles.length == 0){
206-
logPrinter.print("Selected folder doesn't have any chunks. Nothing to do here.", EMsgType.FAIL);
207-
logPrinter.close();
208-
return false;
209-
}
210-
211-
Arrays.sort(chunkFiles);
212-
213-
logPrinter.print("Next files will be merged in following order: ", EMsgType.INFO);
214-
for (File cnk : chunkFiles){
215-
logPrinter.print(" "+cnk.getName(), EMsgType.INFO);
216-
cnkTotalSize += cnk.length();
217-
}
218-
219-
double chunkPercent = (4194240.0 / (cnkTotalSize / 100.0) / 100.0);
220-
long totalSizeCnt = 0;
221-
222-
File resultFile = new File(saveToPath+File.separator+"!_"+folder.getName());
223-
//*******
224-
for (int i = 0; ; i++){
225-
if (this.isCancelled()){
226-
logPrinter.print("Split task interrupted!", EMsgType.PASS);
227-
logPrinter.close();
228-
return false;
229-
}
230-
231-
if (resultFile.exists()){
232-
if (i >= 50){
233-
logPrinter.print("Can't create new file.", EMsgType.FAIL);
234-
logPrinter.close();
235-
return false;
236-
}
237-
238-
logPrinter.print("Trying to create a good new file...", EMsgType.WARNING);
239-
resultFile = new File(saveToPath+File.separator+"!_"+i+"_"+folder.getName());
240-
continue;
241-
}
242-
logPrinter.print("Save results to: "+resultFile.getAbsolutePath(), EMsgType.INFO);
243-
break;
244-
}
245-
//*******
246-
247-
try {
248-
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(resultFile));
249-
250-
BufferedInputStream bis;
251-
byte[] chunk;
252-
int readBytesCnt;
253-
254-
for (File cnk : chunkFiles){
255-
bis = new BufferedInputStream(new FileInputStream(cnk));
256-
while (true){
257-
258-
if (this.isCancelled()){
259-
bos.close();
260-
bis.close();
261-
boolean isDeleted = resultFile.delete();
262-
logPrinter.print("Split task interrupted and file "+(isDeleted?"deleted.":"is not deleted."), EMsgType.PASS);
263-
logPrinter.close();
264-
return false;
265-
}
266-
267-
chunk = new byte[4194240];
268-
readBytesCnt = bis.read(chunk);
269-
270-
logPrinter.updateProgress(chunkPercent * totalSizeCnt);
271-
totalSizeCnt++;
272-
273-
if (readBytesCnt < 4194240){
274-
if (readBytesCnt > 0)
275-
bos.write(chunk, 0, readBytesCnt);
276-
break;
277-
}
278-
279-
bos.write(chunk);
280-
}
281-
bis.close();
282-
}
283-
bos.close();
284-
//=============== let's check what we have ==============
285-
long resultFileSize = resultFile.length();
286-
logPrinter.print("Total chunks size: " + cnkTotalSize, EMsgType.INFO);
287-
logPrinter.print("Merged file size: " + resultFileSize, EMsgType.INFO);
288-
289-
if (cnkTotalSize != resultFileSize){
290-
logPrinter.print("Sizes are different! Do NOT use this file for installations!", EMsgType.FAIL);
291-
return false;
292-
}
293-
logPrinter.print("Sizes are the same! Split file should be good!", EMsgType.PASS);
294-
}
295-
catch (Exception e){
296-
e.printStackTrace();
297-
logPrinter.print("Error: "+e.getMessage(), EMsgType.FAIL);
298-
}
299-
300-
logPrinter.print("Merge task complete!", EMsgType.INFO);
301-
logPrinter.close();
302169
return true;
303170
}
304171
}

src/main/java/nsusbloader/cli/GoldLeaf.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ public void runGoldLeafBackend() throws InterruptedException {
128128
"GoldLeaf"+goldLeafVersion,
129129
filterForNsp);
130130
Thread thread = new Thread(task);
131+
thread.setDaemon(true);
131132
thread.start();
132133
thread.join();
133134
}

src/main/java/nsusbloader/cli/NXDT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ private void parseArgument() throws IncorrectSetupException{
5252
private void runBackend() throws InterruptedException{
5353
NxdtTask nxdtTask = new NxdtTask(saveTo);
5454
Thread thread = new Thread(nxdtTask);
55+
thread.setDaemon(true);
5556
thread.start();
5657
thread.join();
5758
}

src/main/java/nsusbloader/cli/TinfoilNet.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private void showHelp() throws IncorrectSetupException{
7777
+ "\tns-usbloader -n nsip=<arg1> [hostip=<arg2>] FILE1 ...\n"
7878
+ "\tns-usbloader --tfn nsip=<arg1> [hostip=<arg2>] FILE1 ..."
7979
+ "\n\nOptions:"
80-
+ "\n\tnsip=<ip>\t\t\tDefine NS IP address (mandatory)"
80+
+ "\n\tnsip=<ip>\t\tDefine NS IP address (mandatory)"
8181
+ "\n\thostip=<ip[:port]>\tDefine this host IP address. Will be obtained automatically if not set.");
8282
}
8383

@@ -138,6 +138,7 @@ private void runTinfoilNetBackend() throws InterruptedException{
138138
hostPortNum,
139139
"");
140140
Thread netCommThread = new Thread(netCommunications);
141+
netCommThread.setDaemon(true);
141142
netCommThread.start();
142143
netCommThread.join();
143144
}

0 commit comments

Comments
 (0)