Mercurial > 510Connectbot
annotate app/src/main/java/org/tn5250j/framework/tn5250/DataStreamProducer.java @ 518:9acc51a5a98f
Added tag stable-1.9.4-6 for changeset 947ea334735d
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Fri, 31 May 2024 13:35:44 -0600 |
parents | 5ce5235adde6 |
children |
rev | line source |
---|---|
3 | 1 package org.tn5250j.framework.tn5250; |
2 | |
446 | 3 import org.tn5250j.encoding.ICodePage; |
4 | |
3 | 5 import java.io.BufferedInputStream; |
6 import java.io.ByteArrayOutputStream; | |
7 import java.io.IOException; | |
8 import java.net.SocketException; | |
9 import java.util.concurrent.BlockingQueue; | |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
10 |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
11 import static org.tn5250j.framework.tn5250.Stream5250.OPCODE_OFFSET; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
12 |
394
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
13 import java.util.Timer; |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
14 import java.util.TimerTask; |
3 | 15 |
25
5949eb469a79
adding tn5250 files, native android logging
Carl Byington <carl@five-ten-sg.com>
parents:
3
diff
changeset
|
16 import android.util.Log; |
5949eb469a79
adding tn5250 files, native android logging
Carl Byington <carl@five-ten-sg.com>
parents:
3
diff
changeset
|
17 |
3 | 18 |
19 public class DataStreamProducer implements Runnable { | |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
20 private static final int MINIMAL_PARTIAL_STREAM_LEN = 2; |
25
5949eb469a79
adding tn5250 files, native android logging
Carl Byington <carl@five-ten-sg.com>
parents:
3
diff
changeset
|
21 private static final String TAG = "DataStreamProducer"; |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
22 private tnvt vt; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
23 private BufferedInputStream bin; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
24 private ByteArrayOutputStream baosin; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
25 private byte[] saveStream; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
26 private final BlockingQueue<Object> dsq; |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
27 private byte[] dataStream; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
28 private DataStreamDumper dataStreamDumper = new DataStreamDumper(); |
3 | 29 |
25
5949eb469a79
adding tn5250 files, native android logging
Carl Byington <carl@five-ten-sg.com>
parents:
3
diff
changeset
|
30 |
3 | 31 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
32 public DataStreamProducer(tnvt vt, BufferedInputStream bin, BlockingQueue<Object> queue, byte[] init) { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
33 this.bin = bin; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
34 this.vt = vt; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
35 baosin = new ByteArrayOutputStream(); |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
36 dsq = queue; |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
37 dataStream = init; |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
38 } |
3 | 39 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
40 public final void run() { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
41 boolean done = false; |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
42 Thread me = Thread.currentThread(); |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
43 // load the first response screen |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
44 loadStream(dataStream, 0); |
25
5949eb469a79
adding tn5250 files, native android logging
Carl Byington <carl@five-ten-sg.com>
parents:
3
diff
changeset
|
45 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
46 while (!done) { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
47 try { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
48 byte[] abyte0 = readIncoming(); |
3 | 49 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
50 // WVL - LDC : 17/05/2004 : Device name negotiations send TIMING MARK |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
51 // Restructured to the readIncoming() method to return null |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
52 // on TIMING MARK. Don't process in that case (abyte0 == null)! |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
53 if (abyte0 != null) { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
54 // WVL - LDC : 16/07/2003 : TR.000345 |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
55 // When the socket has been closed, the reading returns |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
56 // no bytes (an empty byte arrray). |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
57 // But the loadStream fails on this, so we check it here! |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
58 if (abyte0.length > 0) { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
59 loadStream(abyte0, 0); |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
60 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
61 // WVL - LDC : 16/07/2003 : TR.000345 |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
62 // Returning no bytes means the input buffer has |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
63 // reached end-of-stream, so we do a disconnect! |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
64 else { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
65 done = true; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
66 vt.disconnect(); |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
67 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
68 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
69 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
70 catch (SocketException se) { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
71 Log.w(TAG, " DataStreamProducer thread interrupted and stopping " + se.getMessage()); |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
72 done = true; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
73 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
74 catch (IOException ioe) { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
75 Log.w(TAG, ioe.getMessage()); |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
76 if (me.isInterrupted()) done = true; |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
77 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
78 catch (Exception ex) { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
79 Log.w(TAG, ex.getMessage()); |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
80 if (me.isInterrupted()) done = true; |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
81 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
82 } |
3 | 83 } |
84 | |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
85 private void loadStream(byte streamBuffer[], int offset) { |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
86 |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
87 int partialLen = (streamBuffer[offset] & 0xff) << 8 | streamBuffer[offset + 1] & 0xff; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
88 int bufferLen = streamBuffer.length; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
89 |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
90 Log.d(TAG, "loadStream() offset=" + offset + " partialLen=" + partialLen + " bufferLen=" + bufferLen); |
3 | 91 |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
92 if (saveStream != null) { |
446 | 93 Log.d(TAG, "partial stream found"); |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
94 bufferLen = saveStream.length + streamBuffer.length; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
95 byte[] inter = new byte[bufferLen]; |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
96 System.arraycopy(saveStream, 0, inter, 0, saveStream.length); |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
97 System.arraycopy(streamBuffer, 0, inter, saveStream.length, streamBuffer.length); |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
98 streamBuffer = new byte[bufferLen]; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
99 System.arraycopy(inter, 0, streamBuffer, 0, bufferLen); |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
100 saveStream = null; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
101 } |
3 | 102 |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
103 if (partialLen > bufferLen) { |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
104 saveStream = new byte[streamBuffer.length]; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
105 Log.d(TAG, "partial stream saved"); |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
106 System.arraycopy(streamBuffer, 0, saveStream, 0, streamBuffer.length); |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
107 } else { |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
108 int buf_len = partialLen + 2; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
109 byte[] buf = new byte[buf_len]; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
110 if (isBufferShifted(partialLen, bufferLen) && isOpcodeShifted(streamBuffer, offset)) { |
446 | 111 Log.d(TAG, "Invalid stream buffer detected. Ignoring the inserted byte."); |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
112 System.arraycopy(streamBuffer, offset, buf, 0, MINIMAL_PARTIAL_STREAM_LEN); |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
113 System.arraycopy(streamBuffer, offset + MINIMAL_PARTIAL_STREAM_LEN + 1, buf, MINIMAL_PARTIAL_STREAM_LEN, partialLen); |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
114 } else { |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
115 System.arraycopy(streamBuffer, offset, buf, 0, buf_len); |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
116 } |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
117 try { |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
118 dsq.put(buf); |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
119 if (streamBuffer.length > buf.length + offset + MINIMAL_PARTIAL_STREAM_LEN) |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
120 loadStream(streamBuffer, offset + buf_len); |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
121 } catch (InterruptedException ex) { |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
122 Log.w(TAG, "load stream error.", ex); |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
123 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
124 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
125 } |
3 | 126 |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
127 private boolean isOpcodeShifted(byte[] streamBuffer, int offset) { |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
128 byte code = streamBuffer[offset + 1 + OPCODE_OFFSET]; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
129 return (0 <= code && code <= 12); |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
130 } |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
131 |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
132 private boolean isBufferShifted(int partialLen, int bufferLen) { |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
133 return partialLen + MINIMAL_PARTIAL_STREAM_LEN + 1 == bufferLen; |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
134 } |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
135 |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
136 public final byte[] readIncoming() throws IOException { |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
137 boolean done = false; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
138 boolean negotiate = false; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
139 baosin.reset(); |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
140 int j = -1; |
394
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
141 Timer timer = new Timer("data.stream", true); |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
142 TimerTask task = null; |
3 | 143 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
144 while (!done) { |
394
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
145 if (bin.available() == 0) { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
146 task = new TimerTask() { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
147 public void run() { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
148 try { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
149 dsq.put(new Integer(0)); // trigger buffer.testChanged() |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
150 } |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
151 catch (Exception ex) { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
152 Log.w(TAG, "readIncoming error " + ex.getMessage()); |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
153 } |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
154 } |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
155 }; |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
156 timer.schedule(task, 10); // 10 ms delay |
392
7ac1a0b02f44
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
219
diff
changeset
|
157 } |
394
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
158 |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
159 int i = bin.read(); |
394
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
160 |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
161 if (task != null) { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
162 task.cancel(); |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
163 task = null; |
392
7ac1a0b02f44
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
219
diff
changeset
|
164 } |
3 | 165 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
166 // WVL - LDC : 16/07/2003 : TR.000345 |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
167 // The inStream return -1 when end-of-stream is reached. This |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
168 // happens e.g. when the connection is closed from the AS/400. |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
169 // So we stop in this case! |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
170 // ==> an empty byte array is returned from this method. |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
171 if (i == -1) { // nothing read! |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
172 done = true; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
173 vt.disconnect(); |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
174 continue; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
175 } |
3 | 176 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
177 // We use the values instead of the static values IAC and EOR |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
178 // because they are defined as bytes. |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
179 // |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
180 // The > if(i != 255 || j != 255) < is a hack for the double FF FF's |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
181 // that are being returned. I do not know why this is like this and |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
182 // can not find any documentation for it. It is also being returned |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
183 // on my Client Access tcp dump as well so they are handling it. |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
184 // |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
185 // my5250 |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
186 // 0000: 00 50 DA 44 C8 45 42 00 00 00 00 24 08 00 45 00 .P.D.EB....$..E. |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
187 // 0010: 04 2A BC F9 00 00 40 06 D0 27 C1 A8 33 04 C1 A8 .*....@..'..3... |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
188 // 0020: 33 58 00 17 04 18 6F A2 83 CB 00 1E D1 BA 50 18 3X....o.......P. |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
189 // 0030: 20 00 8A 9A 00 00 03 FF FF 12 A0 00 00 04 00 00 ............... |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
190 // --------------------------- || || ------------------------------------- |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
191 // 0040: 03 04 40 04 11 00 20 01 07 00 00 00 18 00 00 10 ..@... ......... |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
192 |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
193 if (j == 255 && i == 255) { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
194 j = -1; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
195 continue; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
196 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
197 |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
198 baosin.write(i); |
3 | 199 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
200 // check for end of record EOR and IAC - FFEF |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
201 if (j == 255 && i == 239) |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
202 done = true; |
3 | 203 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
204 // This is to check for the TELNET TIMING MARK OPTION |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
205 // rfc860 explains this in more detail. When we receive it |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
206 // we will negotiate with the server by sending a WONT'T TIMING-MARK |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
207 // This will let the server know that we processed the information |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
208 // and are just waiting for the user to enter some data so keep the |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
209 // socket alive. This is more or less a AYT (ARE YOU THERE) or not. |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
210 if (i == 253 && j == 255) { |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
211 done = true; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
212 negotiate = true; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
213 } |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
214 |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
215 j = i; |
3 | 216 } |
217 | |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
218 // after the initial negotiation we might get other options such as |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
219 // timing marks ?????????????? do we ???????????? look at telnet spec |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
220 // yes we do. rfc860 explains about timing marks. |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
221 // WVL - LDC : 17/05/2004 : Device name negotiations send TIMING MARK |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
222 // to existing device! |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
223 // Handled incorrectly: we cannot continue processing the TIMING MARK DO |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
224 // after we have handled it in the vt.negotiate() |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
225 // We should not return the bytes; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
226 // ==> restructured to return null after negotiation! |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
227 // Impacts the run method! Added the null check. |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
228 byte[] rBytes = baosin.toByteArray(); |
3 | 229 |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
230 dataStreamDumper.dump(rBytes); |
3 | 231 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
232 if (negotiate) { |
394
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
233 if (bin.available() == 0) { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
234 task = new TimerTask() { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
235 public void run() { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
236 try { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
237 dsq.put(new Integer(0)); // trigger buffer.testChanged() |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
238 } |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
239 catch (Exception ex) { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
240 Log.w(TAG, "readIncoming error " + ex.getMessage()); |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
241 } |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
242 } |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
243 }; |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
244 timer.schedule(task, 10); // 10 ms delay |
392
7ac1a0b02f44
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
219
diff
changeset
|
245 } |
394
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
246 |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
247 // get the negotiation option |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
248 baosin.write(bin.read()); |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
249 |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
250 if (task != null) { |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
251 task.cancel(); |
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
252 task = null; |
392
7ac1a0b02f44
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
219
diff
changeset
|
253 } |
394
24186858750f
add test buffer changed when input stream runs dry, similar to async test
Carl Byington <carl@five-ten-sg.com>
parents:
392
diff
changeset
|
254 |
3 | 255 vt.negotiate(rBytes); |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
256 return null; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
257 } |
3 | 258 |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
259 return rBytes; |
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
260 } |
3 | 261 |
445
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
262 protected void toggleDebug(ICodePage codePage) { |
8fa8e73e2f5c
update to tn5250j version 0.7.7, svn r1270
Carl Byington <carl@five-ten-sg.com>
parents:
438
diff
changeset
|
263 dataStreamDumper.toggleDebug(codePage); |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
99
diff
changeset
|
264 } |
3 | 265 |
446 | 266 } |