cleaning and adding updates

This commit is contained in:
2026-08-20 17:24:55 -04:00
parent 4ac3c6fa69
commit 80166c477b
70 changed files with 471 additions and 284 deletions
@@ -350,12 +350,16 @@ public class J3270App extends JFrame implements ConnectionListener, ScreenUpdate
@Override
public void onScreenUpdated() {
SwingUtilities.invokeLater(() -> {
if (client != null) {
client.getInputProcessor().setKeyboardLocked(false);
}
// During an active file transfer, let the CUT/DFT handler drive
// keyboard state. In x3270, ft_cut_data() runs before WCC
// keyboard-restore is applied — the keyboard stays locked for the
// entire CUT transfer.
if (fileTransfer != null) {
fileTransfer.onScreenUpdated();
}
if (client != null && (fileTransfer == null || !fileTransfer.isTransferActive())) {
client.getInputProcessor().setKeyboardLocked(false);
}
terminalPanel.repaint();
statusBar.updateStatus();
});
@@ -22,6 +22,10 @@ public class FileTransfer implements FTCut.FTCutListener, FTDft.FTDftListener {
private static final Logger log = Logger.getLogger(FileTransfer.class.getName());
public enum FTMode {
UNKNOWN, CUT, DFT
}
public interface FileTransferCallback {
void onTransferStarted();
void onTransferRunning();
@@ -36,6 +40,7 @@ public class FileTransfer implements FTCut.FTCutListener, FTDft.FTDftListener {
private FTConfig currentConfig;
private File localFile;
private FTState state = FTState.NONE;
private FTMode activeMode = FTMode.UNKNOWN;
private FTCut cutHandler;
private FTDft dftHandler;
@@ -64,6 +69,7 @@ public class FileTransfer implements FTCut.FTCutListener, FTDft.FTDftListener {
this.currentConfig = config;
this.localFile = new File(config.getLocalFilename());
this.activeMode = FTMode.UNKNOWN;
// Check overwrite
if (config.isReceive() && !config.isAppend() && !config.isOverwrite()) {
@@ -83,14 +89,6 @@ public class FileTransfer implements FTCut.FTCutListener, FTDft.FTDftListener {
client.getDataStreamProcessor().setFTDft(dftHandler);
}
try {
cutHandler.initTransfer(localFile);
dftHandler.initTransfer(localFile);
} catch (IOException e) {
cleanupHandlers(false);
return "Failed to open local file: " + e.getMessage();
}
// Build and type the IND$FILE command
String command = config.buildCommand();
log.info("Starting IND$FILE transfer with command: " + command);
@@ -130,9 +128,19 @@ public class FileTransfer implements FTCut.FTCutListener, FTDft.FTDftListener {
}
}
/** Check whether a file transfer is currently active. */
public boolean isTransferActive() {
return state != FTState.NONE;
}
public FTMode getActiveMode() {
return activeMode;
}
/** Must be called after every screen update to drive CUT mode. */
public void onScreenUpdated() {
if (state == FTState.AWAIT_ACK || state == FTState.RUNNING || state == FTState.ABORT_WAIT) {
if ((activeMode == FTMode.CUT || activeMode == FTMode.UNKNOWN) &&
(state == FTState.AWAIT_ACK || state == FTState.RUNNING || state == FTState.ABORT_WAIT)) {
cutHandler.processScreenUpdate();
}
}
@@ -179,6 +187,7 @@ public class FileTransfer implements FTCut.FTCutListener, FTDft.FTDftListener {
boolean success = (errorMessage == null);
cleanupHandlers(success);
setState(FTState.NONE);
activeMode = FTMode.UNKNOWN;
currentConfig = null;
}
@@ -186,6 +195,32 @@ public class FileTransfer implements FTCut.FTCutListener, FTDft.FTDftListener {
@Override
public void onTransferRunning() {
// Mode detection check
StackTraceElement[] st = Thread.currentThread().getStackTrace();
boolean isDft = false;
for (StackTraceElement elem : st) {
if (elem.getClassName().contains("FTDft")) {
isDft = true;
break;
}
}
if (activeMode == FTMode.UNKNOWN) {
activeMode = isDft ? FTMode.DFT : FTMode.CUT;
log.info("FT mode established: " + activeMode);
try {
if (activeMode == FTMode.DFT) {
dftHandler.initTransfer(localFile);
} else {
cutHandler.initTransfer(localFile);
}
} catch (IOException e) {
log.warning("Failed to open local file for " + activeMode + ": " + e.getMessage());
onTransferAborted("Failed to open local file: " + e.getMessage());
return;
}
}
cancelTimeout();
setState(FTState.RUNNING);
SwingUtilities.invokeLater(callback::onTransferRunning);
@@ -193,7 +228,7 @@ public class FileTransfer implements FTCut.FTCutListener, FTDft.FTDftListener {
@Override
public void onTransferComplete(String errorMessage) {
completeTransfer(null);
completeTransfer(errorMessage);
SwingUtilities.invokeLater(() -> {
if (errorMessage == null) {
callback.onTransferComplete("Transfer complete.");