Commit f7cac77fc646f851043e44fd8d8cdc9f36e788d1
1 parent
26c15e13
Exists in
master
and in
5 other branches
Atualizando transferência de arquivos
Showing
11 changed files
with
174 additions
and
83 deletions
Show diff stats
src/include/lib3270/filetransfer.h
| @@ -45,12 +45,29 @@ | @@ -45,12 +45,29 @@ | ||
| 45 | LIB3270_FT_OPTION_REMAP_ASCII = 0x0020 | 45 | LIB3270_FT_OPTION_REMAP_ASCII = 0x0020 |
| 46 | } LIB3270_FT_OPTION; | 46 | } LIB3270_FT_OPTION; |
| 47 | 47 | ||
| 48 | + typedef enum _lib3270_ft_state | ||
| 49 | + { | ||
| 50 | + LIB3270_FT_STATE_NONE, /**< No transfer in progress */ | ||
| 51 | + LIB3270_FT_STATE_AWAIT_ACK, /**< IND$FILE sent, awaiting acknowledgement message */ | ||
| 52 | + LIB3270_FT_STATE_RUNNING, /**< Ack received, data flowing */ | ||
| 53 | + LIB3270_FT_STATE_ABORT_WAIT, /**< Awaiting chance to send an abort */ | ||
| 54 | + LIB3270_FT_STATE_ABORT_SENT /**< Abort sent; awaiting response */ | ||
| 55 | + } LIB3270_FT_STATE; | ||
| 56 | + | ||
| 48 | typedef struct _h3270ft | 57 | typedef struct _h3270ft |
| 49 | { | 58 | { |
| 50 | - unsigned short sz; /**< Size of FT data structure */ | ||
| 51 | - H3270 * host; | ||
| 52 | - void * widget; /**< File transfer dialog handle */ | ||
| 53 | - FILE * ft_local_file; /**< File descriptor for local file */ | 59 | + unsigned short sz; /**< Size of FT data structure */ |
| 60 | + H3270 * host; | ||
| 61 | + void * widget; /**< File transfer dialog handle */ | ||
| 62 | + FILE * ft_local_file; /**< File descriptor for local file */ | ||
| 63 | + LIB3270_FT_STATE state; | ||
| 64 | + | ||
| 65 | + void (*complete)(struct _h3270ft *ft, const char *errmsg,unsigned long length,double kbytes_sec,const char *mode); | ||
| 66 | + void (*setlength)(struct _h3270ft *ft, unsigned long length); | ||
| 67 | + void (*update)(struct _h3270ft *ft, unsigned long length, double kbytes_sec); | ||
| 68 | + void (*running)(struct _h3270ft *ft, int is_cut); | ||
| 69 | + void (*aborting)(struct _h3270ft *ft); | ||
| 70 | + void (*state_changed)(struct _h3270ft *ft, LIB3270_FT_STATE state); | ||
| 54 | 71 | ||
| 55 | } H3270FT; | 72 | } H3270FT; |
| 56 | 73 | ||
| @@ -75,4 +92,8 @@ | @@ -75,4 +92,8 @@ | ||
| 75 | 92 | ||
| 76 | LIB3270_EXPORT int lib3270_ft_cancel(H3270FT *ft, int force); | 93 | LIB3270_EXPORT int lib3270_ft_cancel(H3270FT *ft, int force); |
| 77 | 94 | ||
| 95 | + | ||
| 96 | + LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session); | ||
| 97 | + | ||
| 98 | + | ||
| 78 | #endif // LIB3270_FILETRANSFER_INCLUDED | 99 | #endif // LIB3270_FILETRANSFER_INCLUDED |
src/include/lib3270/session.h
| @@ -103,6 +103,9 @@ | @@ -103,6 +103,9 @@ | ||
| 103 | 103 | ||
| 104 | unsigned short current_port; | 104 | unsigned short current_port; |
| 105 | 105 | ||
| 106 | + // Misc | ||
| 107 | + void * ft; /**< Active file transfer data */ | ||
| 108 | + | ||
| 106 | // screen info | 109 | // screen info |
| 107 | char * charset; | 110 | char * charset; |
| 108 | int ov_rows; | 111 | int ov_rows; |
src/lib3270/api.h
| @@ -223,18 +223,15 @@ | @@ -223,18 +223,15 @@ | ||
| 223 | #define FT_ALLOCATION_UNITS_AVBLOCK 0x3000 | 223 | #define FT_ALLOCATION_UNITS_AVBLOCK 0x3000 |
| 224 | #define FT_ALLOCATION_UNITS_MASK FT_ALLOCATION_UNITS_AVBLOCK | 224 | #define FT_ALLOCATION_UNITS_MASK FT_ALLOCATION_UNITS_AVBLOCK |
| 225 | 225 | ||
| 226 | - enum ft_state | ||
| 227 | - { | ||
| 228 | - FT_NONE, /**< No transfer in progress */ | ||
| 229 | - FT_AWAIT_ACK, /**< IND$FILE sent, awaiting acknowledgement message */ | ||
| 230 | - FT_RUNNING, /**< Ack received, data flowing */ | ||
| 231 | - FT_ABORT_WAIT, /**< Awaiting chance to send an abort */ | ||
| 232 | - FT_ABORT_SENT /**< Abort sent; awaiting response */ | ||
| 233 | - }; | 226 | + #define FT_NONE LIB3270_FT_STATE_NONE |
| 227 | + #define FT_AWAIT_ACK LIB3270_FT_STATE_AWAIT_ACK | ||
| 228 | + #define FT_RUNNING LIB3270_FT_STATE_RUNNING | ||
| 229 | + #define FT_ABORT_WAIT LIB3270_FT_STATE_ABORT_WAIT | ||
| 230 | + #define FT_ABORT_SENT LIB3270_FT_STATE_ABORT_SENT | ||
| 234 | 231 | ||
| 235 | // LOCAL_EXTERN int BeginFileTransfer(unsigned short flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft); | 232 | // LOCAL_EXTERN int BeginFileTransfer(unsigned short flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft); |
| 236 | LOCAL_EXTERN int CancelFileTransfer(int force); | 233 | LOCAL_EXTERN int CancelFileTransfer(int force); |
| 237 | - LOCAL_EXTERN enum ft_state GetFileTransferState(void); | 234 | +// LOCAL_EXTERN enum ft_state GetFileTransferState(void); |
| 238 | 235 | ||
| 239 | struct filetransfer_callbacks | 236 | struct filetransfer_callbacks |
| 240 | { | 237 | { |
| @@ -264,7 +261,7 @@ | @@ -264,7 +261,7 @@ | ||
| 264 | 261 | ||
| 265 | #ifndef LIB3270 | 262 | #ifndef LIB3270 |
| 266 | 263 | ||
| 267 | - LOCAL_EXTERN enum ft_state QueryFTstate(void); | 264 | +// LOCAL_EXTERN enum ft_state QueryFTstate(void); |
| 268 | 265 | ||
| 269 | #endif | 266 | #endif |
| 270 | 267 |
src/lib3270/ctlr.c
| @@ -2284,10 +2284,10 @@ ps_process(void) | @@ -2284,10 +2284,10 @@ ps_process(void) | ||
| 2284 | 2284 | ||
| 2285 | #if defined(X3270_FT) /*[*/ | 2285 | #if defined(X3270_FT) /*[*/ |
| 2286 | /* Process file transfers. */ | 2286 | /* Process file transfers. */ |
| 2287 | - if (ft_state != FT_NONE && /* transfer in progress */ | ||
| 2288 | - h3270.formatted && /* screen is formatted */ | ||
| 2289 | - !h3270.screen_alt && /* 24x80 screen */ | ||
| 2290 | - !kybdlock && /* keyboard not locked */ | 2287 | + if (lib3270_get_ft_state(&h3270) != LIB3270_FT_STATE_NONE && /* transfer in progress */ |
| 2288 | + h3270.formatted && /* screen is formatted */ | ||
| 2289 | + !h3270.screen_alt && /* 24x80 screen */ | ||
| 2290 | + !kybdlock && /* keyboard not locked */ | ||
| 2291 | /* magic field */ | 2291 | /* magic field */ |
| 2292 | h3270.ea_buf[1919].fa && FA_IS_SKIP(h3270.ea_buf[1919].fa)) { | 2292 | h3270.ea_buf[1919].fa && FA_IS_SKIP(h3270.ea_buf[1919].fa)) { |
| 2293 | ft_cut_data(); | 2293 | ft_cut_data(); |
src/lib3270/ft.c
| @@ -74,11 +74,11 @@ static void ft_in3270(H3270 *session, int ignored unused, void *unused); | @@ -74,11 +74,11 @@ static void ft_in3270(H3270 *session, int ignored unused, void *unused); | ||
| 74 | #define BN (Boolean *)NULL | 74 | #define BN (Boolean *)NULL |
| 75 | 75 | ||
| 76 | // Globals. | 76 | // Globals. |
| 77 | -H3270FT *ftsession = NULL; | 77 | +static H3270FT *ftsession = NULL; |
| 78 | 78 | ||
| 79 | #define CHECK_FT_HANDLE(x) if(!x) x = ftsession; | 79 | #define CHECK_FT_HANDLE(x) if(!x) x = ftsession; |
| 80 | 80 | ||
| 81 | -enum ft_state ft_state = FT_NONE; // File transfer state | 81 | +// enum ft_state ft_state = FT_NONE; // File transfer state |
| 82 | // char *ft_local_filename; // Local file to transfer to/from | 82 | // char *ft_local_filename; // Local file to transfer to/from |
| 83 | Boolean ft_last_cr = False; // CR was last char in local file | 83 | Boolean ft_last_cr = False; // CR was last char in local file |
| 84 | Boolean ascii_flag = True; // Convert to ascii | 84 | Boolean ascii_flag = True; // Convert to ascii |
| @@ -89,29 +89,39 @@ static Boolean ft_is_cut; // File transfer is CUT-style | @@ -89,29 +89,39 @@ static Boolean ft_is_cut; // File transfer is CUT-style | ||
| 89 | 89 | ||
| 90 | static struct timeval starting_time; // Starting time | 90 | static struct timeval starting_time; // Starting time |
| 91 | 91 | ||
| 92 | -static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to main application | 92 | +// static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to main application |
| 93 | 93 | ||
| 94 | #define snconcat(x,s,fmt,...) snprintf(x+strlen(x),s-strlen(x),fmt,__VA_ARGS__) | 94 | #define snconcat(x,s,fmt,...) snprintf(x+strlen(x),s-strlen(x),fmt,__VA_ARGS__) |
| 95 | 95 | ||
| 96 | -#define set_ft_state(x) ft_state = x | 96 | +static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 97 | + | ||
| 97 | 98 | ||
| 98 | /*---[ Implement ]-------------------------------------------------------------------------------------------------------*/ | 99 | /*---[ Implement ]-------------------------------------------------------------------------------------------------------*/ |
| 99 | 100 | ||
| 100 | - void ft_init(H3270FT *h) | 101 | + static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state) |
| 101 | { | 102 | { |
| 102 | - /* Register for state changes. */ | 103 | + CHECK_FT_HANDLE(session); |
| 103 | 104 | ||
| 104 | - CHECK_FT_HANDLE(h); | 105 | + if(session->state == state) |
| 106 | + return; | ||
| 107 | + | ||
| 108 | + session->state = state; | ||
| 109 | + session->state_changed(session,state); | ||
| 105 | 110 | ||
| 106 | - lib3270_register_schange(h->host, ST_CONNECT, ( void (*)(H3270 *, int, void *)) ft_connected, NULL); | ||
| 107 | - lib3270_register_schange(h->host, ST_3270_MODE, ( void (*)(H3270 *, int, void *)) ft_in3270, NULL); | ||
| 108 | } | 111 | } |
| 109 | 112 | ||
| 110 | - enum ft_state QueryFTstate(void) | 113 | + void ft_init(H3270 *session) |
| 111 | { | 114 | { |
| 112 | - return ft_state; | 115 | + /* Register for state changes. */ |
| 116 | + lib3270_register_schange(session, ST_CONNECT, ( void (*)(H3270 *, int, void *)) ft_connected, NULL); | ||
| 117 | + lib3270_register_schange(session, ST_3270_MODE, ( void (*)(H3270 *, int, void *)) ft_in3270, NULL); | ||
| 113 | } | 118 | } |
| 114 | 119 | ||
| 120 | +// enum ft_state QueryFTstate(void) | ||
| 121 | +// { | ||
| 122 | +// return ft_state; | ||
| 123 | +// } | ||
| 124 | + | ||
| 115 | /* | 125 | /* |
| 116 | int RegisterFTCallbacks(const struct filetransfer_callbacks *cbk) | 126 | int RegisterFTCallbacks(const struct filetransfer_callbacks *cbk) |
| 117 | { | 127 | { |
| @@ -124,18 +134,19 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m | @@ -124,18 +134,19 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m | ||
| 124 | } | 134 | } |
| 125 | */ | 135 | */ |
| 126 | 136 | ||
| 137 | +/* | ||
| 127 | enum ft_state GetFileTransferState(void) | 138 | enum ft_state GetFileTransferState(void) |
| 128 | { | 139 | { |
| 129 | return ft_state; | 140 | return ft_state; |
| 130 | } | 141 | } |
| 142 | +*/ | ||
| 131 | 143 | ||
| 132 | LIB3270_EXPORT int lib3270_ft_cancel(H3270FT *ft, int force) | 144 | LIB3270_EXPORT int lib3270_ft_cancel(H3270FT *ft, int force) |
| 133 | { | 145 | { |
| 134 | - if (ft_state == FT_RUNNING) | 146 | + if (ft->state == LIB3270_FT_STATE_RUNNING) |
| 135 | { | 147 | { |
| 136 | - set_ft_state(FT_ABORT_WAIT); | ||
| 137 | - if(callbacks && callbacks->aborting) | ||
| 138 | - callbacks->aborting(); | 148 | + set_ft_state(ft,LIB3270_FT_STATE_ABORT_WAIT); |
| 149 | + ft->aborting(ft); | ||
| 139 | return 0; | 150 | return 0; |
| 140 | } | 151 | } |
| 141 | 152 | ||
| @@ -143,11 +154,42 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m | @@ -143,11 +154,42 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m | ||
| 143 | return EBUSY; | 154 | return EBUSY; |
| 144 | 155 | ||
| 145 | // Impatient user or hung host -- just clean up. | 156 | // Impatient user or hung host -- just clean up. |
| 146 | - ft_complete(ft, _("Cancelled by user") ); | 157 | + ft_complete(ft, N_("Cancelled by user") ); |
| 158 | + | ||
| 159 | + return 0; | ||
| 160 | + } | ||
| 161 | + | ||
| 162 | + static void def_complete(H3270FT *ft, const char *errmsg,unsigned long length,double kbytes_sec,const char *mode) | ||
| 163 | + { | ||
| 164 | + | ||
| 165 | + } | ||
| 166 | + | ||
| 167 | + static void def_setlength(H3270FT *ft, unsigned long length) | ||
| 168 | + { | ||
| 169 | + | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + static void def_update(H3270FT *ft, unsigned long length,double kbytes_sec) | ||
| 173 | + { | ||
| 174 | + | ||
| 175 | + } | ||
| 176 | + | ||
| 177 | + static void def_running(H3270FT *ft, int is_cut) | ||
| 178 | + { | ||
| 179 | + | ||
| 180 | + } | ||
| 181 | + | ||
| 182 | + static void def_aborting(H3270FT *ft) | ||
| 183 | + { | ||
| 147 | 184 | ||
| 148 | - return ECANCELED; | ||
| 149 | } | 185 | } |
| 150 | 186 | ||
| 187 | + static void def_state_changed(H3270FT *ft, LIB3270_FT_STATE state) | ||
| 188 | + { | ||
| 189 | + | ||
| 190 | + } | ||
| 191 | + | ||
| 192 | + | ||
| 151 | LIB3270_EXPORT H3270FT * lib3270_ft_start(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) | 193 | LIB3270_EXPORT H3270FT * lib3270_ft_start(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) |
| 152 | { | 194 | { |
| 153 | H3270FT * ftHandle = NULL; | 195 | H3270FT * ftHandle = NULL; |
| @@ -172,6 +214,14 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m | @@ -172,6 +214,14 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m | ||
| 172 | errno = EBUSY; | 214 | errno = EBUSY; |
| 173 | return NULL; | 215 | return NULL; |
| 174 | } | 216 | } |
| 217 | + | ||
| 218 | + if(session->ft) | ||
| 219 | + { | ||
| 220 | + *msg = N_( "File transfer is already active in this session" ); | ||
| 221 | + errno = EBUSY; | ||
| 222 | + return NULL; | ||
| 223 | + } | ||
| 224 | + | ||
| 175 | // Check remote file | 225 | // Check remote file |
| 176 | if(!*remote) | 226 | if(!*remote) |
| 177 | { | 227 | { |
| @@ -279,7 +329,6 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m | @@ -279,7 +329,6 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m | ||
| 279 | (void) lib3270_emulate_input(NULL, buffer, strlen(buffer), False); | 329 | (void) lib3270_emulate_input(NULL, buffer, strlen(buffer), False); |
| 280 | 330 | ||
| 281 | // Get this thing started. | 331 | // Get this thing started. |
| 282 | - set_ft_state(FT_AWAIT_ACK); | ||
| 283 | 332 | ||
| 284 | ft_last_cr = False; | 333 | ft_last_cr = False; |
| 285 | ft_is_cut = False; | 334 | ft_is_cut = False; |
| @@ -290,6 +339,15 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m | @@ -290,6 +339,15 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m | ||
| 290 | ftHandle->sz = sizeof(H3270FT); | 339 | ftHandle->sz = sizeof(H3270FT); |
| 291 | ftHandle->host = session; | 340 | ftHandle->host = session; |
| 292 | ftHandle->ft_local_file = ft_local_file; | 341 | ftHandle->ft_local_file = ft_local_file; |
| 342 | + ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK; | ||
| 343 | + ftHandle->complete = def_complete; | ||
| 344 | + ftHandle->setlength = def_setlength; | ||
| 345 | + ftHandle->update = def_update; | ||
| 346 | + ftHandle->running = def_running; | ||
| 347 | + ftHandle->aborting = def_aborting; | ||
| 348 | + ftHandle->state_changed = def_state_changed; | ||
| 349 | + | ||
| 350 | + session->ft = ftHandle; | ||
| 293 | 351 | ||
| 294 | return ftsession = ftHandle; | 352 | return ftsession = ftHandle; |
| 295 | } | 353 | } |
| @@ -322,16 +380,18 @@ void ft_complete(H3270FT *session, const char *errmsg) | @@ -322,16 +380,18 @@ void ft_complete(H3270FT *session, const char *errmsg) | ||
| 322 | } | 380 | } |
| 323 | 381 | ||
| 324 | // Clean up the state. | 382 | // Clean up the state. |
| 325 | - set_ft_state(FT_NONE); | 383 | + set_ft_state(session,FT_NONE); |
| 326 | 384 | ||
| 327 | ft_update_length(session); | 385 | ft_update_length(session); |
| 328 | 386 | ||
| 329 | - if(callbacks && callbacks->complete) | ||
| 330 | - callbacks->complete(errmsg,ft_length,kbytes_sec,ft_is_cut ? "CUT" : "DFT"); | 387 | + session->complete(session,errmsg,ft_length,kbytes_sec,ft_is_cut ? "CUT" : "DFT"); |
| 331 | 388 | ||
| 332 | if(session == ftsession) | 389 | if(session == ftsession) |
| 333 | ftsession = NULL; | 390 | ftsession = NULL; |
| 334 | 391 | ||
| 392 | + if(session->host) | ||
| 393 | + session->host->ft = NULL; | ||
| 394 | + | ||
| 335 | free(session); | 395 | free(session); |
| 336 | 396 | ||
| 337 | } | 397 | } |
| @@ -355,8 +415,7 @@ void ft_update_length(H3270FT *session) | @@ -355,8 +415,7 @@ void ft_update_length(H3270FT *session) | ||
| 355 | 415 | ||
| 356 | Trace("%s",__FUNCTION__); | 416 | Trace("%s",__FUNCTION__); |
| 357 | 417 | ||
| 358 | - if(callbacks && callbacks->update) | ||
| 359 | - callbacks->update(ft_length,kbytes_sec); | 418 | + session->update(session,ft_length,kbytes_sec); |
| 360 | 419 | ||
| 361 | } | 420 | } |
| 362 | 421 | ||
| @@ -372,11 +431,10 @@ void ft_running(H3270FT *h, Boolean is_cut) | @@ -372,11 +431,10 @@ void ft_running(H3270FT *h, Boolean is_cut) | ||
| 372 | 431 | ||
| 373 | (void) gettimeofday(&starting_time, (struct timezone *)NULL); | 432 | (void) gettimeofday(&starting_time, (struct timezone *)NULL); |
| 374 | 433 | ||
| 375 | - if (ft_state == FT_AWAIT_ACK) | ||
| 376 | - set_ft_state(FT_RUNNING); | 434 | + if (h->state == FT_AWAIT_ACK) |
| 435 | + set_ft_state(h,FT_RUNNING); | ||
| 377 | 436 | ||
| 378 | - if(callbacks && callbacks->running) | ||
| 379 | - callbacks->running(is_cut); | 437 | + h->running(h,is_cut); |
| 380 | 438 | ||
| 381 | ft_update_length(h); | 439 | ft_update_length(h); |
| 382 | 440 | ||
| @@ -385,29 +443,37 @@ void ft_running(H3270FT *h, Boolean is_cut) | @@ -385,29 +443,37 @@ void ft_running(H3270FT *h, Boolean is_cut) | ||
| 385 | // Process a protocol-generated abort. | 443 | // Process a protocol-generated abort. |
| 386 | void ft_aborting(H3270FT *h) | 444 | void ft_aborting(H3270FT *h) |
| 387 | { | 445 | { |
| 388 | - Trace("%s",__FUNCTION__); | 446 | +// Trace("%s",__FUNCTION__); |
| 389 | 447 | ||
| 390 | CHECK_FT_HANDLE(h); | 448 | CHECK_FT_HANDLE(h); |
| 391 | 449 | ||
| 392 | - if (ft_state == FT_RUNNING || ft_state == FT_ABORT_WAIT) | ||
| 393 | - set_ft_state(FT_ABORT_SENT); | 450 | + if (h->state == FT_RUNNING || h->state == FT_ABORT_WAIT) |
| 451 | + set_ft_state(h,FT_ABORT_SENT); | ||
| 394 | 452 | ||
| 395 | - if(callbacks && callbacks->aborting) | ||
| 396 | - callbacks->aborting(); | 453 | + h->aborting(h); |
| 397 | 454 | ||
| 398 | } | 455 | } |
| 399 | 456 | ||
| 400 | /* Process a disconnect abort. */ | 457 | /* Process a disconnect abort. */ |
| 401 | static void ft_connected(H3270 *session, int ignored, void *dunno) | 458 | static void ft_connected(H3270 *session, int ignored, void *dunno) |
| 402 | { | 459 | { |
| 403 | - if (!CONNECTED && ft_state != FT_NONE) | ||
| 404 | - ft_complete(ftsession,_("Host disconnected, transfer cancelled")); | 460 | + if (!CONNECTED && lib3270_get_ft_state(session) != LIB3270_FT_STATE_NONE) |
| 461 | + ft_complete(session->ft,_("Host disconnected, transfer cancelled")); | ||
| 405 | } | 462 | } |
| 406 | 463 | ||
| 407 | /* Process an abort from no longer being in 3270 mode. */ | 464 | /* Process an abort from no longer being in 3270 mode. */ |
| 408 | static void ft_in3270(H3270 *session, int ignored, void *dunno) | 465 | static void ft_in3270(H3270 *session, int ignored, void *dunno) |
| 409 | { | 466 | { |
| 410 | - if (!IN_3270 && ft_state != FT_NONE) | ||
| 411 | - ft_complete(ftsession,_("Not in 3270 mode, transfer cancelled")); | 467 | + if (!IN_3270 && lib3270_get_ft_state(session) != LIB3270_FT_STATE_NONE) |
| 468 | + ft_complete(session->ft,_("Not in 3270 mode, transfer cancelled")); | ||
| 412 | } | 469 | } |
| 413 | 470 | ||
| 471 | +LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session) | ||
| 472 | +{ | ||
| 473 | + CHECK_SESSION_HANDLE(session); | ||
| 474 | + | ||
| 475 | + if(!session->ft) | ||
| 476 | + return LIB3270_FT_STATE_NONE; | ||
| 477 | + | ||
| 478 | + return ((H3270FT *) session->ft)->state; | ||
| 479 | +} |
src/lib3270/ft_cut.c
| @@ -332,7 +332,7 @@ cut_control_code(void) | @@ -332,7 +332,7 @@ cut_control_code(void) | ||
| 332 | cut_xfer_in_progress = False; | 332 | cut_xfer_in_progress = False; |
| 333 | cut_ack(); | 333 | cut_ack(); |
| 334 | 334 | ||
| 335 | - if (ft_state == FT_ABORT_SENT && saved_errmsg != CN) | 335 | + if (lib3270_get_ft_state(&h3270) == FT_ABORT_SENT && saved_errmsg != CN) |
| 336 | { | 336 | { |
| 337 | buf = saved_errmsg; | 337 | buf = saved_errmsg; |
| 338 | saved_errmsg = CN; | 338 | saved_errmsg = CN; |
| @@ -383,8 +383,9 @@ cut_data_request(void) | @@ -383,8 +383,9 @@ cut_data_request(void) | ||
| 383 | unsigned char attr; | 383 | unsigned char attr; |
| 384 | 384 | ||
| 385 | trace_ds("< FT DATA_REQUEST %u\n", from6(seq)); | 385 | trace_ds("< FT DATA_REQUEST %u\n", from6(seq)); |
| 386 | - if (ft_state == FT_ABORT_WAIT) { | ||
| 387 | - cut_abort(SC_ABORT_FILE,"%s",_("Transfer cancelled by user")); | 386 | + if (lib3270_get_ft_state(&h3270) == FT_ABORT_WAIT) |
| 387 | + { | ||
| 388 | + cut_abort(SC_ABORT_FILE,"%s",N_("Transfer cancelled by user")); | ||
| 388 | return; | 389 | return; |
| 389 | } | 390 | } |
| 390 | 391 | ||
| @@ -396,7 +397,7 @@ cut_data_request(void) | @@ -396,7 +397,7 @@ cut_data_request(void) | ||
| 396 | } | 397 | } |
| 397 | 398 | ||
| 398 | /* Check for errors. */ | 399 | /* Check for errors. */ |
| 399 | - if (ferror(ftsession->ft_local_file)) { | 400 | + if (ferror(((H3270FT *) h3270.ft)->ft_local_file)) { |
| 400 | int j; | 401 | int j; |
| 401 | 402 | ||
| 402 | /* Clean out any data we may have written. */ | 403 | /* Clean out any data we may have written. */ |
| @@ -409,7 +410,7 @@ cut_data_request(void) | @@ -409,7 +410,7 @@ cut_data_request(void) | ||
| 409 | } | 410 | } |
| 410 | 411 | ||
| 411 | /* Send special data for EOF. */ | 412 | /* Send special data for EOF. */ |
| 412 | - if (!count && feof(ftsession->ft_local_file)) { | 413 | + if (!count && feof(((H3270FT *) h3270.ft)->ft_local_file)) { |
| 413 | ctlr_add(O_UP_DATA, EOF_DATA1, 0); | 414 | ctlr_add(O_UP_DATA, EOF_DATA1, 0); |
| 414 | ctlr_add(O_UP_DATA+1, EOF_DATA2, 0); | 415 | ctlr_add(O_UP_DATA+1, EOF_DATA2, 0); |
| 415 | count = 2; | 416 | count = 2; |
| @@ -474,7 +475,8 @@ cut_data(void) | @@ -474,7 +475,8 @@ cut_data(void) | ||
| 474 | register int i; | 475 | register int i; |
| 475 | 476 | ||
| 476 | trace_ds("< FT DATA\n"); | 477 | trace_ds("< FT DATA\n"); |
| 477 | - if (ft_state == FT_ABORT_WAIT) { | 478 | + if (((H3270FT *) h3270.ft)->state == LIB3270_FT_STATE_ABORT_WAIT) |
| 479 | + { | ||
| 478 | cut_abort(SC_ABORT_FILE,"%s",_("Transfer cancelled by user")); | 480 | cut_abort(SC_ABORT_FILE,"%s",_("Transfer cancelled by user")); |
| 479 | return; | 481 | return; |
| 480 | } | 482 | } |
| @@ -499,7 +501,7 @@ cut_data(void) | @@ -499,7 +501,7 @@ cut_data(void) | ||
| 499 | return; | 501 | return; |
| 500 | 502 | ||
| 501 | /* Write it to the file. */ | 503 | /* Write it to the file. */ |
| 502 | - if (fwrite((char *)cvbuf, conv_length, 1, ftsession->ft_local_file) == 0) { | 504 | + if (fwrite((char *)cvbuf, conv_length, 1, ((H3270FT *) h3270.ft)->ft_local_file) == 0) { |
| 503 | cut_abort(SC_ABORT_FILE,_( "Error \"%s\" writing to local file (rc=%d)" ),strerror(errno),errno); | 505 | cut_abort(SC_ABORT_FILE,_( "Error \"%s\" writing to local file (rc=%d)" ),strerror(errno),errno); |
| 504 | } else { | 506 | } else { |
| 505 | ft_length += conv_length; | 507 | ft_length += conv_length; |
| @@ -567,7 +569,7 @@ xlate_getc(void) | @@ -567,7 +569,7 @@ xlate_getc(void) | ||
| 567 | } | 569 | } |
| 568 | 570 | ||
| 569 | /* Get the next byte from the file. */ | 571 | /* Get the next byte from the file. */ |
| 570 | - c = fgetc(ftsession->ft_local_file); | 572 | + c = fgetc(((H3270FT *) h3270.ft)->ft_local_file); |
| 571 | if (c == EOF) | 573 | if (c == EOF) |
| 572 | return c; | 574 | return c; |
| 573 | ft_length++; | 575 | ft_length++; |
src/lib3270/ft_dft.c
| @@ -106,7 +106,8 @@ ft_dft_data(unsigned char *data, int length unused) | @@ -106,7 +106,8 @@ ft_dft_data(unsigned char *data, int length unused) | ||
| 106 | unsigned short data_length, data_type; | 106 | unsigned short data_length, data_type; |
| 107 | unsigned char *cp; | 107 | unsigned char *cp; |
| 108 | 108 | ||
| 109 | - if (ft_state == FT_NONE) { | 109 | + if (lib3270_get_ft_state(&h3270) == FT_NONE) |
| 110 | + { | ||
| 110 | trace_ds(" (no transfer in progress)\n"); | 111 | trace_ds(" (no transfer in progress)\n"); |
| 111 | return; | 112 | return; |
| 112 | } | 113 | } |
| @@ -215,7 +216,7 @@ dft_data_insert(struct data_buffer *data_bufr) | @@ -215,7 +216,7 @@ dft_data_insert(struct data_buffer *data_bufr) | ||
| 215 | int my_length; | 216 | int my_length; |
| 216 | unsigned char *cp; | 217 | unsigned char *cp; |
| 217 | 218 | ||
| 218 | - if (!message_flag && ft_state == FT_ABORT_WAIT) | 219 | + if(!message_flag && lib3270_get_ft_state(&h3270) == FT_ABORT_WAIT) |
| 219 | { | 220 | { |
| 220 | dft_abort(TR_DATA_INSERT, "%s", _("Transfer cancelled by user") ); | 221 | dft_abort(TR_DATA_INSERT, "%s", _("Transfer cancelled by user") ); |
| 221 | return; | 222 | return; |
| @@ -257,7 +258,7 @@ dft_data_insert(struct data_buffer *data_bufr) | @@ -257,7 +258,7 @@ dft_data_insert(struct data_buffer *data_bufr) | ||
| 257 | if (memcmp(msgp, END_TRANSFER, strlen(END_TRANSFER)) == 0) { | 258 | if (memcmp(msgp, END_TRANSFER, strlen(END_TRANSFER)) == 0) { |
| 258 | Free(msgp); | 259 | Free(msgp); |
| 259 | ft_complete(NULL,NULL); | 260 | ft_complete(NULL,NULL); |
| 260 | - } else if (ft_state == FT_ABORT_SENT && abort_string != CN) { | 261 | + } else if (lib3270_get_ft_state(&h3270) == FT_ABORT_SENT && abort_string != CN) { |
| 261 | Free(msgp); | 262 | Free(msgp); |
| 262 | ft_complete(NULL,abort_string); | 263 | ft_complete(NULL,abort_string); |
| 263 | Replace(abort_string, CN); | 264 | Replace(abort_string, CN); |
| @@ -289,7 +290,7 @@ dft_data_insert(struct data_buffer *data_bufr) | @@ -289,7 +290,7 @@ dft_data_insert(struct data_buffer *data_bufr) | ||
| 289 | 290 | ||
| 290 | if (l) | 291 | if (l) |
| 291 | { | 292 | { |
| 292 | - rv = fwrite(s, l, (size_t)1,ftsession->ft_local_file); | 293 | + rv = fwrite(s, l, (size_t)1,((H3270FT *) h3270.ft)->ft_local_file); |
| 293 | if (rv == 0) | 294 | if (rv == 0) |
| 294 | break; | 295 | break; |
| 295 | ft_length += l; | 296 | ft_length += l; |
| @@ -300,7 +301,7 @@ dft_data_insert(struct data_buffer *data_bufr) | @@ -300,7 +301,7 @@ dft_data_insert(struct data_buffer *data_bufr) | ||
| 300 | len -= l; | 301 | len -= l; |
| 301 | } | 302 | } |
| 302 | } else { | 303 | } else { |
| 303 | - rv = fwrite((char *)data_bufr->data, my_length,(size_t)1, ftsession->ft_local_file); | 304 | + rv = fwrite((char *)data_bufr->data, my_length,(size_t)1, ((H3270FT *) h3270.ft)->ft_local_file); |
| 304 | ft_length += my_length; | 305 | ft_length += my_length; |
| 305 | } | 306 | } |
| 306 | 307 | ||
| @@ -310,7 +311,7 @@ dft_data_insert(struct data_buffer *data_bufr) | @@ -310,7 +311,7 @@ dft_data_insert(struct data_buffer *data_bufr) | ||
| 310 | } | 311 | } |
| 311 | 312 | ||
| 312 | /* Add up amount transferred. */ | 313 | /* Add up amount transferred. */ |
| 313 | - ft_update_length(ftsession); | 314 | + ft_update_length((H3270FT *) h3270.ft); |
| 314 | } | 315 | } |
| 315 | 316 | ||
| 316 | /* Send an acknowledgement frame back. */ | 317 | /* Send an acknowledgement frame back. */ |
| @@ -346,7 +347,7 @@ dft_get_request(void) | @@ -346,7 +347,7 @@ dft_get_request(void) | ||
| 346 | 347 | ||
| 347 | trace_ds(" Get\n"); | 348 | trace_ds(" Get\n"); |
| 348 | 349 | ||
| 349 | - if (!message_flag && ft_state == FT_ABORT_WAIT) { | 350 | + if (!message_flag && lib3270_get_ft_state(&h3270) == FT_ABORT_WAIT) { |
| 350 | dft_abort(TR_GET_REQ, _( "Transfer cancelled by user" ) ); | 351 | dft_abort(TR_GET_REQ, _( "Transfer cancelled by user" ) ); |
| 351 | return; | 352 | return; |
| 352 | } | 353 | } |
| @@ -361,7 +362,7 @@ dft_get_request(void) | @@ -361,7 +362,7 @@ dft_get_request(void) | ||
| 361 | int c; | 362 | int c; |
| 362 | 363 | ||
| 363 | /* Read one byte and do CR/LF translation. */ | 364 | /* Read one byte and do CR/LF translation. */ |
| 364 | - c = fgetc(ftsession->ft_local_file); | 365 | + c = fgetc(((H3270FT *) h3270.ft)->ft_local_file); |
| 365 | if (c == EOF) { | 366 | if (c == EOF) { |
| 366 | break; | 367 | break; |
| 367 | } | 368 | } |
| @@ -371,7 +372,7 @@ dft_get_request(void) | @@ -371,7 +372,7 @@ dft_get_request(void) | ||
| 371 | * Not enough room to expand NL to | 372 | * Not enough room to expand NL to |
| 372 | * CR/LF. | 373 | * CR/LF. |
| 373 | */ | 374 | */ |
| 374 | - ungetc(c, ftsession->ft_local_file); | 375 | + ungetc(c, ((H3270FT *) h3270.ft)->ft_local_file); |
| 375 | break; | 376 | break; |
| 376 | } | 377 | } |
| 377 | *bufptr++ = '\r'; | 378 | *bufptr++ = '\r'; |
| @@ -384,7 +385,7 @@ dft_get_request(void) | @@ -384,7 +385,7 @@ dft_get_request(void) | ||
| 384 | total_read++; | 385 | total_read++; |
| 385 | } else { | 386 | } else { |
| 386 | /* Binary read. */ | 387 | /* Binary read. */ |
| 387 | - numread = fread(bufptr, 1, numbytes, ftsession->ft_local_file); | 388 | + numread = fread(bufptr, 1, numbytes, ((H3270FT *) h3270.ft)->ft_local_file); |
| 388 | if (numread <= 0) { | 389 | if (numread <= 0) { |
| 389 | break; | 390 | break; |
| 390 | } | 391 | } |
| @@ -402,13 +403,13 @@ dft_get_request(void) | @@ -402,13 +403,13 @@ dft_get_request(void) | ||
| 402 | numbytes -= numread; | 403 | numbytes -= numread; |
| 403 | total_read += numread; | 404 | total_read += numread; |
| 404 | } | 405 | } |
| 405 | - if (feof(ftsession->ft_local_file) || ferror(ftsession->ft_local_file)) { | 406 | + if (feof(((H3270FT *) h3270.ft)->ft_local_file) || ferror(((H3270FT *) h3270.ft)->ft_local_file)) { |
| 406 | break; | 407 | break; |
| 407 | } | 408 | } |
| 408 | } | 409 | } |
| 409 | 410 | ||
| 410 | /* Check for read error. */ | 411 | /* Check for read error. */ |
| 411 | - if (ferror(ftsession->ft_local_file)) | 412 | + if (ferror(((H3270FT *) h3270.ft)->ft_local_file)) |
| 412 | { | 413 | { |
| 413 | dft_abort(TR_GET_REQ, _( "Error \"%s\" reading from local file (rc=%d)" ), strerror(errno), errno); | 414 | dft_abort(TR_GET_REQ, _( "Error \"%s\" reading from local file (rc=%d)" ), strerror(errno), errno); |
| 414 | return; | 415 | return; |
| @@ -434,7 +435,7 @@ dft_get_request(void) | @@ -434,7 +435,7 @@ dft_get_request(void) | ||
| 434 | 435 | ||
| 435 | ft_length += total_read; | 436 | ft_length += total_read; |
| 436 | 437 | ||
| 437 | - if (feof(ftsession->ft_local_file)) | 438 | + if (feof(((H3270FT *) h3270.ft)->ft_local_file)) |
| 438 | { | 439 | { |
| 439 | dft_eof = True; | 440 | dft_eof = True; |
| 440 | } | 441 | } |
| @@ -464,7 +465,7 @@ dft_get_request(void) | @@ -464,7 +465,7 @@ dft_get_request(void) | ||
| 464 | 465 | ||
| 465 | /* Write the data. */ | 466 | /* Write the data. */ |
| 466 | net_output(); | 467 | net_output(); |
| 467 | - ft_update_length(ftsession); | 468 | + ft_update_length((H3270FT *) h3270.ft); |
| 468 | } | 469 | } |
| 469 | 470 | ||
| 470 | /* Process a Close request. */ | 471 | /* Process a Close request. */ |
| @@ -512,7 +513,7 @@ static void dft_abort(unsigned short code, const char *fmt, ...) | @@ -512,7 +513,7 @@ static void dft_abort(unsigned short code, const char *fmt, ...) | ||
| 512 | net_output(); | 513 | net_output(); |
| 513 | 514 | ||
| 514 | /* Update the pop-up and state. */ | 515 | /* Update the pop-up and state. */ |
| 515 | - ft_aborting(ftsession); | 516 | + ft_aborting((H3270FT *) h3270.ft); |
| 516 | } | 517 | } |
| 517 | 518 | ||
| 518 | /* Returns the number of bytes in s, limited by len, that aren't CRs or ^Zs. */ | 519 | /* Returns the number of bytes in s, limited by len, that aren't CRs or ^Zs. */ |
src/lib3270/ftc.h
| @@ -26,7 +26,7 @@ LIB3270_INTERNAL Boolean ascii_flag; | @@ -26,7 +26,7 @@ LIB3270_INTERNAL Boolean ascii_flag; | ||
| 26 | LIB3270_INTERNAL Boolean cr_flag; | 26 | LIB3270_INTERNAL Boolean cr_flag; |
| 27 | LIB3270_INTERNAL unsigned long ft_length; | 27 | LIB3270_INTERNAL unsigned long ft_length; |
| 28 | 28 | ||
| 29 | -LIB3270_INTERNAL H3270FT * ftsession; | 29 | +// LIB3270_INTERNAL H3270FT * ftsession; |
| 30 | 30 | ||
| 31 | // LIB3270_INTERNAL FILE *ft_local_file; | 31 | // LIB3270_INTERNAL FILE *ft_local_file; |
| 32 | // extern char *ft_local_filename; | 32 | // extern char *ft_local_filename; |
| @@ -34,7 +34,8 @@ LIB3270_INTERNAL H3270FT * ftsession; | @@ -34,7 +34,8 @@ LIB3270_INTERNAL H3270FT * ftsession; | ||
| 34 | LIB3270_INTERNAL Boolean ft_last_cr; | 34 | LIB3270_INTERNAL Boolean ft_last_cr; |
| 35 | LIB3270_INTERNAL Boolean remap_flag; | 35 | LIB3270_INTERNAL Boolean remap_flag; |
| 36 | 36 | ||
| 37 | -LIB3270_INTERNAL void ft_init(H3270FT *h); | 37 | +LIB3270_INTERNAL void ft_init(H3270 *session); |
| 38 | + | ||
| 38 | LIB3270_INTERNAL void ft_aborting(H3270FT *h); | 39 | LIB3270_INTERNAL void ft_aborting(H3270FT *h); |
| 39 | LIB3270_INTERNAL void ft_complete(H3270FT *h, const char *errmsg); | 40 | 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_running(H3270FT *h, Boolean is_cut); |
src/lib3270/globals.h
| @@ -262,7 +262,7 @@ LIB3270_INTERNAL int *xtra_width; | @@ -262,7 +262,7 @@ LIB3270_INTERNAL int *xtra_width; | ||
| 262 | */ | 262 | */ |
| 263 | 263 | ||
| 264 | /* Connection state */ | 264 | /* Connection state */ |
| 265 | -LIB3270_INTERNAL enum ft_state ft_state; | 265 | +// LIB3270_INTERNAL enum ft_state ft_state; |
| 266 | 266 | ||
| 267 | /* | 267 | /* |
| 268 | LIB3270_INTERNAL enum cstate cstate; | 268 | LIB3270_INTERNAL enum cstate cstate; |
src/lib3270/init.c
| @@ -229,7 +229,7 @@ H3270 * lib3270_session_new(const char *model) | @@ -229,7 +229,7 @@ H3270 * lib3270_session_new(const char *model) | ||
| 229 | ansi_init(); | 229 | ansi_init(); |
| 230 | 230 | ||
| 231 | #if defined(X3270_FT) | 231 | #if defined(X3270_FT) |
| 232 | - ft_init(); | 232 | + ft_init(hSession); |
| 233 | #endif | 233 | #endif |
| 234 | 234 | ||
| 235 | /* | 235 | /* |
src/lib3270/kybd.c
| @@ -1464,7 +1464,7 @@ do_reset(Boolean explicit) | @@ -1464,7 +1464,7 @@ do_reset(Boolean explicit) | ||
| 1464 | 1464 | ||
| 1465 | if (explicit | 1465 | if (explicit |
| 1466 | #if defined(X3270_FT) /*[*/ | 1466 | #if defined(X3270_FT) /*[*/ |
| 1467 | - || ft_state != FT_NONE | 1467 | + || lib3270_get_ft_state(&h3270) != LIB3270_FT_STATE_NONE |
| 1468 | #endif /*]*/ | 1468 | #endif /*]*/ |
| 1469 | ) { | 1469 | ) { |
| 1470 | Boolean half_reset = False; | 1470 | Boolean half_reset = False; |
| @@ -1503,7 +1503,7 @@ do_reset(Boolean explicit) | @@ -1503,7 +1503,7 @@ do_reset(Boolean explicit) | ||
| 1503 | */ | 1503 | */ |
| 1504 | if (explicit | 1504 | if (explicit |
| 1505 | #if defined(X3270_FT) /*[*/ | 1505 | #if defined(X3270_FT) /*[*/ |
| 1506 | - || ft_state != FT_NONE | 1506 | + || lib3270_get_ft_state(&h3270) != LIB3270_FT_STATE_NONE |
| 1507 | #endif /*]*/ | 1507 | #endif /*]*/ |
| 1508 | || (!appres.unlock_delay) // && !sms_in_macro()) | 1508 | || (!appres.unlock_delay) // && !sms_in_macro()) |
| 1509 | || (unlock_delay_time != 0 && (time(NULL) - unlock_delay_time) > 1)) { | 1509 | || (unlock_delay_time != 0 && (time(NULL) - unlock_delay_time) > 1)) { |