Commit c88e21fa82465fcbacfb6409c37b1ca025fd78d9

Authored by perry.werneck@gmail.com
1 parent ff256cff

Movendo fila de teclado para a estrutura de sessão

android/jni/actions.cpp
... ... @@ -36,7 +36,10 @@ JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_sendEnter(JNIEnv *env, jobj
36 36 {
37 37 PW3270_JNI_BEGIN
38 38  
39   - lib3270_enter(PW3270_SESSION);
  39 + if(lib3270_connected(PW3270_SESSION))
  40 + lib3270_enter(PW3270_SESSION);
  41 + else
  42 + pw3270_jni_post_message(1,LIB3270_MESSAGE_DISCONNECTED);
40 43  
41 44 PW3270_JNI_END
42 45 }
... ... @@ -45,7 +48,10 @@ JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_sendPFkey(JNIEnv *env, jobj
45 48 {
46 49 PW3270_JNI_BEGIN
47 50  
48   - lib3270_pfkey(PW3270_SESSION,key);
  51 + if(lib3270_connected(PW3270_SESSION))
  52 + lib3270_pfkey(PW3270_SESSION,key);
  53 + else
  54 + pw3270_jni_post_message(1,LIB3270_MESSAGE_DISCONNECTED);
49 55  
50 56 PW3270_JNI_END
51 57 }
... ...
android/jni/globals.h
... ... @@ -76,6 +76,7 @@
76 76  
77 77 void pw3270_jni_lock(JNIEnv *env, jobject obj);
78 78 void pw3270_jni_unlock();
  79 + void pw3270_jni_post_message(int msgid, int arg1 = 0, int arg2 = 0);
79 80  
80 81 jmethodID lib3270_getmethodID(const char *name, const char *sig);
81 82  
... ...
android/jni/main.cpp
... ... @@ -63,7 +63,7 @@ jmethodID lib3270_getmethodID(const char *name, const char *sig)
63 63 return PW3270_JNI_ENV->GetMethodID(PW3270_JNI_ENV->GetObjectClass(PW3270_JNI_OBJ), name, sig );
64 64 }
65 65  
66   -static void post_message(int msgid, int arg1 = 0, int arg2 = 0)
  66 +void pw3270_jni_post_message(int msgid, int arg1, int arg2)
67 67 {
68 68 trace("%s: pw3270_env=%p pw3270_obj=%p",__FUNCTION__,PW3270_JNI_ENV,PW3270_JNI_OBJ);
69 69  
... ... @@ -73,12 +73,12 @@ static void post_message(int msgid, int arg1 = 0, int arg2 = 0)
73 73  
74 74 static void changed(H3270 *session, int offset, int len)
75 75 {
76   - post_message(2,offset,len);
  76 + pw3270_jni_post_message(2,offset,len);
77 77 }
78 78  
79 79 static void erase(H3270 *session)
80 80 {
81   - post_message(4);
  81 + pw3270_jni_post_message(4);
82 82 }
83 83  
84 84 static int popuphandler(H3270 *session, void *terminal, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list args)
... ... @@ -124,13 +124,13 @@ static int popuphandler(H3270 *session, void *terminal, LIB3270_NOTIFY type, con
124 124  
125 125 static void ctlr_done(H3270 *session)
126 126 {
127   - post_message(4);
  127 + pw3270_jni_post_message(4);
128 128 }
129 129  
130 130 void update_status(H3270 *session, LIB3270_MESSAGE id)
131 131 {
132   - __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "Status changed to %d",(int) id);
133   - post_message(1,(int) id);
  132 +// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "Status changed to %d",(int) id);
  133 + pw3270_jni_post_message(1,(int) id);
134 134 }
135 135  
136 136 static int write_buffer(H3270 *session, unsigned const char *buf, int len)
... ... @@ -335,6 +335,8 @@ JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_set_1connection_1status(JNI
335 335 {
336 336 PW3270_JNI_BEGIN
337 337  
  338 + trace("Host is %s",connected ? "connected" : "disconnected");
  339 +
338 340 if(connected)
339 341 lib3270_set_connected(PW3270_SESSION);
340 342 else
... ...
android/jni/text.cpp
... ... @@ -108,43 +108,43 @@ JNIEXPORT jbyteArray JNICALL Java_br_com_bb_pw3270_lib3270_getText(JNIEnv *env,
108 108  
109 109 JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_setTextAt(JNIEnv *env, jobject obj, jint pos, jbyteArray inText, jint szText)
110 110 {
111   - unsigned char str[szText+1];
112   - int f;
113   - jbyte * bt;
114   -
115 111 PW3270_JNI_BEGIN
116 112  
117   - bt = env->GetByteArrayElements(inText,0);
  113 + if(lib3270_connected(PW3270_SESSION))
  114 + {
  115 + unsigned char str[szText+1];
  116 + int f;
  117 + jbyte * bt = env->GetByteArrayElements(inText,0);
  118 +
  119 + for(int f=0;f<szText;f++)
  120 + str[f] = (char) bt[f];
  121 + str[szText] = 0;
118 122  
119   - for(int f=0;f<szText;f++)
120   - str[f] = (char) bt[f];
121   - str[szText] = 0;
  123 +// trace("Buffer(%d/%d)=\"%s\"",(int) pos, lib3270_field_addr(PW3270_SESSION, (int) pos), str);
122 124  
123   - trace("Buffer(%d/%d)=\"%s\"",(int) pos, lib3270_field_addr(PW3270_SESSION, (int) pos), str);
  125 + if( ((int) pos) == lib3270_field_addr(PW3270_SESSION, (int) pos))
  126 + {
  127 + // Begin of field, clear it first
  128 + int sz = lib3270_field_length(PW3270_SESSION,pos);
  129 + unsigned char * buffer = (unsigned char *) lib3270_malloc(sz+1);
124 130  
  131 + memset(buffer,' ',sz);
125 132  
126   - if( ((int) pos) == lib3270_field_addr(PW3270_SESSION, (int) pos))
127   - {
128   - // Begin of field, clear it first
129   - int sz = lib3270_field_length(PW3270_SESSION,pos);
130   - unsigned char * buffer = (unsigned char *) lib3270_malloc(sz+1);
  133 + lib3270_clear_operator_error(PW3270_SESSION);
  134 + lib3270_set_cursor_address(PW3270_SESSION,(int) pos);
  135 + lib3270_set_string(PW3270_SESSION,buffer);
131 136  
132   - memset(buffer,' ',sz);
  137 + lib3270_free(buffer);
  138 + }
133 139  
134 140 lib3270_clear_operator_error(PW3270_SESSION);
135 141 lib3270_set_cursor_address(PW3270_SESSION,(int) pos);
136   - lib3270_set_string(PW3270_SESSION,buffer);
  142 + lib3270_set_string(PW3270_SESSION,str);
137 143  
138   - lib3270_free(buffer);
139   - }
140   -
141   - lib3270_clear_operator_error(PW3270_SESSION);
142   - lib3270_set_cursor_address(PW3270_SESSION,(int) pos);
143   - lib3270_set_string(PW3270_SESSION,str);
144   -
145   - lib3270_clear_operator_error(PW3270_SESSION);
  144 + lib3270_clear_operator_error(PW3270_SESSION);
146 145  
147   - env->ReleaseByteArrayElements(inText,bt,JNI_ABORT);
  146 + env->ReleaseByteArrayElements(inText,bt,JNI_ABORT);
  147 + }
148 148  
149 149 PW3270_JNI_END
150 150 }
... ...
android/res/values/drawables.xml
1 1 <?xml version="1.0" encoding="utf-8"?>
2 2 <resources>
  3 +
3 4 </resources>
... ...
android/res/values/strings.xml
... ... @@ -7,7 +7,7 @@
7 7 <item>X Aguarde</item>
8 8 <item>Conectado</item>
9 9 <item>Desconectado</item>
10   - <item>X</item>
  10 + <item>X Aguardando</item>
11 11 <item>X -f</item>
12 12 <item>X Protegido</item>
13 13 <item>X Numérico</item>
... ...
android/src/br/com/bb/pw3270/PW3270Activity.java
... ... @@ -192,20 +192,24 @@ public class PW3270Activity extends Activity
192 192 public boolean onOptionsItemSelected(MenuItem item)
193 193 {
194 194 // Handle item selection
195   - Log.d(TAG,"Menu item selected");
196   - /*
197   - switch (item.getItemId()) {
198   - case R.id.new_game:
199   - newGame();
200   - return true;
201   - case R.id.help:
202   - showHelp();
203   - return true;
204   - default:
205   - return super.onOptionsItemSelected(item);
  195 + switch (item.getItemId())
  196 + {
  197 + case R.id.connect:
  198 + host.connect();
  199 + break;
  200 +
  201 + case R.id.disconnect:
  202 + host.disconnect();
  203 + break;
  204 +
  205 + case R.id.settings:
  206 + break;
  207 +
  208 + default:
  209 + return super.onOptionsItemSelected(item);
206 210 }
207   - */
208   - return super.onOptionsItemSelected(item);
  211 + return true;
  212 +
209 213 }
210 214  
211 215 }
... ...
android/src/br/com/bb/pw3270/lib3270.java
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como lib3270.java e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + *
  27 + */
  28 +
1 29 package br.com.bb.pw3270;
2 30  
3 31 import java.lang.Thread;
... ... @@ -13,13 +41,15 @@ import java.io.DataOutputStream;
13 41  
14 42 // import java.util.Vector;
15 43  
16   -public class lib3270 {
  44 +public class lib3270
  45 +{
17 46 private NetworkThread mainloop = null;
18 47 private static final String TAG = "lib3270";
19 48  
20 49 protected int screenState = 0;
21 50 private boolean connected = false;
22 51 private boolean refresh = true;
  52 + private Socket sock = null;
23 53  
24 54 DataOutputStream outData = null;
25 55 DataInputStream inData = null;
... ... @@ -28,17 +58,74 @@ public class lib3270 {
28 58 protected int port = 8023;
29 59 protected boolean ssl = false;
30 60  
31   - static {
  61 + // Define the Handler that receives messages from the thread
  62 + final Handler mHandler = new Handler()
  63 + {
  64 + public void handleMessage(Message msg)
  65 + {
  66 + switch (msg.what)
  67 + {
  68 + case 0: // Connected/Disconnected
  69 + set_connection_status(connected);
  70 + break;
  71 +
  72 + case 1: // OIA message has changed
  73 + showProgramMessage(msg.arg1);
  74 + break;
  75 +
  76 + case 2: // Screen changed
  77 + Log.d(TAG, "Screen changed");
  78 + screenState = 1;
  79 + break;
  80 +
  81 + case 3: // Popup
  82 + popupMessageInfo popup = (popupMessageInfo) msg.obj;
  83 + popupMessage(msg.arg1, popup.title, popup.text, popup.info);
  84 + break;
  85 +
  86 + case 4: // erase
  87 + if(screenState != 2)
  88 + {
  89 + screenState = 2;
  90 + erase();
  91 + }
  92 + break;
  93 +
  94 + case 5: // ctlr_done
  95 + Log.d(TAG, "ctlr_done");
  96 + break;
  97 +
  98 + case 6: // recv_data
  99 + procRecvdata(((byteMessage) msg.obj).getMessage(),
  100 + ((byteMessage) msg.obj).getLength());
  101 + break;
  102 +
  103 + case 7: // ready
  104 + hideProgressDialog();
  105 + break;
  106 +
  107 + case 8: // busy
  108 + showProgressDialog("Aguarde...");
  109 + break;
  110 + }
  111 + }
  112 + };
  113 +
  114 +
  115 + static
  116 + {
32 117 System.loadLibrary("3270");
33 118 init();
34 119 }
35 120  
36   - lib3270() {
  121 + lib3270()
  122 + {
37 123 screenState = 0;
38 124 mainloop = null;
39 125 }
40 126  
41   - private class timer extends CountDownTimer {
  127 + private class timer extends CountDownTimer
  128 + {
42 129 private long id;
43 130 private lib3270 terminal;
44 131  
... ... @@ -53,17 +140,20 @@ public class lib3270 {
53 140 this.start();
54 141 }
55 142  
56   - public void onTick(long millisUntilFinished) {
  143 + public void onTick(long millisUntilFinished)
  144 + {
57 145 }
58 146  
59   - public void onFinish() {
  147 + public void onFinish()
  148 + {
60 149 Log.d(TAG, "Timer " + id + " finished");
61 150 terminal.timerFinish(id);
62 151 }
63 152  
64 153 }
65 154  
66   - private class popupMessageInfo {
  155 + private class popupMessageInfo
  156 + {
67 157 public String title;
68 158 public String text;
69 159 public String info;
... ... @@ -75,7 +165,8 @@ public class lib3270 {
75 165 }
76 166 }
77 167  
78   - private class byteMessage {
  168 + private class byteMessage
  169 + {
79 170 byte[] msg;
80 171 int sz;
81 172  
... ... @@ -93,14 +184,17 @@ public class lib3270 {
93 184 }
94 185 }
95 186  
96   - protected int send_data(byte[] data, int len) {
  187 + protected int send_data(byte[] data, int len)
  188 + {
97 189 Log.i(TAG, "Bytes a enviar: " + len);
98 190  
99 191 try {
100 192 outData.write(data, 0, len);
101 193 outData.flush();
102 194 return len;
103   - } catch (Exception e) {
  195 + }
  196 + catch (Exception e)
  197 + {
104 198 String msg = e.getLocalizedMessage();
105 199  
106 200 if (msg == null)
... ... @@ -111,23 +205,17 @@ public class lib3270 {
111 205  
112 206 Log.i(TAG, "Erro ao enviar dados: " + msg);
113 207  
114   - postPopup(0, "Erro na comunicação",
115   - "Não foi possível enviar dados", msg);
  208 + postPopup(0, "Erro na comunicação", "Não foi possível enviar dados", msg);
116 209  
117 210 }
118 211 return -1;
119 212 }
120 213  
121 214 // Main Thread
122   - private class NetworkThread extends Thread {
123   - Handler mHandler;
124   - Socket sock = null;
125   -
126   - NetworkThread(Handler h) {
127   - mHandler = h;
128   - }
129   -
130   - private boolean connect() {
  215 + private class NetworkThread extends Thread
  216 + {
  217 + private boolean connect()
  218 + {
131 219 // Connecta no host
132 220 SocketFactory socketFactory;
133 221  
... ... @@ -148,7 +236,9 @@ public class lib3270 {
148 236 outData = new DataOutputStream(sock.getOutputStream());
149 237 inData = new DataInputStream(sock.getInputStream());
150 238  
151   - } catch (Exception e) {
  239 + }
  240 + catch (Exception e)
  241 + {
152 242 String msg = e.getLocalizedMessage();
153 243  
154 244 if (msg == null)
... ... @@ -159,8 +249,7 @@ public class lib3270 {
159 249  
160 250 Log.i(TAG, "Erro ao conectar: " + msg);
161 251  
162   - postPopup(0, "Erro na conexão", "Não foi possível conectar",
163   - msg);
  252 + postPopup(0, "Erro na conexão", "Não foi possível conectar", msg);
164 253  
165 254 postMessage(0, 0, 0);
166 255  
... ... @@ -172,15 +261,18 @@ public class lib3270 {
172 261  
173 262 }
174 263  
175   - public void run() {
  264 + public void run()
  265 + {
176 266  
177 267 info(TAG, "Network thread started");
178 268 connected = connect();
179 269  
180   - if (connected) {
  270 + if (connected)
  271 + {
181 272 postMessage(0, 0, 0);
182 273  
183   - while (connected) {
  274 + while (connected)
  275 + {
184 276 byte[] in = new byte[4096];
185 277 int sz = -1;
186 278  
... ... @@ -202,10 +294,13 @@ public class lib3270 {
202 294 }
203 295 }
204 296  
205   - try {
  297 + Log.v(TAG, "Exiting communication thread");
  298 +
  299 + try
  300 + {
206 301 sock.close();
207   - } catch (Exception e) {
208 302 }
  303 + catch (Exception e) { }
209 304  
210 305 sock = null;
211 306 outData = null;
... ... @@ -217,15 +312,19 @@ public class lib3270 {
217 312 info(TAG, "Network thread stopped");
218 313 }
219 314  
220   - public void postMessage(int what, int arg1, int arg2) {
  315 + /*
  316 + public void postMessage(int what, int arg1, int arg2)
  317 + {
221 318 Message msg = mHandler.obtainMessage();
222 319 msg.what = what;
223 320 msg.arg1 = arg1;
224 321 msg.arg2 = arg2;
225 322 mHandler.sendMessage(msg);
226 323 }
  324 + */
227 325  
228   - public void postPopup(int type, String title, String text, String info) {
  326 + public void postPopup(int type, String title, String text, String info)
  327 + {
229 328 Message msg = mHandler.obtainMessage();
230 329  
231 330 msg.what = 3;
... ... @@ -236,11 +335,17 @@ public class lib3270 {
236 335  
237 336 }
238 337  
239   - public void postMessage(int what, int arg1, int arg2) {
240   - mainloop.postMessage(what, arg1, arg2);
  338 + public void postMessage(int what, int arg1, int arg2)
  339 + {
  340 + Message msg = mHandler.obtainMessage();
  341 + msg.what = what;
  342 + msg.arg1 = arg1;
  343 + msg.arg2 = arg2;
  344 + mHandler.sendMessage(msg);
241 345 }
242 346  
243   - public void postPopup(int type, String title, String text, String info) {
  347 + public void postPopup(int type, String title, String text, String info)
  348 + {
244 349 Log.d(TAG, "Type:" + type);
245 350 Log.d(TAG, "Title:" + title);
246 351 Log.d(TAG, "Text:" + text);
... ... @@ -248,124 +353,109 @@ public class lib3270 {
248 353 mainloop.postPopup(type, title, text, info);
249 354 }
250 355  
251   - // Define the Handler that receives messages from the thread and update the
252   - // progress
253   - final Handler handler = new Handler() {
254   - public void handleMessage(Message msg) {
255   - switch (msg.what) {
256   - case 0: // Connected/Disconnected
257   - set_connection_status(connected);
258   - Log.d(TAG, connected ? "Connected" : "Disconnected");
259   - break;
260   -
261   - case 1: // OIA message has changed
262   - showProgramMessage(msg.arg1);
263   - break;
264   -
265   - case 2: // Screen changed
266   - Log.d(TAG, "Screen changed");
267   - screenState = 1;
268   - break;
269   -
270   - case 3: // Popup
271   - popupMessageInfo popup = (popupMessageInfo) msg.obj;
272   - popupMessage(msg.arg1, popup.title, popup.text, popup.info);
273   - break;
274   -
275   - case 4: // erase
276   - if(screenState != 2)
277   - {
278   - screenState = 2;
279   - erase();
280   - }
281   - break;
282   -
283   - case 5: // ctlr_done
284   - Log.d(TAG, "ctlr_done");
285   - break;
286   -
287   - case 6: // recv_data
288   - procRecvdata(((byteMessage) msg.obj).getMessage(),
289   - ((byteMessage) msg.obj).getLength());
290   - break;
291   -
292   - case 7: // ready
293   - hideProgressDialog();
294   - break;
295   -
296   - case 8: // busy
297   - showProgressDialog("Aguarde...");
298   - break;
299   - }
300   - }
301   - };
302   -
303 356 /*---[ Signal methods ]--------------------------------------------------*/
304 357  
305   - protected boolean showProgramMessage(int id)
  358 + protected boolean showProgramMessage(int id)
306 359 {
307   - if(id == 0 && screenState != 0)
  360 + switch(id)
308 361 {
309   - screenState = 0;
310   - updateScreen();
311   - return true;
  362 + case 0: // LIB3270_MESSAGE_NONE
  363 + if(screenState != 0)
  364 + {
  365 + screenState = 0;
  366 + updateScreen();
  367 + }
  368 + break;
  369 +
  370 + case 4: // LIB3270_MESSAGE_DISCONNECTED
  371 + Log.v(TAG, "Disconnected");
  372 + connected = false;
  373 + erase();
  374 + break;
  375 +
  376 + case 3: // LIB3270_MESSAGE_CONNECTED
  377 + Log.v(TAG, "Connected");
  378 + break;
  379 +
  380 + // 01 LIB3270_MESSAGE_SYSWAIT
  381 + // 02 LIB3270_MESSAGE_TWAIT
  382 + // 03 LIB3270_MESSAGE_CONNECTED
  383 + // 05 LIB3270_MESSAGE_AWAITING_FIRST
  384 + // 06 LIB3270_MESSAGE_MINUS
  385 + // 07 LIB3270_MESSAGE_PROTECTED
  386 + // 08 LIB3270_MESSAGE_NUMERIC
  387 + // 09 LIB3270_MESSAGE_OVERFLOW
  388 + // 10 LIB3270_MESSAGE_INHIBIT
  389 + // 11 LIB3270_MESSAGE_KYBDLOCK
  390 + // 12 LIB3270_MESSAGE_X
  391 + // 13 LIB3270_MESSAGE_RESOLVING
  392 + // 14 LIB3270_MESSAGE_CONNECTING
  393 +
  394 + default:
  395 + return false;
312 396 }
313   -
314   - return false;
  397 +
  398 + return true;
315 399 }
316 400  
317   - protected void popupMessage(int type, String title, String text, String info) {
  401 + protected void popupMessage(int type, String title, String text, String info)
  402 + {
318 403 }
319 404  
320   - protected void info(String tag, String msg) {
  405 + protected void info(String tag, String msg)
  406 + {
321 407 Log.i(tag, msg);
322 408 }
323 409  
324   - protected void error(String tag, String msg) {
  410 + protected void error(String tag, String msg)
  411 + {
325 412 Log.e(tag, msg);
326 413 }
327 414  
328   - protected void erase()
  415 + protected void erase()
329 416 {
330 417 }
331 418  
332 419 protected void updateScreen()
333 420 {
334 421 }
335   -
336   - public void pfkey(int id)
  422 +
  423 + public void pfkey(int id)
337 424 {
338 425 sendPFkey(id);
339 426 }
340 427  
341   - public void xmit()
  428 + public void xmit()
342 429 {
343 430 sendEnter();
344 431 }
345 432  
346   - public void ready()
  433 + public void ready()
347 434 {
348 435 postMessage(7, 0, 0);
349 436 }
350 437  
351   - public void busy()
  438 + public void busy()
352 439 {
353 440 postMessage(8, 0, 0);
354 441 }
355 442  
356   - public void hideProgressDialog()
  443 + public void hideProgressDialog()
357 444 {
358 445 }
359 446  
360   - public void showProgressDialog(String msg) {
  447 + public void showProgressDialog(String msg)
  448 + {
361 449 }
362 450  
363 451 /*---[ External methods ]------------------------------------------------*/
364 452  
365   - public int connect() {
366   - if (mainloop == null) {
  453 + public int connect()
  454 + {
  455 + if (mainloop == null)
  456 + {
367 457 info(TAG, "Starting comm thread");
368   - mainloop = new NetworkThread(handler);
  458 + mainloop = new NetworkThread();
369 459 mainloop.start();
370 460 return 0;
371 461 }
... ... @@ -373,12 +463,25 @@ public class lib3270 {
373 463 return -1;
374 464 }
375 465  
376   - public int disconnect() {
  466 + public int disconnect()
  467 + {
  468 + Log.v(TAG, "Disconnecting");
377 469 connected = false;
  470 +
  471 + if(sock != null)
  472 + {
  473 + try
  474 + {
  475 + sock.shutdownInput();
  476 + sock.shutdownOutput();
  477 + } catch(Exception e) { }
  478 + }
  479 +
378 480 return 0;
379 481 }
380 482  
381   - public void setStringAt(int offset, String str) {
  483 + public void setStringAt(int offset, String str)
  484 + {
382 485 refresh = false;
383 486 try {
384 487 setTextAt(offset, str.getBytes(getEncoding()), str.length());
... ...
src/include/lib3270/session.h
... ... @@ -69,6 +69,10 @@
69 69 #define SSL void
70 70 #endif // !HEADER_SSL_H
71 71  
  72 +#ifndef LIB3270_TA
  73 + #define LIB3270_TA void
  74 +#endif // !LIB3270_TA
  75 +
72 76 struct _h3270
73 77 {
74 78 unsigned short sz; /**< Struct size */
... ... @@ -245,6 +249,8 @@
245 249 unsigned char aid; /**< current attention ID */
246 250 void * unlock_id;
247 251 time_t unlock_delay_time;
  252 + LIB3270_TA * ta_head;
  253 + LIB3270_TA * ta_tail;
248 254  
249 255 // Widget info
250 256 void * widget;
... ...
src/lib3270/kybd.c
... ... @@ -35,6 +35,10 @@
35 35 * This module handles the keyboard for the 3270 emulator.
36 36 */
37 37  
  38 +struct ta;
  39 +
  40 +#define LIB3270_TA struct ta
  41 +
38 42 #include "globals.h"
39 43  
40 44 #ifndef ANDROID
... ... @@ -153,7 +157,7 @@ static int n_composites = 0;
153 157 #define ak_eq(k1, k2) (((k1).keysym == (k2).keysym) && \
154 158 ((k1).keytype == (k2).keytype))
155 159  
156   -static struct ta
  160 +struct ta
157 161 {
158 162 struct ta *next;
159 163  
... ... @@ -164,12 +168,15 @@ static struct ta
164 168 TA_TYPE_USER
165 169 } type;
166 170  
167   - H3270 * session;
168 171 void (*fn)(H3270 *, const char *, const char *);
169 172 char *parm[2];
170 173 unsigned char aid_code;
171   -} *ta_head = (struct ta *) NULL,
  174 +};
  175 +
  176 +/*
  177 +*ta_head = (struct ta *) NULL,
172 178 *ta_tail = (struct ta *) NULL;
  179 +*/
173 180  
174 181  
175 182 #if defined(DEBUG) || defined(ANDROID)
... ... @@ -238,16 +245,16 @@ static int enq_chk(H3270 *session)
238 245  
239 246 trace("Adding key %02x on queue",(int) aid_code);
240 247  
241   - if (ta_head)
  248 + if (session->ta_head)
242 249 {
243   - ta_tail->next = ta;
  250 + session->ta_tail->next = ta;
244 251 }
245 252 else
246 253 {
247   - ta_head = ta;
  254 + session->ta_head = ta;
248 255 status_typeahead(session,True);
249 256 }
250   - ta_tail = ta;
  257 + session->ta_tail = ta;
251 258  
252 259 trace_event(" Key-aid queued (kybdlock 0x%x)\n", session->kybdlock);
253 260 }
... ... @@ -271,7 +278,6 @@ static void enq_ta(H3270 *hSession, void (*fn)(H3270 *, const char *, const char
271 278 return;
272 279  
273 280 ta = (struct ta *) lib3270_malloc(sizeof(*ta));
274   - ta->session = hSession;
275 281 ta->next = (struct ta *) NULL;
276 282 ta->type = TA_TYPE_DEFAULT;
277 283 ta->fn = fn;
... ... @@ -282,16 +288,16 @@ static void enq_ta(H3270 *hSession, void (*fn)(H3270 *, const char *, const char
282 288 if (parm2)
283 289 ta->parm[1] = NewString(parm2);
284 290  
285   - if (ta_head)
  291 + if(hSession->ta_head)
286 292 {
287   - ta_tail->next = ta;
  293 + hSession->ta_tail->next = ta;
288 294 }
289 295 else
290 296 {
291   - ta_head = ta;
  297 + hSession->ta_head = ta;
292 298 status_typeahead(hSession,True);
293 299 }
294   - ta_tail = ta;
  300 + hSession->ta_tail = ta;
295 301  
296 302 trace_event(" action queued (kybdlock 0x%x)\n", h3270.kybdlock);
297 303 }
... ... @@ -303,30 +309,30 @@ Boolean run_ta(void)
303 309 {
304 310 struct ta *ta;
305 311  
306   - if (h3270.kybdlock || (ta = ta_head) == (struct ta *)NULL)
  312 + if (h3270.kybdlock || (ta = h3270.ta_head) == (struct ta *)NULL)
307 313 return False;
308 314  
309   - if ((ta_head = ta->next) == (struct ta *)NULL)
  315 + if ((h3270.ta_head = ta->next) == (struct ta *)NULL)
310 316 {
311   - ta_tail = (struct ta *)NULL;
  317 + h3270.ta_tail = (struct ta *)NULL;
312 318 status_typeahead(&h3270,False);
313 319 }
314 320  
315 321 switch(ta->type)
316 322 {
317 323 case TA_TYPE_DEFAULT:
318   - ta->fn(ta->session,ta->parm[0],ta->parm[1]);
  324 + ta->fn(&h3270,ta->parm[0],ta->parm[1]);
319 325 lib3270_free(ta->parm[0]);
320 326 lib3270_free(ta->parm[1]);
321 327 break;
322 328  
323 329 case TA_TYPE_KEY_AID:
324 330 trace("Sending enqueued key %02x",ta->aid_code);
325   - key_AID(ta->session,ta->aid_code);
  331 + key_AID(&h3270,ta->aid_code);
326 332 break;
327 333  
328 334 default:
329   - popup_an_error(ta->session, _( "Unexpected type %d in typeahead queue" ), ta->type);
  335 + popup_an_error(&h3270, _( "Unexpected type %d in typeahead queue" ), ta->type);
330 336  
331 337 }
332 338  
... ... @@ -339,13 +345,12 @@ Boolean run_ta(void)
339 345 * Flush the typeahead queue.
340 346 * Returns whether or not anything was flushed.
341 347 */
342   -static Boolean
343   -flush_ta(void)
  348 +static Boolean flush_ta(void)
344 349 {
345 350 struct ta *ta, *next;
346 351 Boolean any = False;
347 352  
348   - for (ta = ta_head; ta != (struct ta *) NULL; ta = next)
  353 + for (ta = h3270.ta_head; ta != (struct ta *) NULL; ta = next)
349 354 {
350 355 lib3270_free(ta->parm[0]);
351 356 lib3270_free(ta->parm[1]);
... ... @@ -353,7 +358,7 @@ flush_ta(void)
353 358 lib3270_free(ta);
354 359 any = True;
355 360 }
356   - ta_head = ta_tail = (struct ta *) NULL;
  361 + h3270.ta_head = h3270.ta_tail = (struct ta *) NULL;
357 362 status_typeahead(&h3270,False);
358 363 return any;
359 364 }
... ... @@ -1001,316 +1006,6 @@ static Boolean key_Character(int code, Boolean with_ge, Boolean pasting, Boolean
1001 1006 }
1002 1007  
1003 1008 /*
1004   -#if defined(X3270_DBCS)
1005   -static void
1006   -key_WCharacter_wrapper(Widget w unused, XEvent *event unused, String *params, Cardinal *num_params unused)
1007   -{
1008   - int code;
1009   - unsigned char codebuf[2];
1010   -
1011   - code = atoi(params[0]);
1012   - trace_event(" %s -> Key(0x%04x)\n",
1013   - ia_name[(int) ia_cause], code);
1014   - codebuf[0] = (code >> 8) & 0xff;
1015   - codebuf[1] = code & 0xff;
1016   - (void) key_WCharacter(codebuf, NULL);
1017   -}
1018   -
1019   -//
1020   -// Input a DBCS character.
1021   -// Returns True if a character was stored in the buffer, False otherwise.
1022   -//
1023   -Boolean key_WCharacter(unsigned char code[], Boolean *skipped)
1024   -{
1025   - int baddr;
1026   - register unsigned char fa;
1027   - int faddr;
1028   - enum dbcs_state d;
1029   - int xaddr;
1030   - Boolean done = False;
1031   - Boolean no_si = False;
1032   - extern unsigned char reply_mode; // XXX
1033   -
1034   - reset_idle_timer();
1035   -
1036   - if (kybdlock) {
1037   - char codename[64];
1038   -
1039   - (void) sprintf(codename, "%d", (code[0] << 8) | code[1]);
1040   - enq_ta(key_WCharacter_wrapper, codename, CN);
1041   - return False;
1042   - }
1043   -
1044   - if (skipped != NULL)
1045   - *skipped = False;
1046   -
1047   - // In DBCS mode?
1048   - if (!dbcs) {
1049   - trace_event("DBCS character received when not in DBCS mode, "
1050   - "ignoring.\n");
1051   - return True;
1052   - }
1053   -
1054   -#if defined(X3270_ANSI)
1055   - // In ANSI mode?
1056   - if (IN_ANSI) {
1057   - char mb[16];
1058   -
1059   - dbcs_to_mb(code[0], code[1], mb);
1060   - net_sends(mb);
1061   - return True;
1062   - }
1063   -#endif
1064   -
1065   - baddr = cursor_addr;
1066   - fa = get_field_attribute(baddr);
1067   - faddr = find_field_attribute(baddr);
1068   -
1069   - // Protected?
1070   - if (ea_buf[baddr].fa || FA_IS_PROTECTED(fa)) {
1071   - operator_error(KL_OERR_PROTECTED);
1072   - return False;
1073   - }
1074   -
1075   - // Numeric?
1076   - if (h3270.numeric_lock && FA_IS_NUMERIC(fa)) {
1077   - operator_error(KL_OERR_NUMERIC);
1078   - return False;
1079   - }
1080   -
1081   - //
1082   - // Figure our what to do based on the DBCS state of the buffer.
1083   - // Leaves baddr pointing to the next unmodified position.
1084   - //
1085   -retry:
1086   - switch (d = ctlr_dbcs_state(baddr)) {
1087   - case DBCS_RIGHT:
1088   - case DBCS_RIGHT_WRAP:
1089   - // Back up one position and process it as a LEFT.
1090   - DEC_BA(baddr);
1091   - // fall through...
1092   - case DBCS_LEFT:
1093   - case DBCS_LEFT_WRAP:
1094   - // Overwrite the existing character.
1095   - if (insert) {
1096   - if (!ins_prep(faddr, baddr, 2)) {
1097   - return False;
1098   - }
1099   - }
1100   - ctlr_add(baddr, code[0], ea_buf[baddr].cs);
1101   - INC_BA(baddr);
1102   - ctlr_add(baddr, code[1], ea_buf[baddr].cs);
1103   - INC_BA(baddr);
1104   - done = True;
1105   - break;
1106   - case DBCS_SB:
1107   - // Back up one position and process it as an SI.
1108   - DEC_BA(baddr);
1109   - // fall through...
1110   - case DBCS_SI:
1111   - // Extend the subfield to the right.
1112   - if (insert) {
1113   - if (!ins_prep(faddr, baddr, 2)) {
1114   - return False;
1115   - }
1116   - } else {
1117   - // Don't overwrite a field attribute or an SO.
1118   - xaddr = baddr;
1119   - INC_BA(xaddr); // C1
1120   - if (ea_buf[xaddr].fa)
1121   - break;
1122   - if (ea_buf[xaddr].cc == EBC_so)
1123   - no_si = True;
1124   - INC_BA(xaddr); // SI
1125   - if (ea_buf[xaddr].fa || ea_buf[xaddr].cc == EBC_so)
1126   - break;
1127   - }
1128   - ctlr_add(baddr, code[0], ea_buf[baddr].cs);
1129   - INC_BA(baddr);
1130   - ctlr_add(baddr, code[1], ea_buf[baddr].cs);
1131   - if (!no_si) {
1132   - INC_BA(baddr);
1133   - ctlr_add(baddr, EBC_si, ea_buf[baddr].cs);
1134   - }
1135   - done = True;
1136   - break;
1137   - case DBCS_DEAD:
1138   - break;
1139   - case DBCS_NONE:
1140   - if (ea_buf[faddr].ic) {
1141   - Boolean extend_left = FALSE;
1142   -
1143   - // Is there room?
1144   - if (insert) {
1145   - if (!ins_prep(faddr, baddr, 4)) {
1146   - return False;
1147   - }
1148   - } else {
1149   - xaddr = baddr; // baddr, SO
1150   - if (ea_buf[xaddr].cc == EBC_so) {
1151   - //
1152   - // (baddr), where we would have put the
1153   - // SO, is already an SO. Move to
1154   - // (baddr+1) and try again.
1155   - //
1156   -#if defined(DBCS_RIGHT_DEBUG)
1157   - printf("SO in position 0\n");
1158   -#endif
1159   - INC_BA(baddr);
1160   - goto retry;
1161   - }
1162   -
1163   - INC_BA(xaddr); // baddr+1, C0
1164   - if (ea_buf[xaddr].fa)
1165   - break;
1166   - if (ea_buf[xaddr].cc == EBC_so) {
1167   - enum dbcs_state e;
1168   -
1169   - //
1170   - // (baddr+1), where we would have put
1171   - // the left side of the DBCS, is a SO.
1172   - // If there's room, we can extend the
1173   - // subfield to the left. If not, we're
1174   - // stuck.
1175   - //
1176   - DEC_BA(xaddr);
1177   - DEC_BA(xaddr);
1178   - e = ctlr_dbcs_state(xaddr);
1179   - if (e == DBCS_NONE || e == DBCS_SB) {
1180   - extend_left = True;
1181   - no_si = True;
1182   -#if defined(DBCS_RIGHT_DEBUG)
1183   - printf("SO in position 1, "
1184   - "extend left\n");
1185   -#endif
1186   - } else {
1187   - //
1188   - // Won't actually happen,
1189   - // because this implies that
1190   - // the buffer addr at baddr
1191   - // is an SB.
1192   - //
1193   -#if defined(DBCS_RIGHT_DEBUG)
1194   - printf("SO in position 1, "
1195   - "no room on left, "
1196   - "fail\n");
1197   -#endif
1198   - break;
1199   - }
1200   - }
1201   -
1202   - INC_BA(xaddr); // baddr+2, C1
1203   - if (ea_buf[xaddr].fa)
1204   - break;
1205   - if (ea_buf[xaddr].cc == EBC_so) {
1206   - //
1207   - // (baddr+2), where we want to put the
1208   - // right half of the DBCS character, is
1209   - // a SO. This is a natural extension
1210   - // to the left -- just make sure we
1211   - // don't write an SI.
1212   - //
1213   - no_si = True;
1214   -#if defined(DBCS_RIGHT_DEBUG)
1215   - printf("SO in position 2, no SI\n");
1216   -#endif
1217   - }
1218   -
1219   - //
1220   - // Check the fourth position only if we're
1221   - // not doing an extend-left.
1222   - ///
1223   - if (!no_si) {
1224   - INC_BA(xaddr); // baddr+3, SI
1225   - if (ea_buf[xaddr].fa)
1226   - break;
1227   - if (ea_buf[xaddr].cc == EBC_so) {
1228   - //
1229   - // (baddr+3), where we want to
1230   - // put an
1231   - // SI, is an SO. Forget it.
1232   - //
1233   -#if defined(DBCS_RIGHT_DEBUG)
1234   - printf("SO in position 3, "
1235   - "retry right\n");
1236   - INC_BA(baddr);
1237   - goto retry;
1238   -#endif
1239   - break;
1240   - }
1241   - }
1242   - }
1243   - // Yes, add it.
1244   - if (extend_left)
1245   - DEC_BA(baddr);
1246   - ctlr_add(baddr, EBC_so, ea_buf[baddr].cs);
1247   - INC_BA(baddr);
1248   - ctlr_add(baddr, code[0], ea_buf[baddr].cs);
1249   - INC_BA(baddr);
1250   - ctlr_add(baddr, code[1], ea_buf[baddr].cs);
1251   - if (!no_si) {
1252   - INC_BA(baddr);
1253   - ctlr_add(baddr, EBC_si, ea_buf[baddr].cs);
1254   - }
1255   - done = True;
1256   - } else if (reply_mode == SF_SRM_CHAR) {
1257   - // Use the character attribute.
1258   - if (insert) {
1259   - if (!ins_prep(faddr, baddr, 2)) {
1260   - return False;
1261   - }
1262   - } else {
1263   - xaddr = baddr;
1264   - INC_BA(xaddr);
1265   - if (ea_buf[xaddr].fa)
1266   - break;
1267   - }
1268   - ctlr_add(baddr, code[0], CS_DBCS);
1269   - INC_BA(baddr);
1270   - ctlr_add(baddr, code[1], CS_DBCS);
1271   - INC_BA(baddr);
1272   - done = True;
1273   - }
1274   - break;
1275   - }
1276   -
1277   - if (done) {
1278   - // Implement blank fill mode.
1279   - if (lib3270_get_toggle(&h3270,LIB3270_TOGGLE_BLANK_FILL)) {
1280   - xaddr = faddr;
1281   - INC_BA(xaddr);
1282   - while (xaddr != baddr) {
1283   - if (ea_buf[xaddr].cc == EBC_null)
1284   - ctlr_add(xaddr, EBC_space, CS_BASE);
1285   - else
1286   - break;
1287   - INC_BA(xaddr);
1288   - }
1289   - }
1290   -
1291   - mdt_set(cursor_addr);
1292   -
1293   - // Implement auto-skip.
1294   - while (ea_buf[baddr].fa) {
1295   - if (skipped != NULL)
1296   - *skipped = True;
1297   - if (FA_IS_SKIP(ea_buf[baddr].fa))
1298   - baddr = next_unprotected(&h3270,baddr);
1299   - else
1300   - INC_BA(baddr);
1301   - }
1302   - cursor_move(baddr);
1303   - (void) ctlr_dbcs_postprocess();
1304   - return True;
1305   - } else {
1306   - operator_error(KL_OERR_DBCS);
1307   - return False;
1308   - }
1309   -}
1310   -#endif
1311   -*/
1312   -
1313   -/*
1314 1009 * Handle an ordinary character key, given an ASCII code.
1315 1010 */
1316 1011 void key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped)
... ... @@ -1341,59 +1036,6 @@ void key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause,Bo
1341 1036 }
1342 1037 }
1343 1038  
1344   -
1345   -/*
1346   - * Simple toggles.
1347   - */
1348   -/*
1349   -#if defined(X3270_DISPLAY)
1350   -void
1351   -AltCursor_action(Widget w unused, XEvent *event, String *params,
1352   - Cardinal *num_params)
1353   -{
1354   - reset_idle_timer();
1355   - do_toggle(ALT_CURSOR);
1356   -}
1357   -#endif
1358   -*/
1359   -
1360   -/*
1361   -void
1362   -MonoCase_action(Widget w unused, XEvent *event, String *params,
1363   - Cardinal *num_params)
1364   -{
1365   - reset_idle_timer();
1366   - do_toggle(MONOCASE);
1367   -}
1368   -*/
1369   -
1370   -/*
1371   - * Flip the display left-to-right
1372   - */
1373   - /*
1374   -void
1375   -Flip_action(Widget w unused, XEvent *event, String *params,
1376   - Cardinal *num_params)
1377   -{
1378   -
1379   -// reset_idle_timer();
1380   -
1381   - screen_flip();
1382   -}
1383   -*/
1384   -
1385   -
1386   -/*
1387   - * Tab forward to next field.
1388   - */
1389   -/*
1390   -void
1391   -Tab_action(Widget w unused, XEvent *event, String *params, Cardinal *num_params)
1392   -{
1393   - action_NextField();
1394   -}
1395   -*/
1396   -
1397 1039 LIB3270_ACTION( nextfield )
1398 1040 {
1399 1041  
... ... @@ -1612,13 +1254,6 @@ do_left(void)
1612 1254 cursor_move(&h3270,baddr);
1613 1255 }
1614 1256  
1615   -/*
1616   -void Left_action(Widget w unused, XEvent *event, String *params, Cardinal *num_params)
1617   -{
1618   - action_CursorLeft();
1619   -}
1620   -*/
1621   -
1622 1257 LIB3270_CURSOR_ACTION( left )
1623 1258 {
1624 1259 if (hSession->kybdlock)
... ... @@ -2323,116 +1958,6 @@ LIB3270_ACTION( clear )
2323 1958 return 0;
2324 1959 }
2325 1960  
2326   -
2327   -/*
2328   - * Cursor Select key (light pen simulator).
2329   - */
2330   - /*
2331   -static void
2332   -lightpen_select(int baddr)
2333   -{
2334   - int faddr;
2335   - register unsigned char fa;
2336   - int designator;
2337   -#if defined(X3270_DBCS)
2338   - int designator2;
2339   -#endif
2340   -
2341   - faddr = find_field_attribute(baddr);
2342   - fa = ea_buf[faddr].fa;
2343   - if (!FA_IS_SELECTABLE(fa)) {
2344   - lib3270_ring_bell();
2345   - return;
2346   - }
2347   - designator = faddr;
2348   - INC_BA(designator);
2349   -
2350   -#if defined(X3270_DBCS)
2351   - if (dbcs) {
2352   - if (ea_buf[baddr].cs == CS_DBCS) {
2353   - designator2 = designator;
2354   - INC_BA(designator2);
2355   - if ((ea_buf[designator].db != DBCS_LEFT &&
2356   - ea_buf[designator].db != DBCS_LEFT_WRAP) &&
2357   - (ea_buf[designator2].db != DBCS_RIGHT &&
2358   - ea_buf[designator2].db != DBCS_RIGHT_WRAP)) {
2359   - lib3270_ring_bell();
2360   - return;
2361   - }
2362   - if (ea_buf[designator].cc == 0x42 &&
2363   - ea_buf[designator2].cc == EBC_greater) {
2364   - ctlr_add(designator2, EBC_question, CS_DBCS);
2365   - mdt_clear(faddr);
2366   - } else if (ea_buf[designator].cc == 0x42 &&
2367   - ea_buf[designator2].cc == EBC_question) {
2368   - ctlr_add(designator2, EBC_greater, CS_DBCS);
2369   - mdt_clear(faddr);
2370   - } else if ((ea_buf[designator].cc == EBC_space &&
2371   - ea_buf[designator2].cc == EBC_space) ||
2372   - (ea_buf[designator].cc == EBC_null &&
2373   - ea_buf[designator2].cc == EBC_null)) {
2374   - ctlr_add(designator2, EBC_greater, CS_DBCS);
2375   - mdt_set(faddr);
2376   - key_AID(AID_SELECT);
2377   - } else if (ea_buf[designator].cc == 0x42 &&
2378   - ea_buf[designator2].cc == EBC_ampersand) {
2379   - mdt_set(faddr);
2380   - key_AID(AID_ENTER);
2381   - } else {
2382   - lib3270_ring_bell();
2383   - }
2384   - return;
2385   - }
2386   - }
2387   -#endif
2388   -
2389   - switch (ea_buf[designator].cc) {
2390   - case EBC_greater:
2391   - ctlr_add(designator, EBC_question, 0);
2392   - mdt_clear(faddr);
2393   - break;
2394   - case EBC_question:
2395   - ctlr_add(designator, EBC_greater, 0);
2396   - mdt_set(faddr);
2397   - break;
2398   - case EBC_space:
2399   - case EBC_null:
2400   - mdt_set(faddr);
2401   - key_AID(AID_SELECT);
2402   - break;
2403   - case EBC_ampersand:
2404   - mdt_set(faddr);
2405   - key_AID(AID_ENTER);
2406   - break;
2407   - default:
2408   - lib3270_ring_bell();
2409   - break;
2410   - }
2411   -}
2412   -*/
2413   -
2414   -/*
2415   - * Cursor Select key (light pen simulator) -- at the current cursor location.
2416   - */
2417   -/*
2418   -void
2419   -CursorSelect_action(Widget w unused, XEvent *event, String *params,
2420   - Cardinal *num_params)
2421   -{
2422   -// reset_idle_timer();
2423   - if (kybdlock) {
2424   - enq_ta(CursorSelect_action, CN, CN);
2425   - return;
2426   - }
2427   -
2428   -#if defined(X3270_ANSI)
2429   - if (IN_ANSI)
2430   - return;
2431   -#endif
2432   - lightpen_select(cursor_addr);
2433   -}
2434   -*/
2435   -
2436 1961 /**
2437 1962 * Erase End Of Line Key.
2438 1963 *
... ...