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 | 18 | * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin |
| 19 | 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 | 23 | * Contatos: |
| 24 | 24 | * |
| ... | ... | @@ -26,7 +26,6 @@ |
| 26 | 26 | * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) |
| 27 | 27 | * licinio@bb.com.br (Licínio Luis Branco) |
| 28 | 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 | 78 | #define BN (Boolean *)NULL |
| 80 | 79 | |
| 81 | 80 | // Globals. |
| 82 | -H3270FT *ftsession = NULL; | |
| 81 | +// H3270FT *ftsession = NULL; | |
| 83 | 82 | |
| 84 | 83 | // enum ft_state ft_state = FT_NONE; // File transfer state |
| 85 | 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 | 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 | 100 | |
| 102 | 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 | 114 | if(session->state == state) |
| 109 | 115 | return; |
| 110 | - | |
| 111 | 116 | session->state = state; |
| 112 | 117 | session->state_changed(session,state); |
| 113 | 118 | |
| ... | ... | @@ -126,10 +131,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 126 | 131 | |
| 127 | 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 | 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 | 182 | |
| 181 | 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 | 186 | FILE * ft_local_file = NULL; |
| 185 | 187 | // unsigned long length = 0L; |
| 186 | 188 | |
| ... | ... | @@ -192,19 +194,21 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 192 | 194 | return NULL; |
| 193 | 195 | } |
| 194 | 196 | |
| 195 | - if(session->ft) | |
| 197 | + if(ftHandle) | |
| 196 | 198 | { |
| 197 | 199 | *msg = N_( "File transfer is already active in this session" ); |
| 198 | 200 | errno = EBUSY; |
| 199 | 201 | return NULL; |
| 200 | 202 | } |
| 201 | 203 | |
| 204 | +/* | |
| 202 | 205 | if(ftsession) |
| 203 | 206 | { |
| 204 | 207 | *msg = N_( "File transfer is already active" ); |
| 205 | 208 | errno = EBUSY; |
| 206 | 209 | return NULL; |
| 207 | 210 | } |
| 211 | +*/ | |
| 208 | 212 | |
| 209 | 213 | // Check remote file |
| 210 | 214 | if(!*remote) |
| ... | ... | @@ -227,14 +231,17 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 227 | 231 | session->dft_buffersize = dft; |
| 228 | 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 | 235 | ftHandle = lib3270_malloc(sizeof(H3270FT)+strlen(local)+strlen(remote)+3); |
| 235 | 236 | |
| 236 | 237 | ftHandle->sz = sizeof(H3270FT); |
| 237 | 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 | 245 | ftHandle->flags = flags; |
| 239 | 246 | ftHandle->local_file = ft_local_file; |
| 240 | 247 | ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK; |
| ... | ... | @@ -249,6 +256,8 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 249 | 256 | ftHandle->primspace = primspace; |
| 250 | 257 | ftHandle->secspace = secspace; |
| 251 | 258 | ftHandle->dft = dft; |
| 259 | + ftHandle->quadrant = -1; | |
| 260 | + | |
| 252 | 261 | |
| 253 | 262 | ftHandle->local = (char *) (ftHandle+1); |
| 254 | 263 | strcpy((char *) ftHandle->local,local); |
| ... | ... | @@ -258,7 +267,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 258 | 267 | |
| 259 | 268 | session->ft = ftHandle; |
| 260 | 269 | |
| 261 | - return ftsession = ftHandle; | |
| 270 | + return ftHandle; | |
| 262 | 271 | } |
| 263 | 272 | |
| 264 | 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 | 284 | |
| 276 | 285 | CHECK_SESSION_HANDLE(hSession); |
| 277 | 286 | |
| 278 | - ft = (H3270FT *) hSession->ft; | |
| 287 | + ft = get_ft_handle(hSession); | |
| 279 | 288 | if(!ft) |
| 280 | 289 | return EINVAL; |
| 281 | 290 | |
| 282 | 291 | recfm = (ft->flags & FT_RECORD_FORMAT_MASK) >> 8; |
| 283 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 460 | hSession->ft = NULL; |
| 454 | 461 | |
| 455 | - free(session); | |
| 462 | + lib3270_free(session); | |
| 456 | 463 | |
| 457 | 464 | return 0; |
| 458 | 465 | } |
| ... | ... | @@ -462,46 +469,43 @@ void ft_update_length(H3270FT *session) |
| 462 | 469 | { |
| 463 | 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 | 474 | struct timeval t1; |
| 470 | 475 | |
| 471 | 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 | 478 | ((double)(t1.tv_sec - session->starting_time.tv_sec) + |
| 474 | 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 | 506 | // Process a protocol-generated abort. |
| 501 | 507 | void ft_aborting(H3270FT *h) |
| 502 | 508 | { |
| 503 | - CHECK_FT_HANDLE(h); | |
| 504 | - | |
| 505 | 509 | if (h->state == FT_RUNNING || h->state == FT_ABORT_WAIT) |
| 506 | 510 | set_ft_state(h,FT_ABORT_SENT); |
| 507 | 511 | |
| ... | ... | @@ -513,14 +517,14 @@ void ft_aborting(H3270FT *h) |
| 513 | 517 | static void ft_connected(H3270 *session, int ignored, void *dunno) |
| 514 | 518 | { |
| 515 | 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 | 523 | /* Process an abort from no longer being in 3270 mode. */ |
| 520 | 524 | static void ft_in3270(H3270 *session, int ignored, void *dunno) |
| 521 | 525 | { |
| 522 | 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 | 530 | LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session) | ... | ... |
ft_cut.c
| ... | ... | @@ -58,9 +58,9 @@ |
| 58 | 58 | |
| 59 | 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 | 64 | #define XLATE_NULL 0xc1 /* translation of NULL */ |
| 65 | 65 | |
| 66 | 66 | static const char alphas[NE + 1] = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%&_()<+,-./:>?"; |
| ... | ... | @@ -109,14 +109,14 @@ static const struct |
| 109 | 109 | }; |
| 110 | 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 | 121 | static void cut_control_code(H3270 *hSession); |
| 122 | 122 | static void cut_data_request(H3270 *hSession); |
| ... | ... | @@ -127,7 +127,7 @@ static void cut_ack(H3270 *hSession); |
| 127 | 127 | static void cut_abort(H3270 *hSession, unsigned short code, const char *fmt, ...) printflike(3,4); |
| 128 | 128 | |
| 129 | 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 | 133 | * Convert a buffer for uploading (host->local). Overwrites the buffer. |
| ... | ... | @@ -138,8 +138,9 @@ static int xlate_getc(void); |
| 138 | 138 | */ |
| 139 | 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 | 145 | while (len--) |
| 145 | 146 | { |
| ... | ... | @@ -149,15 +150,15 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) |
| 149 | 150 | // int oq = -1; |
| 150 | 151 | |
| 151 | 152 | retry: |
| 152 | - if (quadrant < 0) | |
| 153 | + if (ft->quadrant < 0) | |
| 153 | 154 | { |
| 154 | 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 | 159 | break; |
| 159 | 160 | } |
| 160 | - if (quadrant >= NQ) | |
| 161 | + if (ft->quadrant >= NQ) | |
| 161 | 162 | { |
| 162 | 163 | cut_abort(hSession,SC_ABORT_XMIT, "%s", _("Data conversion error")); |
| 163 | 164 | return -1; |
| ... | ... | @@ -178,7 +179,7 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) |
| 178 | 179 | { |
| 179 | 180 | /* Try a different quadrant. */ |
| 180 | 181 | // oq = quadrant; |
| 181 | - quadrant = -1; | |
| 182 | + ft->quadrant = -1; | |
| 182 | 183 | goto retry; |
| 183 | 184 | } |
| 184 | 185 | ix = ixp - alphas; |
| ... | ... | @@ -187,19 +188,19 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) |
| 187 | 188 | * See if it's mapped by that quadrant, handling NULLs |
| 188 | 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 | 193 | /* Try a different quadrant. */ |
| 193 | 194 | // oq = quadrant; |
| 194 | - quadrant = -1; | |
| 195 | + ft->quadrant = -1; | |
| 195 | 196 | goto retry; |
| 196 | 197 | } |
| 197 | 198 | |
| 198 | 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 | 202 | continue; |
| 202 | - if (ascii_flag && remap_flag) | |
| 203 | + if (ft->ascii_flag && ft->remap_flag) | |
| 203 | 204 | c = ft2asc[c]; |
| 204 | 205 | *ob++ = c; |
| 205 | 206 | } |
| ... | ... | @@ -207,60 +208,68 @@ static int upload_convert(H3270 *hSession, unsigned char *buf, int len) |
| 207 | 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 | 222 | unsigned char c = *buf++; |
| 219 | 223 | unsigned char *ixp; |
| 220 | 224 | unsigned ix; |
| 221 | 225 | int oq; |
| 222 | 226 | |
| 223 | 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 | 235 | *ob++ = XLATE_NULL; |
| 230 | 236 | continue; |
| 231 | 237 | } |
| 232 | 238 | |
| 233 | 239 | /* Translate. */ |
| 234 | - if (ascii_flag && remap_flag) | |
| 240 | + if (ft->ascii_flag && ft->remap_flag) | |
| 235 | 241 | c = asc2ft[c]; |
| 236 | 242 | |
| 237 | 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 | 249 | *ob++ = asc2ebc[(int)alphas[ix]]; |
| 244 | 250 | continue; |
| 245 | 251 | } |
| 246 | 252 | } |
| 247 | 253 | |
| 248 | 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 | 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 | 263 | if (ixp == (unsigned char *)NULL) |
| 256 | 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 | 267 | *ob++ = asc2ebc[(int)alphas[ix]]; |
| 260 | 268 | break; |
| 261 | 269 | } |
| 262 | - if (quadrant >= NQ) { | |
| 263 | - quadrant = -1; | |
| 270 | + if (ft->quadrant >= NQ) | |
| 271 | + { | |
| 272 | + ft->quadrant = -1; | |
| 264 | 273 | fprintf(stderr, "Oops\n"); |
| 265 | 274 | continue; |
| 266 | 275 | } |
| ... | ... | @@ -304,10 +313,11 @@ void ft_cut_data(H3270 *hSession) |
| 304 | 313 | */ |
| 305 | 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 | 322 | trace_ds(hSession,"< FT CONTROL_CODE "); |
| 313 | 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 | 327 | case SC_HOST_ACK: |
| 318 | 328 | trace_ds(hSession,"HOST_ACK\n"); |
| 319 | 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 | 333 | cut_ack(hSession); |
| 324 | - ft_running(NULL,True); | |
| 334 | + ft_running(hSession->ft,True); | |
| 325 | 335 | break; |
| 326 | 336 | |
| 327 | 337 | case SC_XFER_COMPLETE: |
| 328 | 338 | trace_ds(hSession,"XFER_COMPLETE\n"); |
| 329 | 339 | cut_ack(hSession); |
| 330 | 340 | hSession->cut_xfer_in_progress = 0; |
| 331 | - ft_complete(NULL,N_( "Complete" ) ); | |
| 341 | + ft_complete(ft,N_( "Complete" ) ); | |
| 332 | 342 | break; |
| 333 | 343 | |
| 334 | 344 | case SC_ABORT_FILE: |
| ... | ... | @@ -337,10 +347,10 @@ static void cut_control_code(H3270 *hSession) |
| 337 | 347 | hSession->cut_xfer_in_progress = 0; |
| 338 | 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 | 355 | else |
| 346 | 356 | { |
| ... | ... | @@ -363,7 +373,7 @@ static void cut_control_code(H3270 *hSession) |
| 363 | 373 | if (!*buf) |
| 364 | 374 | strcpy(buf, N_( "Transfer cancelled by host" ) ); |
| 365 | 375 | } |
| 366 | - ft_complete(NULL,buf); | |
| 376 | + ft_complete(hSession->ft,buf); | |
| 367 | 377 | lib3270_free(buf); |
| 368 | 378 | break; |
| 369 | 379 | |
| ... | ... | @@ -379,12 +389,13 @@ static void cut_control_code(H3270 *hSession) |
| 379 | 389 | */ |
| 380 | 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 | 400 | trace_ds(hSession,"< FT DATA_REQUEST %u\n", from6(seq)); |
| 390 | 401 | if (lib3270_get_ft_state(hSession) == FT_ABORT_WAIT) |
| ... | ... | @@ -393,15 +404,18 @@ static void cut_data_request(H3270 *hSession) |
| 393 | 404 | return; |
| 394 | 405 | } |
| 395 | 406 | |
| 407 | + | |
| 396 | 408 | /* Copy data into the screen buffer. */ |
| 397 | 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 | 412 | ctlr_add(hSession,O_UP_DATA + count, c, 0); |
| 400 | 413 | count++; |
| 401 | 414 | } |
| 402 | 415 | |
| 403 | 416 | /* Check for errors. */ |
| 404 | - if (ferror(((H3270FT *) hSession->ft)->local_file)) { | |
| 417 | + if (ferror(((H3270FT *) hSession->ft)->local_file)) | |
| 418 | + { | |
| 405 | 419 | int j; |
| 406 | 420 | |
| 407 | 421 | /* Clean out any data we may have written. */ |
| ... | ... | @@ -438,8 +452,8 @@ static void cut_data_request(H3270 *hSession) |
| 438 | 452 | |
| 439 | 453 | /* Send it up to the host. */ |
| 440 | 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 | 458 | lib3270_enter(hSession); |
| 445 | 459 | } |
| ... | ... | @@ -473,13 +487,14 @@ from6(unsigned char c) |
| 473 | 487 | */ |
| 474 | 488 | static void cut_data(H3270 *hSession) |
| 475 | 489 | { |
| 490 | + H3270FT *ft = get_ft_handle(hSession); | |
| 476 | 491 | static unsigned char cvbuf[O_RESPONSE - O_DT_DATA]; |
| 477 | 492 | unsigned short raw_length; |
| 478 | 493 | int conv_length; |
| 479 | 494 | register int i; |
| 480 | 495 | |
| 481 | 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 | 499 | cut_abort(hSession,SC_ABORT_FILE,"%s",_("Transfer cancelled by user")); |
| 485 | 500 | return; |
| ... | ... | @@ -510,14 +525,14 @@ static void cut_data(H3270 *hSession) |
| 510 | 525 | return; |
| 511 | 526 | |
| 512 | 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 | 530 | cut_abort(hSession,SC_ABORT_FILE,_( "Error \"%s\" writing to local file (rc=%d)" ),strerror(errno),errno); |
| 516 | 531 | } |
| 517 | 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 | 536 | cut_ack(hSession); |
| 522 | 537 | } |
| 523 | 538 | } |
| ... | ... | @@ -536,14 +551,15 @@ static void cut_ack(H3270 *hSession) |
| 536 | 551 | */ |
| 537 | 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 | 560 | /* Save the error message. */ |
| 545 | 561 | va_start(args, fmt); |
| 546 | - saved_errmsg = lib3270_vsprintf(fmt, args); | |
| 562 | + ft->saved_errmsg = lib3270_vsprintf(fmt, args); | |
| 547 | 563 | va_end(args); |
| 548 | 564 | |
| 549 | 565 | /* Send the abort sequence. */ |
| ... | ... | @@ -556,15 +572,15 @@ static void cut_abort(H3270 *hSession, unsigned short reason, const char *fmt, . |
| 556 | 572 | lib3270_pfkey(hSession,2); |
| 557 | 573 | |
| 558 | 574 | /* Update the in-progress pop-up. */ |
| 559 | - ft_aborting(NULL); | |
| 575 | + ft_aborting(ft); | |
| 560 | 576 | } |
| 561 | 577 | |
| 562 | -/* | |
| 578 | +/** | |
| 563 | 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 | 585 | int r; |
| 570 | 586 | int c; |
| ... | ... | @@ -573,25 +589,29 @@ xlate_getc(void) |
| 573 | 589 | int nc; |
| 574 | 590 | |
| 575 | 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 | 597 | return r; |
| 581 | 598 | } |
| 582 | 599 | |
| 583 | 600 | /* Get the next byte from the file. */ |
| 584 | - c = fgetc(((H3270FT *) h3270.ft)->local_file); | |
| 601 | + c = fgetc(ft->local_file); | |
| 585 | 602 | if (c == EOF) |
| 586 | 603 | return c; |
| 587 | - ft_length++; | |
| 604 | + ft->ft_length++; | |
| 588 | 605 | |
| 589 | 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 | 609 | nc = download_convert((unsigned const char *)"\r", 1, cbuf); |
| 592 | - } else { | |
| 610 | + } | |
| 611 | + else | |
| 612 | + { | |
| 593 | 613 | nc = 0; |
| 594 | - ft_last_cr = (c == '\r'); | |
| 614 | + ft->ft_last_cr = (c == '\r') ? 1 : 0; | |
| 595 | 615 | } |
| 596 | 616 | |
| 597 | 617 | /* Convert it. */ |
| ... | ... | @@ -600,12 +620,13 @@ xlate_getc(void) |
| 600 | 620 | |
| 601 | 621 | /* Return it and buffer what's left. */ |
| 602 | 622 | r = cbuf[0]; |
| 603 | - if (nc > 1) { | |
| 623 | + if (nc > 1) | |
| 624 | + { | |
| 604 | 625 | int i; |
| 605 | 626 | |
| 606 | 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 | 631 | return r; |
| 611 | 632 | } | ... | ... |
ft_dft.c
| ... | ... | @@ -59,34 +59,35 @@ |
| 59 | 59 | // extern unsigned char aid; |
| 60 | 60 | |
| 61 | 61 | /* Macros. */ |
| 62 | -#define OPEN_MSG "FT:MSG" /* Open request for message */ | |
| 62 | +#define OPEN_MSG "FT:MSG" /* Open request for message */ | |
| 63 | 63 | #define END_TRANSFER "TRANS03" /* Message for xfer complete */ |
| 64 | 64 | |
| 65 | 65 | #define DFT_MIN_BUF 256 |
| 66 | 66 | #define DFT_MAX_BUF 32768 |
| 67 | 67 | |
| 68 | 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 | 80 | /* Globals. */ |
| 80 | 81 | // int dft_buffersize = 0; /* Buffer size (LIMIN, LIMOUT) */ |
| 81 | 82 | |
| 82 | 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 | 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 | 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 | 159 | /* Process an Open request. */ |
| 159 | 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 | 168 | if (len == 0x23) |
| 167 | 169 | { |
| ... | ... | @@ -199,15 +201,15 @@ static void dft_open_request(H3270 *hSession, unsigned short len, unsigned char |
| 199 | 201 | } |
| 200 | 202 | |
| 201 | 203 | if (!strcmp(namebuf, OPEN_MSG)) |
| 202 | - message_flag = True; | |
| 204 | + ft->message_flag = 1; | |
| 203 | 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 | 214 | /* Acknowledge the Open. */ |
| 213 | 215 | trace_ds(hSession,"> WriteStructuredField FileTransferData OpenAck\n"); |
| ... | ... | @@ -231,10 +233,11 @@ static void dft_insert_request(H3270 *hSession) |
| 231 | 233 | static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) |
| 232 | 234 | { |
| 233 | 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 | 242 | dft_abort(hSession,TR_DATA_INSERT, "%s", _("Transfer cancelled by user") ); |
| 240 | 243 | return; |
| ... | ... | @@ -248,13 +251,13 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) |
| 248 | 251 | /* Adjust for 5 extra count */ |
| 249 | 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 | 257 | * First, check to see if we have message data or file data. |
| 255 | 258 | * Message data will result in a popup. |
| 256 | 259 | */ |
| 257 | - if (message_flag) | |
| 260 | + if (ft->message_flag) | |
| 258 | 261 | { |
| 259 | 262 | /* Data is from a message */ |
| 260 | 263 | unsigned char *msgp; |
| ... | ... | @@ -281,8 +284,8 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) |
| 281 | 284 | else if (lib3270_get_ft_state(hSession) == FT_ABORT_SENT && ((H3270FT *) hSession->ft)->abort_string != CN) |
| 282 | 285 | { |
| 283 | 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 | 290 | else |
| 288 | 291 | { |
| ... | ... | @@ -293,17 +296,20 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) |
| 293 | 296 | /* Write the data out to the file. */ |
| 294 | 297 | int rv = 1; |
| 295 | 298 | |
| 296 | - if (ascii_flag && remap_flag) { | |
| 299 | + if (ft->ascii_flag && ft->remap_flag) | |
| 300 | + { | |
| 297 | 301 | /* Filter. */ |
| 298 | 302 | unsigned char *s = (unsigned char *)data_bufr->data; |
| 299 | 303 | unsigned len = my_length; |
| 300 | 304 | |
| 301 | - while (len--) { | |
| 305 | + while (len--) | |
| 306 | + { | |
| 302 | 307 | *s = ft2asc[*s]; |
| 303 | 308 | s++; |
| 304 | 309 | } |
| 305 | 310 | } |
| 306 | - if (ascii_flag && cr_flag) { | |
| 311 | + if (ft->ascii_flag && ft->cr_flag) | |
| 312 | + { | |
| 307 | 313 | char *s = (char *)data_bufr->data; |
| 308 | 314 | unsigned len = my_length; |
| 309 | 315 | |
| ... | ... | @@ -316,7 +322,7 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) |
| 316 | 322 | rv = fwrite(s, l, (size_t)1,((H3270FT *) h3270.ft)->local_file); |
| 317 | 323 | if (rv == 0) |
| 318 | 324 | break; |
| 319 | - ft_length += l; | |
| 325 | + ft->ft_length += l; | |
| 320 | 326 | } |
| 321 | 327 | if (l < len) |
| 322 | 328 | l++; |
| ... | ... | @@ -325,7 +331,7 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) |
| 325 | 331 | } |
| 326 | 332 | } else { |
| 327 | 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 | 337 | if (!rv) { |
| ... | ... | @@ -334,11 +340,11 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) |
| 334 | 340 | } |
| 335 | 341 | |
| 336 | 342 | /* Add up amount transferred. */ |
| 337 | - ft_update_length((H3270FT *) hSession->ft); | |
| 343 | + ft_update_length(ft); | |
| 338 | 344 | } |
| 339 | 345 | |
| 340 | 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 | 348 | hSession->obptr = hSession->obuf; |
| 343 | 349 | space3270out(hSession,12); |
| 344 | 350 | *hSession->obptr++ = AID_SF; |
| ... | ... | @@ -346,8 +352,8 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) |
| 346 | 352 | *hSession->obptr++ = SF_TRANSFER_DATA; |
| 347 | 353 | SET16(hSession->obptr, TR_NORMAL_REPLY); |
| 348 | 354 | SET16(hSession->obptr, TR_RECNUM_HDR); |
| 349 | - SET32(hSession->obptr, recnum); | |
| 350 | - recnum++; | |
| 355 | + SET32(hSession->obptr, ft->recnum); | |
| 356 | + ft->recnum++; | |
| 351 | 357 | net_output(hSession); |
| 352 | 358 | } |
| 353 | 359 | |
| ... | ... | @@ -361,14 +367,15 @@ static void dft_set_cur_req(H3270 *hSession) |
| 361 | 367 | /* Process a Get request. */ |
| 362 | 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 | 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 | 380 | dft_abort(hSession,TR_GET_REQ, _( "Transfer cancelled by user" ) ); |
| 374 | 381 | return; |
| ... | ... | @@ -376,43 +383,46 @@ static void dft_get_request(H3270 *hSession) |
| 376 | 383 | |
| 377 | 384 | /* Read a buffer's worth. */ |
| 378 | 385 | set_dft_buffersize(hSession); |
| 379 | - space3270out(hSession,h3270.dft_buffersize); | |
| 386 | + space3270out(hSession,hSession->dft_buffersize); | |
| 380 | 387 | numbytes = h3270.dft_buffersize - 27; /* always read 5 bytes less than we're allowed */ |
| 381 | 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 | 394 | int c; |
| 386 | 395 | |
| 387 | 396 | /* Read one byte and do CR/LF translation. */ |
| 388 | - c = fgetc(((H3270FT *) h3270.ft)->local_file); | |
| 397 | + c = fgetc(ft->local_file); | |
| 389 | 398 | if (c == EOF) { |
| 390 | 399 | break; |
| 391 | 400 | } |
| 392 | - if (!ft_last_cr && c == '\n') { | |
| 401 | + if (!ft->ft_last_cr && c == '\n') | |
| 402 | + { | |
| 393 | 403 | if (numbytes < 2) { |
| 394 | 404 | /* |
| 395 | 405 | * Not enough room to expand NL to |
| 396 | 406 | * CR/LF. |
| 397 | 407 | */ |
| 398 | - ungetc(c, ((H3270FT *) h3270.ft)->local_file); | |
| 408 | + ungetc(c, ft->local_file); | |
| 399 | 409 | break; |
| 400 | 410 | } |
| 401 | 411 | *bufptr++ = '\r'; |
| 402 | 412 | numbytes--; |
| 403 | 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 | 417 | numbytes--; |
| 408 | 418 | total_read++; |
| 409 | 419 | } else { |
| 410 | 420 | /* Binary read. */ |
| 411 | - numread = fread(bufptr, 1, numbytes, ((H3270FT *) h3270.ft)->local_file); | |
| 421 | + numread = fread(bufptr, 1, numbytes, ft->local_file); | |
| 412 | 422 | if (numread <= 0) { |
| 413 | 423 | break; |
| 414 | 424 | } |
| 415 | - if (ascii_flag && remap_flag) { | |
| 425 | + if (ft->ascii_flag && ft->remap_flag) { | |
| 416 | 426 | unsigned char *s = bufptr; |
| 417 | 427 | int i = numread; |
| 418 | 428 | |
| ... | ... | @@ -426,7 +436,8 @@ static void dft_get_request(H3270 *hSession) |
| 426 | 436 | numbytes -= numread; |
| 427 | 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 | 441 | break; |
| 431 | 442 | } |
| 432 | 443 | } |
| ... | ... | @@ -439,55 +450,57 @@ static void dft_get_request(H3270 *hSession) |
| 439 | 450 | } |
| 440 | 451 | |
| 441 | 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 | 477 | } else { |
| 466 | 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 | 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 | 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 | 501 | /* Write the data. */ |
| 489 | 502 | net_output(hSession); |
| 490 | - ft_update_length((H3270FT *) h3270.ft); | |
| 503 | + ft_update_length(get_ft_handle(hSession)); | |
| 491 | 504 | } |
| 492 | 505 | |
| 493 | 506 | /* Process a Close request. */ |
| ... | ... | @@ -555,13 +568,15 @@ filter_len(char *s, register int len) |
| 555 | 568 | */ |
| 556 | 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 | 575 | trace_ds(hSession,"> WriteStructuredField FileTransferData\n"); |
| 561 | 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 | 580 | net_output(hSession); |
| 566 | 581 | } |
| 567 | 582 | } | ... | ... |
| ... | ... | @@ -22,22 +22,24 @@ |
| 22 | 22 | |
| 23 | 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 | 27 | LIB3270_INTERNAL Boolean ascii_flag; |
| 28 | 28 | LIB3270_INTERNAL Boolean cr_flag; |
| 29 | 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 | 45 | #endif /*]*/ | ... | ... |