cleaning and adding updates
This commit is contained in:
@@ -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.");
|
||||
|
||||
Reference in New Issue
Block a user