Commit bfcf4caaee030acb1aac0a8e7822f2d33b34c069

Authored by perry.werneck@gmail.com
1 parent 499a94ca

Ajustando transferência de arquivos para funcionar em multi-sessão

Showing 4 changed files with 306 additions and 264 deletions   Show diff stats
ft.c
... ... @@ -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 }
... ...
ftc.h
... ... @@ -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 /*]*/
... ...