diff --git a/po/pt_BR.po b/po/pt_BR.po index be24b9b..d3eb790 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-07 15:12-0300\n" -"PO-Revision-Date: 2012-05-07 15:30-0300\n" +"POT-Creation-Date: 2012-05-08 07:23-0300\n" +"PO-Revision-Date: 2012-05-08 07:19-0300\n" "Last-Translator: Perry Werneck \n" "Language-Team: Português do Brasil <>\n" "Language: pt_BR\n" @@ -264,18 +264,22 @@ msgstr "" msgid "Can't set lib3270 I/O handlers" msgstr "Não foi possível registrar manipuladores de I/O 3270" -#: filetransfer.c:262 +#: filetransfer.c:307 msgid "Can't start download" msgstr "Não foi possível iniciar o download" -#: filetransfer.c:310 +#: filetransfer.c:284 +msgid "Can't start file transfer" +msgstr "Não foi possível iniciar transferência de arquivo" + +#: filetransfer.c:347 msgid "Can't start upload" msgstr "Não foi possível iniciar upload" #: telnet.c:387 #, c-format msgid "Can't use winsock version %d.%d" -msgstr "Não é possível usar a WinSOCK versão %d.%d" +msgstr "Não é possível usar a Winsock versão %d.%d" #: ft.c:157 msgid "Cancelled by user" @@ -311,6 +315,7 @@ msgid "Colors" msgstr "Cores" #: ft_cut.c:326 +#, fuzzy msgid "Complete" msgstr "Complete" @@ -432,7 +437,11 @@ msgstr "" msgid "Fields" msgstr "" -#: filetransfer.c:262 filetransfer.c:310 ft.c:213 +#: filetransfer.c:287 +msgid "File transfer error" +msgstr "Erro na transferência de arquivos" + +#: filetransfer.c:307 filetransfer.c:347 ft.c:213 msgid "File transfer is already active" msgstr "Transferência de arquivos já está ativa" @@ -660,9 +669,9 @@ msgstr "Púrpura" msgid "Receive file" msgstr "Receber arquivo" -#: filetransfer.c:268 +#: filetransfer.c:313 msgid "Receive file from host" -msgstr "Receber arquivo" +msgstr "Receber arquivo do servidor" #: colors.c:353 msgid "Red" @@ -738,7 +747,7 @@ msgstr "Seleção retangular" #: filetransfer.c:86 msgid "Select file to receive" -msgstr "Select file to receive" +msgstr "Selecione arquivo a receber" #: filetransfer.c:86 msgid "Select file to send" @@ -770,7 +779,7 @@ msgstr "Enviar/Receber" #: ui/00default.xml:142 msgid "Set hostname" -msgstr "Selecione host" +msgstr "Selecione servidor" #: glue.c:325 msgid "Set terminal model (screen size)" diff --git a/src/include/lib3270/filetransfer.h b/src/include/lib3270/filetransfer.h index f0a95e0..08939b0 100644 --- a/src/include/lib3270/filetransfer.h +++ b/src/include/lib3270/filetransfer.h @@ -37,6 +37,18 @@ #define LIB3270_FT_OPTION_SEND 0x0000 + #define LIB3270_FT_RECORD_FORMAT_DEFAULT 0x0000 + #define LIB3270_FT_RECORD_FORMAT_FIXED 0x0100 + #define LIB3270_FT_RECORD_FORMAT_VARIABLE 0x0200 + #define LIB3270_FT_RECORD_FORMAT_UNDEFINED 0x0300 + #define LIB3270_FT_RECORD_FORMAT_MASK LIB3270_FT_RECORD_FORMAT_UNDEFINED + + #define LIB3270_FT_ALLOCATION_UNITS_DEFAULT 0x0000 + #define LIB3270_FT_ALLOCATION_UNITS_TRACKS 0x1000 + #define LIB3270_FT_ALLOCATION_UNITS_CYLINDERS 0x2000 + #define LIB3270_FT_ALLOCATION_UNITS_AVBLOCK 0x3000 + #define LIB3270_FT_ALLOCATION_UNITS_MASK LIB3270_FT_ALLOCATION_UNITS_AVBLOCK + typedef enum _lib3270_FT_FLAG { LIB3270_FT_OPTION_RECEIVE = 0x0001, diff --git a/src/lib3270/api.h b/src/lib3270/api.h index b5b87c2..ff1e3fc 100644 --- a/src/lib3270/api.h +++ b/src/lib3270/api.h @@ -213,15 +213,15 @@ // #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 - #define FT_RECORD_FORMAT_UNDEFINED 0x0300 - #define FT_RECORD_FORMAT_MASK FT_RECORD_FORMAT_UNDEFINED - - #define FT_ALLOCATION_UNITS_TRACKS 0x1000 - #define FT_ALLOCATION_UNITS_CYLINDERS 0x2000 - #define FT_ALLOCATION_UNITS_AVBLOCK 0x3000 - #define FT_ALLOCATION_UNITS_MASK FT_ALLOCATION_UNITS_AVBLOCK + #define FT_RECORD_FORMAT_FIXED LIB3270_FT_RECORD_FORMAT_FIXED + #define FT_RECORD_FORMAT_VARIABLE LIB3270_FT_RECORD_FORMAT_VARIABLE + #define FT_RECORD_FORMAT_UNDEFINED LIB3270_FT_RECORD_FORMAT_UNDEFINED + #define FT_RECORD_FORMAT_MASK LIB3270_FT_RECORD_FORMAT_MASK + + #define FT_ALLOCATION_UNITS_TRACKS LIB3270_FT_ALLOCATION_UNITS_TRACKS + #define FT_ALLOCATION_UNITS_CYLINDERS LIB3270_FT_ALLOCATION_UNITS_CYLINDERS + #define FT_ALLOCATION_UNITS_AVBLOCK LIB3270_FT_ALLOCATION_UNITS_AVBLOCK + #define FT_ALLOCATION_UNITS_MASK LIB3270_FT_ALLOCATION_UNITS_MASK #define FT_NONE LIB3270_FT_STATE_NONE #define FT_AWAIT_ACK LIB3270_FT_STATE_AWAIT_ACK diff --git a/src/lib3270/ft.c b/src/lib3270/ft.c index 72976dd..3c673b9 100644 --- a/src/lib3270/ft.c +++ b/src/lib3270/ft.c @@ -206,7 +206,13 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); unsigned int flen; - Trace("%s(%s)",__FUNCTION__,local); +// Trace("%s(%s)",__FUNCTION__,local); + if(!lib3270_connected(session)) + { + *msg = N_( "Disconnected from host" ); + errno = EINVAL; + return NULL; + } if(ftsession) { diff --git a/src/pw3270/filetransfer.c b/src/pw3270/filetransfer.c index 0c53175..7d9fd85 100644 --- a/src/pw3270/filetransfer.c +++ b/src/pw3270/filetransfer.c @@ -53,6 +53,14 @@ const gchar * label; }; + struct ftmask + { + unsigned int flag; + unsigned int mask; + const gchar * name; + const gchar * label; + }; + /*--[ Implement ]------------------------------------------------------------------------------------*/ @@ -186,6 +194,7 @@ static void add_transfer_options(GObject *action, struct ftdialog *dlg) GtkTable * table = GTK_TABLE(gtk_table_new(3,2,TRUE)); GtkWidget * frame = gtk_frame_new( _( "Transfer options" ) ); + GtkWidget * label = gtk_frame_get_label_widget(GTK_FRAME(frame)); int row, col, f; row=0; @@ -196,6 +205,7 @@ static void add_transfer_options(GObject *action, struct ftdialog *dlg) GtkWidget * widget = gtk_check_button_new_with_mnemonic( gettext(option[f].label) ); gboolean active = FALSE; + gtk_widget_set_name(widget,option[f].name); if(val) @@ -252,11 +262,55 @@ static void setup_dft(GObject *action, struct ftdialog *dlg, GtkWidget **label) } +static gboolean run_ft_dialog(GtkWidget *widget, struct ftdialog *dlg) +{ + H3270FT * ft = NULL; + const char * msg = NULL; + + gtk_widget_show_all(dlg->dialog); + + if(gtk_dialog_run(GTK_DIALOG(dlg->dialog)) != GTK_RESPONSE_ACCEPT) + return FALSE; + + ft = lib3270_ft_start( v3270_get_session(widget), + dlg->option, + gtk_entry_get_text(dlg->file[0]), + gtk_entry_get_text(dlg->file[1]), + 0, + 0, + 0, + 0, + atoi(gtk_entry_get_text(dlg->dft)), + &msg ); + + trace("%s ft=%p msg=%p",__FUNCTION__,ft,&msg); + + if(msg) + { + GtkWidget *popup = gtk_message_dialog_new_with_markup( + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, + "%s", _( "Can't start file transfer" )); + + trace("msg=%s",msg); + gtk_window_set_title(GTK_WINDOW(popup),_("File transfer error")); + + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",gettext(msg)); + + gtk_widget_show_all(popup); + gtk_dialog_run(GTK_DIALOG(popup)); + gtk_widget_destroy(popup); + + } + + return ft != NULL; +} + void download_action(GtkAction *action, GtkWidget *widget) { struct ftdialog dlg; - if(lib3270_get_ft_state(v3270_get_session(widget)) != LIB3270_FT_STATE_NONE) { error_dialog(widget,_( "Can't start download" ), _( "File transfer is already active" ), NULL); @@ -289,29 +343,142 @@ void download_action(GtkAction *action, GtkWidget *widget) gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg.dialog))),hbox,FALSE,FALSE,2); } - gtk_widget_show_all(dlg.dialog); + run_ft_dialog(widget,&dlg); - if(gtk_dialog_run(GTK_DIALOG(dlg.dialog)) == GTK_RESPONSE_ACCEPT) - { - // Begin file transfer - } + gtk_widget_destroy(dlg.dialog); +} -// begin_ft_session(action,widget,LIB3270_FT_OPTION_RECEIVE); +static void toggle_format(GtkToggleButton *button, const struct ftmask *option) +{ + gboolean active = gtk_toggle_button_get_active(button); + struct ftdialog * dlg = (struct ftdialog *) g_object_get_data(G_OBJECT(button),"dlg"); + const gchar * name = (const gchar *) g_object_get_data(G_OBJECT(button),"setupname"); - gtk_widget_destroy(dlg.dialog); + dlg->option &= ~option->mask; + dlg->option |= option->flag; + if(active) + { + set_string_to_config(dlg->name,name,"%s",option->name); + trace("%s=%s (flags=%04x)",name,option->name,dlg->option); + } } void upload_action(GtkAction *action, GtkWidget *widget) { + struct ftdialog dlg; + if(lib3270_get_ft_state(v3270_get_session(widget)) != LIB3270_FT_STATE_NONE) { error_dialog(widget,_( "Can't start upload" ), _( "File transfer is already active" ), NULL); return; } -// begin_ft_session(action,widget,LIB3270_FT_OPTION_SEND); + memset(&dlg,0,sizeof(dlg)); + + dlg.dialog = gtk_dialog_new_with_buttons( _( "Send file to host" ), \ + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_DESTROY_WITH_PARENT, \ + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, \ + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, \ + NULL ); + + dlg.name = "upload"; + dlg.option = LIB3270_FT_OPTION_SEND; + add_file_fields(G_OBJECT(action),&dlg); + add_transfer_options(G_OBJECT(action),&dlg); + + { + + static const struct ftmask recfm[] = + { + { LIB3270_FT_RECORD_FORMAT_DEFAULT, LIB3270_FT_RECORD_FORMAT_MASK, "default", N_( "Default" ) }, + { LIB3270_FT_RECORD_FORMAT_FIXED, LIB3270_FT_RECORD_FORMAT_MASK, "fixed", N_( "Fixed" ) }, + { LIB3270_FT_RECORD_FORMAT_VARIABLE, LIB3270_FT_RECORD_FORMAT_MASK, "variable", N_( "Variable" ) }, + { LIB3270_FT_RECORD_FORMAT_UNDEFINED, LIB3270_FT_RECORD_FORMAT_MASK, "undefined", N_( "Undefined" ) }, + }; + + static const struct ftmask units[] = + { + { LIB3270_FT_ALLOCATION_UNITS_DEFAULT, LIB3270_FT_ALLOCATION_UNITS_MASK, "default", N_( "Default" ) }, + { LIB3270_FT_ALLOCATION_UNITS_TRACKS, LIB3270_FT_ALLOCATION_UNITS_MASK, "tracks", N_( "Tracks" ) }, + { LIB3270_FT_ALLOCATION_UNITS_CYLINDERS, LIB3270_FT_ALLOCATION_UNITS_MASK, "cilinders", N_( "Cylinders" ) }, + { LIB3270_FT_ALLOCATION_UNITS_AVBLOCK, LIB3270_FT_ALLOCATION_UNITS_MASK, "avblock", N_( "Avblock" ) }, + }; + + static const struct _fdesc + { + const gchar * title; + const gchar * name; + const struct ftmask * option; + } fdesk[] = + { + { N_( "Record format" ), "recordformat", recfm }, + { N_( "Space allocation units" ), "allocationunits", units } + }; + + GtkWidget *box = gtk_hbox_new(TRUE,2); + int f; + + for(f=0;f<2;f++) + { + GtkWidget * frame = gtk_frame_new(gettext(fdesk[f].title)); + GtkWidget * vbox = gtk_vbox_new(TRUE,2); + GSList * group = NULL; + const gchar * attr = g_object_get_data(G_OBJECT(action),fdesk[f].name); + gchar * setup; + int p; + + if(attr) + setup = g_strdup(attr); + else + setup = get_string_from_config(dlg.name,fdesk[f].name,fdesk[f].option[0].name); + + for(p=0;p<4;p++) + { + GtkWidget *widget = gtk_radio_button_new_with_label(group,gettext(fdesk[f].option[p].label)); + g_object_set_data(G_OBJECT(widget),"dlg",(gpointer) &dlg); + g_object_set_data(G_OBJECT(widget),"setupname",(gpointer) fdesk[f].name); + + g_signal_connect(G_OBJECT(widget),"toggled", G_CALLBACK(toggle_format),(gpointer) &fdesk[f].option[p]); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),!g_strcasecmp(fdesk[f].option[p].name,setup)); + group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(widget)); + gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0); + } + + g_free(setup); + + gtk_container_add(GTK_CONTAINER(frame),GTK_WIDGET(vbox)); + gtk_box_pack_start(GTK_BOX(box),frame,TRUE,TRUE,2); + } + + + + + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg.dialog))),box,TRUE,TRUE,2); + } + + + + { + // Add dft option + GtkWidget *hbox = gtk_hbox_new(FALSE,2); + GtkWidget *label = NULL; + + setup_dft(G_OBJECT(action),&dlg,&label); + + gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); + gtk_box_pack_start(GTK_BOX(hbox),GTK_WIDGET(dlg.dft),FALSE,FALSE,0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg.dialog))),hbox,FALSE,FALSE,2); + } + + run_ft_dialog(widget,&dlg); + + gtk_widget_destroy(dlg.dialog); + + } -- libgit2 0.21.2