From 6b65c74c9d3f0a58deefc48d60efe5c98a87670c Mon Sep 17 00:00:00 2001 From: Dmitry Isaenko Date: Fri, 3 Jul 2020 04:01:20 +0300 Subject: [PATCH] Refactor some old UI-related code. Rewrite LogPrinter to handle commandline. Add RCM-payload module into CLI interface: now it could be executed on system without graphical environment (x86/amd64 only). E.g.: java -jar app.jar --rcm payload.bin --- pom.xml | 2 +- .../COM/NET/NETCommunications.java | 7 +- .../java/nsusbloader/COM/USB/GoldLeaf.java | 4 +- .../java/nsusbloader/COM/USB/GoldLeaf_05.java | 4 +- .../java/nsusbloader/COM/USB/GoldLeaf_07.java | 4 +- .../nsusbloader/COM/USB/PFS/PFSProvider.java | 4 +- .../java/nsusbloader/COM/USB/TinFoil.java | 4 +- .../nsusbloader/COM/USB/TransferModule.java | 6 +- .../COM/USB/UsbCommunications.java | 7 +- .../java/nsusbloader/COM/USB/UsbConnect.java | 10 +- .../Controllers/FrontController.java | 132 +++++++++--------- .../Controllers/RcmController.java | 37 ++--- .../java/nsusbloader/MediatorControl.java | 4 +- .../ModelControllers/ILogPrinter.java | 35 +++++ .../nsusbloader/ModelControllers/Log.java | 34 +++++ .../ModelControllers/LogPrinterCli.java | 42 ++++++ .../{LogPrinter.java => LogPrinterGui.java} | 27 +++- .../ModelControllers/MessagesConsumer.java | 20 ++- src/main/java/nsusbloader/NSLMain.java | 40 +++++- .../java/nsusbloader/Utilities/NxdtTask.java | 7 +- .../nsusbloader/Utilities/NxdtUsbAbi1.java | 6 +- .../Utilities/{RcmTask.java => Rcm.java} | 35 ++--- .../nsusbloader/Utilities/SplitMergeTool.java | 11 +- 23 files changed, 328 insertions(+), 154 deletions(-) create mode 100644 src/main/java/nsusbloader/ModelControllers/ILogPrinter.java create mode 100644 src/main/java/nsusbloader/ModelControllers/Log.java create mode 100644 src/main/java/nsusbloader/ModelControllers/LogPrinterCli.java rename src/main/java/nsusbloader/ModelControllers/{LogPrinter.java => LogPrinterGui.java} (78%) rename src/main/java/nsusbloader/Utilities/{RcmTask.java => Rcm.java} (95%) diff --git a/pom.xml b/pom.xml index e529882..f3d39b8 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ NS-USBloader ns-usbloader - 3.0-SNAPSHOT + 4.0-SNAPSHOT https://github.com/developersu/ns-usbloader/ diff --git a/src/main/java/nsusbloader/COM/NET/NETCommunications.java b/src/main/java/nsusbloader/COM/NET/NETCommunications.java index 2b157ef..ccd21f5 100644 --- a/src/main/java/nsusbloader/COM/NET/NETCommunications.java +++ b/src/main/java/nsusbloader/COM/NET/NETCommunications.java @@ -19,8 +19,9 @@ package nsusbloader.COM.NET; import javafx.concurrent.Task; +import nsusbloader.ModelControllers.ILogPrinter; import nsusbloader.NSLDataTypes.EFileStatus; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.Log; import nsusbloader.NSLDataTypes.EModule; import nsusbloader.NSLDataTypes.EMsgType; import nsusbloader.COM.Helpers.NSSplitReader; @@ -33,7 +34,7 @@ import java.util.*; public class NETCommunications extends Task { // todo: thows IOException? - private LogPrinter logPrinter; + private ILogPrinter logPrinter; private String hostIP; private int hostPort; @@ -61,7 +62,7 @@ public class NETCommunications extends Task { // todo: thows IOException? else this.extras = ""; this.switchIP = switchIP; - this.logPrinter = new LogPrinter(EModule.USB_NET_TRANSFERS); + this.logPrinter = Log.getPrinter(EModule.USB_NET_TRANSFERS); this.nspMap = new HashMap<>(); this.nspFileSizes = new HashMap<>(); // Filter and remove empty/incorrect split-files diff --git a/src/main/java/nsusbloader/COM/USB/GoldLeaf.java b/src/main/java/nsusbloader/COM/USB/GoldLeaf.java index 3beeaaa..66dba20 100644 --- a/src/main/java/nsusbloader/COM/USB/GoldLeaf.java +++ b/src/main/java/nsusbloader/COM/USB/GoldLeaf.java @@ -22,7 +22,7 @@ import javafx.application.Platform; import javafx.concurrent.Task; import javafx.stage.FileChooser; import nsusbloader.MediatorControl; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; import nsusbloader.NSLDataTypes.EMsgType; import nsusbloader.COM.Helpers.NSSplitReader; import org.usb4java.DeviceHandle; @@ -69,7 +69,7 @@ class GoldLeaf extends TransferModule { // For using in CMD_SelectFile with SPEC:/ prefix private File selectedFile; - GoldLeaf(DeviceHandle handler, LinkedHashMap nspMap, Task task, LogPrinter logPrinter, boolean nspFilter){ + GoldLeaf(DeviceHandle handler, LinkedHashMap nspMap, Task task, ILogPrinter logPrinter, boolean nspFilter){ super(handler, nspMap, task, logPrinter); final byte CMD_GetDriveCount = 1; diff --git a/src/main/java/nsusbloader/COM/USB/GoldLeaf_05.java b/src/main/java/nsusbloader/COM/USB/GoldLeaf_05.java index 260cf10..5e3a463 100644 --- a/src/main/java/nsusbloader/COM/USB/GoldLeaf_05.java +++ b/src/main/java/nsusbloader/COM/USB/GoldLeaf_05.java @@ -19,7 +19,7 @@ package nsusbloader.COM.USB; import javafx.concurrent.Task; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; import nsusbloader.NSLDataTypes.EFileStatus; import nsusbloader.NSLDataTypes.EMsgType; import nsusbloader.COM.Helpers.NSSplitReader; @@ -53,7 +53,7 @@ public class GoldLeaf_05 extends TransferModule { private RandomAccessFile raf; // NSP File private NSSplitReader nsr; // It'a also NSP File - GoldLeaf_05(DeviceHandle handler, LinkedHashMap nspMap, Task task, LogPrinter logPrinter){ + GoldLeaf_05(DeviceHandle handler, LinkedHashMap nspMap, Task task, ILogPrinter logPrinter){ super(handler, nspMap, task, logPrinter); status = EFileStatus.FAILED; diff --git a/src/main/java/nsusbloader/COM/USB/GoldLeaf_07.java b/src/main/java/nsusbloader/COM/USB/GoldLeaf_07.java index 902a140..8f59a79 100644 --- a/src/main/java/nsusbloader/COM/USB/GoldLeaf_07.java +++ b/src/main/java/nsusbloader/COM/USB/GoldLeaf_07.java @@ -23,7 +23,7 @@ import javafx.concurrent.Task; import javafx.stage.FileChooser; import nsusbloader.COM.Helpers.NSSplitReader; import nsusbloader.MediatorControl; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; import nsusbloader.NSLDataTypes.EMsgType; import org.usb4java.DeviceHandle; import org.usb4java.LibUsb; @@ -69,7 +69,7 @@ class GoldLeaf_07 extends TransferModule { // For using in CMD_SelectFile with SPEC:/ prefix private File selectedFile; - GoldLeaf_07(DeviceHandle handler, LinkedHashMap nspMap, Task task, LogPrinter logPrinter, boolean nspFilter){ + GoldLeaf_07(DeviceHandle handler, LinkedHashMap nspMap, Task task, ILogPrinter logPrinter, boolean nspFilter){ super(handler, nspMap, task, logPrinter); final byte CMD_GetDriveCount = 0x00; diff --git a/src/main/java/nsusbloader/COM/USB/PFS/PFSProvider.java b/src/main/java/nsusbloader/COM/USB/PFS/PFSProvider.java index dea5fe6..463135c 100644 --- a/src/main/java/nsusbloader/COM/USB/PFS/PFSProvider.java +++ b/src/main/java/nsusbloader/COM/USB/PFS/PFSProvider.java @@ -18,7 +18,7 @@ */ package nsusbloader.COM.USB.PFS; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; import nsusbloader.NSLDataTypes.EMsgType; import java.io.*; @@ -38,7 +38,7 @@ public class PFSProvider { private long bodySize; private int ticketID = -1; - public PFSProvider(File nspFile, LogPrinter logPrinter) throws Exception{ + public PFSProvider(File nspFile, ILogPrinter logPrinter) throws Exception{ if (nspFile.isDirectory()) { nspFileName = nspFile.getName(); nspFile = new File(nspFile.getAbsolutePath() + File.separator + "00"); diff --git a/src/main/java/nsusbloader/COM/USB/TinFoil.java b/src/main/java/nsusbloader/COM/USB/TinFoil.java index 7894b90..86e9d08 100644 --- a/src/main/java/nsusbloader/COM/USB/TinFoil.java +++ b/src/main/java/nsusbloader/COM/USB/TinFoil.java @@ -19,7 +19,7 @@ package nsusbloader.COM.USB; import javafx.concurrent.Task; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; import nsusbloader.NSLDataTypes.EFileStatus; import nsusbloader.NSLDataTypes.EMsgType; import nsusbloader.COM.Helpers.NSSplitReader; @@ -48,7 +48,7 @@ class TinFoil extends TransferModule { /* byte[] magic = new byte[4]; ByteBuffer bb = StandardCharsets.UTF_8.encode("TUC0").rewind().get(magic); // Let's rephrase this 'string' */ - TinFoil(DeviceHandle handler, LinkedHashMap nspMap, Task task, LogPrinter logPrinter){ + TinFoil(DeviceHandle handler, LinkedHashMap nspMap, Task task, ILogPrinter logPrinter){ super(handler, nspMap, task, logPrinter); logPrinter.print("============= Tinfoil =============", EMsgType.INFO); diff --git a/src/main/java/nsusbloader/COM/USB/TransferModule.java b/src/main/java/nsusbloader/COM/USB/TransferModule.java index cf10f3d..f59ed97 100644 --- a/src/main/java/nsusbloader/COM/USB/TransferModule.java +++ b/src/main/java/nsusbloader/COM/USB/TransferModule.java @@ -19,7 +19,7 @@ package nsusbloader.COM.USB; import javafx.concurrent.Task; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; import nsusbloader.NSLDataTypes.EFileStatus; import nsusbloader.NSLDataTypes.EMsgType; import org.usb4java.DeviceHandle; @@ -31,11 +31,11 @@ public abstract class TransferModule { EFileStatus status = EFileStatus.UNKNOWN; LinkedHashMap nspMap; - LogPrinter logPrinter; + ILogPrinter logPrinter; DeviceHandle handlerNS; Task task; - TransferModule(DeviceHandle handler, LinkedHashMap nspMap, Task task, LogPrinter printer){ + TransferModule(DeviceHandle handler, LinkedHashMap nspMap, Task task, ILogPrinter printer){ this.handlerNS = handler; this.nspMap = nspMap; this.task = task; diff --git a/src/main/java/nsusbloader/COM/USB/UsbCommunications.java b/src/main/java/nsusbloader/COM/USB/UsbCommunications.java index 9688168..345e029 100644 --- a/src/main/java/nsusbloader/COM/USB/UsbCommunications.java +++ b/src/main/java/nsusbloader/COM/USB/UsbCommunications.java @@ -19,7 +19,8 @@ package nsusbloader.COM.USB; import javafx.concurrent.Task; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; +import nsusbloader.ModelControllers.Log; import nsusbloader.NSLDataTypes.EFileStatus; import nsusbloader.NSLDataTypes.EModule; import nsusbloader.NSLDataTypes.EMsgType; @@ -32,7 +33,7 @@ import java.util.*; // TODO: add filter option to show only NSP files public class UsbCommunications extends Task { - private LogPrinter logPrinter; + private ILogPrinter logPrinter; private LinkedHashMap nspMap; private String protocol; private boolean nspFilterForGl; @@ -43,7 +44,7 @@ public class UsbCommunications extends Task { this.nspMap = new LinkedHashMap<>(); for (File f: nspList) nspMap.put(f.getName(), f); - this.logPrinter = new LogPrinter(EModule.USB_NET_TRANSFERS); + this.logPrinter = Log.getPrinter(EModule.USB_NET_TRANSFERS); } @Override diff --git a/src/main/java/nsusbloader/COM/USB/UsbConnect.java b/src/main/java/nsusbloader/COM/USB/UsbConnect.java index 2c83b94..7b17a24 100644 --- a/src/main/java/nsusbloader/COM/USB/UsbConnect.java +++ b/src/main/java/nsusbloader/COM/USB/UsbConnect.java @@ -18,7 +18,7 @@ */ package nsusbloader.COM.USB; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; import nsusbloader.NSLDataTypes.EMsgType; import org.usb4java.*; @@ -39,7 +39,7 @@ public class UsbConnect { private DeviceHandle handlerNS; private Device deviceNS; - private LogPrinter logPrinter; + private ILogPrinter logPrinter; private boolean connected; // TODO: replace to 'connectionFailure' and invert requests everywhere @@ -49,7 +49,7 @@ public class UsbConnect { private int returningValue; private DeviceList deviceList; - public static UsbConnect connectRcmMode(LogPrinter logPrinter){ + public static UsbConnect connectRcmMode(ILogPrinter logPrinter){ UsbConnect usbConnect = new UsbConnect(logPrinter); usbConnect.VENDOR_ID = RCM_VID; usbConnect.PRODUCT_ID = RCM_PID; @@ -71,7 +71,7 @@ public class UsbConnect { return usbConnect; } - public static UsbConnect connectHomebrewMode(LogPrinter logPrinter){ + public static UsbConnect connectHomebrewMode(ILogPrinter logPrinter){ UsbConnect usbConnect = new UsbConnect(logPrinter); usbConnect.VENDOR_ID = HOMEBREW_VID; usbConnect.PRODUCT_ID = HOMEBREW_PID; @@ -96,7 +96,7 @@ public class UsbConnect { private UsbConnect(){} - private UsbConnect(LogPrinter logPrinter){ + private UsbConnect(ILogPrinter logPrinter){ this.logPrinter = logPrinter; this.connected = false; }; diff --git a/src/main/java/nsusbloader/Controllers/FrontController.java b/src/main/java/nsusbloader/Controllers/FrontController.java index 1ab7d10..5016ff5 100644 --- a/src/main/java/nsusbloader/Controllers/FrontController.java +++ b/src/main/java/nsusbloader/Controllers/FrontController.java @@ -89,10 +89,7 @@ public class FrontController implements Initializable { } } // Really bad disable-enable upload button function - if (tableFilesListController.isFilesForUploadListEmpty()) - disableUploadStopBtn(true); - else - disableUploadStopBtn(false); + disableUploadStopBtn(tableFilesListController.isFilesForUploadListEmpty()); }); // Add listener to notify tableView controller tableFilesListController.setNewProtocol(choiceProtocol.getSelectionModel().getSelectedItem()); // Notify tableView controller @@ -132,10 +129,7 @@ public class FrontController implements Initializable { this.switchThemeBtn.setOnAction(e->switchTheme()); - if (getSelectedProtocol().equals("TinFoil")) - uploadStopBtn.setDisable(true); - else - uploadStopBtn.setDisable(false); + uploadStopBtn.setDisable(getSelectedProtocol().equals("TinFoil")); selectNspBtn.setOnAction(e-> selectFilesBtnAction()); selectSplitNspBtn.setOnAction(e-> selectSplitBtnAction()); @@ -157,15 +151,19 @@ public class FrontController implements Initializable { * Changes UI theme on the go * */ private void switchTheme(){ - if (switchThemeBtn.getScene().getStylesheets().get(0).equals("/res/app_dark.css")) { - switchThemeBtn.getScene().getStylesheets().remove("/res/app_dark.css"); - switchThemeBtn.getScene().getStylesheets().add("/res/app_light.css"); + final String darkTheme = "/res/app_dark.css"; + final String lightTheme = "/res/app_light.css"; + final ObservableList styleSheets = switchThemeBtn.getScene().getStylesheets(); + + if (styleSheets.get(0).equals(darkTheme)) { + styleSheets.remove(darkTheme); + styleSheets.add(lightTheme); } else { - switchThemeBtn.getScene().getStylesheets().remove("/res/app_light.css"); - switchThemeBtn.getScene().getStylesheets().add("/res/app_dark.css"); + styleSheets.remove(lightTheme); + styleSheets.add(darkTheme); } - AppPreferences.getInstance().setTheme(switchThemeBtn.getScene().getStylesheets().get(0)); + AppPreferences.getInstance().setTheme(styleSheets.get(0)); } /** * Get selected protocol (GL/TF) @@ -186,8 +184,6 @@ public class FrontController implements Initializable { return nsIpTextField.getText(); } - - /*-****************************************************************************************************************-*/ /** * Functionality for selecting NSP button. * */ @@ -244,58 +240,59 @@ public class FrontController implements Initializable { * It's button listener when no transmission executes * */ private void uploadBtnAction(){ - if ((workThread == null || !workThread.isAlive())){ - // Collect files - List nspToUpload; - if (tableFilesListController.getFilesForUpload() == null && getSelectedProtocol().equals("TinFoil")) { - MediatorControl.getInstance().getContoller().logArea.setText(resourceBundle.getString("tab3_Txt_NoFolderOrFileSelected")); - return; + if (workThread != null && workThread.isAlive()) + return; + + // Collect files + List nspToUpload; + + TextArea logArea = MediatorControl.getInstance().getContoller().logArea; + + if (getSelectedProtocol().equals("TinFoil") && tableFilesListController.getFilesForUpload() == null) { + logArea.setText(resourceBundle.getString("tab3_Txt_NoFolderOrFileSelected")); + return; + } + + if ((nspToUpload = tableFilesListController.getFilesForUpload()) != null){ + logArea.setText(resourceBundle.getString("tab3_Txt_FilesToUploadTitle")+"\n"); + nspToUpload.forEach(item -> logArea.appendText(" "+item.getAbsolutePath()+"\n")); + } + else { + logArea.clear(); + nspToUpload = new LinkedList<>(); + } + + SettingsController settings = MediatorControl.getInstance().getContoller().getSettingsCtrlr(); + // If USB selected + if (getSelectedProtocol().equals("GoldLeaf") || ( getSelectedProtocol().equals("TinFoil") && getSelectedNetUsb().equals("USB") ) ){ + usbNetCommunications = new UsbCommunications(nspToUpload, getSelectedProtocol() + settings.getGlOldVer(), settings.getNSPFileFilterForGL()); + } + else { // NET INSTALL OVER TINFOIL + final String ipValidationPattern = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; + + if (settings.isNsIpValidate() && ! getNsIp().matches(ipValidationPattern)) { + if (!ServiceWindow.getConfirmationWindow(resourceBundle.getString("windowTitleBadIp"), resourceBundle.getString("windowBodyBadIp"))) + return; } + + String nsIP = getNsIp(); + + if (! settings.getExpertModeSelected()) + usbNetCommunications = new NETCommunications(nspToUpload, nsIP, false, "", "", ""); else { - if ((nspToUpload = tableFilesListController.getFilesForUpload()) != null){ - MediatorControl.getInstance().getContoller().logArea.setText(resourceBundle.getString("tab3_Txt_FilesToUploadTitle")+"\n"); - for (File item: nspToUpload) - MediatorControl.getInstance().getContoller().logArea.appendText(" "+item.getAbsolutePath()+"\n"); - } - else { - MediatorControl.getInstance().getContoller().logArea.clear(); - nspToUpload = new LinkedList<>(); - } - } - // If USB selected - if (getSelectedProtocol().equals("GoldLeaf") || - ( getSelectedProtocol().equals("TinFoil") && getSelectedNetUsb().equals("USB") ) - ){ - usbNetCommunications = new UsbCommunications(nspToUpload, getSelectedProtocol()+MediatorControl.getInstance().getContoller().getSettingsCtrlr().getGlOldVer(), MediatorControl.getInstance().getContoller().getSettingsCtrlr().getNSPFileFilterForGL()); - workThread = new Thread(usbNetCommunications); - workThread.setDaemon(true); - workThread.start(); - } - else { // NET INSTALL OVER TINFOIL - if (MediatorControl.getInstance().getContoller().getSettingsCtrlr().isNsIpValidate() && ! getNsIp().matches("^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$")) - if (!ServiceWindow.getConfirmationWindow(resourceBundle.getString("windowTitleBadIp"),resourceBundle.getString("windowBodyBadIp"))) - return; - - String nsIP = getNsIp(); - - if (! MediatorControl.getInstance().getContoller().getSettingsCtrlr().getExpertModeSelected()) - usbNetCommunications = new NETCommunications(nspToUpload, nsIP, false, "", "", ""); - else { - usbNetCommunications = new NETCommunications( - nspToUpload, - nsIP, - MediatorControl.getInstance().getContoller().getSettingsCtrlr().getNotServeSelected(), - MediatorControl.getInstance().getContoller().getSettingsCtrlr().getAutoIpSelected()?"":MediatorControl.getInstance().getContoller().getSettingsCtrlr().getHostIp(), - MediatorControl.getInstance().getContoller().getSettingsCtrlr().getRandPortSelected()?"":MediatorControl.getInstance().getContoller().getSettingsCtrlr().getHostPort(), - MediatorControl.getInstance().getContoller().getSettingsCtrlr().getNotServeSelected()?MediatorControl.getInstance().getContoller().getSettingsCtrlr().getHostExtra():"" - ); - } - - workThread = new Thread(usbNetCommunications); - workThread.setDaemon(true); - workThread.start(); + usbNetCommunications = new NETCommunications( + nspToUpload, + nsIP, + settings.getNotServeSelected(), + settings.getAutoIpSelected()?"":settings.getHostIp(), + settings.getRandPortSelected()?"":settings.getHostPort(), + settings.getNotServeSelected()?settings.getHostExtra():"" + ); } } + workThread = new Thread(usbNetCommunications); + workThread.setDaemon(true); + workThread.start(); } /** * It's button listener when transmission in progress @@ -320,10 +317,11 @@ public class FrontController implements Initializable { @FXML private void handleDrop(DragEvent event){ List filesDropped = event.getDragboard().getFiles(); + SettingsController settingsController = MediatorControl.getInstance().getContoller().getSettingsCtrlr(); - if (getSelectedProtocol().equals("TinFoil") && MediatorControl.getInstance().getContoller().getSettingsCtrlr().getTfXciNszXczSupport()) + if (getSelectedProtocol().equals("TinFoil") && settingsController.getTfXciNszXczSupport()) filesDropped.removeIf(file -> ! file.getName().toLowerCase().matches("(.*\\.nsp$)|(.*\\.xci$)|(.*\\.nsz$)|(.*\\.xcz$)")); - else if (getSelectedProtocol().equals("GoldLeaf") && (! MediatorControl.getInstance().getContoller().getSettingsCtrlr().getNSPFileFilterForGL())) + else if (getSelectedProtocol().equals("GoldLeaf") && (! settingsController.getNSPFileFilterForGL())) filesDropped.removeIf(file -> (file.isDirectory() && ! file.getName().toLowerCase().matches(".*\\.nsp$"))); else filesDropped.removeIf(file -> ! file.getName().toLowerCase().matches(".*\\.nsp$")); @@ -339,7 +337,7 @@ public class FrontController implements Initializable { * Called from mediator * TODO: remove shitcoding practices * */ - public void notifyTransmThreadStarted(boolean isActive, EModule type){ + public void notifyThreadStarted(boolean isActive, EModule type){ if (! type.equals(EModule.USB_NET_TRANSFERS)){ usbNetPane.setDisable(isActive); return; diff --git a/src/main/java/nsusbloader/Controllers/RcmController.java b/src/main/java/nsusbloader/Controllers/RcmController.java index f55842b..a9feb05 100644 --- a/src/main/java/nsusbloader/Controllers/RcmController.java +++ b/src/main/java/nsusbloader/Controllers/RcmController.java @@ -18,7 +18,6 @@ */ package nsusbloader.Controllers; -import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; @@ -36,7 +35,7 @@ import nsusbloader.AppPreferences; import nsusbloader.MediatorControl; import nsusbloader.NSLDataTypes.EModule; import nsusbloader.ServiceWindow; -import nsusbloader.Utilities.RcmTask; +import nsusbloader.Utilities.Rcm; import java.io.File; import java.net.URL; @@ -199,37 +198,32 @@ public class RcmController implements Initializable { return; } - Task RcmTask; + Rcm rcmTask; RadioButton selectedRadio = (RadioButton)rcmToggleGrp.getSelectedToggle(); switch (selectedRadio.getId()){ case "pldrRadio1": - RcmTask = new RcmTask(payloadFPathLbl1.getText()); + rcmTask = new Rcm(payloadFPathLbl1.getText()); break; case "pldrRadio2": - RcmTask = new RcmTask(payloadFPathLbl2.getText()); + rcmTask = new Rcm(payloadFPathLbl2.getText()); break; case "pldrRadio3": - RcmTask = new RcmTask(payloadFPathLbl3.getText()); + rcmTask = new Rcm(payloadFPathLbl3.getText()); break; case "pldrRadio4": - RcmTask = new RcmTask(payloadFPathLbl4.getText()); + rcmTask = new Rcm(payloadFPathLbl4.getText()); break; case "pldrRadio5": - RcmTask = new RcmTask(payloadFPathLbl5.getText()); + rcmTask = new Rcm(payloadFPathLbl5.getText()); break; default: return; } - RcmTask.setOnSucceeded(event -> { - if (RcmTask.getValue()) - statusLbl.setText(rb.getString("done_txt")); - else - statusLbl.setText(rb.getString("failure_txt")); - }); - Thread RcmThread = new Thread(RcmTask); - RcmThread.setDaemon(true); - RcmThread.start(); + Thread rcmThread = new Thread(rcmTask); + + rcmThread.setDaemon(true); + rcmThread.start(); } @FXML @@ -328,7 +322,14 @@ public class RcmController implements Initializable { } } - public void notifySmThreadStarted(boolean isStart, EModule type){ + public void setOneLineStatus(boolean statusSuccess){ + if (statusSuccess) + statusLbl.setText(rb.getString("done_txt")); + else + statusLbl.setText(rb.getString("failure_txt")); + } + + public void notifyThreadStarted(boolean isStart, EModule type){ rcmToolPane.setDisable(isStart); if (type.equals(EModule.RCM) && isStart){ MediatorControl.getInstance().getContoller().logArea.clear(); diff --git a/src/main/java/nsusbloader/MediatorControl.java b/src/main/java/nsusbloader/MediatorControl.java index c0af1ab..e14564a 100644 --- a/src/main/java/nsusbloader/MediatorControl.java +++ b/src/main/java/nsusbloader/MediatorControl.java @@ -41,9 +41,9 @@ public class MediatorControl { public synchronized void setBgThreadActive(boolean isActive, EModule appModuleType) { isTransferActive.set(isActive); - mainCtrler.getFrontCtrlr().notifyTransmThreadStarted(isActive, appModuleType); + mainCtrler.getFrontCtrlr().notifyThreadStarted(isActive, appModuleType); mainCtrler.getSmCtrlr().notifySmThreadStarted(isActive, appModuleType); - mainCtrler.getRcmCtrlr().notifySmThreadStarted(isActive, appModuleType); + mainCtrler.getRcmCtrlr().notifyThreadStarted(isActive, appModuleType); mainCtrler.getNXDTabController().notifyThreadStarted(isActive, appModuleType); } public synchronized boolean getTransferActive() { return this.isTransferActive.get(); } diff --git a/src/main/java/nsusbloader/ModelControllers/ILogPrinter.java b/src/main/java/nsusbloader/ModelControllers/ILogPrinter.java new file mode 100644 index 0000000..09b1e8e --- /dev/null +++ b/src/main/java/nsusbloader/ModelControllers/ILogPrinter.java @@ -0,0 +1,35 @@ +/* + 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.ModelControllers; + +import nsusbloader.NSLDataTypes.EFileStatus; +import nsusbloader.NSLDataTypes.EMsgType; + +import java.io.File; +import java.util.HashMap; + +public interface ILogPrinter { + void print(String message, EMsgType type); + void updateProgress(Double value); + void update(HashMap nspMap, EFileStatus status); + void update(File file, EFileStatus status); + void updateOneLinerStatus(boolean status); + void close(); +} diff --git a/src/main/java/nsusbloader/ModelControllers/Log.java b/src/main/java/nsusbloader/ModelControllers/Log.java new file mode 100644 index 0000000..4f5e94a --- /dev/null +++ b/src/main/java/nsusbloader/ModelControllers/Log.java @@ -0,0 +1,34 @@ +/* + 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.ModelControllers; + +import nsusbloader.NSLDataTypes.EModule; +import nsusbloader.NSLMain; + +public class Log { + + private Log(){} + + public static ILogPrinter getPrinter(EModule whoIsAsking){ + if (NSLMain.isCli) + return new LogPrinterCli(); + else + return new LogPrinterGui(whoIsAsking); + } +} diff --git a/src/main/java/nsusbloader/ModelControllers/LogPrinterCli.java b/src/main/java/nsusbloader/ModelControllers/LogPrinterCli.java new file mode 100644 index 0000000..affa66e --- /dev/null +++ b/src/main/java/nsusbloader/ModelControllers/LogPrinterCli.java @@ -0,0 +1,42 @@ +package nsusbloader.ModelControllers; + +import nsusbloader.NSLDataTypes.EFileStatus; +import nsusbloader.NSLDataTypes.EMsgType; + +import java.io.File; +import java.util.HashMap; + +public class LogPrinterCli implements ILogPrinter{ + @Override + public void print(String message, EMsgType type) { + switch (type){ + case PASS: + System.out.println("P: "+message); + break; + case FAIL: + System.out.println("F: "+message); + break; + case INFO: + System.out.println("I: "+message); + break; + case WARNING: + System.out.println("W: "+message); + break; + default: + System.out.println(message); + } + } + + @Override + public void updateProgress(Double value) { } + @Override + public void update(HashMap nspMap, EFileStatus status) { } + @Override + public void update(File file, EFileStatus status) { } + @Override + public void updateOneLinerStatus(boolean status){ } + @Override + public void close() { + System.out.println("\n-\n"); + } +} diff --git a/src/main/java/nsusbloader/ModelControllers/LogPrinter.java b/src/main/java/nsusbloader/ModelControllers/LogPrinterGui.java similarity index 78% rename from src/main/java/nsusbloader/ModelControllers/LogPrinter.java rename to src/main/java/nsusbloader/ModelControllers/LogPrinterGui.java index 9d5adfe..4bcb11c 100644 --- a/src/main/java/nsusbloader/ModelControllers/LogPrinter.java +++ b/src/main/java/nsusbloader/ModelControllers/LogPrinterGui.java @@ -26,23 +26,27 @@ import java.io.File; import java.util.HashMap; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; -public class LogPrinter { - private MessagesConsumer msgConsumer; - private BlockingQueue msgQueue; - private BlockingQueue progressQueue; - private HashMap statusMap; // BlockingQueue for literally one object. TODO: read more books ; replace to hashMap +public class LogPrinterGui implements ILogPrinter { + private final MessagesConsumer msgConsumer; + private final BlockingQueue msgQueue; + private final BlockingQueue progressQueue; + private final HashMap statusMap; // BlockingQueue for literally one object. TODO: read more books ; replace to hashMap + private AtomicBoolean oneLinerStatus; - public LogPrinter(EModule whoIsAsking){ + public LogPrinterGui(EModule whoIsAsking){ this.msgQueue = new LinkedBlockingQueue<>(); this.progressQueue = new LinkedBlockingQueue<>(); this.statusMap = new HashMap<>(); - this.msgConsumer = new MessagesConsumer(whoIsAsking, this.msgQueue, this.progressQueue, this.statusMap); + this.oneLinerStatus = new AtomicBoolean(); + this.msgConsumer = new MessagesConsumer(whoIsAsking, this.msgQueue, this.progressQueue, this.statusMap, this.oneLinerStatus); this.msgConsumer.start(); } /** * This is what will print to textArea of the application. * */ + @Override public void print(String message, EMsgType type){ try { switch (type){ @@ -69,6 +73,7 @@ public class LogPrinter { /** * Update progress for progress bar * */ + @Override public void updateProgress(Double value) { try { progressQueue.put(value); @@ -78,6 +83,7 @@ public class LogPrinter { /** * When we're done - update status * */ + @Override public void update(HashMap nspMap, EFileStatus status){ for (File file: nspMap.values()) statusMap.putIfAbsent(file.getName(), status); @@ -85,12 +91,19 @@ public class LogPrinter { /** * When we're done - update status * */ + @Override public void update(File file, EFileStatus status){ statusMap.putIfAbsent(file.getName(), status); } + + @Override + public void updateOneLinerStatus(boolean status){ + oneLinerStatus.set(status); + } /** * When we're done - close it * */ + @Override public void close(){ msgConsumer.interrupt(); } diff --git a/src/main/java/nsusbloader/ModelControllers/MessagesConsumer.java b/src/main/java/nsusbloader/ModelControllers/MessagesConsumer.java index ce0cce9..f0b6d7c 100644 --- a/src/main/java/nsusbloader/ModelControllers/MessagesConsumer.java +++ b/src/main/java/nsusbloader/ModelControllers/MessagesConsumer.java @@ -26,10 +26,12 @@ import nsusbloader.Controllers.NSTableViewController; import nsusbloader.MediatorControl; import nsusbloader.NSLDataTypes.EFileStatus; import nsusbloader.NSLDataTypes.EModule; +import nsusbloader.NSLDataTypes.EMsgType; import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.BlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; public class MessagesConsumer extends AnimationTimer { private final BlockingQueue msgQueue; @@ -41,9 +43,15 @@ public class MessagesConsumer extends AnimationTimer { private final NSTableViewController tableViewController; private final EModule appModuleType; + private AtomicBoolean oneLinerStatus; + private boolean isInterrupted; - MessagesConsumer(EModule appModuleType, BlockingQueue msgQueue, BlockingQueue progressQueue, HashMap statusMap){ + MessagesConsumer(EModule appModuleType, + BlockingQueue msgQueue, + BlockingQueue progressQueue, + HashMap statusMap, + AtomicBoolean oneLinerStatus) { this.appModuleType = appModuleType; this.isInterrupted = false; @@ -56,6 +64,8 @@ public class MessagesConsumer extends AnimationTimer { this.statusMap = statusMap; this.tableViewController = MediatorControl.getInstance().getContoller().FrontTabController.tableFilesListController; + this.oneLinerStatus = oneLinerStatus; + progressBar.setProgress(0.0); progressBar.setProgress(ProgressIndicator.INDETERMINATE_PROGRESS); @@ -84,9 +94,15 @@ public class MessagesConsumer extends AnimationTimer { MediatorControl.getInstance().setBgThreadActive(false, appModuleType); progressBar.setProgress(0.0); - if (statusMap.size() > 0) + if (statusMap.size() > 0){ for (String key : statusMap.keySet()) tableViewController.setFileStatus(key, statusMap.get(key)); + } + //TODO: rewrite + if (appModuleType.equals(EModule.RCM)){ + MediatorControl.getInstance().getContoller().getRcmCtrlr().setOneLineStatus(oneLinerStatus.get()); + } + this.stop(); } } diff --git a/src/main/java/nsusbloader/NSLMain.java b/src/main/java/nsusbloader/NSLMain.java index 849c34c..b72475e 100644 --- a/src/main/java/nsusbloader/NSLMain.java +++ b/src/main/java/nsusbloader/NSLMain.java @@ -25,14 +25,17 @@ import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.stage.Stage; import nsusbloader.Controllers.NSLMainController; +import nsusbloader.Utilities.Rcm; +import java.io.File; import java.util.Locale; import java.util.ResourceBundle; import java.util.prefs.Preferences; public class NSLMain extends Application { - public static final String appVersion = "v3.0"; + public static final String appVersion = "v4.0"; + public static boolean isCli; @Override public void start(Stage primaryStage) throws Exception{ @@ -86,9 +89,11 @@ public class NSLMain extends Application { } private static boolean handleCli(String[] args){ - if (args.length != 1) + if (args.length == 0) return false; + NSLMain.isCli = true; + try { switch (args[0]) { case "-v": @@ -104,19 +109,44 @@ public class NSLMain extends Application { else System.out.println("Nothing to remove"); return true; + case "--rcm": // TODO: rewrite + if (args.length < 2){ + System.out.println("No payload file specified. Expected:\n" + + "... file.jar --rcm payload.bin\n" + "or\n" + + "... file.jar --rcm /home/user/payload.bin\n"); + return true; + } + + boolean isWindows = false; + if (System.getProperty("os.name").toLowerCase().replace(" ", "").contains("windows")) + isWindows = true; + + if (isWindows) { + if (! args[1].matches("^.:\\\\.*$")) + args[1] = System.getProperty("user.dir") + File.separator + args[1]; + } + else { + if (! args[1].startsWith("/")) + args[1] = System.getProperty("user.dir") + File.separator + args[1]; + } + + Rcm rcm = new Rcm(args[1]); + Thread rcmThread = new Thread(rcm); + rcmThread.start(); + return true; case "--help": + default: System.out.println("CLI Usage:\n" + + "\t --rcm payload.bin\tSend payload\n" + "\t-c, --clean\tRemove/reset settings and exit\n" + "\t-v, --version \tShow application version\n" + "\t-h, --help\t\tShow this message"); return true; - default: - return false; } } catch (Exception e){ e.printStackTrace(); - return false; + return true; } } } diff --git a/src/main/java/nsusbloader/Utilities/NxdtTask.java b/src/main/java/nsusbloader/Utilities/NxdtTask.java index 4b3907f..bb90540 100644 --- a/src/main/java/nsusbloader/Utilities/NxdtTask.java +++ b/src/main/java/nsusbloader/Utilities/NxdtTask.java @@ -20,18 +20,19 @@ package nsusbloader.Utilities; import javafx.concurrent.Task; import nsusbloader.COM.USB.UsbConnect; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; +import nsusbloader.ModelControllers.Log; import nsusbloader.NSLDataTypes.EModule; import nsusbloader.NSLDataTypes.EMsgType; import org.usb4java.DeviceHandle; public class NxdtTask extends Task { - private LogPrinter logPrinter; + private ILogPrinter logPrinter; private String saveToLocation; public NxdtTask(String saveToLocation){ - this.logPrinter = new LogPrinter(EModule.NXDT); + this.logPrinter = Log.getPrinter(EModule.NXDT); this.saveToLocation = saveToLocation; } diff --git a/src/main/java/nsusbloader/Utilities/NxdtUsbAbi1.java b/src/main/java/nsusbloader/Utilities/NxdtUsbAbi1.java index 0f1b6b0..f67e6a6 100644 --- a/src/main/java/nsusbloader/Utilities/NxdtUsbAbi1.java +++ b/src/main/java/nsusbloader/Utilities/NxdtUsbAbi1.java @@ -20,7 +20,7 @@ package nsusbloader.Utilities; import javafx.concurrent.Task; import nsusbloader.COM.USB.UsbErrorCodes; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; import nsusbloader.NSLDataTypes.EMsgType; import org.usb4java.DeviceHandle; import org.usb4java.LibUsb; @@ -33,7 +33,7 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; class NxdtUsbAbi1 { - private LogPrinter logPrinter; + private ILogPrinter logPrinter; private DeviceHandle handlerNS; private Task task; private String saveToPath; @@ -80,7 +80,7 @@ class NxdtUsbAbi1 { public NxdtUsbAbi1(DeviceHandle handler, Task task, - LogPrinter logPrinter, + ILogPrinter logPrinter, String saveToPath ){ this.handlerNS = handler; diff --git a/src/main/java/nsusbloader/Utilities/RcmTask.java b/src/main/java/nsusbloader/Utilities/Rcm.java similarity index 95% rename from src/main/java/nsusbloader/Utilities/RcmTask.java rename to src/main/java/nsusbloader/Utilities/Rcm.java index f7d6bc4..fddb849 100644 --- a/src/main/java/nsusbloader/Utilities/RcmTask.java +++ b/src/main/java/nsusbloader/Utilities/Rcm.java @@ -24,10 +24,10 @@ */ package nsusbloader.Utilities; -import javafx.concurrent.Task; import nsusbloader.COM.USB.UsbConnect; import nsusbloader.COM.USB.UsbErrorCodes; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; +import nsusbloader.ModelControllers.Log; import nsusbloader.NSLDataTypes.EModule; import nsusbloader.NSLDataTypes.EMsgType; import org.usb4java.*; @@ -37,13 +37,15 @@ import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.util.Arrays; -public class RcmTask extends Task { +public class Rcm implements Runnable{ + + private boolean status = false; private enum ECurrentOS { win, lin, mac, unsupported } - private LogPrinter logPrinter; + private ILogPrinter logPrinter; private String filePath; private DeviceHandle handler; @@ -65,13 +67,13 @@ public class RcmTask extends Task { private static final byte[] sprayPttrn = { 0x00, 0x00, 0x01, 0x40}; - public RcmTask(String filePath){ - this.logPrinter = new LogPrinter(EModule.RCM); + public Rcm(String filePath){ + this.logPrinter = Log.getPrinter(EModule.RCM); this.filePath = filePath; } @Override - protected Boolean call() { + public void run() { logPrinter.print("Selected: "+filePath, EMsgType.INFO); logPrinter.print("=============== RCM ===============", EMsgType.INFO); @@ -94,13 +96,13 @@ public class RcmTask extends Task { "\n But you could file a bug with request."+ "\n\n Nothing has been sent to NS. Execution stopped.", EMsgType.FAIL); logPrinter.close(); - return false; + return; } } if (preparePayload()){ logPrinter.close(); - return false; + return; } // === TEST THIS === // writeTestFile(); @@ -111,7 +113,7 @@ public class RcmTask extends Task { if (! usbConnect.isConnected()){ logPrinter.close(); - return false; + return; } this.handler = usbConnect.getNsHandler(); @@ -119,7 +121,7 @@ public class RcmTask extends Task { if (readUsbDeviceID()){ usbConnect.close(); logPrinter.close(); - return false; + return; } // Send payload for (int i=0; i < fullPayload.length / 4096 ; i++){ @@ -128,7 +130,7 @@ public class RcmTask extends Task { "\n\n Execution stopped.", EMsgType.FAIL); usbConnect.close(); logPrinter.close(); - return false; + return; } } logPrinter.print("Information sent to NS.", EMsgType.PASS); @@ -137,7 +139,7 @@ public class RcmTask extends Task { if (smashMacOS()){ usbConnect.close(); logPrinter.close(); - return false; + return; } } else { @@ -153,7 +155,7 @@ public class RcmTask extends Task { "\n\n Execution stopped and failed. And it's strange.", EMsgType.FAIL); usbConnect.close(); logPrinter.close(); - return false; + return; } if (retval != 0){ @@ -161,14 +163,13 @@ public class RcmTask extends Task { "\n\n Execution stopped and failed.", EMsgType.FAIL); usbConnect.close(); logPrinter.close(); - return false; + return; } } logPrinter.print(".:: Payload complete ::.", EMsgType.PASS); - usbConnect.close(); + logPrinter.updateOneLinerStatus(true); logPrinter.close(); - return true; } /** * Prepare the 'big' or full-size byte-buffer that is actually is a payload that we're about to use. diff --git a/src/main/java/nsusbloader/Utilities/SplitMergeTool.java b/src/main/java/nsusbloader/Utilities/SplitMergeTool.java index 2bbb970..66a8160 100644 --- a/src/main/java/nsusbloader/Utilities/SplitMergeTool.java +++ b/src/main/java/nsusbloader/Utilities/SplitMergeTool.java @@ -19,7 +19,8 @@ package nsusbloader.Utilities; import javafx.concurrent.Task; -import nsusbloader.ModelControllers.LogPrinter; +import nsusbloader.ModelControllers.ILogPrinter; +import nsusbloader.ModelControllers.Log; import nsusbloader.NSLDataTypes.EModule; import nsusbloader.NSLDataTypes.EMsgType; @@ -39,14 +40,14 @@ public class SplitMergeTool { class SplitTask extends Task{ - private LogPrinter logPrinter; + private ILogPrinter logPrinter; private String saveToPath; private String filePath; SplitTask(String filePath, String saveToPath){ this.filePath = filePath; this.saveToPath = saveToPath; - logPrinter = new LogPrinter(EModule.SPLIT_MERGE_TOOL); + logPrinter = Log.getPrinter(EModule.SPLIT_MERGE_TOOL); } @Override @@ -182,14 +183,14 @@ class SplitTask extends Task{ class MergeTask extends Task { - private LogPrinter logPrinter; + private ILogPrinter logPrinter; private String saveToPath; private String filePath; MergeTask(String filePath, String saveToPath) { this.filePath = filePath; this.saveToPath = saveToPath; - logPrinter = new LogPrinter(EModule.SPLIT_MERGE_TOOL); + logPrinter = Log.getPrinter(EModule.SPLIT_MERGE_TOOL); } @Override protected Boolean call() {