Commit eb180443d335d18b97227156259573af04a9f29f

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

Corrigindo segfaults aleatórios durante a montagem dos formulários html, inician…

…do implementação do arquivo de configuração em android
android/src/br/com/bb/pw3270/PW3270Activity.java
... ... @@ -7,6 +7,7 @@ import android.os.Bundle;
7 7 // import android.widget.EditText;
8 8 import android.util.Log;
9 9 // import android.view.View;
  10 +import android.content.SharedPreferences;
10 11 import android.content.res.*;
11 12 import android.app.AlertDialog;
12 13 import android.webkit.WebView;
... ... @@ -31,6 +32,15 @@ public class PW3270Activity extends Activity
31 32  
32 33 terminal()
33 34 {
  35 + SharedPreferences settings = getSharedPreferences(TAG, 0);
  36 + hostname = settings.getString("hostname",hostname);
  37 + port = settings.getInt("port",port);
  38 + ssl = settings.getBoolean("ssl",ssl);
  39 +
  40 + setToggle("dstrace",settings.getBoolean("dstrace",true));
  41 + setToggle("screentrace",settings.getBoolean("screentrace",true));
  42 + setToggle("eventtrace",settings.getBoolean("eventtrace",true));
  43 +
34 44 }
35 45  
36 46 protected void updateProgramMessage(int id)
... ...
android/src/br/com/bb/pw3270/lib3270.java
... ... @@ -24,9 +24,9 @@ public class lib3270
24 24 DataOutputStream outData = null;
25 25 DataInputStream inData = null;
26 26  
27   - private String hostname = "3270.df.bb";
28   - private int port = 8023;
29   - private boolean ssl = false;
  27 + protected String hostname = "3270.df.bb";
  28 + protected int port = 8023;
  29 + protected boolean ssl = false;
30 30  
31 31 static
32 32 {
... ... @@ -36,9 +36,6 @@ public class lib3270
36 36  
37 37 lib3270()
38 38 {
39   - setToggle("dstrace",true);
40   - setToggle("screentrace",true);
41   - setToggle("eventtrace",true);
42 39 changed = false;
43 40 mainloop = null;
44 41 }
... ... @@ -150,6 +147,10 @@ public class lib3270
150 147 {
151 148 // Connecta no host
152 149 SocketFactory socketFactory;
  150 +
  151 + if(hostname == "")
  152 + return false;
  153 +
153 154 if(ssl)
154 155 {
155 156 // Host é SSL
... ...
src/lib3270/html.c
... ... @@ -110,8 +110,7 @@
110 110 } mode;
111 111  
112 112 char * text;
113   - char * input;
114   - char * block;
  113 + int block;
115 114 int maxlength;
116 115 unsigned short fg;
117 116 unsigned short bg;
... ... @@ -189,11 +188,7 @@
189 188  
190 189 snprintf(name,29,"F%04d",addr);
191 190  
192   - info->block = info->text+strlen(info->text);
193   -
194   -#ifdef DEBUG
195   - append_string(info,"\n");
196   -#endif // DEBUG
  191 + info->block = strlen(info->text);
197 192  
198 193 append_string(info,"<input type=\"");
199 194 append_string(info,mode == HTML_MODE_INPUT_TEXT ? "text" : "password" );
... ... @@ -202,44 +197,35 @@
202 197 append_string(info,"\" value=\"");
203 198 info->mode = mode;
204 199 info->maxlength = 0;
205   - info->input = info->text+strlen(info->text);
206 200  
207 201 }
208 202  
209 203 static void close_input(struct html_info *info)
210 204 {
211   - char buffer[80];
212   - char *ptr;
213   - char *mark;
  205 + char buffer[80];
  206 + int pos;
214 207  
215 208 if(info->mode == HTML_MODE_TEXT)
216 209 return;
217 210  
  211 + trace("maxlength=%d",info->maxlength);
  212 +
218 213 if(info->maxlength < 1)
219 214 {
220   - *info->block = 0;
  215 + info->text[info->block] = 0;
221 216 info->mode = HTML_MODE_TEXT;
222 217 info->maxlength = 0;
223 218 return;
224 219 }
225 220  
226   - for(ptr=mark=info->input;*ptr;ptr++)
227   - {
228   - if(*ptr != ' ')
229   - mark=ptr+1;
230   - }
231   - *mark = 0;
  221 + for(pos = strlen(info->text)-1;pos > 0 && info->text[pos] == ' '; pos--)
  222 + info->text[pos] = 0;
232 223  
233 224 snprintf(buffer,80,"\" maxlength=\"%d\" class=\"IW%03d\"",info->maxlength,info->maxlength);
234 225 append_string(info,buffer);
235 226  
236 227 append_string(info,"></input>");
237 228  
238   -#ifdef DEBUG
239   - append_string(info,"\n");
240   -#endif // DEBUG
241   -
242   -
243 229 info->mode = HTML_MODE_TEXT;
244 230 info->maxlength = 0;
245 231 }
... ... @@ -266,30 +252,12 @@
266 252 baddr = 0;
267 253 for(row=0;row < session->rows;row++)
268 254 {
269   - int cr = 0;
270   - int len = 0;
271 255 int col;
272 256  
273   -#ifdef DEBUG
274   - {
275   - char buffer[4096];
276   - snprintf(buffer,4095,"\n<!-- R%02d/%02d --->\t",row,session->rows);
277   - append_string(&info,buffer);
278   - }
279   -#endif // DEBUG
280   -
281 257 for(col = 0; col < session->cols;col++)
282 258 {
283   - if( session->text[baddr+col].chr != ' ' || (session->text[baddr+col].attr & LIB3270_ATTR_CG))
284   - len = col;
285   - }
286   -
287   - for(col = 0; col <= len || (col < session->cols && info.mode != HTML_MODE_TEXT);col++)
288   - {
289 259 if((option & LIB3270_HTML_OPTION_ALL) || (session->text[baddr+col].attr & LIB3270_ATTR_SELECTED))
290 260 {
291   - cr++;
292   -
293 261 if((session->text[baddr+col].attr & LIB3270_ATTR_MARKER) && (option & LIB3270_HTML_OPTION_FORM) )
294 262 {
295 263 int fa = (session->ea_buf[baddr+col].fa & FA_MASK);
... ... @@ -303,12 +271,10 @@
303 271 {
304 272 // Input field
305 273 unsigned char attr = get_field_attribute(session,baddr+col+1);
306   - //char * text = lib3270_get_field_at(session,baddr+col+1);
307   -
308 274 open_input(&info,baddr+col+1,FA_IS_ZERO(attr) ? HTML_MODE_INPUT_PASSWORD : HTML_MODE_INPUT_TEXT);
309 275  
310 276 }
311   - else if(col < len && session->text[baddr+col+1].chr == 'F')
  277 + else if(session->text[baddr+col+1].chr == 'F')
312 278 {
313 279 char *text = lib3270_get_field_at(session,baddr+col+1);
314 280  
... ... @@ -336,8 +302,7 @@
336 302 append_string(&info,"\" />");
337 303 info.mode = HTML_MODE_INPUT_BUTTON;
338 304 info.maxlength = 0;
339   - info.input = info.text+strlen(info.text);
340   -
  305 + info.block = strlen(info.text);
341 306 }
342 307 }
343 308 lib3270_free(text);
... ... @@ -414,17 +379,16 @@
414 379 enum HTML_MODE mode = info.mode;
415 380  
416 381 close_input(&info);
417   -
418   - if(cr)
419   - append_element(&info,HTML_ELEMENT_LINE_BREAK);
420   -
  382 + append_element(&info,HTML_ELEMENT_LINE_BREAK);
421 383 open_input(&info,baddr,mode);
422 384  
423 385 }
424   - else if(cr)
  386 + else
425 387 {
426 388 append_element(&info,HTML_ELEMENT_LINE_BREAK);
427   -
  389 +#if defined(DEBUG) || defined(ANDROID)
  390 + append_string(&info,"\n");
  391 +#endif // DEBUG
428 392 }
429 393  
430 394 }
... ... @@ -441,8 +405,8 @@
441 405  
442 406 if(info.form)
443 407 {
444   - static const char * prefix = "<form name=\"" PACKAGE_NAME "\" id=\"form3270\" >";
445   - static const char * suffix = "</form>";
  408 + static const char * prefix = "<form name=\"" PACKAGE_NAME "\" id=\"form3270\" >\n";
  409 + static const char * suffix = "</form>\n";
446 410 char *text = info.text;
447 411  
448 412 info.text = lib3270_malloc(strlen(prefix)+strlen(suffix)+strlen(text)+4);
... ... @@ -454,7 +418,24 @@
454 418 lib3270_free(text);
455 419 }
456 420  
457   - return lib3270_realloc(info.text,strlen(info.text)+2);
  421 + info.text = lib3270_realloc(info.text,strlen(info.text)+2);
  422 +
  423 +#if defined(DEBUG) || defined(ANDROID)
  424 + {
  425 + char *text = strdup(info.text);
  426 + char *save;
  427 + char *ptr;
  428 +
  429 + for(ptr=strtok_r(text,"\n",&save);ptr;ptr = strtok_r(NULL,"\n",&save))
  430 + {
  431 + trace("%s",ptr);
  432 + }
  433 +
  434 + free(text);
  435 + }
  436 +#endif // DEBUG
  437 +
  438 + return info.text;
458 439 }
459 440  
460 441  
... ...