xtn5250mg/net/infordata/em/Main.java
2025-05-13 14:41:26 +02:00

347 lines
11 KiB
Java

package net.infordata.em;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.File;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import net.infordata.em.crt5250.XI5250Field;
import net.infordata.em.crt5250.XIEbcdicTranslator;
import net.infordata.em.tn5250.XI5250Emulator;
import net.infordata.em.tn5250.XI5250Frame;
import net.infordata.em.tn5250ext.PSHBTNCHCHandler;
import net.infordata.em.tn5250ext.XI5250EmulatorExt;
import net.infordata.em.tn5250ext.XI5250PanelHandler;
import net.infordata.em.tn5250ext.XI5250PanelsDispatcher;
import net.infordata.em.tn5250.XIImagesBdl;
/**
* Command line startup utility.
* @author valentino.proietti
*/
public class Main {
// images
private static XIImagesBdl cvImagesBdl =
net.infordata.em.tn5250.XIImagesBdl.getImagesBdl();
private Main() {}
private static void usageError(String msg) {
System.err.println(msg);
System.err.println("Usage: [-3dFX] [-PSHBTNCHC] [-STRPCCMD] [-altFKeyRemap]" +
" [-maximized] [-cp codepage] [-devName name]" +
" [-autoLogon <fieldsCount>;<usrFieldLabel>;<pwdFieldLabel>;<user>;<passwd>]" +
" host-name");
System.err.println("Supported code pages:");
for (String cp : XIEbcdicTranslator.getRegisteredTranslators().keySet()) {
System.err.println(" " + cp +
(XI5250Emulator.DEFAULT_CODE_PAGE.equalsIgnoreCase(cp)? " default" : ""));
}
System.exit(1);
}
public static Font loadFontFromResource(Class theClass, String fontFileName, float fontSize) {
float fntSize = 12f;
if (fontSize >= 1f) {
fntSize = fontSize;
}
InputStream is = null;
try {
is = new FileInputStream("/tmp/Inconsolata.otf");
} catch (FileNotFoundException ex) {
System.err.println("file not found font : " + ex);
}
Font font = null;
try {
System.err.println(" createFont Testing res/" + fontFileName + " ... ");
font = Font.createFont(Font.TRUETYPE_FONT, is);
System.err.println(" createFont OK ");
font = font.deriveFont(fntSize);
} catch (FontFormatException | IOException ex) {
System.err.println(" Font err : " + ex.getMessage());
} finally {
if (is != null) {
try {
is.close();
} catch (IOException ex) {
System.err.println("Close error : " + ex.getMessage());
}
}
}
return font;
}
/**
*/
public static void main(String[] args) {
boolean pUse3dFX = false;
boolean pAltFKeyRemap = false;
boolean pPSHBTNCHC = false;
boolean pSTRPCCMD = false;
boolean pMaximized = false;
String arg;
String pHost = null;
boolean expectCP = false;
boolean expectDevName = false;
boolean expectLogonInfo = false;
String cp = null;
String devName = null;
LogonInfo logonInfo = null;
for (int i = 0; i < args.length; i++) {
arg = args[i];
if (arg.startsWith("-")) {
if ("-3dfx".equalsIgnoreCase(arg))
pUse3dFX = true;
else if ("-PSHBTNCHC".equalsIgnoreCase(arg))
pPSHBTNCHC = true;
else if ("-STRPCCMD".equalsIgnoreCase(arg))
pSTRPCCMD = true;
else if ("-maximized".equalsIgnoreCase(arg))
pMaximized = true;
else if ("-altFKeyRemap".equalsIgnoreCase(arg))
pAltFKeyRemap = true;
else if ("-cp".equalsIgnoreCase(arg))
expectCP = true;
else if ("-devName".equalsIgnoreCase(arg))
expectDevName = true;
else if ("-autoLogon".equalsIgnoreCase(arg))
expectLogonInfo = true;
else
usageError("Wrong option: " + arg);
}
else if (expectCP) {
expectCP = false;
if (XIEbcdicTranslator.getTranslator(arg) == null)
usageError("Unknown codepage: " + arg);
cp = arg;
}
else if (expectDevName) {
expectDevName = false;
devName = arg;
}
else if (expectLogonInfo) {
expectLogonInfo = false;
try {
logonInfo = new LogonInfo(arg);
}
catch (IllegalArgumentException ex) {
usageError(ex.getMessage());
}
}
else {
if (pHost == null)
pHost = arg;
else
usageError("Too many host names.");
}
}
if (expectCP)
usageError("A code page is expected");
final boolean altFKeyRemap = pAltFKeyRemap;
final boolean use3dFX = pUse3dFX;
final boolean enablePSHBTNCHC = pPSHBTNCHC;
final boolean enableSTRPCCMD = pSTRPCCMD;
final boolean maximized = pMaximized;
final String host = pHost;
final String codePage = cp;
final String deviceName = devName;
final LogonInfo autoLogonInfo = logonInfo;
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
XI5250Emulator em;
if (enablePSHBTNCHC) {
XI5250EmulatorExt emext = new XI5250EmulatorExt();
PanelsDispatcher disp = new PanelsDispatcher();
disp.setEmulator(emext);
new PSHBTNCHCHandler(disp);
if (autoLogonInfo != null)
new AutoLogonHandler(disp, autoLogonInfo);
em = emext;
}
else if (autoLogonInfo != null) {
XI5250EmulatorExt emext = new XI5250EmulatorExt();
PanelsDispatcher disp = new PanelsDispatcher();
disp.setEmulator(emext);
new AutoLogonHandler(disp, autoLogonInfo);
em = emext;
}
else {
em = new XI5250Emulator();
}
em.setTerminalType("IBM-3477-FC");
em.setKeyboardQueue(true);
em.setStrPcCmdEnabled(enableSTRPCCMD);
em.setAltFKeyRemap(altFKeyRemap);
em.setCodePage(codePage);
if (deviceName != null)
em.setTelnetEnv("\u0003DEVNAME\u0001" + deviceName);
if (host != null) {
em.setHost(host);
em.setActive(true);
}
Font mahefaFont = loadFontFromResource(Main.class, "MonoSpaced", 1);
em.setFont(mahefaFont);
XI5250Frame frm = new XI5250Frame("xtn5250mg" + " " +
XI5250Emulator.VERSION, em);
frm.setFont(mahefaFont);
frm.setIconImage(cvImagesBdl.getImage("Logo"));
frm.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
//3D FX
if (use3dFX) {
em.setDefFieldsBorderStyle(XI5250Field.LOWERED_BORDER);
em.setDefBackground(UIManager.getColor("control"));
}
//frm.setBounds(0, 0, 570, 510);
frm.centerOnScreen(70);
if (maximized) {
frm.doNotPackOnStartup();
frm.setExtendedState(Frame.MAXIMIZED_BOTH);
}
frm.setVisible(true);
}
});
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
catch (InvocationTargetException ex) {
ex.printStackTrace();
}
}
//////
private static class PanelsDispatcher extends XI5250PanelsDispatcher {
private AutoLogonHandler ivAutoLogonHandler;
private XI5250PanelHandler ivHandler;
@Override
public synchronized void addPanelHandler(XI5250PanelHandler panel) {
if (panel instanceof AutoLogonHandler) {
if (ivAutoLogonHandler != null)
throw new IllegalArgumentException("Handler already setted");
ivAutoLogonHandler = (AutoLogonHandler)panel;
return;
}
if (ivHandler != null)
throw new IllegalArgumentException("Handler already setted");
ivHandler = panel;
}
@Override
protected synchronized XI5250PanelHandler getCurrentPanelHandler() {
return (ivAutoLogonHandler != null && ivAutoLogonHandler.detailedTest()) ? ivAutoLogonHandler : ivHandler;
}
@Override
public synchronized void removePanelHandler(XI5250PanelHandler panel) {
if (ivHandler != panel)
throw new IllegalArgumentException("Not the registered handler " + panel);
ivHandler = null;
}
}
//////
private static class LogonInfo {
final int fieldsCount;
final String userLabel;
final String passwdLabel;
final String user;
final String passwd;
LogonInfo(String info) {
String[] ss = info.split(";", 5);
if (ss.length < 5)
throw new IllegalArgumentException("Invalid autoLogon argument");
try {
fieldsCount = Integer.parseInt(ss[0]);
}
catch (NumberFormatException ex) {
throw new IllegalArgumentException("Invalid autoLogon argument: " + ex.getMessage());
}
userLabel = ss[1];
passwdLabel = ss[2];
user = ss[3];
passwd = ss[4];
}
}
//////
private static class AutoLogonHandler extends XI5250PanelHandler {
private final LogonInfo ivLogonInfo;
private boolean ivLoggedOn;
public AutoLogonHandler(XI5250PanelsDispatcher aPanelDisp, LogonInfo info) {
super(aPanelDisp);
ivLogonInfo = info;
}
@Override
protected boolean detailedTest() {
if (ivLoggedOn)
return false;
// I'm expecting xx fields in the logon panel
if (getFields().size() != ivLogonInfo.fieldsCount)
return false;
// Is there the user id field ?
if (!checkField(getFieldNextTo(ivLogonInfo.userLabel), 10))
return false;
// Is there the password field ?
if (!checkField(getFieldNextTo(ivLogonInfo.passwdLabel), 10))
return false;
return true;
}
@Override
protected void start() {
ivLoggedOn = true;
// Start logon panel processing
XI5250Field userField = getFieldNextTo(ivLogonInfo.userLabel);
XI5250Field passwdField = getFieldNextTo(ivLogonInfo.passwdLabel);
userField.setString(ivLogonInfo.user); // Your user id
passwdField.setString(ivLogonInfo.passwd); // Your password
// Simulate the user ENTER key pressed
getEmulator().processRawKeyEvent(
new KeyEvent(getEmulator(), KeyEvent.KEY_PRESSED,
0, 0, KeyEvent.VK_ENTER, KeyEvent.CHAR_UNDEFINED));
}
@Override
protected void stop() {
}
}
}