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,6 +7,7 @@ import android.os.Bundle;
7 // import android.widget.EditText; 7 // import android.widget.EditText;
8 import android.util.Log; 8 import android.util.Log;
9 // import android.view.View; 9 // import android.view.View;
  10 +import android.content.SharedPreferences;
10 import android.content.res.*; 11 import android.content.res.*;
11 import android.app.AlertDialog; 12 import android.app.AlertDialog;
12 import android.webkit.WebView; 13 import android.webkit.WebView;
@@ -31,6 +32,15 @@ public class PW3270Activity extends Activity @@ -31,6 +32,15 @@ public class PW3270Activity extends Activity
31 32
32 terminal() 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 protected void updateProgramMessage(int id) 46 protected void updateProgramMessage(int id)
android/src/br/com/bb/pw3270/lib3270.java
@@ -24,9 +24,9 @@ public class lib3270 @@ -24,9 +24,9 @@ public class lib3270
24 DataOutputStream outData = null; 24 DataOutputStream outData = null;
25 DataInputStream inData = null; 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 static 31 static
32 { 32 {
@@ -36,9 +36,6 @@ public class lib3270 @@ -36,9 +36,6 @@ public class lib3270
36 36
37 lib3270() 37 lib3270()
38 { 38 {
39 - setToggle("dstrace",true);  
40 - setToggle("screentrace",true);  
41 - setToggle("eventtrace",true);  
42 changed = false; 39 changed = false;
43 mainloop = null; 40 mainloop = null;
44 } 41 }
@@ -150,6 +147,10 @@ public class lib3270 @@ -150,6 +147,10 @@ public class lib3270
150 { 147 {
151 // Connecta no host 148 // Connecta no host
152 SocketFactory socketFactory; 149 SocketFactory socketFactory;
  150 +
  151 + if(hostname == "")
  152 + return false;
  153 +
153 if(ssl) 154 if(ssl)
154 { 155 {
155 // Host é SSL 156 // Host é SSL
src/lib3270/html.c
@@ -110,8 +110,7 @@ @@ -110,8 +110,7 @@
110 } mode; 110 } mode;
111 111
112 char * text; 112 char * text;
113 - char * input;  
114 - char * block; 113 + int block;
115 int maxlength; 114 int maxlength;
116 unsigned short fg; 115 unsigned short fg;
117 unsigned short bg; 116 unsigned short bg;
@@ -189,11 +188,7 @@ @@ -189,11 +188,7 @@
189 188
190 snprintf(name,29,"F%04d",addr); 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 append_string(info,"<input type=\""); 193 append_string(info,"<input type=\"");
199 append_string(info,mode == HTML_MODE_INPUT_TEXT ? "text" : "password" ); 194 append_string(info,mode == HTML_MODE_INPUT_TEXT ? "text" : "password" );
@@ -202,44 +197,35 @@ @@ -202,44 +197,35 @@
202 append_string(info,"\" value=\""); 197 append_string(info,"\" value=\"");
203 info->mode = mode; 198 info->mode = mode;
204 info->maxlength = 0; 199 info->maxlength = 0;
205 - info->input = info->text+strlen(info->text);  
206 200
207 } 201 }
208 202
209 static void close_input(struct html_info *info) 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 if(info->mode == HTML_MODE_TEXT) 208 if(info->mode == HTML_MODE_TEXT)
216 return; 209 return;
217 210
  211 + trace("maxlength=%d",info->maxlength);
  212 +
218 if(info->maxlength < 1) 213 if(info->maxlength < 1)
219 { 214 {
220 - *info->block = 0; 215 + info->text[info->block] = 0;
221 info->mode = HTML_MODE_TEXT; 216 info->mode = HTML_MODE_TEXT;
222 info->maxlength = 0; 217 info->maxlength = 0;
223 return; 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 snprintf(buffer,80,"\" maxlength=\"%d\" class=\"IW%03d\"",info->maxlength,info->maxlength); 224 snprintf(buffer,80,"\" maxlength=\"%d\" class=\"IW%03d\"",info->maxlength,info->maxlength);
234 append_string(info,buffer); 225 append_string(info,buffer);
235 226
236 append_string(info,"></input>"); 227 append_string(info,"></input>");
237 228
238 -#ifdef DEBUG  
239 - append_string(info,"\n");  
240 -#endif // DEBUG  
241 -  
242 -  
243 info->mode = HTML_MODE_TEXT; 229 info->mode = HTML_MODE_TEXT;
244 info->maxlength = 0; 230 info->maxlength = 0;
245 } 231 }
@@ -266,30 +252,12 @@ @@ -266,30 +252,12 @@
266 baddr = 0; 252 baddr = 0;
267 for(row=0;row < session->rows;row++) 253 for(row=0;row < session->rows;row++)
268 { 254 {
269 - int cr = 0;  
270 - int len = 0;  
271 int col; 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 for(col = 0; col < session->cols;col++) 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 if((option & LIB3270_HTML_OPTION_ALL) || (session->text[baddr+col].attr & LIB3270_ATTR_SELECTED)) 259 if((option & LIB3270_HTML_OPTION_ALL) || (session->text[baddr+col].attr & LIB3270_ATTR_SELECTED))
290 { 260 {
291 - cr++;  
292 -  
293 if((session->text[baddr+col].attr & LIB3270_ATTR_MARKER) && (option & LIB3270_HTML_OPTION_FORM) ) 261 if((session->text[baddr+col].attr & LIB3270_ATTR_MARKER) && (option & LIB3270_HTML_OPTION_FORM) )
294 { 262 {
295 int fa = (session->ea_buf[baddr+col].fa & FA_MASK); 263 int fa = (session->ea_buf[baddr+col].fa & FA_MASK);
@@ -303,12 +271,10 @@ @@ -303,12 +271,10 @@
303 { 271 {
304 // Input field 272 // Input field
305 unsigned char attr = get_field_attribute(session,baddr+col+1); 273 unsigned char attr = get_field_attribute(session,baddr+col+1);
306 - //char * text = lib3270_get_field_at(session,baddr+col+1);  
307 -  
308 open_input(&info,baddr+col+1,FA_IS_ZERO(attr) ? HTML_MODE_INPUT_PASSWORD : HTML_MODE_INPUT_TEXT); 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 char *text = lib3270_get_field_at(session,baddr+col+1); 279 char *text = lib3270_get_field_at(session,baddr+col+1);
314 280
@@ -336,8 +302,7 @@ @@ -336,8 +302,7 @@
336 append_string(&info,"\" />"); 302 append_string(&info,"\" />");
337 info.mode = HTML_MODE_INPUT_BUTTON; 303 info.mode = HTML_MODE_INPUT_BUTTON;
338 info.maxlength = 0; 304 info.maxlength = 0;
339 - info.input = info.text+strlen(info.text);  
340 - 305 + info.block = strlen(info.text);
341 } 306 }
342 } 307 }
343 lib3270_free(text); 308 lib3270_free(text);
@@ -414,17 +379,16 @@ @@ -414,17 +379,16 @@
414 enum HTML_MODE mode = info.mode; 379 enum HTML_MODE mode = info.mode;
415 380
416 close_input(&info); 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 open_input(&info,baddr,mode); 383 open_input(&info,baddr,mode);
422 384
423 } 385 }
424 - else if(cr) 386 + else
425 { 387 {
426 append_element(&info,HTML_ELEMENT_LINE_BREAK); 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,8 +405,8 @@
441 405
442 if(info.form) 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 char *text = info.text; 410 char *text = info.text;
447 411
448 info.text = lib3270_malloc(strlen(prefix)+strlen(suffix)+strlen(text)+4); 412 info.text = lib3270_malloc(strlen(prefix)+strlen(suffix)+strlen(text)+4);
@@ -454,7 +418,24 @@ @@ -454,7 +418,24 @@
454 lib3270_free(text); 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