From 25cedbb8e994ab1e94bb3307e2a070d71f2acf43 Mon Sep 17 00:00:00 2001 From: Dominik Downarowicz Date: Sun, 27 Feb 2022 22:21:47 +0100 Subject: [PATCH] Add support for extended field attributes --- pom.xml | 2 +- .../java/at/downardo/j3270Server/Field.java | 127 ++++++++++++++++++ .../java/at/downardo/j3270Server/Screen.java | 79 ++++++++++- .../java/at/downardo/j3270Server/Util.java | 4 +- .../downardo/j3270Server/example/Example.java | 15 ++- 5 files changed, 214 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index be0f67d..90cf02c 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 at.downardo j3270Server - 0.0.1-SNAPSHOT + 0.0.2 Java 3270 Server jar This libary allows the user to write servers for IBM 3270 Terminal emulators. diff --git a/src/main/java/at/downardo/j3270Server/Field.java b/src/main/java/at/downardo/j3270Server/Field.java index 3c9624a..d785992 100644 --- a/src/main/java/at/downardo/j3270Server/Field.java +++ b/src/main/java/at/downardo/j3270Server/Field.java @@ -6,6 +6,8 @@ **/ package at.downardo.j3270Server; + + /** * Field is a field on the 3270 screen * @author downarowiczd @@ -43,6 +45,41 @@ public class Field { public String Name; public boolean Hidden; + + public Colour colour; + + public Highlight highlight; + + + public static enum Colour { + DefaultColour(0), + Blue(0xf1), + Red(0xf2), + Pink(0xf3), + Green(0xf4), + Turquosie(0xf5), + Yellow(0xf6), + White(0xf7); + + public int value; + private Colour(int value) { + this.value = value; + } + + } + + public static enum Highlight { + DefaultHighlight(0), + Blink(0xf1), + ReverseVideo(0xf2), + Underscore(0xf4); + + + public int value; + private Highlight(int value) { + this.value = value; + } + } /** * @@ -54,6 +91,54 @@ public class Field { * @param hidden * @param name */ + public Field(int row, int col, String content, boolean write, boolean intense, boolean hidden, String name, Colour colour, Highlight highlight) { + Row = row; + Col = col; + Content = content; + Write = write; + Intense = intense; + Name = name; + Hidden = hidden; + this.colour = colour; + this.highlight = highlight; + } + + public Field(int row, int col, String content, boolean write, boolean intense, boolean hidden, Colour colour, Highlight highlight) { + Row = row; + Col = col; + Content = content; + Write = write; + Intense = intense; + Name = ""; + Hidden = hidden; + this.colour = colour; + this.highlight = highlight; + } + + public Field(int row, int col, String content, boolean write, boolean intense, boolean hidden, Colour colour) { + Row = row; + Col = col; + Content = content; + Write = write; + Intense = intense; + Name = ""; + Hidden = hidden; + this.colour = colour; + highlight = Highlight.DefaultHighlight; + } + + public Field(int row, int col, String content, boolean write, boolean intense, boolean hidden, String name, Colour colour) { + Row = row; + Col = col; + Content = content; + Write = write; + Intense = intense; + Name = name; + Hidden = hidden; + this.colour = colour; + highlight = Highlight.DefaultHighlight; + } + public Field(int row, int col, String content, boolean write, boolean intense, boolean hidden, String name) { Row = row; Col = col; @@ -62,6 +147,20 @@ public Field(int row, int col, String content, boolean write, boolean intense, b Intense = intense; Name = name; Hidden = hidden; + this.colour = Colour.DefaultColour; + highlight = Highlight.DefaultHighlight; + } + + public Field(int row, int col, String content, boolean write, boolean intense, boolean hidden) { + Row = row; + Col = col; + Content = content; + Write = write; + Intense = intense; + Name = ""; + Hidden = hidden; + this.colour = Colour.DefaultColour; + highlight = Highlight.DefaultHighlight; } /** @@ -151,6 +250,34 @@ public int getRow() { public void setRow(int row) { Row = row; } + + /** + * @return the colour + */ + public Colour getColour() { + return colour; + } + + /** + * @param colour the colour to set + */ + public void setColour(Colour colour) { + this.colour = colour; + } + + /** + * @return the highlight + */ + public Highlight getHighlight() { + return highlight; + } + + /** + * @param highlight the highlight to set + */ + public void setHighlight(Highlight highlight) { + this.highlight = highlight; + } diff --git a/src/main/java/at/downardo/j3270Server/Screen.java b/src/main/java/at/downardo/j3270Server/Screen.java index d264ed1..65626c4 100644 --- a/src/main/java/at/downardo/j3270Server/Screen.java +++ b/src/main/java/at/downardo/j3270Server/Screen.java @@ -10,7 +10,9 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; /** * Screen is an array of fields which compose a complete 3270 screen. @@ -64,7 +66,7 @@ public static Response ShowScreen(Screen screen, HashMap values, buffer.write(_t); } - for(int _t : Screen.sf(fld.isWrite(), fld.isIntense(), fld.isHidden())){ + for(int _t : Screen.buildField(fld)){ buffer.write(_t); } @@ -143,7 +145,7 @@ public static int[] sba(int row, int col) { * @param hidden * @return */ - public static int[] sf(boolean write, boolean intense, boolean hidden) { +/* public static int[] sf(boolean write, boolean intense, boolean hidden) { int[] _return = new int[2]; _return[0] = 0x1d; @@ -168,7 +170,9 @@ public static int[] sf(boolean write, boolean intense, boolean hidden) { return _return; - } + }*/ + + /** * ic is the "insert cursor" 3270 command. This function will include the appropriate SBA command @@ -209,6 +213,75 @@ public static int[] getPos(int row, int col) { return _return; } + /** + * Will return either an sf or sfe command depending for the field + * @param f + * @return + */ + public static int[] buildField(Field f) { + List _return = new ArrayList(); + + if(f.getColour() == Field.Colour.DefaultColour && f.getHighlight() == Field.Highlight.DefaultHighlight) { + _return.add(0x1d); //sf - "start field" + _return.add(sfAttribute(f.isWrite(), f.isIntense(), f.isHidden())); + + return Util.convertIntegers(_return); + } + + _return.add(0x29); //sfe - "start field extended" + int paramCount = 1; + if(f.getColour() != Field.Colour.DefaultColour) { + paramCount++; + } + if(f.getHighlight() != Field.Highlight.DefaultHighlight) { + paramCount++; + } + _return.add(paramCount); + + //Write the basic field attribute + _return.add(0xc0); + _return.add(sfAttribute(f.isWrite(), f.isIntense(), f.isHidden())); + + if(f.getHighlight() != Field.Highlight.DefaultHighlight) { + _return.add(0x41); + _return.add(f.getHighlight().value); + } + + if(f.getColour() != Field.Colour.DefaultColour) { + _return.add(0x42); + _return.add(f.getColour().value); + } + + return Util.convertIntegers(_return); + + } + + + public static int sfAttribute(boolean write, boolean intense, boolean hidden) { + int _return = 0;; + + + if(!write) { + _return |= 1 << 5; + }else { + _return |= 1; + } + + if(intense) { + _return |= 1 << 3; + } + + if(hidden) { + _return |= 1 << 3; + _return |= 1 << 2; + } + + + _return = Util.codes[_return]; + + return _return; + + } } diff --git a/src/main/java/at/downardo/j3270Server/Util.java b/src/main/java/at/downardo/j3270Server/Util.java index 114202c..cb7a6e7 100644 --- a/src/main/java/at/downardo/j3270Server/Util.java +++ b/src/main/java/at/downardo/j3270Server/Util.java @@ -51,7 +51,7 @@ public class Util { * @param integers * @return */ - /* + public static int[] convertIntegers(List integers) { int[] ret = new int[integers.size()]; @@ -61,7 +61,7 @@ public static int[] convertIntegers(List integers) } return ret; } - */ + /** diff --git a/src/main/java/at/downardo/j3270Server/example/Example.java b/src/main/java/at/downardo/j3270Server/example/Example.java index 3dd6dbb..7e1298f 100644 --- a/src/main/java/at/downardo/j3270Server/example/Example.java +++ b/src/main/java/at/downardo/j3270Server/example/Example.java @@ -39,21 +39,23 @@ public void run() { EBCDIC.CODEPAGE = "CP1148"; Field[] fields = { - new Field(0,0,"HALLO WELT TEST €", false, true, false, ""), - new Field(1,0, "Name ....", false, true, false, ""), - new Field(1,13, "", true, false, false, "name"), + new Field(0,0,"HALLO WELT TEST €", false, true, false, "", Field.Colour.Blue, Field.Highlight.Blink), + new Field(1,0, "Name", false, true, false, ""), + new Field(1,13, "", true, false, false, "name", Field.Colour.Turquosie, Field.Highlight.ReverseVideo), + new Field(1,40, "", false, false, false), new Field(2,0, "Password ", false, false, false, ""), - new Field(2, 13, "", true, false, true, "password"), + new Field(2, 13, "", true, false, true, "password", Field.Colour.DefaultColour, Field.Highlight.ReverseVideo), + new Field(2,40, "",false,false,false), new Field(3,0, "Test", false, true, false, ""), new Field(4,0, "Test", false, false, false, ""), - new Field(22,0, "", false, true, false, "errormsg"), + new Field(22,0, "", false, true, false, "errormsg", Field.Colour.Red), new Field(23,0, "PF3 Exit", false, true, false, "") }; Field[] fields2 = { new Field(0,0,"HALLO WELT TEST WORLD 2", false, true, false, ""), - new Field(1,0, "Name ....", false, true, false, ""), + new Field(1,0, "Name", false, true, false, ""), new Field(22,0, "", false, true, false, "errormsg"), new Field(1,13, "", false, false, false, "") }; @@ -68,7 +70,6 @@ public void run() { fieldValues.put("errormsg", ""); while(true) { Response r = Screen.ShowScreen(screen, fieldValues, 1, 14, out, in); - System.out.println(fieldValues.get("errormsg")); if(r.AID == AID.AIDPF3) { break;