106 lines
No EOL
3.8 KiB
Java
106 lines
No EOL
3.8 KiB
Java
/*
|
|
Copyright 2019-2024 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 <https://www.gnu.org/licenses/>.
|
|
*/
|
|
package nsusbloader.ModelControllers;
|
|
|
|
import javafx.animation.AnimationTimer;
|
|
import javafx.scene.control.ProgressBar;
|
|
import javafx.scene.control.ProgressIndicator;
|
|
import javafx.scene.control.TextArea;
|
|
import nsusbloader.Controllers.Payload;
|
|
import nsusbloader.MediatorControl;
|
|
import nsusbloader.NSLDataTypes.EFileStatus;
|
|
import nsusbloader.NSLDataTypes.EModule;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.ResourceBundle;
|
|
import java.util.concurrent.BlockingQueue;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
public class MessagesConsumer extends AnimationTimer {
|
|
private static final MediatorControl mediator = MediatorControl.INSTANCE;
|
|
private static final TextArea logsArea = mediator.getLogArea();
|
|
private static final ProgressBar progressBar = mediator.getProgressBar();;
|
|
private static final ResourceBundle resourceBundle = mediator.getResourceBundle();
|
|
|
|
private final BlockingQueue<String> msgQueue;
|
|
private final BlockingQueue<Double> progressQueue;
|
|
private final HashMap<String, EFileStatus> statusMap;
|
|
private final EModule appModuleType;
|
|
|
|
private final AtomicBoolean oneLinerStatus;
|
|
|
|
private boolean isInterrupted;
|
|
|
|
MessagesConsumer(EModule appModuleType,
|
|
BlockingQueue<String> msgQueue,
|
|
BlockingQueue<Double> progressQueue,
|
|
HashMap<String, EFileStatus> statusMap,
|
|
AtomicBoolean oneLinerStatus){
|
|
this.appModuleType = appModuleType;
|
|
this.isInterrupted = false;
|
|
this.msgQueue = msgQueue;
|
|
this.progressQueue = progressQueue;
|
|
this.statusMap = statusMap;
|
|
this.oneLinerStatus = oneLinerStatus;
|
|
|
|
progressBar.setProgress(0.0);
|
|
progressBar.setProgress(ProgressIndicator.INDETERMINATE_PROGRESS);
|
|
|
|
logsArea.clear();
|
|
mediator.setTransferActive(appModuleType, true, new Payload());
|
|
}
|
|
|
|
@Override
|
|
public void handle(long l){
|
|
ArrayList<String> messages = new ArrayList<>();
|
|
int msgReceived = msgQueue.drainTo(messages);
|
|
if (msgReceived > 0)
|
|
messages.forEach(logsArea::appendText);
|
|
|
|
ArrayList<Double> progress = new ArrayList<>();
|
|
int progressReceived = progressQueue.drainTo(progress);
|
|
if (progressReceived > 0) {
|
|
progress.forEach(prg -> {
|
|
if (prg != 1.0)
|
|
progressBar.setProgress(prg);
|
|
else
|
|
progressBar.setProgress(ProgressIndicator.INDETERMINATE_PROGRESS);
|
|
});
|
|
}
|
|
|
|
if (isInterrupted) // safe, could not be interrupted while HashMap populating
|
|
updateElementsAndStop();
|
|
}
|
|
|
|
private void updateElementsAndStop(){
|
|
Payload payload = new Payload(
|
|
resourceBundle.getString(oneLinerStatus.get() ? "done_txt" : "failure_txt"),
|
|
statusMap);
|
|
|
|
mediator.setTransferActive(appModuleType, false, payload);
|
|
progressBar.setProgress(0.0);
|
|
|
|
this.stop();
|
|
}
|
|
|
|
public void interrupt(){
|
|
this.isInterrupted = true;
|
|
}
|
|
} |