Commit bfcf4caaee030acb1aac0a8e7822f2d33b34c069
1 parent
499a94ca
Exists in
master
and in
3 other branches
Ajustando transferência de arquivos para funcionar em multi-sessão
Showing
4 changed files
with
306 additions
and
264 deletions
Show diff stats
| @@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
| 18 | * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | 18 | * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin |
| 19 | * St, Fifth Floor, Boston, MA 02110-1301 USA | 19 | * St, Fifth Floor, Boston, MA 02110-1301 USA |
| 20 | * | 20 | * |
| 21 | - * Este programa está nomeado como ft.c e possui 2143 linhas de código. | 21 | + * Este programa está nomeado como ft.c e possui - linhas de código. |
| 22 | * | 22 | * |
| 23 | * Contatos: | 23 | * Contatos: |
| 24 | * | 24 | * |
| @@ -26,7 +26,6 @@ | @@ -26,7 +26,6 @@ | ||
| 26 | * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | 26 | * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) |
| 27 | * licinio@bb.com.br (Licínio Luis Branco) | 27 | * licinio@bb.com.br (Licínio Luis Branco) |
| 28 | * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | 28 | * kraucer@bb.com.br (Kraucer Fernandes Mazuco) |
| 29 | - * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda) | ||
| 30 | * | 29 | * |
| 31 | */ | 30 | */ |
| 32 | 31 | ||
| @@ -79,16 +78,16 @@ static void ft_in3270(H3270 *session, int ignored unused, void *unused); | @@ -79,16 +78,16 @@ static void ft_in3270(H3270 *session, int ignored unused, void *unused); | ||
| 79 | #define BN (Boolean *)NULL | 78 | #define BN (Boolean *)NULL |
| 80 | 79 | ||
| 81 | // Globals. | 80 | // Globals. |
| 82 | -H3270FT *ftsession = NULL; | 81 | +// H3270FT *ftsession = NULL; |
| 83 | 82 | ||
| 84 | // enum ft_state ft_state = FT_NONE; // File transfer state | 83 | // enum ft_state ft_state = FT_NONE; // File transfer state |
| 85 | // char *ft_local_filename; // Local file to transfer to/from | 84 | // char *ft_local_filename; // Local file to transfer to/from |
| 86 | -Boolean ft_last_cr = False; // CR was last char in local file | ||
| 87 | -Boolean ascii_flag = True; // Convert to ascii | ||
| 88 | -Boolean cr_flag = True; // Add crlf to each line | ||
| 89 | -Boolean remap_flag = True; // Remap ASCII<->EBCDIC | ||
| 90 | -unsigned long ft_length = 0; // Length of transfer | ||
| 91 | -static Boolean ft_is_cut; // File transfer is CUT-style | 85 | +// Boolean ft_last_cr = 0; // CR was last char in local file |
| 86 | +// Boolean ascii_flag = True; // Convert to ascii | ||
| 87 | +// Boolean cr_flag = True; // Add crlf to each line | ||
| 88 | +// Boolean remap_flag = True; // Remap ASCII<->EBCDIC | ||
| 89 | +// unsigned long ft_length = 0; // Length of transfer | ||
| 90 | +// static Boolean ft_is_cut; // File transfer is CUT-style | ||
| 92 | 91 | ||
| 93 | // static struct timeval starting_time; // Starting time | 92 | // static struct timeval starting_time; // Starting time |
| 94 | 93 | ||
| @@ -101,13 +100,19 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -101,13 +100,19 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
| 101 | 100 | ||
| 102 | /*---[ Implement ]-------------------------------------------------------------------------------------------------------*/ | 101 | /*---[ Implement ]-------------------------------------------------------------------------------------------------------*/ |
| 103 | 102 | ||
| 104 | - static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state) | 103 | + H3270FT * get_ft_handle(H3270 *hSession) |
| 105 | { | 104 | { |
| 106 | - CHECK_FT_HANDLE(session); | 105 | + if(!hSession->ft) |
| 106 | + { | ||
| 107 | + popup_an_error(hSession,"Unexpected call to %s: No active filetransfer",__FUNCTION__); | ||
| 108 | + } | ||
| 109 | + return hSession->ft; | ||
| 110 | + } | ||
| 107 | 111 | ||
| 112 | + static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state) | ||
| 113 | + { | ||
| 108 | if(session->state == state) | 114 | if(session->state == state) |
| 109 | return; | 115 | return; |
| 110 | - | ||
| 111 | session->state = state; | 116 | session->state = state; |
| 112 | session->state_changed(session,state); | 117 | session->state_changed(session,state); |
| 113 | 118 | ||
| @@ -126,10 +131,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -126,10 +131,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
| 126 | 131 | ||
| 127 | CHECK_SESSION_HANDLE(hSession); | 132 | CHECK_SESSION_HANDLE(hSession); |
| 128 | 133 | ||
| 129 | - ft = (H3270FT *) hSession->ft; | ||
| 130 | - if(!ft) | ||
| 131 | - return EINVAL; | ||
| 132 | - | 134 | + ft = get_ft_handle(hSession); |
| 133 | 135 | ||
| 134 | if (ft->state == LIB3270_FT_STATE_RUNNING) | 136 | if (ft->state == LIB3270_FT_STATE_RUNNING) |
| 135 | { | 137 | { |
| @@ -180,7 +182,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -180,7 +182,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
| 180 | 182 | ||
| 181 | LIB3270_EXPORT H3270FT * lib3270_ft_new(H3270 *session, LIB3270_FT_OPTION flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft, const char **msg) | 183 | LIB3270_EXPORT H3270FT * lib3270_ft_new(H3270 *session, LIB3270_FT_OPTION flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft, const char **msg) |
| 182 | { | 184 | { |
| 183 | - H3270FT * ftHandle = NULL; | 185 | + H3270FT * ftHandle = (H3270FT *) session->ft; |
| 184 | FILE * ft_local_file = NULL; | 186 | FILE * ft_local_file = NULL; |
| 185 | // unsigned long length = 0L; | 187 | // unsigned long length = 0L; |
| 186 | 188 | ||
| @@ -192,19 +194,21 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -192,19 +194,21 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
| 192 | return NULL; | 194 | return NULL; |
| 193 | } | 195 | } |
| 194 | 196 | ||
| 195 | - if(session->ft) | 197 | + if(ftHandle) |
| 196 | { | 198 | { |
| 197 | *msg = N_( "File transfer is already active in this session" ); | 199 | *msg = N_( "File transfer is already active in this session" ); |
| 198 | errno = EBUSY; | 200 | errno = EBUSY; |
| 199 | return NULL; | 201 | return NULL; |
| 200 | } | 202 | } |
| 201 | 203 | ||
| 204 | +/* | ||
| 202 | if(ftsession) | 205 | if(ftsession) |
| 203 | { | 206 | { |
| 204 | *msg = N_( "File transfer is already active" ); | 207 | *msg = N_( "File transfer is already active" ); |
| 205 | errno = EBUSY; | 208 | errno = EBUSY; |
| 206 | return NULL; | 209 | return NULL; |
| 207 | } | 210 | } |
| 211 | +*/ | ||
| 208 | 212 | ||
| 209 | // Check remote file | 213 | // Check remote file |
| 210 | if(!*remote) | 214 | if(!*remote) |
| @@ -227,14 +231,17 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -227,14 +231,17 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
| 227 | session->dft_buffersize = dft; | 231 | session->dft_buffersize = dft; |
| 228 | set_dft_buffersize(session); | 232 | set_dft_buffersize(session); |
| 229 | 233 | ||
| 230 | - // Initialize ft control structure. | ||
| 231 | - ft_last_cr = False; | ||
| 232 | - ft_is_cut = False; | ||
| 233 | - | 234 | + // Create & Initialize ft control structure. |
| 234 | ftHandle = lib3270_malloc(sizeof(H3270FT)+strlen(local)+strlen(remote)+3); | 235 | ftHandle = lib3270_malloc(sizeof(H3270FT)+strlen(local)+strlen(remote)+3); |
| 235 | 236 | ||
| 236 | ftHandle->sz = sizeof(H3270FT); | 237 | ftHandle->sz = sizeof(H3270FT); |
| 237 | ftHandle->host = session; | 238 | ftHandle->host = session; |
| 239 | + | ||
| 240 | + ftHandle->ft_last_cr = 0; | ||
| 241 | + ftHandle->remap_flag = 1; // Remap ASCII<->EBCDIC | ||
| 242 | + ftHandle->cr_flag = 1; | ||
| 243 | + ftHandle->ascii_flag = 1; | ||
| 244 | + ftHandle->ft_is_cut = 0; | ||
| 238 | ftHandle->flags = flags; | 245 | ftHandle->flags = flags; |
| 239 | ftHandle->local_file = ft_local_file; | 246 | ftHandle->local_file = ft_local_file; |
| 240 | ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK; | 247 | ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK; |
| @@ -249,6 +256,8 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -249,6 +256,8 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
| 249 | ftHandle->primspace = primspace; | 256 | ftHandle->primspace = primspace; |
| 250 | ftHandle->secspace = secspace; | 257 | ftHandle->secspace = secspace; |
| 251 | ftHandle->dft = dft; | 258 | ftHandle->dft = dft; |
| 259 | + ftHandle->quadrant = -1; | ||
| 260 | + | ||
| 252 | 261 | ||
| 253 | ftHandle->local = (char *) (ftHandle+1); | 262 | ftHandle->local = (char *) (ftHandle+1); |
| 254 | strcpy((char *) ftHandle->local,local); | 263 | strcpy((char *) ftHandle->local,local); |
| @@ -258,7 +267,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -258,7 +267,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
| 258 | 267 | ||
| 259 | session->ft = ftHandle; | 268 | session->ft = ftHandle; |
| 260 | 269 | ||
| 261 | - return ftsession = ftHandle; | 270 | + return ftHandle; |
| 262 | } | 271 | } |
| 263 | 272 | ||
| 264 | LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession) | 273 | LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession) |
| @@ -275,15 +284,15 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -275,15 +284,15 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
| 275 | 284 | ||
| 276 | CHECK_SESSION_HANDLE(hSession); | 285 | CHECK_SESSION_HANDLE(hSession); |
| 277 | 286 | ||
| 278 | - ft = (H3270FT *) hSession->ft; | 287 | + ft = get_ft_handle(hSession); |
| 279 | if(!ft) | 288 | if(!ft) |
| 280 | return EINVAL; | 289 | return EINVAL; |
| 281 | 290 | ||
| 282 | recfm = (ft->flags & FT_RECORD_FORMAT_MASK) >> 8; | 291 | recfm = (ft->flags & FT_RECORD_FORMAT_MASK) >> 8; |
| 283 | units = (ft->flags & FT_ALLOCATION_UNITS_MASK) >> 12; | 292 | units = (ft->flags & FT_ALLOCATION_UNITS_MASK) >> 12; |
| 284 | - ascii_flag = ((ft->flags & LIB3270_FT_OPTION_ASCII) != 0); | ||
| 285 | - cr_flag = ((ft->flags & LIB3270_FT_OPTION_CRLF) != 0); | ||
| 286 | - remap_flag = ((ft->flags & LIB3270_FT_OPTION_ASCII) != 0); | 293 | + ft->ascii_flag = ((ft->flags & LIB3270_FT_OPTION_ASCII) == 0) ? 1 : 0; |
| 294 | + ft->cr_flag = ((ft->flags & LIB3270_FT_OPTION_CRLF) == 0) ? 1 : 0; | ||
| 295 | + ft->remap_flag = ((ft->flags & LIB3270_FT_OPTION_ASCII) == 0) ? 1 : 0; | ||
| 287 | 296 | ||
| 288 | if(ft->flags & LIB3270_FT_OPTION_RECEIVE) | 297 | if(ft->flags & LIB3270_FT_OPTION_RECEIVE) |
| 289 | { | 298 | { |
| @@ -399,32 +408,30 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -399,32 +408,30 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
| 399 | * Pop up a message, end the transfer, release resources. | 408 | * Pop up a message, end the transfer, release resources. |
| 400 | * | 409 | * |
| 401 | */ | 410 | */ |
| 402 | -void ft_complete(H3270FT *session, const char *errmsg) | 411 | +void ft_complete(H3270FT *ft, const char *errmsg) |
| 403 | { | 412 | { |
| 404 | - double kbytes_sec = 0; | ||
| 405 | - struct timeval t1; | ||
| 406 | - | ||
| 407 | - CHECK_FT_HANDLE(session); | 413 | + double kbytes_sec = 0; |
| 414 | + struct timeval t1; | ||
| 408 | 415 | ||
| 409 | (void) gettimeofday(&t1, (struct timezone *)NULL); | 416 | (void) gettimeofday(&t1, (struct timezone *)NULL); |
| 410 | - kbytes_sec = (double)ft_length / 1024.0 / | ||
| 411 | - ((double)(t1.tv_sec - session->starting_time.tv_sec) + | ||
| 412 | - (double)(t1.tv_usec - session->starting_time.tv_usec) / 1.0e6); | 417 | + kbytes_sec = (double) ft->ft_length / 1024.0 / |
| 418 | + ((double)(t1.tv_sec - ft->starting_time.tv_sec) + | ||
| 419 | + (double)(t1.tv_usec - ft->starting_time.tv_usec) / 1.0e6); | ||
| 413 | 420 | ||
| 414 | // Close the local file. | 421 | // Close the local file. |
| 415 | - if(session->local_file) | 422 | + if(ft->local_file) |
| 416 | { | 423 | { |
| 417 | - fclose(session->local_file); | ||
| 418 | - session->local_file = NULL; | 424 | + fclose(ft->local_file); |
| 425 | + ft->local_file = NULL; | ||
| 419 | } | 426 | } |
| 420 | 427 | ||
| 421 | // Clean up the state. | 428 | // Clean up the state. |
| 422 | - set_ft_state(session,FT_NONE); | 429 | + set_ft_state(ft,FT_NONE); |
| 423 | 430 | ||
| 424 | - ft_update_length(session); | 431 | + ft_update_length(ft); |
| 425 | 432 | ||
| 426 | - session->message(session,errmsg); | ||
| 427 | - session->complete(session,ft_length,kbytes_sec,ft_is_cut ? "CUT" : "DFT"); | 433 | + ft->message(ft,errmsg); |
| 434 | + ft->complete(ft,ft->ft_length,kbytes_sec,ft->ft_is_cut ? "CUT" : "DFT"); | ||
| 428 | 435 | ||
| 429 | } | 436 | } |
| 430 | 437 | ||
| @@ -447,12 +454,12 @@ LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession) | @@ -447,12 +454,12 @@ LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession) | ||
| 447 | session->local_file = NULL; | 454 | session->local_file = NULL; |
| 448 | } | 455 | } |
| 449 | 456 | ||
| 450 | - if(session == ftsession) | ||
| 451 | - ftsession = NULL; | 457 | +// if(session == ftsession) |
| 458 | +// ftsession = NULL; | ||
| 452 | 459 | ||
| 453 | hSession->ft = NULL; | 460 | hSession->ft = NULL; |
| 454 | 461 | ||
| 455 | - free(session); | 462 | + lib3270_free(session); |
| 456 | 463 | ||
| 457 | return 0; | 464 | return 0; |
| 458 | } | 465 | } |
| @@ -462,46 +469,43 @@ void ft_update_length(H3270FT *session) | @@ -462,46 +469,43 @@ void ft_update_length(H3270FT *session) | ||
| 462 | { | 469 | { |
| 463 | double kbytes_sec = 0; | 470 | double kbytes_sec = 0; |
| 464 | 471 | ||
| 465 | - CHECK_FT_HANDLE(session); | ||
| 466 | - | ||
| 467 | - if(ft_length > 1024.0) | 472 | + if(session->ft_length > 1024.0) |
| 468 | { | 473 | { |
| 469 | struct timeval t1; | 474 | struct timeval t1; |
| 470 | 475 | ||
| 471 | (void) gettimeofday(&t1, (struct timezone *)NULL); | 476 | (void) gettimeofday(&t1, (struct timezone *)NULL); |
| 472 | - kbytes_sec = (double)ft_length / 1024.0 / | 477 | + kbytes_sec = (double)session->ft_length / 1024.0 / |
| 473 | ((double)(t1.tv_sec - session->starting_time.tv_sec) + | 478 | ((double)(t1.tv_sec - session->starting_time.tv_sec) + |
| 474 | (double)(t1.tv_usec - session->starting_time.tv_usec) / 1.0e6); | 479 | (double)(t1.tv_usec - session->starting_time.tv_usec) / 1.0e6); |
| 475 | } | 480 | } |
| 476 | 481 | ||
| 477 | - session->update(session,ft_length,session->length,kbytes_sec); | 482 | + session->update(session,session->ft_length,session->length,kbytes_sec); |
| 478 | 483 | ||
| 479 | } | 484 | } |
| 480 | 485 | ||
| 481 | -// Process a transfer acknowledgement. | ||
| 482 | -void ft_running(H3270FT *h, Boolean is_cut) | 486 | +/** |
| 487 | + * Process a transfer acknowledgement. | ||
| 488 | + * | ||
| 489 | + */ | ||
| 490 | +void ft_running(H3270FT *ft, Boolean is_cut) | ||
| 483 | { | 491 | { |
| 484 | - CHECK_FT_HANDLE(h); | ||
| 485 | - | ||
| 486 | - ft_is_cut = is_cut; | ||
| 487 | - ft_length = 0; | 492 | + ft->ft_is_cut = is_cut ? 1 : 0; |
| 493 | + ft->ft_length = 0; | ||
| 488 | 494 | ||
| 489 | - gettimeofday(&h->starting_time, (struct timezone *)NULL); | 495 | + gettimeofday(&ft->starting_time, (struct timezone *)NULL); |
| 490 | 496 | ||
| 491 | - if (h->state == FT_AWAIT_ACK) | ||
| 492 | - set_ft_state(h,FT_RUNNING); | 497 | + if (ft->state == FT_AWAIT_ACK) |
| 498 | + set_ft_state(ft,FT_RUNNING); | ||
| 493 | 499 | ||
| 494 | - h->running(h,is_cut); | 500 | + ft->running(ft,is_cut); |
| 495 | 501 | ||
| 496 | - ft_update_length(h); | 502 | + ft_update_length(ft); |
| 497 | 503 | ||
| 498 | } | 504 | } |
| 499 | 505 | ||
| 500 | // Process a protocol-generated abort. | 506 | // Process a protocol-generated abort. |
| 501 | void ft_aborting(H3270FT *h) | 507 | void ft_aborting(H3270FT *h) |
| 502 | { | 508 | { |
| 503 | - CHECK_FT_HANDLE(h); | ||
| 504 | - | ||
| 505 | if (h->state == FT_RUNNING || h->state == FT_ABORT_WAIT) | 509 | if (h->state == FT_RUNNING || h->state == FT_ABORT_WAIT) |
| 506 | set_ft_state(h,FT_ABORT_SENT); | 510 | set_ft_state(h,FT_ABORT_SENT); |
| 507 | 511 | ||
| @@ -513,14 +517,14 @@ void ft_aborting(H3270FT *h) | @@ -513,14 +517,14 @@ void ft_aborting(H3270FT *h) | ||
| 513 | static void ft_connected(H3270 *session, int ignored, void *dunno) | 517 | static void ft_connected(H3270 *session, int ignored, void *dunno) |
| 514 | { | 518 | { |
| 515 | if (!CONNECTED && lib3270_get_ft_state(session) != LIB3270_FT_STATE_NONE) | 519 | if (!CONNECTED && lib3270_get_ft_state(session) != LIB3270_FT_STATE_NONE) |
| 516 | - ft_complete(session->ft,_("Host disconnected, transfer cancelled")); | 520 | + ft_complete(get_ft_handle(session),_("Host disconnected, transfer cancelled")); |
| 517 | } | 521 | } |
| 518 | 522 | ||
| 519 | /* Process an abort from no longer being in 3270 mode. */ | 523 | /* Process an abort from no longer being in 3270 mode. */ |
| 520 | static void ft_in3270(H3270 *session, int ignored, void *dunno) | 524 | static void ft_in3270(H3270 *session, int ignored, void *dunno) |
| 521 | { | 525 | { |
| 522 | if (!IN_3270 && lib3270_get_ft_state(session) != LIB3270_FT_STATE_NONE) | 526 | if (!IN_3270 && lib3270_get_ft_state(session) != LIB3270_FT_STATE_NONE) |
| 523 | - ft_complete(session->ft,_("Not in 3270 mode, transfer cancelled")); | 527 | + ft_complete(get_ft_handle(session),_("Not in 3270 mode, transfer cancelled")); |
| 524 | } | 528 | } |
| 525 | 529 | ||
| 526 | LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session) | 530 | LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session) |
ft_cut.c
| @@ -58,9 +58,9 @@ | @@ -58,9 +58,9 @@ | ||
| 58 | 58 | ||
| 59 | /* Data stream conversion tables. */ | 59 | /* Data stream conversion tables. */ |
| 60 | 60 | ||
| 61 | -#define NQ 4 /* number of quadrants */ | ||
| 62 | -#define NE 77 /* number of elements per quadrant */ | ||
| 63 | -#define OTHER_2 2 /* "OTHER 2" quadrant (includes NULL) */ | 61 | +#define NQ 4 /* number of quadrants */ |
| 62 | +#define NE 77 /* number of elements per quadrant */ | ||
| 63 | +#define OTHER_2 2 /* "OTHER 2" quadrant (includes NULL) */ | ||
| 64 | #define XLATE_NULL 0xc1 /* translation of NULL */ | 64 | #define XLATE_NULL 0xc1 /* translation of NULL */ |
| 65 | 65 | ||
| 66 | static const char alphas[NE + 1] = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%&_()<+,-./:>?"; | 66 | static const char alphas[NE + 1] = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%&_()<+,-./:>?"; |
| @@ -109,14 +109,14 @@ static const struct | @@ -109,14 +109,14 @@ static const struct | ||
| 109 | }; | 109 | }; |
| 110 | static const char table6[] = "abcdefghijklmnopqrstuvwxyz&-.,:+ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"; | 110 | static const char table6[] = "abcdefghijklmnopqrstuvwxyz&-.,:+ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"; |
| 111 | 111 | ||
| 112 | -static int quadrant = -1; | ||
| 113 | -static unsigned long expanded_length; | ||
| 114 | -static char *saved_errmsg = CN; | 112 | +// static int quadrant = -1; |
| 113 | +// static unsigned long expanded_length; | ||
| 114 | +// static char *saved_errmsg = CN; | ||
| 115 | 115 | ||
| 116 | -#define XLATE_NBUF 4 | ||
| 117 | -static int xlate_buffered = 0; /* buffer count */ | ||
| 118 | -static int xlate_buf_ix = 0; /* buffer index */ | ||
| 119 | -static unsigned char xlate_buf[XLATE_NBUF]; /* buffer */ | 116 | +#define XLATE_NBUF LIB3270_XLATE_NBUF |
| 117 | +// static int xlate_buffered = 0; /* buffer count */ | ||
| 118 | +// static int xlate_buf_ix = 0; /* buffer index */ | ||
| 119 | +// static unsigned char xlate_buf[XLATE_NBUF]; /* buffer */ | ||
| 120 | 120 | ||
| 121 | static void cut_control_code(H3270 *hSession); | 121 | static void cut_control_code(H3270 *hSession); |
| 122 | static void cut_data_request(H3270 *hSession); | 122 | static void cut_data_request(H3270 *hSession); |
| @@ -127,7 +127,7 @@ static void cut_ack(H3270 *hSession); | @@ -127,7 +127,7 @@ static void cut_ack(H3270 *hSession); | ||
| 127 | static void cut_abort(H3270 *hSession, unsigned short code, const char *fmt, ...) printflike(3,4); | 127 | static void cut_abort(H3270 *hSession, unsigned short code, const char *fmt, ...) printflike(3,4); |
| 128 | 128 | ||
| 129 | static unsigned from6(unsigned char c); | 129 | static unsigned from6(unsigned char c); |
| 130 | -static int xlate_getc(void); | 130 | +static int xlate_getc(H3270FT *ft); |
| 131 | 131 | ||
| 132 | /** | 132 | /** |
| 133 | * Convert a buffer for uploading (host->local). Overwrites the buffer. | 133 | * Convert a buffer for uploading (host->local). Overwrites the buffer. |
| @@ -138,8 +138,9 @@ static int xlate_getc(void); | @@ -138,8 +138,9 @@ static int xlate_getc(void); | ||
| 138 | */ | 138 | */ |
| 139 | static int upload_convert(H3270 *hSession, unsigned char *buf, int len) | 139 | static int upload_convert(H3270 *hSession, unsigned char *buf, int len) |
| 140 | { | 140 | { |
| 141 | - unsigned char *ob0 = buf; | ||
| 142 | - unsigned char *ob = ob0; | 141 | + unsigned char * ob0 = buf; |
| 142 | + unsigned char * ob = ob0; | ||
| 143 | + H3270FT * ft = get_ft_handle(hSession); | ||
| 143 | 144 | ||
| 144 | while (len--) | 145 | while (len--) |
| 145 | { | 146 | { |
| @@ -149,15 +150,15 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) | @@ -149,15 +150,15 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) | ||
| 149 | // int oq = -1; | 150 | // int oq = -1; |
| 150 | 151 | ||
| 151 | retry: | 152 | retry: |
| 152 | - if (quadrant < 0) | 153 | + if (ft->quadrant < 0) |
| 153 | { | 154 | { |
| 154 | /* Find the quadrant. */ | 155 | /* Find the quadrant. */ |
| 155 | - for (quadrant = 0; quadrant < NQ; quadrant++) | 156 | + for (ft->quadrant = 0; ft->quadrant < NQ; ft->quadrant++) |
| 156 | { | 157 | { |
| 157 | - if (c == conv[quadrant].selector) | 158 | + if (c == conv[ft->quadrant].selector) |
| 158 | break; | 159 | break; |
| 159 | } | 160 | } |
| 160 | - if (quadrant >= NQ) | 161 | + if (ft->quadrant >= NQ) |
| 161 | { | 162 | { |
| 162 | cut_abort(hSession,SC_ABORT_XMIT, "%s", _("Data conversion error")); | 163 | cut_abort(hSession,SC_ABORT_XMIT, "%s", _("Data conversion error")); |
| 163 | return -1; | 164 | return -1; |
| @@ -178,7 +179,7 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) | @@ -178,7 +179,7 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) | ||
| 178 | { | 179 | { |
| 179 | /* Try a different quadrant. */ | 180 | /* Try a different quadrant. */ |
| 180 | // oq = quadrant; | 181 | // oq = quadrant; |
| 181 | - quadrant = -1; | 182 | + ft->quadrant = -1; |
| 182 | goto retry; | 183 | goto retry; |
| 183 | } | 184 | } |
| 184 | ix = ixp - alphas; | 185 | ix = ixp - alphas; |
| @@ -187,19 +188,19 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) | @@ -187,19 +188,19 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) | ||
| 187 | * See if it's mapped by that quadrant, handling NULLs | 188 | * See if it's mapped by that quadrant, handling NULLs |
| 188 | * specially. | 189 | * specially. |
| 189 | */ | 190 | */ |
| 190 | - if (quadrant != OTHER_2 && c != XLATE_NULL && !conv[quadrant].xlate[ix]) | 191 | + if (ft->quadrant != OTHER_2 && c != XLATE_NULL && !conv[ft->quadrant].xlate[ix]) |
| 191 | { | 192 | { |
| 192 | /* Try a different quadrant. */ | 193 | /* Try a different quadrant. */ |
| 193 | // oq = quadrant; | 194 | // oq = quadrant; |
| 194 | - quadrant = -1; | 195 | + ft->quadrant = -1; |
| 195 | goto retry; | 196 | goto retry; |
| 196 | } | 197 | } |
| 197 | 198 | ||
| 198 | /* Map it. */ | 199 | /* Map it. */ |
| 199 | - c = conv[quadrant].xlate[ix]; | ||
| 200 | - if (ascii_flag && cr_flag && (c == '\r' || c == 0x1a)) | 200 | + c = conv[ft->quadrant].xlate[ix]; |
| 201 | + if (ft->ascii_flag && ft->cr_flag && (c == '\r' || c == 0x1a)) | ||
| 201 | continue; | 202 | continue; |
| 202 | - if (ascii_flag && remap_flag) | 203 | + if (ft->ascii_flag && ft->remap_flag) |
| 203 | c = ft2asc[c]; | 204 | c = ft2asc[c]; |
| 204 | *ob++ = c; | 205 | *ob++ = c; |
| 205 | } | 206 | } |
| @@ -207,60 +208,68 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) | @@ -207,60 +208,68 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) | ||
| 207 | return ob - ob0; | 208 | return ob - ob0; |
| 208 | } | 209 | } |
| 209 | 210 | ||
| 210 | -/* Convert a buffer for downloading (local->host). */ | ||
| 211 | -static int | ||
| 212 | -download_convert(unsigned const char *buf, unsigned len, unsigned char *xobuf) | 211 | +/** |
| 212 | + * Convert a buffer for downloading (local->host). | ||
| 213 | + */ | ||
| 214 | +static int download_convert(unsigned const char *buf, unsigned len, unsigned char *xobuf) | ||
| 213 | { | 215 | { |
| 214 | - unsigned char *ob0 = xobuf; | ||
| 215 | - unsigned char *ob = ob0; | 216 | + H3270FT * ft = get_ft_handle(&h3270); |
| 217 | + unsigned char * ob0 = xobuf; | ||
| 218 | + unsigned char * ob = ob0; | ||
| 216 | 219 | ||
| 217 | - while (len--) { | 220 | + while (len--) |
| 221 | + { | ||
| 218 | unsigned char c = *buf++; | 222 | unsigned char c = *buf++; |
| 219 | unsigned char *ixp; | 223 | unsigned char *ixp; |
| 220 | unsigned ix; | 224 | unsigned ix; |
| 221 | int oq; | 225 | int oq; |
| 222 | 226 | ||
| 223 | /* Handle nulls separately. */ | 227 | /* Handle nulls separately. */ |
| 224 | - if (!c) { | ||
| 225 | - if (quadrant != OTHER_2) { | ||
| 226 | - quadrant = OTHER_2; | ||
| 227 | - *ob++ = conv[quadrant].selector; | 228 | + if (!c) |
| 229 | + { | ||
| 230 | + if (ft->quadrant != OTHER_2) | ||
| 231 | + { | ||
| 232 | + ft->quadrant = OTHER_2; | ||
| 233 | + *ob++ = conv[ft->quadrant].selector; | ||
| 228 | } | 234 | } |
| 229 | *ob++ = XLATE_NULL; | 235 | *ob++ = XLATE_NULL; |
| 230 | continue; | 236 | continue; |
| 231 | } | 237 | } |
| 232 | 238 | ||
| 233 | /* Translate. */ | 239 | /* Translate. */ |
| 234 | - if (ascii_flag && remap_flag) | 240 | + if (ft->ascii_flag && ft->remap_flag) |
| 235 | c = asc2ft[c]; | 241 | c = asc2ft[c]; |
| 236 | 242 | ||
| 237 | /* Quadrant already defined. */ | 243 | /* Quadrant already defined. */ |
| 238 | - if (quadrant >= 0) { | ||
| 239 | - ixp = (unsigned char *)memchr(conv[quadrant].xlate, c, | ||
| 240 | - NE); | ||
| 241 | - if (ixp != (unsigned char *)NULL) { | ||
| 242 | - ix = ixp - conv[quadrant].xlate; | 244 | + if (ft->quadrant >= 0) { |
| 245 | + ixp = (unsigned char *)memchr(conv[ft->quadrant].xlate, c, NE); | ||
| 246 | + if (ixp != (unsigned char *)NULL) | ||
| 247 | + { | ||
| 248 | + ix = ixp - conv[ft->quadrant].xlate; | ||
| 243 | *ob++ = asc2ebc[(int)alphas[ix]]; | 249 | *ob++ = asc2ebc[(int)alphas[ix]]; |
| 244 | continue; | 250 | continue; |
| 245 | } | 251 | } |
| 246 | } | 252 | } |
| 247 | 253 | ||
| 248 | /* Locate a quadrant. */ | 254 | /* Locate a quadrant. */ |
| 249 | - oq = quadrant; | ||
| 250 | - for (quadrant = 0; quadrant < NQ; quadrant++) { | ||
| 251 | - if (quadrant == oq) | 255 | + oq = ft->quadrant; |
| 256 | + for (ft->quadrant = 0; ft->quadrant < NQ; ft->quadrant++) | ||
| 257 | + { | ||
| 258 | + if (ft->quadrant == oq) | ||
| 252 | continue; | 259 | continue; |
| 253 | - ixp = (unsigned char *)memchr(conv[quadrant].xlate, c, | ||
| 254 | - NE); | 260 | + |
| 261 | + ixp = (unsigned char *)memchr(conv[ft->quadrant].xlate, c, NE); | ||
| 262 | + | ||
| 255 | if (ixp == (unsigned char *)NULL) | 263 | if (ixp == (unsigned char *)NULL) |
| 256 | continue; | 264 | continue; |
| 257 | - ix = ixp - conv[quadrant].xlate; | ||
| 258 | - *ob++ = conv[quadrant].selector; | 265 | + ix = ixp - conv[ft->quadrant].xlate; |
| 266 | + *ob++ = conv[ft->quadrant].selector; | ||
| 259 | *ob++ = asc2ebc[(int)alphas[ix]]; | 267 | *ob++ = asc2ebc[(int)alphas[ix]]; |
| 260 | break; | 268 | break; |
| 261 | } | 269 | } |
| 262 | - if (quadrant >= NQ) { | ||
| 263 | - quadrant = -1; | 270 | + if (ft->quadrant >= NQ) |
| 271 | + { | ||
| 272 | + ft->quadrant = -1; | ||
| 264 | fprintf(stderr, "Oops\n"); | 273 | fprintf(stderr, "Oops\n"); |
| 265 | continue; | 274 | continue; |
| 266 | } | 275 | } |
| @@ -304,10 +313,11 @@ void ft_cut_data(H3270 *hSession) | @@ -304,10 +313,11 @@ void ft_cut_data(H3270 *hSession) | ||
| 304 | */ | 313 | */ |
| 305 | static void cut_control_code(H3270 *hSession) | 314 | static void cut_control_code(H3270 *hSession) |
| 306 | { | 315 | { |
| 307 | - unsigned short code; | ||
| 308 | - char *buf; | ||
| 309 | - char *bp; | ||
| 310 | - int i; | 316 | + H3270FT * ft = get_ft_handle(hSession); |
| 317 | + unsigned short code; | ||
| 318 | + char * buf; | ||
| 319 | + char * bp; | ||
| 320 | + int i; | ||
| 311 | 321 | ||
| 312 | trace_ds(hSession,"< FT CONTROL_CODE "); | 322 | trace_ds(hSession,"< FT CONTROL_CODE "); |
| 313 | code = (hSession->ea_buf[O_CC_STATUS_CODE].cc << 8) | hSession->ea_buf[O_CC_STATUS_CODE + 1].cc; | 323 | code = (hSession->ea_buf[O_CC_STATUS_CODE].cc << 8) | hSession->ea_buf[O_CC_STATUS_CODE + 1].cc; |
| @@ -317,18 +327,18 @@ static void cut_control_code(H3270 *hSession) | @@ -317,18 +327,18 @@ static void cut_control_code(H3270 *hSession) | ||
| 317 | case SC_HOST_ACK: | 327 | case SC_HOST_ACK: |
| 318 | trace_ds(hSession,"HOST_ACK\n"); | 328 | trace_ds(hSession,"HOST_ACK\n"); |
| 319 | hSession->cut_xfer_in_progress = 1; | 329 | hSession->cut_xfer_in_progress = 1; |
| 320 | - expanded_length = 0; | ||
| 321 | - quadrant = -1; | ||
| 322 | - xlate_buffered = 0; | 330 | + ft->expanded_length = 0; |
| 331 | + ft->quadrant = -1; | ||
| 332 | + ft->xlate_buffered = 0; | ||
| 323 | cut_ack(hSession); | 333 | cut_ack(hSession); |
| 324 | - ft_running(NULL,True); | 334 | + ft_running(hSession->ft,True); |
| 325 | break; | 335 | break; |
| 326 | 336 | ||
| 327 | case SC_XFER_COMPLETE: | 337 | case SC_XFER_COMPLETE: |
| 328 | trace_ds(hSession,"XFER_COMPLETE\n"); | 338 | trace_ds(hSession,"XFER_COMPLETE\n"); |
| 329 | cut_ack(hSession); | 339 | cut_ack(hSession); |
| 330 | hSession->cut_xfer_in_progress = 0; | 340 | hSession->cut_xfer_in_progress = 0; |
| 331 | - ft_complete(NULL,N_( "Complete" ) ); | 341 | + ft_complete(ft,N_( "Complete" ) ); |
| 332 | break; | 342 | break; |
| 333 | 343 | ||
| 334 | case SC_ABORT_FILE: | 344 | case SC_ABORT_FILE: |
| @@ -337,10 +347,10 @@ static void cut_control_code(H3270 *hSession) | @@ -337,10 +347,10 @@ static void cut_control_code(H3270 *hSession) | ||
| 337 | hSession->cut_xfer_in_progress = 0; | 347 | hSession->cut_xfer_in_progress = 0; |
| 338 | cut_ack(hSession); | 348 | cut_ack(hSession); |
| 339 | 349 | ||
| 340 | - if (lib3270_get_ft_state(hSession) == FT_ABORT_SENT && saved_errmsg != CN) | 350 | + if (lib3270_get_ft_state(hSession) == FT_ABORT_SENT && ft->saved_errmsg != CN) |
| 341 | { | 351 | { |
| 342 | - buf = saved_errmsg; | ||
| 343 | - saved_errmsg = CN; | 352 | + buf = ft->saved_errmsg; |
| 353 | + ft->saved_errmsg = CN; | ||
| 344 | } | 354 | } |
| 345 | else | 355 | else |
| 346 | { | 356 | { |
| @@ -363,7 +373,7 @@ static void cut_control_code(H3270 *hSession) | @@ -363,7 +373,7 @@ static void cut_control_code(H3270 *hSession) | ||
| 363 | if (!*buf) | 373 | if (!*buf) |
| 364 | strcpy(buf, N_( "Transfer cancelled by host" ) ); | 374 | strcpy(buf, N_( "Transfer cancelled by host" ) ); |
| 365 | } | 375 | } |
| 366 | - ft_complete(NULL,buf); | 376 | + ft_complete(hSession->ft,buf); |
| 367 | lib3270_free(buf); | 377 | lib3270_free(buf); |
| 368 | break; | 378 | break; |
| 369 | 379 | ||
| @@ -379,12 +389,13 @@ static void cut_control_code(H3270 *hSession) | @@ -379,12 +389,13 @@ static void cut_control_code(H3270 *hSession) | ||
| 379 | */ | 389 | */ |
| 380 | static void cut_data_request(H3270 *hSession) | 390 | static void cut_data_request(H3270 *hSession) |
| 381 | { | 391 | { |
| 382 | - unsigned char seq = hSession->ea_buf[O_DR_FRAME_SEQ].cc; | ||
| 383 | - int count; | ||
| 384 | - unsigned char cs; | ||
| 385 | - int c; | ||
| 386 | - int i; | ||
| 387 | - unsigned char attr; | 392 | + H3270FT * ft = get_ft_handle(hSession); |
| 393 | + unsigned char seq = hSession->ea_buf[O_DR_FRAME_SEQ].cc; | ||
| 394 | + int count; | ||
| 395 | + unsigned char cs; | ||
| 396 | + int c; | ||
| 397 | + int i; | ||
| 398 | + unsigned char attr; | ||
| 388 | 399 | ||
| 389 | trace_ds(hSession,"< FT DATA_REQUEST %u\n", from6(seq)); | 400 | trace_ds(hSession,"< FT DATA_REQUEST %u\n", from6(seq)); |
| 390 | if (lib3270_get_ft_state(hSession) == FT_ABORT_WAIT) | 401 | if (lib3270_get_ft_state(hSession) == FT_ABORT_WAIT) |
| @@ -393,15 +404,18 @@ static void cut_data_request(H3270 *hSession) | @@ -393,15 +404,18 @@ static void cut_data_request(H3270 *hSession) | ||
| 393 | return; | 404 | return; |
| 394 | } | 405 | } |
| 395 | 406 | ||
| 407 | + | ||
| 396 | /* Copy data into the screen buffer. */ | 408 | /* Copy data into the screen buffer. */ |
| 397 | count = 0; | 409 | count = 0; |
| 398 | - while (count < O_UP_MAX && (c = xlate_getc()) != EOF) { | 410 | + while (count < O_UP_MAX && (c = xlate_getc(hSession->ft)) != EOF) |
| 411 | + { | ||
| 399 | ctlr_add(hSession,O_UP_DATA + count, c, 0); | 412 | ctlr_add(hSession,O_UP_DATA + count, c, 0); |
| 400 | count++; | 413 | count++; |
| 401 | } | 414 | } |
| 402 | 415 | ||
| 403 | /* Check for errors. */ | 416 | /* Check for errors. */ |
| 404 | - if (ferror(((H3270FT *) hSession->ft)->local_file)) { | 417 | + if (ferror(((H3270FT *) hSession->ft)->local_file)) |
| 418 | + { | ||
| 405 | int j; | 419 | int j; |
| 406 | 420 | ||
| 407 | /* Clean out any data we may have written. */ | 421 | /* Clean out any data we may have written. */ |
| @@ -438,8 +452,8 @@ static void cut_data_request(H3270 *hSession) | @@ -438,8 +452,8 @@ static void cut_data_request(H3270 *hSession) | ||
| 438 | 452 | ||
| 439 | /* Send it up to the host. */ | 453 | /* Send it up to the host. */ |
| 440 | trace_ds(hSession,"> FT DATA %u\n", from6(seq)); | 454 | trace_ds(hSession,"> FT DATA %u\n", from6(seq)); |
| 441 | - ft_update_length(NULL); | ||
| 442 | - expanded_length += count; | 455 | + ft_update_length(ft); |
| 456 | + ft->expanded_length += count; | ||
| 443 | 457 | ||
| 444 | lib3270_enter(hSession); | 458 | lib3270_enter(hSession); |
| 445 | } | 459 | } |
| @@ -473,13 +487,14 @@ from6(unsigned char c) | @@ -473,13 +487,14 @@ from6(unsigned char c) | ||
| 473 | */ | 487 | */ |
| 474 | static void cut_data(H3270 *hSession) | 488 | static void cut_data(H3270 *hSession) |
| 475 | { | 489 | { |
| 490 | + H3270FT *ft = get_ft_handle(hSession); | ||
| 476 | static unsigned char cvbuf[O_RESPONSE - O_DT_DATA]; | 491 | static unsigned char cvbuf[O_RESPONSE - O_DT_DATA]; |
| 477 | unsigned short raw_length; | 492 | unsigned short raw_length; |
| 478 | int conv_length; | 493 | int conv_length; |
| 479 | register int i; | 494 | register int i; |
| 480 | 495 | ||
| 481 | trace_ds(hSession,"< FT DATA\n"); | 496 | trace_ds(hSession,"< FT DATA\n"); |
| 482 | - if (((H3270FT *) hSession->ft)->state == LIB3270_FT_STATE_ABORT_WAIT) | 497 | + if (ft->state == LIB3270_FT_STATE_ABORT_WAIT) |
| 483 | { | 498 | { |
| 484 | cut_abort(hSession,SC_ABORT_FILE,"%s",_("Transfer cancelled by user")); | 499 | cut_abort(hSession,SC_ABORT_FILE,"%s",_("Transfer cancelled by user")); |
| 485 | return; | 500 | return; |
| @@ -510,14 +525,14 @@ static void cut_data(H3270 *hSession) | @@ -510,14 +525,14 @@ static void cut_data(H3270 *hSession) | ||
| 510 | return; | 525 | return; |
| 511 | 526 | ||
| 512 | /* Write it to the file. */ | 527 | /* Write it to the file. */ |
| 513 | - if (fwrite((char *)cvbuf, conv_length, 1, ((H3270FT *) hSession->ft)->local_file) == 0) | 528 | + if (fwrite((char *)cvbuf, conv_length, 1, ft->local_file) == 0) |
| 514 | { | 529 | { |
| 515 | cut_abort(hSession,SC_ABORT_FILE,_( "Error \"%s\" writing to local file (rc=%d)" ),strerror(errno),errno); | 530 | cut_abort(hSession,SC_ABORT_FILE,_( "Error \"%s\" writing to local file (rc=%d)" ),strerror(errno),errno); |
| 516 | } | 531 | } |
| 517 | else | 532 | else |
| 518 | { | 533 | { |
| 519 | - ft_length += conv_length; | ||
| 520 | - ft_update_length(NULL); | 534 | + ft->ft_length += conv_length; |
| 535 | + ft_update_length(ft); | ||
| 521 | cut_ack(hSession); | 536 | cut_ack(hSession); |
| 522 | } | 537 | } |
| 523 | } | 538 | } |
| @@ -536,14 +551,15 @@ static void cut_ack(H3270 *hSession) | @@ -536,14 +551,15 @@ static void cut_ack(H3270 *hSession) | ||
| 536 | */ | 551 | */ |
| 537 | static void cut_abort(H3270 *hSession, unsigned short reason, const char *fmt, ...) | 552 | static void cut_abort(H3270 *hSession, unsigned short reason, const char *fmt, ...) |
| 538 | { | 553 | { |
| 539 | - va_list args; | 554 | + H3270FT * ft = get_ft_handle(hSession); |
| 555 | + va_list args; | ||
| 540 | 556 | ||
| 541 | - if(saved_errmsg) | ||
| 542 | - lib3270_free(saved_errmsg); | 557 | + if(ft->saved_errmsg) |
| 558 | + lib3270_free(ft->saved_errmsg); | ||
| 543 | 559 | ||
| 544 | /* Save the error message. */ | 560 | /* Save the error message. */ |
| 545 | va_start(args, fmt); | 561 | va_start(args, fmt); |
| 546 | - saved_errmsg = lib3270_vsprintf(fmt, args); | 562 | + ft->saved_errmsg = lib3270_vsprintf(fmt, args); |
| 547 | va_end(args); | 563 | va_end(args); |
| 548 | 564 | ||
| 549 | /* Send the abort sequence. */ | 565 | /* Send the abort sequence. */ |
| @@ -556,15 +572,15 @@ static void cut_abort(H3270 *hSession, unsigned short reason, const char *fmt, . | @@ -556,15 +572,15 @@ static void cut_abort(H3270 *hSession, unsigned short reason, const char *fmt, . | ||
| 556 | lib3270_pfkey(hSession,2); | 572 | lib3270_pfkey(hSession,2); |
| 557 | 573 | ||
| 558 | /* Update the in-progress pop-up. */ | 574 | /* Update the in-progress pop-up. */ |
| 559 | - ft_aborting(NULL); | 575 | + ft_aborting(ft); |
| 560 | } | 576 | } |
| 561 | 577 | ||
| 562 | -/* | 578 | +/** |
| 563 | * Get the next translated character from the local file. | 579 | * Get the next translated character from the local file. |
| 564 | - * Returns the character (in EBCDIC), or EOF. | 580 | + * |
| 581 | + * @return the character (in EBCDIC), or EOF. | ||
| 565 | */ | 582 | */ |
| 566 | -static int | ||
| 567 | -xlate_getc(void) | 583 | +static int xlate_getc(H3270FT *ft) |
| 568 | { | 584 | { |
| 569 | int r; | 585 | int r; |
| 570 | int c; | 586 | int c; |
| @@ -573,25 +589,29 @@ xlate_getc(void) | @@ -573,25 +589,29 @@ xlate_getc(void) | ||
| 573 | int nc; | 589 | int nc; |
| 574 | 590 | ||
| 575 | /* If there is a data buffered, return it. */ | 591 | /* If there is a data buffered, return it. */ |
| 576 | - if (xlate_buffered) { | ||
| 577 | - r = xlate_buf[xlate_buf_ix]; | ||
| 578 | - xlate_buf_ix++; | ||
| 579 | - xlate_buffered--; | 592 | + if (ft->xlate_buffered) |
| 593 | + { | ||
| 594 | + r = ft->xlate_buf[ft->xlate_buf_ix]; | ||
| 595 | + ft->xlate_buf_ix++; | ||
| 596 | + ft->xlate_buffered--; | ||
| 580 | return r; | 597 | return r; |
| 581 | } | 598 | } |
| 582 | 599 | ||
| 583 | /* Get the next byte from the file. */ | 600 | /* Get the next byte from the file. */ |
| 584 | - c = fgetc(((H3270FT *) h3270.ft)->local_file); | 601 | + c = fgetc(ft->local_file); |
| 585 | if (c == EOF) | 602 | if (c == EOF) |
| 586 | return c; | 603 | return c; |
| 587 | - ft_length++; | 604 | + ft->ft_length++; |
| 588 | 605 | ||
| 589 | /* Expand it. */ | 606 | /* Expand it. */ |
| 590 | - if (ascii_flag && cr_flag && !ft_last_cr && c == '\n') { | 607 | + if (ft->ascii_flag && ft->cr_flag && !ft->ft_last_cr && c == '\n') |
| 608 | + { | ||
| 591 | nc = download_convert((unsigned const char *)"\r", 1, cbuf); | 609 | nc = download_convert((unsigned const char *)"\r", 1, cbuf); |
| 592 | - } else { | 610 | + } |
| 611 | + else | ||
| 612 | + { | ||
| 593 | nc = 0; | 613 | nc = 0; |
| 594 | - ft_last_cr = (c == '\r'); | 614 | + ft->ft_last_cr = (c == '\r') ? 1 : 0; |
| 595 | } | 615 | } |
| 596 | 616 | ||
| 597 | /* Convert it. */ | 617 | /* Convert it. */ |
| @@ -600,12 +620,13 @@ xlate_getc(void) | @@ -600,12 +620,13 @@ xlate_getc(void) | ||
| 600 | 620 | ||
| 601 | /* Return it and buffer what's left. */ | 621 | /* Return it and buffer what's left. */ |
| 602 | r = cbuf[0]; | 622 | r = cbuf[0]; |
| 603 | - if (nc > 1) { | 623 | + if (nc > 1) |
| 624 | + { | ||
| 604 | int i; | 625 | int i; |
| 605 | 626 | ||
| 606 | for (i = 1; i < nc; i++) | 627 | for (i = 1; i < nc; i++) |
| 607 | - xlate_buf[xlate_buffered++] = cbuf[i]; | ||
| 608 | - xlate_buf_ix = 0; | 628 | + ft->xlate_buf[ft->xlate_buffered++] = cbuf[i]; |
| 629 | + ft->xlate_buf_ix = 0; | ||
| 609 | } | 630 | } |
| 610 | return r; | 631 | return r; |
| 611 | } | 632 | } |
ft_dft.c
| @@ -59,34 +59,35 @@ | @@ -59,34 +59,35 @@ | ||
| 59 | // extern unsigned char aid; | 59 | // extern unsigned char aid; |
| 60 | 60 | ||
| 61 | /* Macros. */ | 61 | /* Macros. */ |
| 62 | -#define OPEN_MSG "FT:MSG" /* Open request for message */ | 62 | +#define OPEN_MSG "FT:MSG" /* Open request for message */ |
| 63 | #define END_TRANSFER "TRANS03" /* Message for xfer complete */ | 63 | #define END_TRANSFER "TRANS03" /* Message for xfer complete */ |
| 64 | 64 | ||
| 65 | #define DFT_MIN_BUF 256 | 65 | #define DFT_MIN_BUF 256 |
| 66 | #define DFT_MAX_BUF 32768 | 66 | #define DFT_MAX_BUF 32768 |
| 67 | 67 | ||
| 68 | /* Typedefs. */ | 68 | /* Typedefs. */ |
| 69 | -struct data_buffer { | ||
| 70 | - char sf_length[2]; /* SF length = 0x0023 */ | ||
| 71 | - char sf_d0; /* 0xD0 */ | ||
| 72 | - char sf_request_type[2]; /* request type */ | ||
| 73 | - char compress_indic[2]; /* 0xc080 */ | ||
| 74 | - char begin_data; /* 0x61 */ | ||
| 75 | - char data_length[2]; /* Data Length in 3270 byte order+5 */ | ||
| 76 | - char data[256]; /* The actual data */ | 69 | +struct data_buffer |
| 70 | +{ | ||
| 71 | + char sf_length[2]; /**< SF length = 0x0023 */ | ||
| 72 | + char sf_d0; /**< 0xD0 */ | ||
| 73 | + char sf_request_type[2]; /**< request type */ | ||
| 74 | + char compress_indic[2]; /**< 0xc080 */ | ||
| 75 | + char begin_data; /**< 0x61 */ | ||
| 76 | + char data_length[2]; /**< Data Length in 3270 byte order+5 */ | ||
| 77 | + char data[256]; /**< The actual data */ | ||
| 77 | }; | 78 | }; |
| 78 | 79 | ||
| 79 | /* Globals. */ | 80 | /* Globals. */ |
| 80 | // int dft_buffersize = 0; /* Buffer size (LIMIN, LIMOUT) */ | 81 | // int dft_buffersize = 0; /* Buffer size (LIMIN, LIMOUT) */ |
| 81 | 82 | ||
| 82 | /* Statics. */ | 83 | /* Statics. */ |
| 83 | -static Boolean message_flag = False; /* Open Request for msg received */ | ||
| 84 | -static int dft_eof; | ||
| 85 | -static unsigned long recnum; | 84 | +// static Boolean message_flag = False; /* Open Request for msg received */ |
| 85 | +// static int dft_eof; | ||
| 86 | +// static unsigned long recnum; | ||
| 86 | // static char *abort_string = CN; | 87 | // static char *abort_string = CN; |
| 87 | -static unsigned char *dft_savebuf = NULL; | ||
| 88 | -static int dft_savebuf_len = 0; | ||
| 89 | -static int dft_savebuf_max = 0; | 88 | +// static unsigned char *dft_savebuf = NULL; |
| 89 | +// static int dft_savebuf_len = 0; | ||
| 90 | +// static int dft_savebuf_max = 0; | ||
| 90 | 91 | ||
| 91 | static void dft_abort(H3270 *hSession, unsigned short code, const char *fmt, ...); | 92 | static void dft_abort(H3270 *hSession, unsigned short code, const char *fmt, ...); |
| 92 | 93 | ||
| @@ -158,10 +159,11 @@ void ft_dft_data(H3270 *hSession, unsigned char *data, int length unused) | @@ -158,10 +159,11 @@ void ft_dft_data(H3270 *hSession, unsigned char *data, int length unused) | ||
| 158 | /* Process an Open request. */ | 159 | /* Process an Open request. */ |
| 159 | static void dft_open_request(H3270 *hSession, unsigned short len, unsigned char *cp) | 160 | static void dft_open_request(H3270 *hSession, unsigned short len, unsigned char *cp) |
| 160 | { | 161 | { |
| 161 | - char *name = "?"; | ||
| 162 | - char namebuf[8]; | ||
| 163 | - char *s; | ||
| 164 | - unsigned short recsz = 0; | 162 | + H3270FT * ft = get_ft_handle(hSession); |
| 163 | + char * name = "?"; | ||
| 164 | + char namebuf[8]; | ||
| 165 | + char * s; | ||
| 166 | + unsigned short recsz = 0; | ||
| 165 | 167 | ||
| 166 | if (len == 0x23) | 168 | if (len == 0x23) |
| 167 | { | 169 | { |
| @@ -199,15 +201,15 @@ static void dft_open_request(H3270 *hSession, unsigned short len, unsigned char | @@ -199,15 +201,15 @@ static void dft_open_request(H3270 *hSession, unsigned short len, unsigned char | ||
| 199 | } | 201 | } |
| 200 | 202 | ||
| 201 | if (!strcmp(namebuf, OPEN_MSG)) | 203 | if (!strcmp(namebuf, OPEN_MSG)) |
| 202 | - message_flag = True; | 204 | + ft->message_flag = 1; |
| 203 | else | 205 | else |
| 204 | { | 206 | { |
| 205 | - message_flag = False; | ||
| 206 | - ft_running(hSession->ft,False); | 207 | + ft->message_flag = 0; |
| 208 | + ft_running(ft,False); | ||
| 207 | } | 209 | } |
| 208 | 210 | ||
| 209 | - dft_eof = False; | ||
| 210 | - recnum = 1; | 211 | + ft->dft_eof = 0; |
| 212 | + ft->recnum = 1; | ||
| 211 | 213 | ||
| 212 | /* Acknowledge the Open. */ | 214 | /* Acknowledge the Open. */ |
| 213 | trace_ds(hSession,"> WriteStructuredField FileTransferData OpenAck\n"); | 215 | trace_ds(hSession,"> WriteStructuredField FileTransferData OpenAck\n"); |
| @@ -231,10 +233,11 @@ static void dft_insert_request(H3270 *hSession) | @@ -231,10 +233,11 @@ static void dft_insert_request(H3270 *hSession) | ||
| 231 | static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | 233 | static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) |
| 232 | { | 234 | { |
| 233 | /* Received a data buffer, get the length and process it */ | 235 | /* Received a data buffer, get the length and process it */ |
| 234 | - int my_length; | ||
| 235 | - unsigned char *cp; | 236 | + H3270FT * ft = get_ft_handle(hSession); |
| 237 | + int my_length; | ||
| 238 | + unsigned char * cp; | ||
| 236 | 239 | ||
| 237 | - if(!message_flag && lib3270_get_ft_state(hSession) == FT_ABORT_WAIT) | 240 | + if(!ft->message_flag && lib3270_get_ft_state(hSession) == FT_ABORT_WAIT) |
| 238 | { | 241 | { |
| 239 | dft_abort(hSession,TR_DATA_INSERT, "%s", _("Transfer cancelled by user") ); | 242 | dft_abort(hSession,TR_DATA_INSERT, "%s", _("Transfer cancelled by user") ); |
| 240 | return; | 243 | return; |
| @@ -248,13 +251,13 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | @@ -248,13 +251,13 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | ||
| 248 | /* Adjust for 5 extra count */ | 251 | /* Adjust for 5 extra count */ |
| 249 | my_length -= 5; | 252 | my_length -= 5; |
| 250 | 253 | ||
| 251 | - trace_ds(hSession," Data(rec=%lu) %d bytes\n", recnum, my_length); | 254 | + trace_ds(hSession," Data(rec=%lu) %d bytes\n", ft->recnum, my_length); |
| 252 | 255 | ||
| 253 | /* | 256 | /* |
| 254 | * First, check to see if we have message data or file data. | 257 | * First, check to see if we have message data or file data. |
| 255 | * Message data will result in a popup. | 258 | * Message data will result in a popup. |
| 256 | */ | 259 | */ |
| 257 | - if (message_flag) | 260 | + if (ft->message_flag) |
| 258 | { | 261 | { |
| 259 | /* Data is from a message */ | 262 | /* Data is from a message */ |
| 260 | unsigned char *msgp; | 263 | unsigned char *msgp; |
| @@ -281,8 +284,8 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | @@ -281,8 +284,8 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | ||
| 281 | else if (lib3270_get_ft_state(hSession) == FT_ABORT_SENT && ((H3270FT *) hSession->ft)->abort_string != CN) | 284 | else if (lib3270_get_ft_state(hSession) == FT_ABORT_SENT && ((H3270FT *) hSession->ft)->abort_string != CN) |
| 282 | { | 285 | { |
| 283 | lib3270_free(msgp); | 286 | lib3270_free(msgp); |
| 284 | - ft_complete(hSession->ft,((H3270FT *) hSession->ft)->abort_string); | ||
| 285 | - lib3270_free(((H3270FT *) hSession->ft)->abort_string); | 287 | + ft_complete(ft,ft->abort_string); |
| 288 | + lib3270_free(ft->abort_string); | ||
| 286 | } | 289 | } |
| 287 | else | 290 | else |
| 288 | { | 291 | { |
| @@ -293,17 +296,20 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | @@ -293,17 +296,20 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | ||
| 293 | /* Write the data out to the file. */ | 296 | /* Write the data out to the file. */ |
| 294 | int rv = 1; | 297 | int rv = 1; |
| 295 | 298 | ||
| 296 | - if (ascii_flag && remap_flag) { | 299 | + if (ft->ascii_flag && ft->remap_flag) |
| 300 | + { | ||
| 297 | /* Filter. */ | 301 | /* Filter. */ |
| 298 | unsigned char *s = (unsigned char *)data_bufr->data; | 302 | unsigned char *s = (unsigned char *)data_bufr->data; |
| 299 | unsigned len = my_length; | 303 | unsigned len = my_length; |
| 300 | 304 | ||
| 301 | - while (len--) { | 305 | + while (len--) |
| 306 | + { | ||
| 302 | *s = ft2asc[*s]; | 307 | *s = ft2asc[*s]; |
| 303 | s++; | 308 | s++; |
| 304 | } | 309 | } |
| 305 | } | 310 | } |
| 306 | - if (ascii_flag && cr_flag) { | 311 | + if (ft->ascii_flag && ft->cr_flag) |
| 312 | + { | ||
| 307 | char *s = (char *)data_bufr->data; | 313 | char *s = (char *)data_bufr->data; |
| 308 | unsigned len = my_length; | 314 | unsigned len = my_length; |
| 309 | 315 | ||
| @@ -316,7 +322,7 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | @@ -316,7 +322,7 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | ||
| 316 | rv = fwrite(s, l, (size_t)1,((H3270FT *) h3270.ft)->local_file); | 322 | rv = fwrite(s, l, (size_t)1,((H3270FT *) h3270.ft)->local_file); |
| 317 | if (rv == 0) | 323 | if (rv == 0) |
| 318 | break; | 324 | break; |
| 319 | - ft_length += l; | 325 | + ft->ft_length += l; |
| 320 | } | 326 | } |
| 321 | if (l < len) | 327 | if (l < len) |
| 322 | l++; | 328 | l++; |
| @@ -325,7 +331,7 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | @@ -325,7 +331,7 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | ||
| 325 | } | 331 | } |
| 326 | } else { | 332 | } else { |
| 327 | rv = fwrite((char *)data_bufr->data, my_length,(size_t)1, ((H3270FT *) h3270.ft)->local_file); | 333 | rv = fwrite((char *)data_bufr->data, my_length,(size_t)1, ((H3270FT *) h3270.ft)->local_file); |
| 328 | - ft_length += my_length; | 334 | + ft->ft_length += my_length; |
| 329 | } | 335 | } |
| 330 | 336 | ||
| 331 | if (!rv) { | 337 | if (!rv) { |
| @@ -334,11 +340,11 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | @@ -334,11 +340,11 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | ||
| 334 | } | 340 | } |
| 335 | 341 | ||
| 336 | /* Add up amount transferred. */ | 342 | /* Add up amount transferred. */ |
| 337 | - ft_update_length((H3270FT *) hSession->ft); | 343 | + ft_update_length(ft); |
| 338 | } | 344 | } |
| 339 | 345 | ||
| 340 | /* Send an acknowledgement frame back. */ | 346 | /* Send an acknowledgement frame back. */ |
| 341 | - trace_ds(hSession,"> WriteStructuredField FileTransferData DataAck(rec=%lu)\n", recnum); | 347 | + trace_ds(hSession,"> WriteStructuredField FileTransferData DataAck(rec=%lu)\n", ft->recnum); |
| 342 | hSession->obptr = hSession->obuf; | 348 | hSession->obptr = hSession->obuf; |
| 343 | space3270out(hSession,12); | 349 | space3270out(hSession,12); |
| 344 | *hSession->obptr++ = AID_SF; | 350 | *hSession->obptr++ = AID_SF; |
| @@ -346,8 +352,8 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | @@ -346,8 +352,8 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | ||
| 346 | *hSession->obptr++ = SF_TRANSFER_DATA; | 352 | *hSession->obptr++ = SF_TRANSFER_DATA; |
| 347 | SET16(hSession->obptr, TR_NORMAL_REPLY); | 353 | SET16(hSession->obptr, TR_NORMAL_REPLY); |
| 348 | SET16(hSession->obptr, TR_RECNUM_HDR); | 354 | SET16(hSession->obptr, TR_RECNUM_HDR); |
| 349 | - SET32(hSession->obptr, recnum); | ||
| 350 | - recnum++; | 355 | + SET32(hSession->obptr, ft->recnum); |
| 356 | + ft->recnum++; | ||
| 351 | net_output(hSession); | 357 | net_output(hSession); |
| 352 | } | 358 | } |
| 353 | 359 | ||
| @@ -361,14 +367,15 @@ static void dft_set_cur_req(H3270 *hSession) | @@ -361,14 +367,15 @@ static void dft_set_cur_req(H3270 *hSession) | ||
| 361 | /* Process a Get request. */ | 367 | /* Process a Get request. */ |
| 362 | static void dft_get_request(H3270 *hSession) | 368 | static void dft_get_request(H3270 *hSession) |
| 363 | { | 369 | { |
| 364 | - int numbytes; | ||
| 365 | - size_t numread; | ||
| 366 | - size_t total_read = 0; | ||
| 367 | - unsigned char *bufptr; | 370 | + int numbytes; |
| 371 | + size_t numread; | ||
| 372 | + size_t total_read = 0; | ||
| 373 | + unsigned char * bufptr; | ||
| 374 | + H3270FT * ft = get_ft_handle(hSession); | ||
| 368 | 375 | ||
| 369 | trace_ds(hSession," Get\n"); | 376 | trace_ds(hSession," Get\n"); |
| 370 | 377 | ||
| 371 | - if (!message_flag && lib3270_get_ft_state(hSession) == FT_ABORT_WAIT) | 378 | + if (!ft->message_flag && lib3270_get_ft_state(hSession) == FT_ABORT_WAIT) |
| 372 | { | 379 | { |
| 373 | dft_abort(hSession,TR_GET_REQ, _( "Transfer cancelled by user" ) ); | 380 | dft_abort(hSession,TR_GET_REQ, _( "Transfer cancelled by user" ) ); |
| 374 | return; | 381 | return; |
| @@ -376,43 +383,46 @@ static void dft_get_request(H3270 *hSession) | @@ -376,43 +383,46 @@ static void dft_get_request(H3270 *hSession) | ||
| 376 | 383 | ||
| 377 | /* Read a buffer's worth. */ | 384 | /* Read a buffer's worth. */ |
| 378 | set_dft_buffersize(hSession); | 385 | set_dft_buffersize(hSession); |
| 379 | - space3270out(hSession,h3270.dft_buffersize); | 386 | + space3270out(hSession,hSession->dft_buffersize); |
| 380 | numbytes = h3270.dft_buffersize - 27; /* always read 5 bytes less than we're allowed */ | 387 | numbytes = h3270.dft_buffersize - 27; /* always read 5 bytes less than we're allowed */ |
| 381 | bufptr = h3270.obuf + 17; | 388 | bufptr = h3270.obuf + 17; |
| 382 | 389 | ||
| 383 | - while (!dft_eof && numbytes) { | ||
| 384 | - if (ascii_flag && cr_flag) { | 390 | + while (!ft->dft_eof && numbytes) |
| 391 | + { | ||
| 392 | + if (ft->ascii_flag && ft->cr_flag) | ||
| 393 | + { | ||
| 385 | int c; | 394 | int c; |
| 386 | 395 | ||
| 387 | /* Read one byte and do CR/LF translation. */ | 396 | /* Read one byte and do CR/LF translation. */ |
| 388 | - c = fgetc(((H3270FT *) h3270.ft)->local_file); | 397 | + c = fgetc(ft->local_file); |
| 389 | if (c == EOF) { | 398 | if (c == EOF) { |
| 390 | break; | 399 | break; |
| 391 | } | 400 | } |
| 392 | - if (!ft_last_cr && c == '\n') { | 401 | + if (!ft->ft_last_cr && c == '\n') |
| 402 | + { | ||
| 393 | if (numbytes < 2) { | 403 | if (numbytes < 2) { |
| 394 | /* | 404 | /* |
| 395 | * Not enough room to expand NL to | 405 | * Not enough room to expand NL to |
| 396 | * CR/LF. | 406 | * CR/LF. |
| 397 | */ | 407 | */ |
| 398 | - ungetc(c, ((H3270FT *) h3270.ft)->local_file); | 408 | + ungetc(c, ft->local_file); |
| 399 | break; | 409 | break; |
| 400 | } | 410 | } |
| 401 | *bufptr++ = '\r'; | 411 | *bufptr++ = '\r'; |
| 402 | numbytes--; | 412 | numbytes--; |
| 403 | total_read++; | 413 | total_read++; |
| 404 | } | 414 | } |
| 405 | - ft_last_cr = (c == '\r'); | ||
| 406 | - *bufptr++ = remap_flag? asc2ft[c]: c; | 415 | + ft->ft_last_cr = (c == '\r') ? 1 : 0; |
| 416 | + *bufptr++ = ft->remap_flag? asc2ft[c]: c; | ||
| 407 | numbytes--; | 417 | numbytes--; |
| 408 | total_read++; | 418 | total_read++; |
| 409 | } else { | 419 | } else { |
| 410 | /* Binary read. */ | 420 | /* Binary read. */ |
| 411 | - numread = fread(bufptr, 1, numbytes, ((H3270FT *) h3270.ft)->local_file); | 421 | + numread = fread(bufptr, 1, numbytes, ft->local_file); |
| 412 | if (numread <= 0) { | 422 | if (numread <= 0) { |
| 413 | break; | 423 | break; |
| 414 | } | 424 | } |
| 415 | - if (ascii_flag && remap_flag) { | 425 | + if (ft->ascii_flag && ft->remap_flag) { |
| 416 | unsigned char *s = bufptr; | 426 | unsigned char *s = bufptr; |
| 417 | int i = numread; | 427 | int i = numread; |
| 418 | 428 | ||
| @@ -426,7 +436,8 @@ static void dft_get_request(H3270 *hSession) | @@ -426,7 +436,8 @@ static void dft_get_request(H3270 *hSession) | ||
| 426 | numbytes -= numread; | 436 | numbytes -= numread; |
| 427 | total_read += numread; | 437 | total_read += numread; |
| 428 | } | 438 | } |
| 429 | - if (feof(((H3270FT *) h3270.ft)->local_file) || ferror(((H3270FT *) h3270.ft)->local_file)) { | 439 | + if (feof(ft->local_file) || ferror(ft->local_file)) |
| 440 | + { | ||
| 430 | break; | 441 | break; |
| 431 | } | 442 | } |
| 432 | } | 443 | } |
| @@ -439,55 +450,57 @@ static void dft_get_request(H3270 *hSession) | @@ -439,55 +450,57 @@ static void dft_get_request(H3270 *hSession) | ||
| 439 | } | 450 | } |
| 440 | 451 | ||
| 441 | /* Set up SF header for Data or EOF. */ | 452 | /* Set up SF header for Data or EOF. */ |
| 442 | - h3270.obptr = h3270.obuf; | ||
| 443 | - *h3270.obptr++ = AID_SF; | ||
| 444 | - h3270.obptr += 2; /* skip SF length for now */ | ||
| 445 | - *h3270.obptr++ = SF_TRANSFER_DATA; | ||
| 446 | - | ||
| 447 | - if (total_read) { | ||
| 448 | - trace_ds(hSession,"> WriteStructuredField FileTransferData Data(rec=%lu) %d bytes\n",(unsigned long) recnum, (int) total_read); | ||
| 449 | - SET16(h3270.obptr, TR_GET_REPLY); | ||
| 450 | - SET16(h3270.obptr, TR_RECNUM_HDR); | ||
| 451 | - SET32(h3270.obptr, recnum); | ||
| 452 | - recnum++; | ||
| 453 | - SET16(h3270.obptr, TR_NOT_COMPRESSED); | ||
| 454 | - *h3270.obptr++ = TR_BEGIN_DATA; | ||
| 455 | - SET16(h3270.obptr, total_read + 5); | ||
| 456 | - h3270.obptr += total_read; | ||
| 457 | - | ||
| 458 | - ft_length += total_read; | ||
| 459 | - | ||
| 460 | - if (feof(((H3270FT *) h3270.ft)->local_file)) | 453 | + hSession->obptr = hSession->obuf; |
| 454 | + *hSession->obptr++ = AID_SF; | ||
| 455 | + hSession->obptr += 2; /* skip SF length for now */ | ||
| 456 | + *hSession->obptr++ = SF_TRANSFER_DATA; | ||
| 457 | + | ||
| 458 | + if (total_read) | ||
| 459 | + { | ||
| 460 | + trace_ds(hSession,"> WriteStructuredField FileTransferData Data(rec=%lu) %d bytes\n",(unsigned long) ft->recnum, (int) total_read); | ||
| 461 | + SET16(hSession->obptr, TR_GET_REPLY); | ||
| 462 | + SET16(hSession->obptr, TR_RECNUM_HDR); | ||
| 463 | + SET32(hSession->obptr, ft->recnum); | ||
| 464 | + ft->recnum++; | ||
| 465 | + SET16(hSession->obptr, TR_NOT_COMPRESSED); | ||
| 466 | + *hSession->obptr++ = TR_BEGIN_DATA; | ||
| 467 | + SET16(hSession->obptr, total_read + 5); | ||
| 468 | + hSession->obptr += total_read; | ||
| 469 | + | ||
| 470 | + ft->ft_length += total_read; | ||
| 471 | + | ||
| 472 | + if (feof(ft->local_file)) | ||
| 461 | { | 473 | { |
| 462 | - dft_eof = True; | 474 | + ft->dft_eof = 1; |
| 463 | } | 475 | } |
| 464 | 476 | ||
| 465 | } else { | 477 | } else { |
| 466 | trace_ds(hSession,"> WriteStructuredField FileTransferData EOF\n"); | 478 | trace_ds(hSession,"> WriteStructuredField FileTransferData EOF\n"); |
| 467 | - *h3270.obptr++ = HIGH8(TR_GET_REQ); | ||
| 468 | - *h3270.obptr++ = TR_ERROR_REPLY; | ||
| 469 | - SET16(h3270.obptr, TR_ERROR_HDR); | ||
| 470 | - SET16(h3270.obptr, TR_ERR_EOF); | 479 | + *hSession->obptr++ = HIGH8(TR_GET_REQ); |
| 480 | + *hSession->obptr++ = TR_ERROR_REPLY; | ||
| 481 | + SET16(hSession->obptr, TR_ERROR_HDR); | ||
| 482 | + SET16(hSession->obptr, TR_ERR_EOF); | ||
| 471 | 483 | ||
| 472 | - dft_eof = True; | 484 | + ft->dft_eof = 1; |
| 473 | } | 485 | } |
| 474 | 486 | ||
| 475 | /* Set the SF length. */ | 487 | /* Set the SF length. */ |
| 476 | - bufptr = h3270.obuf + 1; | ||
| 477 | - SET16(bufptr, h3270.obptr - (h3270.obuf + 1)); | 488 | + bufptr = hSession->obuf + 1; |
| 489 | + SET16(bufptr, hSession->obptr - (hSession->obuf + 1)); | ||
| 478 | 490 | ||
| 479 | /* Save the data. */ | 491 | /* Save the data. */ |
| 480 | - dft_savebuf_len = h3270.obptr - h3270.obuf; | ||
| 481 | - if (dft_savebuf_len > dft_savebuf_max) { | ||
| 482 | - dft_savebuf_max = dft_savebuf_len; | ||
| 483 | - Replace(dft_savebuf, (unsigned char *)lib3270_malloc(dft_savebuf_max)); | 492 | + ft->dft_savebuf_len = hSession->obptr - hSession->obuf; |
| 493 | + if (ft->dft_savebuf_len > ft->dft_savebuf_max) | ||
| 494 | + { | ||
| 495 | + ft->dft_savebuf_max = ft->dft_savebuf_len; | ||
| 496 | + Replace(ft->dft_savebuf, (unsigned char *)lib3270_malloc(ft->dft_savebuf_max)); | ||
| 484 | } | 497 | } |
| 485 | - (void) memcpy(dft_savebuf, h3270.obuf, dft_savebuf_len); | ||
| 486 | - h3270.aid = AID_SF; | 498 | + (void) memcpy(ft->dft_savebuf, hSession->obuf, ft->dft_savebuf_len); |
| 499 | + hSession->aid = AID_SF; | ||
| 487 | 500 | ||
| 488 | /* Write the data. */ | 501 | /* Write the data. */ |
| 489 | net_output(hSession); | 502 | net_output(hSession); |
| 490 | - ft_update_length((H3270FT *) h3270.ft); | 503 | + ft_update_length(get_ft_handle(hSession)); |
| 491 | } | 504 | } |
| 492 | 505 | ||
| 493 | /* Process a Close request. */ | 506 | /* Process a Close request. */ |
| @@ -555,13 +568,15 @@ filter_len(char *s, register int len) | @@ -555,13 +568,15 @@ filter_len(char *s, register int len) | ||
| 555 | */ | 568 | */ |
| 556 | void dft_read_modified(H3270 *hSession) | 569 | void dft_read_modified(H3270 *hSession) |
| 557 | { | 570 | { |
| 558 | - if (dft_savebuf_len) | 571 | + H3270FT *ft = get_ft_handle(hSession); |
| 572 | + | ||
| 573 | + if(ft->dft_savebuf_len) | ||
| 559 | { | 574 | { |
| 560 | trace_ds(hSession,"> WriteStructuredField FileTransferData\n"); | 575 | trace_ds(hSession,"> WriteStructuredField FileTransferData\n"); |
| 561 | hSession->obptr = hSession->obuf; | 576 | hSession->obptr = hSession->obuf; |
| 562 | - space3270out(hSession,dft_savebuf_len); | ||
| 563 | - memcpy(hSession->obptr, dft_savebuf, dft_savebuf_len); | ||
| 564 | - hSession->obptr += dft_savebuf_len; | 577 | + space3270out(hSession,ft->dft_savebuf_len); |
| 578 | + memcpy(hSession->obptr, ft->dft_savebuf, ft->dft_savebuf_len); | ||
| 579 | + hSession->obptr += ft->dft_savebuf_len; | ||
| 565 | net_output(hSession); | 580 | net_output(hSession); |
| 566 | } | 581 | } |
| 567 | } | 582 | } |
| @@ -22,22 +22,24 @@ | @@ -22,22 +22,24 @@ | ||
| 22 | 22 | ||
| 23 | #include <lib3270/filetransfer.h> | 23 | #include <lib3270/filetransfer.h> |
| 24 | 24 | ||
| 25 | - #define CHECK_FT_HANDLE(x) if(!x) x = ftsession; | 25 | +// #define CHECK_FT_HANDLE(x) if(!x) x = ftsession; |
| 26 | 26 | ||
| 27 | LIB3270_INTERNAL Boolean ascii_flag; | 27 | LIB3270_INTERNAL Boolean ascii_flag; |
| 28 | LIB3270_INTERNAL Boolean cr_flag; | 28 | LIB3270_INTERNAL Boolean cr_flag; |
| 29 | LIB3270_INTERNAL unsigned long ft_length; | 29 | LIB3270_INTERNAL unsigned long ft_length; |
| 30 | 30 | ||
| 31 | - LIB3270_INTERNAL H3270FT * ftsession; | 31 | +// LIB3270_INTERNAL H3270FT * ftsession; |
| 32 | 32 | ||
| 33 | - LIB3270_INTERNAL Boolean ft_last_cr; | ||
| 34 | - LIB3270_INTERNAL Boolean remap_flag; | 33 | +// LIB3270_INTERNAL Boolean ft_last_cr; |
| 34 | +// LIB3270_INTERNAL Boolean remap_flag; | ||
| 35 | 35 | ||
| 36 | - LIB3270_INTERNAL void ft_init(H3270 *session); | 36 | + LIB3270_INTERNAL H3270FT * get_ft_handle(H3270 *hSession); |
| 37 | 37 | ||
| 38 | - LIB3270_INTERNAL void ft_aborting(H3270FT *h); | ||
| 39 | - LIB3270_INTERNAL void ft_complete(H3270FT *h, const char *errmsg); | ||
| 40 | - LIB3270_INTERNAL void ft_running(H3270FT *h, Boolean is_cut); | ||
| 41 | - LIB3270_INTERNAL void ft_update_length(H3270FT *h); | 38 | + LIB3270_INTERNAL void ft_init(H3270 *hSession); |
| 39 | + | ||
| 40 | + LIB3270_INTERNAL void ft_aborting(H3270FT *h); | ||
| 41 | + LIB3270_INTERNAL void ft_complete(H3270FT *h, const char *errmsg); | ||
| 42 | + LIB3270_INTERNAL void ft_running(H3270FT *h, Boolean is_cut); | ||
| 43 | + LIB3270_INTERNAL void ft_update_length(H3270FT *h); | ||
| 42 | 44 | ||
| 43 | #endif /*]*/ | 45 | #endif /*]*/ |