diff --git a/api.h b/api.h index 624d981..b5b87c2 100644 --- a/api.h +++ b/api.h @@ -223,18 +223,15 @@ #define FT_ALLOCATION_UNITS_AVBLOCK 0x3000 #define FT_ALLOCATION_UNITS_MASK FT_ALLOCATION_UNITS_AVBLOCK - enum ft_state - { - FT_NONE, /**< No transfer in progress */ - FT_AWAIT_ACK, /**< IND$FILE sent, awaiting acknowledgement message */ - FT_RUNNING, /**< Ack received, data flowing */ - FT_ABORT_WAIT, /**< Awaiting chance to send an abort */ - FT_ABORT_SENT /**< Abort sent; awaiting response */ - }; + #define FT_NONE LIB3270_FT_STATE_NONE + #define FT_AWAIT_ACK LIB3270_FT_STATE_AWAIT_ACK + #define FT_RUNNING LIB3270_FT_STATE_RUNNING + #define FT_ABORT_WAIT LIB3270_FT_STATE_ABORT_WAIT + #define FT_ABORT_SENT LIB3270_FT_STATE_ABORT_SENT // LOCAL_EXTERN int BeginFileTransfer(unsigned short flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft); LOCAL_EXTERN int CancelFileTransfer(int force); - LOCAL_EXTERN enum ft_state GetFileTransferState(void); +// LOCAL_EXTERN enum ft_state GetFileTransferState(void); struct filetransfer_callbacks { @@ -264,7 +261,7 @@ #ifndef LIB3270 - LOCAL_EXTERN enum ft_state QueryFTstate(void); +// LOCAL_EXTERN enum ft_state QueryFTstate(void); #endif diff --git a/ctlr.c b/ctlr.c index abc471f..7b9b716 100644 --- a/ctlr.c +++ b/ctlr.c @@ -2284,10 +2284,10 @@ ps_process(void) #if defined(X3270_FT) /*[*/ /* Process file transfers. */ - if (ft_state != FT_NONE && /* transfer in progress */ - h3270.formatted && /* screen is formatted */ - !h3270.screen_alt && /* 24x80 screen */ - !kybdlock && /* keyboard not locked */ + if (lib3270_get_ft_state(&h3270) != LIB3270_FT_STATE_NONE && /* transfer in progress */ + h3270.formatted && /* screen is formatted */ + !h3270.screen_alt && /* 24x80 screen */ + !kybdlock && /* keyboard not locked */ /* magic field */ h3270.ea_buf[1919].fa && FA_IS_SKIP(h3270.ea_buf[1919].fa)) { ft_cut_data(); diff --git a/ft.c b/ft.c index 48a5b38..72976dd 100644 --- a/ft.c +++ b/ft.c @@ -74,11 +74,11 @@ static void ft_in3270(H3270 *session, int ignored unused, void *unused); #define BN (Boolean *)NULL // Globals. -H3270FT *ftsession = NULL; +static H3270FT *ftsession = NULL; #define CHECK_FT_HANDLE(x) if(!x) x = ftsession; -enum ft_state ft_state = FT_NONE; // File transfer state +// enum ft_state ft_state = FT_NONE; // File transfer state // char *ft_local_filename; // Local file to transfer to/from Boolean ft_last_cr = False; // CR was last char in local file Boolean ascii_flag = True; // Convert to ascii @@ -89,29 +89,39 @@ static Boolean ft_is_cut; // File transfer is CUT-style static struct timeval starting_time; // Starting time -static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to main application +// static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to main application #define snconcat(x,s,fmt,...) snprintf(x+strlen(x),s-strlen(x),fmt,__VA_ARGS__) -#define set_ft_state(x) ft_state = x +static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); + /*---[ Implement ]-------------------------------------------------------------------------------------------------------*/ - void ft_init(H3270FT *h) + static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state) { - /* Register for state changes. */ + CHECK_FT_HANDLE(session); - CHECK_FT_HANDLE(h); + if(session->state == state) + return; + + session->state = state; + session->state_changed(session,state); - lib3270_register_schange(h->host, ST_CONNECT, ( void (*)(H3270 *, int, void *)) ft_connected, NULL); - lib3270_register_schange(h->host, ST_3270_MODE, ( void (*)(H3270 *, int, void *)) ft_in3270, NULL); } - enum ft_state QueryFTstate(void) + void ft_init(H3270 *session) { - return ft_state; + /* Register for state changes. */ + lib3270_register_schange(session, ST_CONNECT, ( void (*)(H3270 *, int, void *)) ft_connected, NULL); + lib3270_register_schange(session, ST_3270_MODE, ( void (*)(H3270 *, int, void *)) ft_in3270, NULL); } +// enum ft_state QueryFTstate(void) +// { +// return ft_state; +// } + /* int RegisterFTCallbacks(const struct filetransfer_callbacks *cbk) { @@ -124,18 +134,19 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m } */ +/* enum ft_state GetFileTransferState(void) { return ft_state; } +*/ LIB3270_EXPORT int lib3270_ft_cancel(H3270FT *ft, int force) { - if (ft_state == FT_RUNNING) + if (ft->state == LIB3270_FT_STATE_RUNNING) { - set_ft_state(FT_ABORT_WAIT); - if(callbacks && callbacks->aborting) - callbacks->aborting(); + set_ft_state(ft,LIB3270_FT_STATE_ABORT_WAIT); + ft->aborting(ft); return 0; } @@ -143,11 +154,42 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m return EBUSY; // Impatient user or hung host -- just clean up. - ft_complete(ft, _("Cancelled by user") ); + ft_complete(ft, N_("Cancelled by user") ); + + return 0; + } + + static void def_complete(H3270FT *ft, const char *errmsg,unsigned long length,double kbytes_sec,const char *mode) + { + + } + + static void def_setlength(H3270FT *ft, unsigned long length) + { + + } + + static void def_update(H3270FT *ft, unsigned long length,double kbytes_sec) + { + + } + + static void def_running(H3270FT *ft, int is_cut) + { + + } + + static void def_aborting(H3270FT *ft) + { - return ECANCELED; } + static void def_state_changed(H3270FT *ft, LIB3270_FT_STATE state) + { + + } + + 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) { H3270FT * ftHandle = NULL; @@ -172,6 +214,14 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m errno = EBUSY; return NULL; } + + if(session->ft) + { + *msg = N_( "File transfer is already active in this session" ); + errno = EBUSY; + return NULL; + } + // Check remote file if(!*remote) { @@ -279,7 +329,6 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m (void) lib3270_emulate_input(NULL, buffer, strlen(buffer), False); // Get this thing started. - set_ft_state(FT_AWAIT_ACK); ft_last_cr = False; ft_is_cut = False; @@ -290,6 +339,15 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m ftHandle->sz = sizeof(H3270FT); ftHandle->host = session; ftHandle->ft_local_file = ft_local_file; + ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK; + ftHandle->complete = def_complete; + ftHandle->setlength = def_setlength; + ftHandle->update = def_update; + ftHandle->running = def_running; + ftHandle->aborting = def_aborting; + ftHandle->state_changed = def_state_changed; + + session->ft = ftHandle; return ftsession = ftHandle; } @@ -322,16 +380,18 @@ void ft_complete(H3270FT *session, const char *errmsg) } // Clean up the state. - set_ft_state(FT_NONE); + set_ft_state(session,FT_NONE); ft_update_length(session); - if(callbacks && callbacks->complete) - callbacks->complete(errmsg,ft_length,kbytes_sec,ft_is_cut ? "CUT" : "DFT"); + session->complete(session,errmsg,ft_length,kbytes_sec,ft_is_cut ? "CUT" : "DFT"); if(session == ftsession) ftsession = NULL; + if(session->host) + session->host->ft = NULL; + free(session); } @@ -355,8 +415,7 @@ void ft_update_length(H3270FT *session) Trace("%s",__FUNCTION__); - if(callbacks && callbacks->update) - callbacks->update(ft_length,kbytes_sec); + session->update(session,ft_length,kbytes_sec); } @@ -372,11 +431,10 @@ void ft_running(H3270FT *h, Boolean is_cut) (void) gettimeofday(&starting_time, (struct timezone *)NULL); - if (ft_state == FT_AWAIT_ACK) - set_ft_state(FT_RUNNING); + if (h->state == FT_AWAIT_ACK) + set_ft_state(h,FT_RUNNING); - if(callbacks && callbacks->running) - callbacks->running(is_cut); + h->running(h,is_cut); ft_update_length(h); @@ -385,29 +443,37 @@ void ft_running(H3270FT *h, Boolean is_cut) // Process a protocol-generated abort. void ft_aborting(H3270FT *h) { - Trace("%s",__FUNCTION__); +// Trace("%s",__FUNCTION__); CHECK_FT_HANDLE(h); - if (ft_state == FT_RUNNING || ft_state == FT_ABORT_WAIT) - set_ft_state(FT_ABORT_SENT); + if (h->state == FT_RUNNING || h->state == FT_ABORT_WAIT) + set_ft_state(h,FT_ABORT_SENT); - if(callbacks && callbacks->aborting) - callbacks->aborting(); + h->aborting(h); } /* Process a disconnect abort. */ static void ft_connected(H3270 *session, int ignored, void *dunno) { - if (!CONNECTED && ft_state != FT_NONE) - ft_complete(ftsession,_("Host disconnected, transfer cancelled")); + if (!CONNECTED && lib3270_get_ft_state(session) != LIB3270_FT_STATE_NONE) + ft_complete(session->ft,_("Host disconnected, transfer cancelled")); } /* Process an abort from no longer being in 3270 mode. */ static void ft_in3270(H3270 *session, int ignored, void *dunno) { - if (!IN_3270 && ft_state != FT_NONE) - ft_complete(ftsession,_("Not in 3270 mode, transfer cancelled")); + if (!IN_3270 && lib3270_get_ft_state(session) != LIB3270_FT_STATE_NONE) + ft_complete(session->ft,_("Not in 3270 mode, transfer cancelled")); } +LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session) +{ + CHECK_SESSION_HANDLE(session); + + if(!session->ft) + return LIB3270_FT_STATE_NONE; + + return ((H3270FT *) session->ft)->state; +} diff --git a/ft_cut.c b/ft_cut.c index 717ef17..00b7c35 100644 --- a/ft_cut.c +++ b/ft_cut.c @@ -332,7 +332,7 @@ cut_control_code(void) cut_xfer_in_progress = False; cut_ack(); - if (ft_state == FT_ABORT_SENT && saved_errmsg != CN) + if (lib3270_get_ft_state(&h3270) == FT_ABORT_SENT && saved_errmsg != CN) { buf = saved_errmsg; saved_errmsg = CN; @@ -383,8 +383,9 @@ cut_data_request(void) unsigned char attr; trace_ds("< FT DATA_REQUEST %u\n", from6(seq)); - if (ft_state == FT_ABORT_WAIT) { - cut_abort(SC_ABORT_FILE,"%s",_("Transfer cancelled by user")); + if (lib3270_get_ft_state(&h3270) == FT_ABORT_WAIT) + { + cut_abort(SC_ABORT_FILE,"%s",N_("Transfer cancelled by user")); return; } @@ -396,7 +397,7 @@ cut_data_request(void) } /* Check for errors. */ - if (ferror(ftsession->ft_local_file)) { + if (ferror(((H3270FT *) h3270.ft)->ft_local_file)) { int j; /* Clean out any data we may have written. */ @@ -409,7 +410,7 @@ cut_data_request(void) } /* Send special data for EOF. */ - if (!count && feof(ftsession->ft_local_file)) { + if (!count && feof(((H3270FT *) h3270.ft)->ft_local_file)) { ctlr_add(O_UP_DATA, EOF_DATA1, 0); ctlr_add(O_UP_DATA+1, EOF_DATA2, 0); count = 2; @@ -474,7 +475,8 @@ cut_data(void) register int i; trace_ds("< FT DATA\n"); - if (ft_state == FT_ABORT_WAIT) { + if (((H3270FT *) h3270.ft)->state == LIB3270_FT_STATE_ABORT_WAIT) + { cut_abort(SC_ABORT_FILE,"%s",_("Transfer cancelled by user")); return; } @@ -499,7 +501,7 @@ cut_data(void) return; /* Write it to the file. */ - if (fwrite((char *)cvbuf, conv_length, 1, ftsession->ft_local_file) == 0) { + if (fwrite((char *)cvbuf, conv_length, 1, ((H3270FT *) h3270.ft)->ft_local_file) == 0) { cut_abort(SC_ABORT_FILE,_( "Error \"%s\" writing to local file (rc=%d)" ),strerror(errno),errno); } else { ft_length += conv_length; @@ -567,7 +569,7 @@ xlate_getc(void) } /* Get the next byte from the file. */ - c = fgetc(ftsession->ft_local_file); + c = fgetc(((H3270FT *) h3270.ft)->ft_local_file); if (c == EOF) return c; ft_length++; diff --git a/ft_dft.c b/ft_dft.c index e569596..575cb8c 100644 --- a/ft_dft.c +++ b/ft_dft.c @@ -106,7 +106,8 @@ ft_dft_data(unsigned char *data, int length unused) unsigned short data_length, data_type; unsigned char *cp; - if (ft_state == FT_NONE) { + if (lib3270_get_ft_state(&h3270) == FT_NONE) + { trace_ds(" (no transfer in progress)\n"); return; } @@ -215,7 +216,7 @@ dft_data_insert(struct data_buffer *data_bufr) int my_length; unsigned char *cp; - if (!message_flag && ft_state == FT_ABORT_WAIT) + if(!message_flag && lib3270_get_ft_state(&h3270) == FT_ABORT_WAIT) { dft_abort(TR_DATA_INSERT, "%s", _("Transfer cancelled by user") ); return; @@ -257,7 +258,7 @@ dft_data_insert(struct data_buffer *data_bufr) if (memcmp(msgp, END_TRANSFER, strlen(END_TRANSFER)) == 0) { Free(msgp); ft_complete(NULL,NULL); - } else if (ft_state == FT_ABORT_SENT && abort_string != CN) { + } else if (lib3270_get_ft_state(&h3270) == FT_ABORT_SENT && abort_string != CN) { Free(msgp); ft_complete(NULL,abort_string); Replace(abort_string, CN); @@ -289,7 +290,7 @@ dft_data_insert(struct data_buffer *data_bufr) if (l) { - rv = fwrite(s, l, (size_t)1,ftsession->ft_local_file); + rv = fwrite(s, l, (size_t)1,((H3270FT *) h3270.ft)->ft_local_file); if (rv == 0) break; ft_length += l; @@ -300,7 +301,7 @@ dft_data_insert(struct data_buffer *data_bufr) len -= l; } } else { - rv = fwrite((char *)data_bufr->data, my_length,(size_t)1, ftsession->ft_local_file); + rv = fwrite((char *)data_bufr->data, my_length,(size_t)1, ((H3270FT *) h3270.ft)->ft_local_file); ft_length += my_length; } @@ -310,7 +311,7 @@ dft_data_insert(struct data_buffer *data_bufr) } /* Add up amount transferred. */ - ft_update_length(ftsession); + ft_update_length((H3270FT *) h3270.ft); } /* Send an acknowledgement frame back. */ @@ -346,7 +347,7 @@ dft_get_request(void) trace_ds(" Get\n"); - if (!message_flag && ft_state == FT_ABORT_WAIT) { + if (!message_flag && lib3270_get_ft_state(&h3270) == FT_ABORT_WAIT) { dft_abort(TR_GET_REQ, _( "Transfer cancelled by user" ) ); return; } @@ -361,7 +362,7 @@ dft_get_request(void) int c; /* Read one byte and do CR/LF translation. */ - c = fgetc(ftsession->ft_local_file); + c = fgetc(((H3270FT *) h3270.ft)->ft_local_file); if (c == EOF) { break; } @@ -371,7 +372,7 @@ dft_get_request(void) * Not enough room to expand NL to * CR/LF. */ - ungetc(c, ftsession->ft_local_file); + ungetc(c, ((H3270FT *) h3270.ft)->ft_local_file); break; } *bufptr++ = '\r'; @@ -384,7 +385,7 @@ dft_get_request(void) total_read++; } else { /* Binary read. */ - numread = fread(bufptr, 1, numbytes, ftsession->ft_local_file); + numread = fread(bufptr, 1, numbytes, ((H3270FT *) h3270.ft)->ft_local_file); if (numread <= 0) { break; } @@ -402,13 +403,13 @@ dft_get_request(void) numbytes -= numread; total_read += numread; } - if (feof(ftsession->ft_local_file) || ferror(ftsession->ft_local_file)) { + if (feof(((H3270FT *) h3270.ft)->ft_local_file) || ferror(((H3270FT *) h3270.ft)->ft_local_file)) { break; } } /* Check for read error. */ - if (ferror(ftsession->ft_local_file)) + if (ferror(((H3270FT *) h3270.ft)->ft_local_file)) { dft_abort(TR_GET_REQ, _( "Error \"%s\" reading from local file (rc=%d)" ), strerror(errno), errno); return; @@ -434,7 +435,7 @@ dft_get_request(void) ft_length += total_read; - if (feof(ftsession->ft_local_file)) + if (feof(((H3270FT *) h3270.ft)->ft_local_file)) { dft_eof = True; } @@ -464,7 +465,7 @@ dft_get_request(void) /* Write the data. */ net_output(); - ft_update_length(ftsession); + ft_update_length((H3270FT *) h3270.ft); } /* Process a Close request. */ @@ -512,7 +513,7 @@ static void dft_abort(unsigned short code, const char *fmt, ...) net_output(); /* Update the pop-up and state. */ - ft_aborting(ftsession); + ft_aborting((H3270FT *) h3270.ft); } /* Returns the number of bytes in s, limited by len, that aren't CRs or ^Zs. */ diff --git a/ftc.h b/ftc.h index 92d2d6d..37ac549 100644 --- a/ftc.h +++ b/ftc.h @@ -26,7 +26,7 @@ LIB3270_INTERNAL Boolean ascii_flag; LIB3270_INTERNAL Boolean cr_flag; LIB3270_INTERNAL unsigned long ft_length; -LIB3270_INTERNAL H3270FT * ftsession; +// LIB3270_INTERNAL H3270FT * ftsession; // LIB3270_INTERNAL FILE *ft_local_file; // extern char *ft_local_filename; @@ -34,7 +34,8 @@ LIB3270_INTERNAL H3270FT * ftsession; LIB3270_INTERNAL Boolean ft_last_cr; LIB3270_INTERNAL Boolean remap_flag; -LIB3270_INTERNAL void ft_init(H3270FT *h); +LIB3270_INTERNAL void ft_init(H3270 *session); + LIB3270_INTERNAL void ft_aborting(H3270FT *h); LIB3270_INTERNAL void ft_complete(H3270FT *h, const char *errmsg); LIB3270_INTERNAL void ft_running(H3270FT *h, Boolean is_cut); diff --git a/globals.h b/globals.h index d04b42e..cc385a1 100644 --- a/globals.h +++ b/globals.h @@ -262,7 +262,7 @@ LIB3270_INTERNAL int *xtra_width; */ /* Connection state */ -LIB3270_INTERNAL enum ft_state ft_state; +// LIB3270_INTERNAL enum ft_state ft_state; /* LIB3270_INTERNAL enum cstate cstate; diff --git a/init.c b/init.c index 2958bd4..1aeedd6 100644 --- a/init.c +++ b/init.c @@ -229,7 +229,7 @@ H3270 * lib3270_session_new(const char *model) ansi_init(); #if defined(X3270_FT) - ft_init(); + ft_init(hSession); #endif /* diff --git a/kybd.c b/kybd.c index 2ada857..36f3bd5 100644 --- a/kybd.c +++ b/kybd.c @@ -1464,7 +1464,7 @@ do_reset(Boolean explicit) if (explicit #if defined(X3270_FT) /*[*/ - || ft_state != FT_NONE + || lib3270_get_ft_state(&h3270) != LIB3270_FT_STATE_NONE #endif /*]*/ ) { Boolean half_reset = False; @@ -1503,7 +1503,7 @@ do_reset(Boolean explicit) */ if (explicit #if defined(X3270_FT) /*[*/ - || ft_state != FT_NONE + || lib3270_get_ft_state(&h3270) != LIB3270_FT_STATE_NONE #endif /*]*/ || (!appres.unlock_delay) // && !sms_in_macro()) || (unlock_delay_time != 0 && (time(NULL) - unlock_delay_time) > 1)) { -- libgit2 0.21.2