From f0fc1b6e70e7a3204982434253a05501924f6031 Mon Sep 17 00:00:00 2001 From: Rudi Date: Thu, 20 Aug 2026 19:58:46 -0400 Subject: [PATCH] Fix YMS bug --- .gitignore | 1 + build/j3270/org/pubvm/j3270/J3270App.class | Bin 16836 -> 17354 bytes .../org/pubvm/j3270/ui/TerminalPanel.class | Bin 24038 -> 24150 bytes .../datastream/DataStreamProcessor.class | Bin 14927 -> 15410 bytes .../datastream/QueryReplyBuilder.class | Bin 4792 -> 4801 bytes .../org/lib3270j/input/InputProcessor.class | Bin 9372 -> 9643 bytes .../lib3270j/telnet/TelnetConnection.class | Bin 6087 -> 6374 bytes .../main/java/org/pubvm/j3270/J3270App.java | 29 +++++++- .../org/pubvm/j3270/ui/TerminalPanel.java | 12 ++- .../datastream/DataStreamProcessor.java | 70 +++++++++++++----- .../datastream/QueryReplyBuilder.java | 11 +-- .../org/lib3270j/input/InputProcessor.java | 38 +++++++--- .../org/lib3270j/telnet/TelnetConnection.java | 15 +++- 13 files changed, 133 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index 01b729c..1cbe887 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +*.log .DS_Store *.jar build diff --git a/build/j3270/org/pubvm/j3270/J3270App.class b/build/j3270/org/pubvm/j3270/J3270App.class index e4eb9dfd36b637f1d474649dc69868e6aa813e55..7251b122e971be509f672bf641c92996f80353b5 100644 GIT binary patch delta 4662 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 WSf$Obb<%Q0cUZLstx1~;&i?{%{fI#T diff --git a/build/j3270/org/pubvm/j3270/ui/TerminalPanel.class b/build/j3270/org/pubvm/j3270/ui/TerminalPanel.class index 769c3cf665919dfe01dfcceff63802b7482479b4..4268587a183a25c72eefb3c2de4fb9bd2b2d71ff 100644 GIT binary patch delta 4991 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 M$YfNQEF!c70Neu)SO5S3 delta 99 zcmV~$D-wcG0EW@;A4wW6mzNB}P$ZBjB!V=eWS|nHx)rv-0&M7*+?nV6ig)oEt^eVG z11w+6;6^+4zCP`vyN6#l+D%=U(D#0LY+AP8=3DZ&&Y3Y8@)xs-aeGBC?Bvqfz&6HnPG{H ziwl|+T2|udWSUu>v@|v8lxd5are%v-9xRKT?zkOK!8!lC?|%3D|NnmP-aGTEUh8jc zKDp*y0GBep$vABIjIlRN8c;iNQsvEK2xH>8m(X#efy@cbiQP~4VAx;)oDg~-zLb?g zmp`T^aC>>~N+kHh7!<};&!dgsbTuIMG}0J3cm|vreTFf;NzW7<)b&MlwvHvt43uFO zEAbSE;%Sb8#T)SqZ$&*0X-pTZJ~1b~6)yTgY($-|2LSs~*bxud28Wsxmq^`3)A1|Q$K6gLh@EPj%7{453dMT+sOl;W_Itw!awU$*FdUa_@Q2)i zKjnU$keO(eS@=ilaZ(myue?H$rL@ZmI%F-K@&R44iEi1>SlPii+0S@sVSW&~AvH!z~XnaJ=??0GzN%FnkEM%}fx-c7EnS+bi(b}3^M6&p?I~GSxi2lQw;~maR4Q_@HOAL3 zu8-dGGWgjSIqYYx^<7?9jRanS6b@8o3#xS0CP6@-)Tdp`)V)j%p6WYC)XBlR9zWYp zT6v=XfFn1372MG(JwJAczD+w9+u=;CJ6iqeVN7lEor^c3yJ#o7I7~TzSP7{Q_Z+Ej zSHs6^ki~0}&FhfQ8uVZ-268k;@p@dRJwHZ^FWT{L$Vm;NDna}iYEHGWcAO@Bi%K>g z?X@(!a00sXHk9&qmG4&c;hh-3iKy0+9m>0K1MkKJ-h(N;507#xX7heL$7xu=Iy7=R zUgd*W!x>o5hqSC8(NcaiRFa;`>c`>X6G-Bds_iWOW=|uRvr)!p^oV*~#W|?qvl!3k za2sF1!<>uxoQH*+kHu`j>s*KxT!gJ$jL-R!HP@fT6V^I^Nm`@syF|axQr-L2Q%TxD zkEZvR6&tuH?G4rEO@)^unN4S5m%@KrqXIJvRw*1tBHvO8S0j^eqXXBVfNNERcTmoC z7|!*2v-dET?^|s%irH#aWjt1}L3taM_mS4k$I97^LVki`Zc*vC>e%0gDt@Z6H{&LL zHoKjV|5&N*HdO9V+Lub(skB{6`&wz=DD7LN?N-_zrR`PPK1}9*Oy&1@j0bdL|A2Y? zQH3~UwaX0fq*b0dH0@Vyi^Is{5xwefXEW=rnMJH+nH}vdh~aVT%gnBE+Isw3KXNN{ zL|JXKN_;v^?4n&LE+ptwX)A_8q*%3CeT$RS-xi5tB3V-47aszWhW3(#&f-6HP8@8l z5Zy0L=Tnqw3w@h4gmt-aOFojM5ZQ78@}w(@q#Jrk5&Ee;NaxjXDZvPxS+&vw|D=ixa4}ho1G3TB`3!|R;71Z6*=AVT-pdiH}$s`4sEHP WT8$pH+o;`Hb&9P>RiD8)hx=c^3$kkf delta 1715 zcmYjSd2r2V6g}s@{NBrZNl5VGwX~KN?bsvf4K>q$e&2oPe&_q$d%p9#Z*9lL9b7+@@7M#N z4MR7%{&M-Ng)AX`{*9r((%Bj|xBw3FFRqf!ra}E_rp+2ty z);w6K0@xD#Pr_G8;n?S=<~?6J56KFWEXy4fG%(BVwl6~MO5APNqPAe@0=V4vEUN_0 z$@YqpiYsnw5i)I+8{O7&r2T(u1S%$GInv#Z1qgOKN??WO24E)JSyFK-H9df@0+?Re zh{>;EFYJK=4Hs%zi%}g*;K5SFq8N!-hIA}PCcZ&4tUzBJ~u{h0fI75T8EW$ai#(Da2f%|ch$8m}0aG7^-g^zGm^lHS8 z-^GbPBox=B7H&ueZc1a^l5G4bEpS_MaYs7fu5`oS(gXeONpIYj(Rd&e@KC1XiF|=F znTMxRjEl08l+_H99kgUO?Q)0?Im2K%Pp4ea-@h?bt}{&jVHKOjsx~*nY_(X!7EgDj z3urT?ZhvMuqDXol!zzP=6^KW$11>r++kxAfAu8hvHOc>Qb13q|2oGWzg%nk)K5L;V zV@%hY{UhQK%y?8|0+N}inI!Xl&CwAlil!=>h9*o$D`uFso{nMl6>WeBHq;s#nI)c9 zVOfeaQKYFN+2*<@FDyrkX@O|ALIPWx+^F_pZBUhMQIqYorh6vVJ0&MiSsmd~ulv{; z@ytg$yPz3gMZR8HUv@)3_P{{)eCB>9q+BMQrH)b z*bmw4ueJ6;TfT`-d<&g92nBo_gVY2gI0WN36w}lUbJPs;IRZr-i4u;&8oq}e9D}`T zke~U!n&1O}o9HNZ{se8znR>n$mYGhz z0`D(s!V5^_MXmMni`E)xYfsHiUy^kdLA++J`Ra$=fW@17%eORFZsOxIJ-n~b1BD){ zG>=e&k2O_6m{D=BG}a+3K?oNMk>WtK1S3XVh!Y!`iDu zF?SPEL%JeZhY4w8kV#5RuzITWmdQ_SkY?8wgboJlYS;gb9JQlU<7yfwt0=DAD8*b1 Hu{-|-5~hUS diff --git a/build/lib3270j/org/lib3270j/telnet/TelnetConnection.class b/build/lib3270j/org/lib3270j/telnet/TelnetConnection.class index bf938e2c67acaff493015c962de63280223ebfa4..5f4c7a08634810a7be53f2a658cf87001ed2d1a0 100644 GIT binary patch delta 1549 zcmY*ZYiv_>6#t#B?Y+CbYqxgY1Il*yaBrrtJvz4yfrkfnR0(hEoK4Fwh<7 z42bxHuqd!ItPaNewWu-})57Y|P=B;f>5qoBZN?=Miieb;cuWm#6YwV?&vYGCAh*xAwA(IVm|LF!aP5k-x~ zw3vkRxaNj{VF{PXB2yX`Gg^xV46R5uLh;(Dx^qws$JL1PBquhIvgB+PPB7A@X@e4` zk}=|8zC+kX$V`nz2@hyPYQ%(g5HfDJ*%UoW@OG&2 zk{w!Xt1`fCOEr>pE<1Hf6r?VJ*2*ZOZhepQobxe>*3o)_HpsM*9-mm_@{n~ip-lh5 zm8&0dInxB{)emLX3yY}=MAiDG%z(|$w;El^Qm9sM%qpasiBMJpF>}7$AUt zW}%f;Gw#TzVq3*W*gt~36-j(If?ay8x4^dEcNjsv%iEYhX2)sdp2jck->Z_iFgBMM z!(e;LB%d{lllW^2{{Tspvos@#AIGrz7NF2HopIk_)CEJ!=iHQ$T9RlC3va=cR0N*L zZ5-LBNC0XWIL^6tVLNv5!?58w9OQRuoF}>2#(9zD7Bb3y9>w~sw=!`68(7|t1JLjS zTfW4$2k{JE#C{xN%@O8aX6_Zd3LVFozR$9gcnu%ob$pCBa26x@hGiG=Cced6_#SWL z3J!Cjqh?bp;hcp{p!;U|i5JasUuTflDqwmBvc=D1xw^oZO$n3fQXc#nOs0B|g9qJyjmcw0;K5y0nVq@i-K48&6MK*tAv{4L3M2ntV6s=b delta 1296 zcmY*YT})eL7=E7iwC8YoXlYAf4AvG{$1Fb^Y@++o!2lTuRbh@0%@mfm|qtUnv?=*U)UYIPAIR70#!}lCCa~J1*zwddU_y2r9 zR)4lh|Kj@GB>;`=n%0l%<_~(|L-V+5;1`4my+4_5PmYZA^d|#wV=N2r;&%go;2fcL z)psOX63rU^5@JWPr!Sfu9!?GGxQwd-s2J1nJr)ftp+eZHp(e|!;<|a#Qy9cDVZene zx||#aom9+=o_NSjD6!2oPw3Q`rBXL=oE~%0Qys`Q=%tTvKbjgI>`4>b%n1g~_k9ub zkfCKs7{3)JU>-MW%5n*3RaKQ0JkMah)r*!+b*6_0hWd3DaIMNhgGJ`IMu|IYFv94Y zj%>2hbb4F4#Y}i3ywx1?=8fJ)cpFkfL&@HBvM-uWMVSM)&&BOJH10514!6cT2w!JY zVsDhuM~2TYb+)lxWy0V+ym#iBFG!`6h?&(nF}KS5iLe~QX171A7PACosd>!b zQN2HFDNcLcnq^iRLDq{LL(05U5 zi@%3wPUBEKgRf6x!2Bi@cC{9bqrqGX)%UNQn!=v;RZ78mH(IE?3o{i^U^z)_sU7*4^&i+EkIGk6K(a(f#uV;ZmEBfMt!S_01!Tq-N92UWZz z?Ji)=0^AN6)ciVYTBWju3z%IUg!pSx3()fcmb*ub+y^dTCE=`9LQ2sjc7_x`o}R?k zkTMRvGAEiLyDEcpDIdbo?Ti=OZFTjzaB`Dy9Nf%m(X|qxQJSu? 0x20 && ch != 0xFF) { + Font f = bold ? terminalFont.deriveFont(Font.BOLD) : terminalFont; + g2.setFont(f); + g2.setColor(fgColor); + g2.drawString("*", x, y + fontAscent); + } + if (isCellSelected(row, col)) { g2.setColor(SELECTION_COLOR); g2.fillRect(x, y, cellWidth, cellHeight); diff --git a/lib3270j/src/main/java/org/lib3270j/datastream/DataStreamProcessor.java b/lib3270j/src/main/java/org/lib3270j/datastream/DataStreamProcessor.java index 6d9795b..b70fdf2 100644 --- a/lib3270j/src/main/java/org/lib3270j/datastream/DataStreamProcessor.java +++ b/lib3270j/src/main/java/org/lib3270j/datastream/DataStreamProcessor.java @@ -6,6 +6,7 @@ import org.lib3270j.charset.EbcdicTranslator; import org.lib3270j.listener.ScreenUpdateListener; import static org.lib3270j.protocol.DS3270Constants.*; +import java.io.ByteArrayOutputStream; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Logger; @@ -451,8 +452,8 @@ public class DataStreamProcessor { pos += 4; } - // Fill from current position to target - while (baddr != toAddr) { + // Fill from current position to target (do-while wraps entire buffer if baddr == toAddr) + do { ExtendedAttribute ea = screen.getCell(baddr); ea.fa = 0; // Destroy previous field attribute if any ea.ec = (byte) fillChar; @@ -461,7 +462,7 @@ public class DataStreamProcessor { ea.gr = (byte) currentGr; ea.cs = fillCs; baddr = (baddr + 1) % size; - } + } while (baddr != toAddr); screen.setBufferAddress(baddr); lastWasOrder = true; break; @@ -476,7 +477,7 @@ public class DataStreamProcessor { if (toAddr >= size) toAddr = toAddr % size; - while (baddr != toAddr) { + do { ExtendedAttribute ea = screen.getCell(baddr); if (!ea.isFieldAttribute()) { int faAddr = screen.findFieldAttribute(baddr); @@ -491,7 +492,7 @@ public class DataStreamProcessor { } } baddr = (baddr + 1) % size; - } + } while (baddr != toAddr); screen.setBufferAddress(baddr); pos += 3; lastWasOrder = true; @@ -637,7 +638,13 @@ public class DataStreamProcessor { outputPos = 0; - int aid = AID_NO; // Last AID + int aid = (inputProcessor != null && inputProcessor.getLastAid() != 0) + ? inputProcessor.getLastAid() + : AID_NO; + if (inputProcessor != null) { + inputProcessor.setLastAid(AID_NO); + } + int size = screen.getRows() * screen.getCols(); // AID byte @@ -649,31 +656,56 @@ public class DataStreamProcessor { outputWrite(caddr[1] & 0xFF); if (!screen.isFormatted()) { - // Unformatted: send everything - if (all) { - for (int i = 0; i < size; i++) { - outputWrite(screen.getCell(i).ec & 0xFF); + // Unformatted screen: send data up to last non-null + int lastNonNull = -1; + for (int i = size - 1; i >= 0; i--) { + if (screen.getCell(i).ec != 0) { + lastNonNull = i; + break; + } + } + if (lastNonNull >= 0) { + for (int i = 0; i <= lastNonNull; i++) { + int b = screen.getCell(i).ec & 0xFF; + outputWrite(b != 0 ? b : 0x40); } } } else { - // Formatted: send modified fields + // Formatted screen: send modified fields with trailing NULLs stripped for (int i = 0; i < size; i++) { ExtendedAttribute ea = screen.getCell(i); if (ea.isFieldAttribute() && (all || faIsModified(ea.fa & 0xFF))) { int fieldStart = (i + 1) % size; - // Send SBA for field start + + // Collect field data and find last non-null byte + ByteArrayOutputStream fieldData = new ByteArrayOutputStream(); + int pos = fieldStart; + int lastNonNull = -1; + int fieldLen = 0; + while (!screen.getCell(pos).isFieldAttribute()) { + int b = screen.getCell(pos).ec & 0xFF; + fieldData.write(b); + if (b != 0x00) { + lastNonNull = fieldLen; + } + fieldLen++; + pos = (pos + 1) % size; + if (pos == fieldStart) + break; + } + + // Always send SBA and address outputWrite(ORDER_SBA); byte[] addr = encodeAddress(fieldStart, screen.getRows(), screen.getCols()); outputWrite(addr[0] & 0xFF); outputWrite(addr[1] & 0xFF); - // Send field contents until next FA - int pos = fieldStart; - while (pos < size && !screen.getCell(pos).isFieldAttribute()) { - outputWrite(screen.getCell(pos).ec & 0xFF); - pos = (pos + 1) % size; - if (pos == fieldStart) - break; + // Send field data (strip trailing nulls) + if (lastNonNull >= 0) { + byte[] allData = fieldData.toByteArray(); + for (int k = 0; k <= lastNonNull; k++) { + outputWrite(allData[k] & 0xFF); + } } } } diff --git a/lib3270j/src/main/java/org/lib3270j/datastream/QueryReplyBuilder.java b/lib3270j/src/main/java/org/lib3270j/datastream/QueryReplyBuilder.java index df5bf52..6ae25c2 100644 --- a/lib3270j/src/main/java/org/lib3270j/datastream/QueryReplyBuilder.java +++ b/lib3270j/src/main/java/org/lib3270j/datastream/QueryReplyBuilder.java @@ -265,20 +265,21 @@ public class QueryReplyBuilder { private byte[] buildImplicitPartition(int maxCols, int maxRows) { ByteArrayOutputStream out = new ByteArrayOutputStream(22); - // Implicit partition sizes, 2 self-defining parameters + // Implicit partition sizes SDP (Self-Defining Parameter) - // SDP 1: Default screen size out.write(0x00); // flags out.write(0x00); // reserved - out.write(0x0b); // SDP length + // SDP 1: Implicit partition sizes + out.write(0x00); // SDP length high byte + out.write(0x0b); // SDP length low byte (11 bytes: 2 len + 1 type + 1 res + 8 dims) out.write(0x01); // SDP type: implicit partition sizes out.write(0x00); // reserved - // Default + // Default dimensions (Model 2: 80x24) out.write((MODEL_2_COLS >> 8) & 0xFF); out.write(MODEL_2_COLS & 0xFF); out.write((MODEL_2_ROWS >> 8) & 0xFF); out.write(MODEL_2_ROWS & 0xFF); - // Alternate + // Alternate dimensions out.write((maxCols >> 8) & 0xFF); out.write(maxCols & 0xFF); out.write((maxRows >> 8) & 0xFF); diff --git a/lib3270j/src/main/java/org/lib3270j/input/InputProcessor.java b/lib3270j/src/main/java/org/lib3270j/input/InputProcessor.java index 688210e..959d36d 100644 --- a/lib3270j/src/main/java/org/lib3270j/input/InputProcessor.java +++ b/lib3270j/src/main/java/org/lib3270j/input/InputProcessor.java @@ -138,9 +138,10 @@ public class InputProcessor { } // Advance cursor + int startAdvance = baddr; baddr = (baddr + 1) % size; - // Skip over field attributes - while (screen.getCell(baddr).isFieldAttribute()) { + // Skip over field attributes safely + while (screen.getCell(baddr).isFieldAttribute() && baddr != startAdvance) { baddr = (baddr + 1) % size; } screen.setCursorAddress(baddr); @@ -255,18 +256,26 @@ public class InputProcessor { } } } else { - // Unformatted screen in 3270 mode: - // Send character data from address 0 up to last non-null character - int size = screen.getRows() * screen.getCols(); - int lastNonNull = -1; - for (int i = size - 1; i >= 0; i--) { - if (screen.getCell(i).ec != 0) { - lastNonNull = i; + // Unformatted screen in 3270 mode (e.g. line-mode console): + // Send AID + cursor address + only the active input line (row containing cursor) + int cols = screen.getCols(); + int curAddr = screen.getCursorAddress(); + int row = curAddr / cols; + int rowStart = row * cols; + int rowEnd = rowStart + cols; + + // Find last non-null, non-blank character on the current line + int lastChar = rowStart - 1; + for (int i = rowEnd - 1; i >= rowStart; i--) { + int ec = screen.getCell(i).ec & 0xFF; + if (ec != 0x00 && ec != 0x40) { + lastChar = i; break; } } - if (lastNonNull >= 0) { - for (int i = 0; i <= lastNonNull; i++) { + + if (lastChar >= rowStart) { + for (int i = rowStart; i <= lastChar; i++) { int b = screen.getCell(i).ec & 0xFF; out.write(b != 0 ? b : 0x40); } @@ -325,6 +334,13 @@ public class InputProcessor { screen.setCursorAddress(addr); } + public int getLastAid() { return lastAid; } + public void setLastAid(int aid) { this.lastAid = aid; } + + public void setCursorAddress(int baddr) { + screen.setCursorAddress(baddr); + } + public void backTab() { // Find previous unprotected field int addr = screen.getCursorAddress(); diff --git a/lib3270j/src/main/java/org/lib3270j/telnet/TelnetConnection.java b/lib3270j/src/main/java/org/lib3270j/telnet/TelnetConnection.java index 1ce34c0..ded53a8 100644 --- a/lib3270j/src/main/java/org/lib3270j/telnet/TelnetConnection.java +++ b/lib3270j/src/main/java/org/lib3270j/telnet/TelnetConnection.java @@ -132,10 +132,14 @@ public class TelnetConnection { if (log.isLoggable(Level.FINE)) { log.fine("RCVD " + n + " bytes: " + formatHex(buf, 0, n)); } - for (int i = 0; i < n; i++) { - fsm.feedByte(buf[i] & 0xFF); + try { + for (int i = 0; i < n; i++) { + fsm.feedByte(buf[i] & 0xFF); + } + fsm.endOfNetworkData(); + } catch (Throwable t) { + log.log(Level.SEVERE, "Exception processing incoming data stream", t); } - fsm.endOfNetworkData(); } } } catch (SocketException e) { @@ -148,6 +152,11 @@ public class TelnetConnection { log.log(Level.WARNING, "Read error", e); fsm.onError("Read error: " + e.getMessage()); } + } catch (Throwable t) { + if (running) { + log.log(Level.SEVERE, "Unexpected fatal error in readLoop", t); + fsm.onError("Network loop error: " + t.getMessage()); + } } }