diff --git a/Makefile.in b/Makefile.in index 2b3d163..a284dd6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -147,8 +147,6 @@ endif #---[ Targets ]---------------------------------------------------------------- -lang: $(foreach SRC, $(basename $(LANG_FILES)), $(SRC).po) - tgz: $(PACKAGE_TARNAME)-$(PACKAGE_VERSION).tar.gz rpm: $(PACKAGE_TARNAME)-$(PACKAGE_VERSION).tar.gz @@ -206,6 +204,8 @@ install-app: install-locale install-lib: @$(MAKE) BINRLS="../../.bin/Release/lib" -C src/lib3270 install +locale: $(foreach SRC, $(basename $(LANG_FILES)), $(SRC).po) + install-locale: $(foreach MO, $(basename $(LANG_FILES)), $(BINDIR)/Release/$(localedir)/$(notdir $(MO))/LC_MESSAGES/$(PACKAGE_NAME).mo) @echo -e $(foreach MO, $(notdir $(basename $(LANG_FILES))), mkdir -p $(DESTDIR)/$(localedir)/$(MO)/LC_MESSAGES\\n$(INSTALL_DATA) $(BINDIR)/Release/$(localedir)/$(MO)/LC_MESSAGES/$(PACKAGE_NAME).mo $(DESTDIR)/$(localedir)/$(MO)/LC_MESSAGES/$(PACKAGE_NAME).mo \\n ) | $(SHELL) diff --git a/po/pt_BR.po b/po/pt_BR.po index db33805..738702f 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: pw3270 5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-05-04 10:26-0300\n" -"PO-Revision-Date: 2012-05-04 11:54-0300\n" +"POT-Creation-Date: 2012-05-04 12:01-0300\n" +"PO-Revision-Date: 2012-05-04 12:00-0300\n" "Last-Translator: Perry Werneck \n" "Language-Team: Português do Brasil <>\n" "Language: \n" @@ -327,7 +327,7 @@ msgstr "Cursor mira" #: dialog.c:111 #, c-format msgid "Current (%s)" -msgstr "Current (%s)" +msgstr "Atual (%s)" #: colors.c:335 msgid "Custom colors" diff --git a/pw3270.cbp b/pw3270.cbp index d3f27c0..b64c7c8 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -63,6 +63,7 @@ + diff --git a/src/include/lib3270/filetransfer.h b/src/include/lib3270/filetransfer.h new file mode 100644 index 0000000..bccac46 --- /dev/null +++ b/src/include/lib3270/filetransfer.h @@ -0,0 +1,78 @@ +/* + * "Software PW3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA, 02111-1307, USA + * + * Este programa está nomeado como filetransfer.h e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) + * licinio@bb.com.br (Licínio Luis Branco) + * kraucer@bb.com.br (Kraucer Fernandes Mazuco) + * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda) + * + */ + +#ifndef LIB3270_FILETRANSFER_INCLUDED + + #define LIB3270_FILETRANSFER_INCLUDED 1 + #include + + typedef enum _lib3270_FT_FLAG + { + LIB3270_FT_OPTION_RECEIVE = 0x0001, + LIB3270_FT_OPTION_ASCII = 0x0002, + LIB3270_FT_OPTION_CRLF = 0x0004, + LIB3270_FT_OPTION_APPEND = 0x0008, + LIB3270_FT_OPTION_TSO = 0x0010, + LIB3270_FT_OPTION_REMAP_ASCII = 0x0020 + } LIB3270_FT_OPTION; + + typedef struct _h3270ft + { + unsigned short sz; /**< Size of FT data structure */ + H3270 * host; + void * widget; /**< File transfer dialog handle */ + FILE * ft_local_file; /**< File descriptor for local file */ + + } H3270FT; + + /** + * Start a new file transfer session. + * + * @param session + * @param flags + * @param local + * @param remote + * @param lrecl + * @param blksize + * @param primspace + * @param secspace + * @param dft + * @param msg Pointer to error message. + * + * @return Filetransfer handle if ok, NULL if failed + * + */ + 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); + + LIB3270_EXPORT int lib3270_ft_cancel(H3270FT *ft, int force); + +#endif // LIB3270_FILETRANSFER_INCLUDED diff --git a/src/lib3270/api.h b/src/lib3270/api.h index 02a43bf..624d981 100644 --- a/src/lib3270/api.h +++ b/src/lib3270/api.h @@ -206,12 +206,12 @@ // LOCAL_EXTERN int set_device_buffer(struct ea *src, int el); /* File transfer */ - #define FT_FLAG_RECEIVE 0x0001 - #define FT_FLAG_ASCII 0x0002 - #define FT_FLAG_CRLF 0x0004 - #define FT_FLAG_APPEND 0x0008 - #define FT_FLAG_TSO 0x0010 - #define FT_FLAG_REMAP_ASCII 0x0020 + //#define LIB3270_FT_OPTION_RECEIVE 0x0001 + // #define LIB3270_FT_OPTION_ASCII 0x0002 + // #define LIB3270_FT_OPTION_CRLF 0x0004 + // #define LIB3270_FT_OPTION_APPEND 0x0008 + // #define LIB3270_FT_OPTION_TSO 0x0010 + // #define LIB3270_FT_OPTION_REMAP_ASCII 0x0020 #define FT_RECORD_FORMAT_FIXED 0x0100 #define FT_RECORD_FORMAT_VARIABLE 0x0200 @@ -232,7 +232,7 @@ FT_ABORT_SENT /**< Abort sent; awaiting response */ }; - 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 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); diff --git a/src/lib3270/ft.c b/src/lib3270/ft.c index ebf0717..9e04d1f 100644 --- a/src/lib3270/ft.c +++ b/src/lib3270/ft.c @@ -32,10 +32,9 @@ #include #include +#include #include "globals.h" -#if defined(X3270_FT) - #include #include "appres.h" @@ -43,13 +42,13 @@ #include "ft_cutc.h" #include "ft_dftc.h" #include "ftc.h" -// #include "dialogc.h" #include "hostc.h" +/* #if defined(C3270) || defined(WC3270) #include "icmdc.h" #endif +*/ #include "kybdc.h" -// #include "macrosc.h" #include "objects.h" #include "popupsc.h" #include "screenc.h" @@ -57,8 +56,8 @@ #include "telnetc.h" #include "utilc.h" -static void ft_connected(H3270 *session, int ignored, void *dunno); -static void ft_in3270(H3270 *session, int ignored unused, void *dunno); +static void ft_connected(H3270 *session, int ignored, H3270FT *ft); +static void ft_in3270(H3270 *session, int ignored unused, H3270FT *ft); /* Macros. */ #define eos(s) strchr((s), '\0') @@ -75,9 +74,12 @@ static void ft_in3270(H3270 *session, int ignored unused, void *dunno); #define BN (Boolean *)NULL // Globals. +H3270FT *ftsession = NULL; + +#define CHECK_FT_HANDLE(x) if(!x) x = ftsession; + enum ft_state ft_state = FT_NONE; // File transfer state -char *ft_local_filename; // Local file to transfer to/from -FILE *ft_local_file = (FILE *)NULL; // File descriptor for local file +// 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 Boolean cr_flag = True; // Add crlf to each line @@ -95,11 +97,14 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m /*---[ Implement ]-------------------------------------------------------------------------------------------------------*/ - void ft_init(void) + void ft_init(H3270FT *h) { /* Register for state changes. */ - register_schange(ST_CONNECT, ft_connected); - register_schange(ST_3270_MODE, ft_in3270); + + CHECK_FT_HANDLE(h); + + lib3270_register_schange(h->host, ST_CONNECT, ( void (*)(H3270 *, int, void *)) ft_connected, h); + lib3270_register_schange(h->host, ST_3270_MODE, ( void (*)(H3270 *, int, void *)) ft_in3270, h); } enum ft_state QueryFTstate(void) @@ -107,6 +112,7 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m return ft_state; } +/* int RegisterFTCallbacks(const struct filetransfer_callbacks *cbk) { if(!(cbk && cbk->sz == sizeof(struct filetransfer_callbacks)) ) @@ -116,20 +122,14 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m return 0; } - - static int cant_start(int errcode, const char *errmsg) - { - if(callbacks && callbacks->complete) - callbacks->complete(errmsg,0,0,""); - return errcode; - } +*/ enum ft_state GetFileTransferState(void) { return ft_state; } - int CancelFileTransfer(int force) + LIB3270_EXPORT int lib3270_ft_cancel(H3270FT *ft, int force) { if (ft_state == FT_RUNNING) { @@ -143,59 +143,72 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m return EBUSY; // Impatient user or hung host -- just clean up. - ft_complete( _("Cancelled by user") ); + ft_complete(ft, _("Cancelled by user") ); return ECANCELED; } - int BeginFileTransfer(unsigned short flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft) + 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) { - static const char *rec = "fvu"; - static const char *un[] = { "tracks", "cylinders", "avblock" }; + H3270FT * ftHandle = NULL; + static const char * rec = "fvu"; + static const char * un[] = { "tracks", "cylinders", "avblock" }; - unsigned short recfm = (flags & FT_RECORD_FORMAT_MASK) >> 8; - unsigned short units = (flags & FT_ALLOCATION_UNITS_MASK) >> 12; + unsigned short recfm = (flags & FT_RECORD_FORMAT_MASK) >> 8; + unsigned short units = (flags & FT_ALLOCATION_UNITS_MASK) >> 12; - char op[4096]; - char buffer[4096]; + FILE * ft_local_file = NULL; - unsigned int flen; + char op[4096]; + char buffer[4096]; - Trace("%s(%s)",__FUNCTION__,local); + unsigned int flen; - if(ft_local_file) - return cant_start(EBUSY,_( "File transfer is already active")); + Trace("%s(%s)",__FUNCTION__,local); + if(ftsession) + { + *msg = N_( "File transfer is already active" ); + errno = EBUSY; + return NULL; + } // Check remote file if(!*remote) - return cant_start(EINVAL,_( "The remote file name is invalid")); + { + *msg = N_( "The remote file name is invalid" ); + errno = EINVAL; + return NULL; + } // Open local file - ft_local_file = fopen(local,(flags & FT_FLAG_RECEIVE) ? ((flags & FT_FLAG_APPEND) ? "a" : "w") : "r"); + ft_local_file = fopen(local,(flags & LIB3270_FT_OPTION_RECEIVE) ? ((flags & LIB3270_FT_OPTION_APPEND) ? "a" : "w") : "r"); if(!ft_local_file) - return cant_start(errno,_( "Can't open local file")); + { + *msg = N_( "Can't open local file" ); + return NULL; + } // Set options dft_buffersize = dft; set_dft_buffersize(); - ascii_flag = ((flags & FT_FLAG_ASCII) != 0); - cr_flag = ((flags & FT_FLAG_CRLF) != 0); - remap_flag = ((flags & FT_FLAG_REMAP_ASCII) != 0); + ascii_flag = ((flags & LIB3270_FT_OPTION_ASCII) != 0); + cr_flag = ((flags & LIB3270_FT_OPTION_CRLF) != 0); + remap_flag = ((flags & LIB3270_FT_OPTION_ASCII) != 0); - Log("%s file \"%s\"",(flags & FT_FLAG_RECEIVE) ? "Receiving" : "Sending", local); + lib3270_write_log(session, "%s file \"%s\"",(flags & LIB3270_FT_OPTION_RECEIVE) ? "Receiving" : "Sending", local); /* Build the ind$file command */ snprintf(op,4095,"%s%s%s", - (flags & FT_FLAG_ASCII) ? " ASCII" : "", - (flags & FT_FLAG_CRLF) ? " CRLF" : "", - (flags & FT_FLAG_APPEND) ? " APPEND" : "" + (flags & LIB3270_FT_OPTION_ASCII) ? " ASCII" : "", + (flags & LIB3270_FT_OPTION_CRLF) ? " CRLF" : "", + (flags & LIB3270_FT_OPTION_APPEND) ? " APPEND" : "" ); - if(!(flags & FT_FLAG_RECEIVE)) + if(!(flags & LIB3270_FT_OPTION_RECEIVE)) { - if(flags & FT_FLAG_TSO) + if(flags & LIB3270_FT_OPTION_TSO) { // TSO Host if(recfm > 0) @@ -237,12 +250,12 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m } snprintf(buffer,4095,"%s %s %s", "IND$FILE", - (flags & FT_FLAG_RECEIVE) ? "GET" : "PUT", + (flags & LIB3270_FT_OPTION_RECEIVE) ? "GET" : "PUT", remote ); if(*op) { - if(flags & FT_FLAG_TSO) + if(flags & LIB3270_FT_OPTION_TSO) snconcat(buffer,4095," %s",op+1); else snconcat(buffer,4095," (%s)",op+1); @@ -254,10 +267,11 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m flen = kybd_prime(); if (!flen || flen < strlen(buffer) - 1) { - Log("Unable to send command \"%s\"",buffer); + lib3270_write_log(session, "Unable to send command \"%s\" (flen=%d szBuffer=%d)",buffer,flen,strlen(buffer)); fclose(ft_local_file); - ft_local_file = NULL; - return cant_start(-1,_( "Unable to send file-transfer request")); + *msg = _( "Unable to send file-transfer request" ); + errno = EINVAL; + return NULL; } Trace("Command: \"%s\"",buffer); @@ -268,57 +282,67 @@ static const struct filetransfer_callbacks *callbacks = NULL; // Callbacks to m set_ft_state(FT_AWAIT_ACK); ft_last_cr = False; - ft_is_cut = False; + ft_is_cut = False; + + ftHandle = malloc(sizeof(H3270FT)); + memset(ftHandle,0,sizeof(H3270FT)); - if(callbacks && callbacks->begin) - callbacks->begin(flags,local,remote); + ftHandle->sz = sizeof(H3270FT); + ftHandle->host = session; + ftHandle->ft_local_file = ft_local_file; - return 0; + return ftsession = ftHandle; } /* External entry points called by ft_dft and ft_cut. */ -/* Pop up a message, end the transfer. */ -void -ft_complete(const char *errmsg) +/** + * Pop up a message, end the transfer, release resources. + * + */ +void ft_complete(H3270FT *session, const char *errmsg) { double kbytes_sec = 0; struct timeval t1; + CHECK_FT_HANDLE(session); + (void) gettimeofday(&t1, (struct timezone *)NULL); kbytes_sec = (double)ft_length / 1024.0 / ((double)(t1.tv_sec - starting_time.tv_sec) + (double)(t1.tv_usec - starting_time.tv_usec) / 1.0e6); - Trace("%s",__FUNCTION__); + trace("%s",__FUNCTION__); // Close the local file. - if(ft_local_file) - { - fclose(ft_local_file); - ft_local_file = NULL; - } - else + if(session->ft_local_file) { - Log("Unexpected call do %s(): ft_local_file is NULL",__FUNCTION__); + fclose(session->ft_local_file); + session->ft_local_file = NULL; } // Clean up the state. set_ft_state(FT_NONE); - ft_update_length(); + ft_update_length(session); if(callbacks && callbacks->complete) callbacks->complete(errmsg,ft_length,kbytes_sec,ft_is_cut ? "CUT" : "DFT"); + if(session == ftsession) + ftsession = NULL; + + free(session); + } -/* Update the bytes-transferred count on the progress pop-up. */ -void -ft_update_length(void) +// Update the bytes-transferred count on the progress pop-up. +void ft_update_length(H3270FT *session) { double kbytes_sec = 0; + CHECK_FT_HANDLE(session); + if(ft_length > 1024.0) { struct timeval t1; @@ -336,11 +360,12 @@ ft_update_length(void) } -/* Process a transfer acknowledgement. */ -void -ft_running(Boolean is_cut) +// Process a transfer acknowledgement. +void ft_running(H3270FT *h, Boolean is_cut) { - Trace("%s",__FUNCTION__); + trace("%s",__FUNCTION__); + + CHECK_FT_HANDLE(h); ft_is_cut = is_cut; ft_length = 0; @@ -353,16 +378,17 @@ ft_running(Boolean is_cut) if(callbacks && callbacks->running) callbacks->running(is_cut); - ft_update_length(); + ft_update_length(h); } // Process a protocol-generated abort. -void -ft_aborting(void) +void ft_aborting(H3270FT *h) { Trace("%s",__FUNCTION__); + CHECK_FT_HANDLE(h); + if (ft_state == FT_RUNNING || ft_state == FT_ABORT_WAIT) set_ft_state(FT_ABORT_SENT); @@ -372,17 +398,20 @@ ft_aborting(void) } /* Process a disconnect abort. */ -static void ft_connected(H3270 *session, int ignored, void *dunno) +static void ft_connected(H3270 *session, int ignored, H3270FT *ft) { + CHECK_FT_HANDLE(ft); + if (!CONNECTED && ft_state != FT_NONE) - ft_complete(_("Host disconnected, transfer cancelled")); + ft_complete(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) +static void ft_in3270(H3270 *session, int ignored, H3270FT *ft) { + CHECK_FT_HANDLE(ft); + if (!IN_3270 && ft_state != FT_NONE) - ft_complete(_("Not in 3270 mode, transfer cancelled")); + ft_complete(ft,_("Not in 3270 mode, transfer cancelled")); } -#endif diff --git a/src/lib3270/ft_cut.c b/src/lib3270/ft_cut.c index a81b358..a8779ef 100644 --- a/src/lib3270/ft_cut.c +++ b/src/lib3270/ft_cut.c @@ -130,7 +130,7 @@ static void cut_retransmit(void); static void cut_data(void); static void cut_ack(void); -static void cut_abort(const char *s, unsigned short reason); +static void cut_abort(unsigned short code, const char *fmt, ...); static unsigned from6(unsigned char c); static int xlate_getc(void); @@ -160,7 +160,7 @@ upload_convert(unsigned char *buf, int len) break; } if (quadrant >= NQ) { - cut_abort(_("Data conversion error"),SC_ABORT_XMIT); + cut_abort(SC_ABORT_XMIT, "%s", _("Data conversion error")); return -1; } continue; @@ -168,7 +168,7 @@ upload_convert(unsigned char *buf, int len) /* Make sure it's in a valid range. */ if (c < 0x40 || c > 0xf9) { - cut_abort(_("Data conversion error"),SC_ABORT_XMIT); + cut_abort(SC_ABORT_XMIT, "%s", _("Data conversion error")); return -1; } @@ -289,7 +289,7 @@ ft_cut_data(void) break; default: trace_ds("< FT unknown 0x%02x\n", h3270.ea_buf[O_FRAME_TYPE].cc); - cut_abort(_(" Unknown frame type from host"), SC_ABORT_XMIT); + cut_abort(SC_ABORT_XMIT, "%s", _("Unknown frame type from host")); break; } } @@ -307,51 +307,64 @@ cut_control_code(void) trace_ds("< FT CONTROL_CODE "); code = (h3270.ea_buf[O_CC_STATUS_CODE].cc << 8) | h3270.ea_buf[O_CC_STATUS_CODE + 1].cc; - switch (code) { - case SC_HOST_ACK: + switch (code) + { + case SC_HOST_ACK: trace_ds("HOST_ACK\n"); cut_xfer_in_progress = True; expanded_length = 0; quadrant = -1; xlate_buffered = 0; cut_ack(); - ft_running(True); + ft_running(NULL,True); break; - case SC_XFER_COMPLETE: + + case SC_XFER_COMPLETE: trace_ds("XFER_COMPLETE\n"); cut_ack(); cut_xfer_in_progress = False; - ft_complete((String)NULL); + ft_complete(NULL,N_( "Complete" ) ); break; - case SC_ABORT_FILE: - case SC_ABORT_XMIT: + + case SC_ABORT_FILE: + case SC_ABORT_XMIT: trace_ds("ABORT\n"); cut_xfer_in_progress = False; cut_ack(); - if (ft_state == FT_ABORT_SENT && saved_errmsg != CN) { + if (ft_state == FT_ABORT_SENT && saved_errmsg != CN) + { buf = saved_errmsg; saved_errmsg = CN; - } else { + } + else + { bp = buf = Malloc(81); + for (i = 0; i < 80; i++) *bp++ = ebc2asc[h3270.ea_buf[O_CC_MESSAGE + i].cc]; + *bp-- = '\0'; + while (bp >= buf && *bp == ' ') *bp-- = '\0'; + if (bp >= buf && *bp == '$') *bp-- = '\0'; + while (bp >= buf && *bp == ' ') *bp-- = '\0'; + if (!*buf) - strcpy(buf, _("Transfer cancelled by host")); + strcpy(buf, N_( "Transfer cancelled by host" ) ); } - ft_complete(buf); + ft_complete(NULL,buf); Free(buf); break; - default: + + default: trace_ds("unknown 0x%04x\n", code); - cut_abort(_("Unknown FT control code from host"), SC_ABORT_XMIT); + cut_abort(SC_ABORT_XMIT, "%s", _("Unknown FT control code from host")); break; } } @@ -371,7 +384,7 @@ cut_data_request(void) trace_ds("< FT DATA_REQUEST %u\n", from6(seq)); if (ft_state == FT_ABORT_WAIT) { - cut_abort(_("Transfer cancelled by user"), SC_ABORT_FILE); + cut_abort(SC_ABORT_FILE,"%s",_("Transfer cancelled by user")); return; } @@ -383,23 +396,20 @@ cut_data_request(void) } /* Check for errors. */ - if (ferror(ft_local_file)) { + if (ferror(ftsession->ft_local_file)) { int j; - char *msg; /* Clean out any data we may have written. */ for (j = 0; j < count; j++) ctlr_add(O_UP_DATA + j, 0, 0); /* Abort the transfer. */ - msg = xs_buffer("read(%s): %s", ft_local_filename,strerror(errno)); - cut_abort(msg, SC_ABORT_FILE); - Free(msg); + cut_abort(SC_ABORT_FILE,_( "Error \"%s\" reading local file (rc=%d)" ), strerror(errno), errno); return; } /* Send special data for EOF. */ - if (!count && feof(ft_local_file)) { + if (!count && feof(ftsession->ft_local_file)) { ctlr_add(O_UP_DATA, EOF_DATA1, 0); ctlr_add(O_UP_DATA+1, EOF_DATA2, 0); count = 2; @@ -421,7 +431,7 @@ cut_data_request(void) /* Send it up to the host. */ trace_ds("> FT DATA %u\n", from6(seq)); - ft_update_length(); + ft_update_length(NULL); expanded_length += count; lib3270_enter(&h3270); @@ -434,7 +444,7 @@ static void cut_retransmit(void) { trace_ds("< FT RETRANSMIT\n"); - cut_abort(_("Transmission error"), SC_ABORT_XMIT); + cut_abort(SC_ABORT_XMIT,"%s",_("Transmission error")); } /* @@ -465,7 +475,7 @@ cut_data(void) trace_ds("< FT DATA\n"); if (ft_state == FT_ABORT_WAIT) { - cut_abort(_("Transfer cancelled by user"), SC_ABORT_FILE); + cut_abort(SC_ABORT_FILE,"%s",_("Transfer cancelled by user")); return; } @@ -473,7 +483,7 @@ cut_data(void) raw_length = from6(h3270.ea_buf[O_DT_LEN].cc) << 6 | from6(h3270.ea_buf[O_DT_LEN + 1].cc); if ((int)raw_length > O_RESPONSE - O_DT_DATA) { - cut_abort(_("Illegal frame length"), SC_ABORT_XMIT); + cut_abort(SC_ABORT_XMIT,"%s",_("Illegal frame length")); return; } for (i = 0; i < (int)raw_length; i++) @@ -489,16 +499,11 @@ cut_data(void) return; /* Write it to the file. */ - if (fwrite((char *)cvbuf, conv_length, 1, ft_local_file) == 0) { - char *msg; - - msg = xs_buffer("write(%s): %s", ft_local_filename, - strerror(errno)); - cut_abort(msg, SC_ABORT_FILE); - Free(msg); + if (fwrite((char *)cvbuf, conv_length, 1, ftsession->ft_local_file) == 0) { + cut_abort(SC_ABORT_FILE,_( "Error \"%s\" writing to file (rc=%d)" ),strerror(errno),errno); } else { ft_length += conv_length; - ft_update_length(); + ft_update_length(NULL); cut_ack(); } } @@ -515,11 +520,17 @@ static void cut_ack(void) /* * Abort a transfer in progress. */ -static void -cut_abort(const char *s, unsigned short reason) +static void cut_abort(unsigned short reason, const char *fmt, ...) { + va_list args; + + if(saved_errmsg) + free(saved_errmsg); + /* Save the error message. */ - Replace(saved_errmsg, NewString(s)); + va_start(args, fmt); + saved_errmsg = xs_vsprintf(fmt, args); + va_end(args); /* Send the abort sequence. */ ctlr_add(RO_FRAME_TYPE, RFT_CONTROL_CODE, 0); @@ -531,7 +542,7 @@ cut_abort(const char *s, unsigned short reason) lib3270_pfkey(&h3270,2); /* Update the in-progress pop-up. */ - ft_aborting(); + ft_aborting(NULL); } /* @@ -556,7 +567,7 @@ xlate_getc(void) } /* Get the next byte from the file. */ - c = fgetc(ft_local_file); + c = fgetc(ftsession->ft_local_file); if (c == EOF) return c; ft_length++; diff --git a/src/lib3270/ft_dft.c b/src/lib3270/ft_dft.c index 1b01f51..e569596 100644 --- a/src/lib3270/ft_dft.c +++ b/src/lib3270/ft_dft.c @@ -88,7 +88,8 @@ static unsigned char *dft_savebuf = NULL; static int dft_savebuf_len = 0; static int dft_savebuf_max = 0; -static void dft_abort(const char *s, unsigned short code); +static void dft_abort(unsigned short code, const char *fmt, ...); + static void dft_close_request(void); static void dft_data_insert(struct data_buffer *data_bufr); static void dft_get_request(void); @@ -162,7 +163,7 @@ dft_open_request(unsigned short len, unsigned char *cp) GET16(recsz, recszp); name = (char *)cp + 31; } else { - dft_abort( _("Uknown DFT Open type from host"), TR_OPEN_REQ); + dft_abort(TR_OPEN_REQ, "%s", _("Uknown DFT Open type from host") ); return; } @@ -182,7 +183,7 @@ dft_open_request(unsigned short len, unsigned char *cp) message_flag = True; else { message_flag = False; - ft_running(False); + ft_running(NULL,False); } dft_eof = False; recnum = 1; @@ -214,8 +215,9 @@ dft_data_insert(struct data_buffer *data_bufr) int my_length; unsigned char *cp; - if (!message_flag && ft_state == FT_ABORT_WAIT) { - dft_abort( _("Transfer cancelled by user"), TR_DATA_INSERT); + if (!message_flag && ft_state == FT_ABORT_WAIT) + { + dft_abort(TR_DATA_INSERT, "%s", _("Transfer cancelled by user") ); return; } @@ -254,13 +256,13 @@ dft_data_insert(struct data_buffer *data_bufr) /* If transfer completed ok, use our msg. */ if (memcmp(msgp, END_TRANSFER, strlen(END_TRANSFER)) == 0) { Free(msgp); - ft_complete((String)NULL); + ft_complete(NULL,NULL); } else if (ft_state == FT_ABORT_SENT && abort_string != CN) { Free(msgp); - ft_complete(abort_string); + ft_complete(NULL,abort_string); Replace(abort_string, CN); } else { - ft_complete((char *)msgp); + ft_complete(NULL,(char *)msgp); Free(msgp); } } else if (my_length > 0) { @@ -285,9 +287,9 @@ dft_data_insert(struct data_buffer *data_bufr) while (len) { unsigned l = filter_len(s, len); - if (l) { - rv = fwrite(s, l, (size_t)1, - ft_local_file); + if (l) + { + rv = fwrite(s, l, (size_t)1,ftsession->ft_local_file); if (rv == 0) break; ft_length += l; @@ -298,23 +300,17 @@ dft_data_insert(struct data_buffer *data_bufr) len -= l; } } else { - rv = fwrite((char *)data_bufr->data, my_length, - (size_t)1, ft_local_file); + rv = fwrite((char *)data_bufr->data, my_length,(size_t)1, ftsession->ft_local_file); ft_length += my_length; } if (!rv) { /* write failed */ - char *buf; - - buf = xs_buffer( _( "write(%s): %s" ), ft_local_filename,strerror(errno)); - - dft_abort(buf, TR_DATA_INSERT); - Free(buf); + dft_abort(TR_DATA_INSERT, _( "Error \"%s\" writing to local file (rc=%d)" ) , strerror(errno), errno); } /* Add up amount transferred. */ - ft_update_length(); + ft_update_length(ftsession); } /* Send an acknowledgement frame back. */ @@ -351,7 +347,7 @@ dft_get_request(void) trace_ds(" Get\n"); if (!message_flag && ft_state == FT_ABORT_WAIT) { - dft_abort(_("Transfer cancelled by user"), TR_GET_REQ); + dft_abort(TR_GET_REQ, _( "Transfer cancelled by user" ) ); return; } @@ -365,7 +361,7 @@ dft_get_request(void) int c; /* Read one byte and do CR/LF translation. */ - c = fgetc(ft_local_file); + c = fgetc(ftsession->ft_local_file); if (c == EOF) { break; } @@ -375,7 +371,7 @@ dft_get_request(void) * Not enough room to expand NL to * CR/LF. */ - ungetc(c, ft_local_file); + ungetc(c, ftsession->ft_local_file); break; } *bufptr++ = '\r'; @@ -388,7 +384,7 @@ dft_get_request(void) total_read++; } else { /* Binary read. */ - numread = fread(bufptr, 1, numbytes, ft_local_file); + numread = fread(bufptr, 1, numbytes, ftsession->ft_local_file); if (numread <= 0) { break; } @@ -406,19 +402,15 @@ dft_get_request(void) numbytes -= numread; total_read += numread; } - if (feof(ft_local_file) || ferror(ft_local_file)) { + if (feof(ftsession->ft_local_file) || ferror(ftsession->ft_local_file)) { break; } } /* Check for read error. */ - if (ferror(ft_local_file)) { - char *buf; - - buf = xs_buffer("read(%s): %s", ft_local_filename, - strerror(errno)); - dft_abort(buf, TR_GET_REQ); - Free(buf); + if (ferror(ftsession->ft_local_file)) + { + dft_abort(TR_GET_REQ, _( "Error \"%s\" reading from local file (rc=%d)" ), strerror(errno), errno); return; } @@ -442,9 +434,11 @@ dft_get_request(void) ft_length += total_read; - if (feof(ft_local_file)) { + if (feof(ftsession->ft_local_file)) + { dft_eof = True; } + } else { trace_ds("> WriteStructuredField FileTransferData EOF\n"); *obptr++ = HIGH8(TR_GET_REQ); @@ -470,7 +464,7 @@ dft_get_request(void) /* Write the data. */ net_output(); - ft_update_length(); + ft_update_length(ftsession); } /* Process a Close request. */ @@ -493,10 +487,16 @@ dft_close_request(void) } /* Abort a transfer. */ -static void -dft_abort(const char *s, unsigned short code) +static void dft_abort(unsigned short code, const char *fmt, ...) { - Replace(abort_string, NewString(s)); + va_list args; + + if(abort_string) + free(abort_string); + + va_start(args, fmt); + abort_string = xs_vsprintf(fmt, args); + va_end(args); trace_ds("> WriteStructuredField FileTransferData Error\n"); @@ -512,7 +512,7 @@ dft_abort(const char *s, unsigned short code) net_output(); /* Update the pop-up and state. */ - ft_aborting(); + ft_aborting(ftsession); } /* Returns the number of bytes in s, limited by len, that aren't CRs or ^Zs. */ diff --git a/src/lib3270/ftc.h b/src/lib3270/ftc.h index f6a67c9..92d2d6d 100644 --- a/src/lib3270/ftc.h +++ b/src/lib3270/ftc.h @@ -20,29 +20,24 @@ #if defined(X3270_FT) /*[*/ +#include + LIB3270_INTERNAL Boolean ascii_flag; LIB3270_INTERNAL Boolean cr_flag; LIB3270_INTERNAL unsigned long ft_length; -LIB3270_INTERNAL FILE *ft_local_file; -extern char *ft_local_filename; + +LIB3270_INTERNAL H3270FT * ftsession; + +// LIB3270_INTERNAL FILE *ft_local_file; +// extern char *ft_local_filename; LIB3270_INTERNAL Boolean ft_last_cr; LIB3270_INTERNAL Boolean remap_flag; -LIB3270_INTERNAL void ft_init(void); -LIB3270_INTERNAL void ft_aborting(void); -LIB3270_INTERNAL void ft_complete(const char *errmsg); -LIB3270_INTERNAL void ft_running(Boolean is_cut); -LIB3270_INTERNAL void ft_update_length(void); - -/* -extern void PA_dialog_focus_action(Widget w, XEvent *event, String *parms, - Cardinal *num_parms); -extern void PA_dialog_next_action(Widget w, XEvent *event, String *parms, - Cardinal *num_parms); -extern void popup_ft(Widget w, XtPointer call_parms, XtPointer call_data); -extern void Transfer_action(Widget w, XEvent *event, String *parms, - Cardinal *num_parms); -*/ +LIB3270_INTERNAL void ft_init(H3270FT *h); +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); +LIB3270_INTERNAL void ft_update_length(H3270FT *h); #endif /*]*/ diff --git a/src/tools/Makefile.in b/src/tools/Makefile.in new file mode 100644 index 0000000..e2fb13b --- /dev/null +++ b/src/tools/Makefile.in @@ -0,0 +1,57 @@ +# +# "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 +# (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a +# aplicativos mainframe. Registro no INPI sob o nome G3270. +# +# Copyright (C) <2008> +# +# Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob +# os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela +# Free Software Foundation. +# +# Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER +# GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO +# A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para +# obter mais detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este +# programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple +# Place, Suite 330, Boston, MA, 02111-1307, USA +# +# Contatos: +# +# perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) +# erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) +# licinio@bb.com.br (Licínio Luis Branco) +# kraucer@bb.com.br (Kraucer Fernandes Mazuco) +# + +PACKAGE_NAME=@PACKAGE_NAME@ + +EXEEXT=@EXEEXT@ +OBJEXT=@OBJEXT@ +CFLAGS=@CFLAGS@ @GTK_CFLAGS@ -DDATAROOTDIR=\"$(datarootdir)\" -I../../src/include +LIBS=@LIBS@ @GTK_LIBS@ + +CC=@CC@ +LD=@CC@ + +#---[ Rules ]------------------------------------------------------------------ + +$(OBJDBG)/%.o: %.c + @echo " CC `basename $@`" + @$(CC) $(CFLAGS) -o $@ -c $< + +#---[ Targets ]---------------------------------------------------------------- + +all: xml2pot$(EXEEXT) + +xml2pot$(EXEEXT): xml2pot$(OBJEXT) + @echo " CCLD `basename $@`" + @$(LD) -o $@ $^ $(LIBS) + +clean: + @rm -f *.$(OBJEXT) + @rm -f xml2pot$(EXEEXT) + + -- libgit2 0.21.2