Commit 4330eeae8c4f4d20b524bb298d239b9564523fda

Authored by perry.werneck@gmail.com
1 parent a6ea694c

Implementando caixa de transferência

@@ -5,8 +5,8 @@ msgid "" @@ -5,8 +5,8 @@ msgid ""
5 msgstr "" 5 msgstr ""
6 "Project-Id-Version: pw3270 5.0\n" 6 "Project-Id-Version: pw3270 5.0\n"
7 "Report-Msgid-Bugs-To: \n" 7 "Report-Msgid-Bugs-To: \n"
8 -"POT-Creation-Date: 2012-05-07 15:12-0300\n"  
9 -"PO-Revision-Date: 2012-05-07 15:30-0300\n" 8 +"POT-Creation-Date: 2012-05-08 07:23-0300\n"
  9 +"PO-Revision-Date: 2012-05-08 07:19-0300\n"
10 "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n" 10 "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n"
11 "Language-Team: Português do Brasil <>\n" 11 "Language-Team: Português do Brasil <>\n"
12 "Language: pt_BR\n" 12 "Language: pt_BR\n"
@@ -264,18 +264,22 @@ msgstr &quot;&quot; @@ -264,18 +264,22 @@ msgstr &quot;&quot;
264 msgid "Can't set lib3270 I/O handlers" 264 msgid "Can't set lib3270 I/O handlers"
265 msgstr "Não foi possível registrar manipuladores de I/O 3270" 265 msgstr "Não foi possível registrar manipuladores de I/O 3270"
266 266
267 -#: filetransfer.c:262 267 +#: filetransfer.c:307
268 msgid "Can't start download" 268 msgid "Can't start download"
269 msgstr "Não foi possível iniciar o download" 269 msgstr "Não foi possível iniciar o download"
270 270
271 -#: filetransfer.c:310 271 +#: filetransfer.c:284
  272 +msgid "Can't start file transfer"
  273 +msgstr "Não foi possível iniciar transferência de arquivo"
  274 +
  275 +#: filetransfer.c:347
272 msgid "Can't start upload" 276 msgid "Can't start upload"
273 msgstr "Não foi possível iniciar upload" 277 msgstr "Não foi possível iniciar upload"
274 278
275 #: telnet.c:387 279 #: telnet.c:387
276 #, c-format 280 #, c-format
277 msgid "Can't use winsock version %d.%d" 281 msgid "Can't use winsock version %d.%d"
278 -msgstr "Não é possível usar a WinSOCK versão %d.%d" 282 +msgstr "Não é possível usar a Winsock versão %d.%d"
279 283
280 #: ft.c:157 284 #: ft.c:157
281 msgid "Cancelled by user" 285 msgid "Cancelled by user"
@@ -311,6 +315,7 @@ msgid &quot;Colors&quot; @@ -311,6 +315,7 @@ msgid &quot;Colors&quot;
311 msgstr "Cores" 315 msgstr "Cores"
312 316
313 #: ft_cut.c:326 317 #: ft_cut.c:326
  318 +#, fuzzy
314 msgid "Complete" 319 msgid "Complete"
315 msgstr "Complete" 320 msgstr "Complete"
316 321
@@ -432,7 +437,11 @@ msgstr &quot;&quot; @@ -432,7 +437,11 @@ msgstr &quot;&quot;
432 msgid "Fields" 437 msgid "Fields"
433 msgstr "" 438 msgstr ""
434 439
435 -#: filetransfer.c:262 filetransfer.c:310 ft.c:213 440 +#: filetransfer.c:287
  441 +msgid "File transfer error"
  442 +msgstr "Erro na transferência de arquivos"
  443 +
  444 +#: filetransfer.c:307 filetransfer.c:347 ft.c:213
436 msgid "File transfer is already active" 445 msgid "File transfer is already active"
437 msgstr "Transferência de arquivos já está ativa" 446 msgstr "Transferência de arquivos já está ativa"
438 447
@@ -660,9 +669,9 @@ msgstr &quot;Púrpura&quot; @@ -660,9 +669,9 @@ msgstr &quot;Púrpura&quot;
660 msgid "Receive file" 669 msgid "Receive file"
661 msgstr "Receber arquivo" 670 msgstr "Receber arquivo"
662 671
663 -#: filetransfer.c:268 672 +#: filetransfer.c:313
664 msgid "Receive file from host" 673 msgid "Receive file from host"
665 -msgstr "Receber arquivo" 674 +msgstr "Receber arquivo do servidor"
666 675
667 #: colors.c:353 676 #: colors.c:353
668 msgid "Red" 677 msgid "Red"
@@ -738,7 +747,7 @@ msgstr &quot;Seleção retangular&quot; @@ -738,7 +747,7 @@ msgstr &quot;Seleção retangular&quot;
738 747
739 #: filetransfer.c:86 748 #: filetransfer.c:86
740 msgid "Select file to receive" 749 msgid "Select file to receive"
741 -msgstr "Select file to receive" 750 +msgstr "Selecione arquivo a receber"
742 751
743 #: filetransfer.c:86 752 #: filetransfer.c:86
744 msgid "Select file to send" 753 msgid "Select file to send"
@@ -770,7 +779,7 @@ msgstr &quot;Enviar/Receber&quot; @@ -770,7 +779,7 @@ msgstr &quot;Enviar/Receber&quot;
770 779
771 #: ui/00default.xml:142 780 #: ui/00default.xml:142
772 msgid "Set hostname" 781 msgid "Set hostname"
773 -msgstr "Selecione host" 782 +msgstr "Selecione servidor"
774 783
775 #: glue.c:325 784 #: glue.c:325
776 msgid "Set terminal model (screen size)" 785 msgid "Set terminal model (screen size)"
src/include/lib3270/filetransfer.h
@@ -37,6 +37,18 @@ @@ -37,6 +37,18 @@
37 37
38 #define LIB3270_FT_OPTION_SEND 0x0000 38 #define LIB3270_FT_OPTION_SEND 0x0000
39 39
  40 + #define LIB3270_FT_RECORD_FORMAT_DEFAULT 0x0000
  41 + #define LIB3270_FT_RECORD_FORMAT_FIXED 0x0100
  42 + #define LIB3270_FT_RECORD_FORMAT_VARIABLE 0x0200
  43 + #define LIB3270_FT_RECORD_FORMAT_UNDEFINED 0x0300
  44 + #define LIB3270_FT_RECORD_FORMAT_MASK LIB3270_FT_RECORD_FORMAT_UNDEFINED
  45 +
  46 + #define LIB3270_FT_ALLOCATION_UNITS_DEFAULT 0x0000
  47 + #define LIB3270_FT_ALLOCATION_UNITS_TRACKS 0x1000
  48 + #define LIB3270_FT_ALLOCATION_UNITS_CYLINDERS 0x2000
  49 + #define LIB3270_FT_ALLOCATION_UNITS_AVBLOCK 0x3000
  50 + #define LIB3270_FT_ALLOCATION_UNITS_MASK LIB3270_FT_ALLOCATION_UNITS_AVBLOCK
  51 +
40 typedef enum _lib3270_FT_FLAG 52 typedef enum _lib3270_FT_FLAG
41 { 53 {
42 LIB3270_FT_OPTION_RECEIVE = 0x0001, 54 LIB3270_FT_OPTION_RECEIVE = 0x0001,
src/lib3270/api.h
@@ -213,15 +213,15 @@ @@ -213,15 +213,15 @@
213 // #define LIB3270_FT_OPTION_TSO 0x0010 213 // #define LIB3270_FT_OPTION_TSO 0x0010
214 // #define LIB3270_FT_OPTION_REMAP_ASCII 0x0020 214 // #define LIB3270_FT_OPTION_REMAP_ASCII 0x0020
215 215
216 - #define FT_RECORD_FORMAT_FIXED 0x0100  
217 - #define FT_RECORD_FORMAT_VARIABLE 0x0200  
218 - #define FT_RECORD_FORMAT_UNDEFINED 0x0300  
219 - #define FT_RECORD_FORMAT_MASK FT_RECORD_FORMAT_UNDEFINED  
220 -  
221 - #define FT_ALLOCATION_UNITS_TRACKS 0x1000  
222 - #define FT_ALLOCATION_UNITS_CYLINDERS 0x2000  
223 - #define FT_ALLOCATION_UNITS_AVBLOCK 0x3000  
224 - #define FT_ALLOCATION_UNITS_MASK FT_ALLOCATION_UNITS_AVBLOCK 216 + #define FT_RECORD_FORMAT_FIXED LIB3270_FT_RECORD_FORMAT_FIXED
  217 + #define FT_RECORD_FORMAT_VARIABLE LIB3270_FT_RECORD_FORMAT_VARIABLE
  218 + #define FT_RECORD_FORMAT_UNDEFINED LIB3270_FT_RECORD_FORMAT_UNDEFINED
  219 + #define FT_RECORD_FORMAT_MASK LIB3270_FT_RECORD_FORMAT_MASK
  220 +
  221 + #define FT_ALLOCATION_UNITS_TRACKS LIB3270_FT_ALLOCATION_UNITS_TRACKS
  222 + #define FT_ALLOCATION_UNITS_CYLINDERS LIB3270_FT_ALLOCATION_UNITS_CYLINDERS
  223 + #define FT_ALLOCATION_UNITS_AVBLOCK LIB3270_FT_ALLOCATION_UNITS_AVBLOCK
  224 + #define FT_ALLOCATION_UNITS_MASK LIB3270_FT_ALLOCATION_UNITS_MASK
225 225
226 #define FT_NONE LIB3270_FT_STATE_NONE 226 #define FT_NONE LIB3270_FT_STATE_NONE
227 #define FT_AWAIT_ACK LIB3270_FT_STATE_AWAIT_ACK 227 #define FT_AWAIT_ACK LIB3270_FT_STATE_AWAIT_ACK
src/lib3270/ft.c
@@ -206,7 +206,13 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); @@ -206,7 +206,13 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
206 206
207 unsigned int flen; 207 unsigned int flen;
208 208
209 - Trace("%s(%s)",__FUNCTION__,local); 209 +// Trace("%s(%s)",__FUNCTION__,local);
  210 + if(!lib3270_connected(session))
  211 + {
  212 + *msg = N_( "Disconnected from host" );
  213 + errno = EINVAL;
  214 + return NULL;
  215 + }
210 216
211 if(ftsession) 217 if(ftsession)
212 { 218 {
src/pw3270/filetransfer.c
@@ -53,6 +53,14 @@ @@ -53,6 +53,14 @@
53 const gchar * label; 53 const gchar * label;
54 }; 54 };
55 55
  56 + struct ftmask
  57 + {
  58 + unsigned int flag;
  59 + unsigned int mask;
  60 + const gchar * name;
  61 + const gchar * label;
  62 + };
  63 +
56 /*--[ Implement ]------------------------------------------------------------------------------------*/ 64 /*--[ Implement ]------------------------------------------------------------------------------------*/
57 65
58 66
@@ -186,6 +194,7 @@ static void add_transfer_options(GObject *action, struct ftdialog *dlg) @@ -186,6 +194,7 @@ static void add_transfer_options(GObject *action, struct ftdialog *dlg)
186 194
187 GtkTable * table = GTK_TABLE(gtk_table_new(3,2,TRUE)); 195 GtkTable * table = GTK_TABLE(gtk_table_new(3,2,TRUE));
188 GtkWidget * frame = gtk_frame_new( _( "Transfer options" ) ); 196 GtkWidget * frame = gtk_frame_new( _( "Transfer options" ) );
  197 + GtkWidget * label = gtk_frame_get_label_widget(GTK_FRAME(frame));
189 int row, col, f; 198 int row, col, f;
190 199
191 row=0; 200 row=0;
@@ -196,6 +205,7 @@ static void add_transfer_options(GObject *action, struct ftdialog *dlg) @@ -196,6 +205,7 @@ static void add_transfer_options(GObject *action, struct ftdialog *dlg)
196 GtkWidget * widget = gtk_check_button_new_with_mnemonic( gettext(option[f].label) ); 205 GtkWidget * widget = gtk_check_button_new_with_mnemonic( gettext(option[f].label) );
197 gboolean active = FALSE; 206 gboolean active = FALSE;
198 207
  208 +
199 gtk_widget_set_name(widget,option[f].name); 209 gtk_widget_set_name(widget,option[f].name);
200 210
201 if(val) 211 if(val)
@@ -252,11 +262,55 @@ static void setup_dft(GObject *action, struct ftdialog *dlg, GtkWidget **label) @@ -252,11 +262,55 @@ static void setup_dft(GObject *action, struct ftdialog *dlg, GtkWidget **label)
252 262
253 } 263 }
254 264
  265 +static gboolean run_ft_dialog(GtkWidget *widget, struct ftdialog *dlg)
  266 +{
  267 + H3270FT * ft = NULL;
  268 + const char * msg = NULL;
  269 +
  270 + gtk_widget_show_all(dlg->dialog);
  271 +
  272 + if(gtk_dialog_run(GTK_DIALOG(dlg->dialog)) != GTK_RESPONSE_ACCEPT)
  273 + return FALSE;
  274 +
  275 + ft = lib3270_ft_start( v3270_get_session(widget),
  276 + dlg->option,
  277 + gtk_entry_get_text(dlg->file[0]),
  278 + gtk_entry_get_text(dlg->file[1]),
  279 + 0,
  280 + 0,
  281 + 0,
  282 + 0,
  283 + atoi(gtk_entry_get_text(dlg->dft)),
  284 + &msg );
  285 +
  286 + trace("%s ft=%p msg=%p",__FUNCTION__,ft,&msg);
  287 +
  288 + if(msg)
  289 + {
  290 + GtkWidget *popup = gtk_message_dialog_new_with_markup(
  291 + GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  292 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  293 + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
  294 + "%s", _( "Can't start file transfer" ));
  295 +
  296 + trace("msg=%s",msg);
  297 + gtk_window_set_title(GTK_WINDOW(popup),_("File transfer error"));
  298 +
  299 + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",gettext(msg));
  300 +
  301 + gtk_widget_show_all(popup);
  302 + gtk_dialog_run(GTK_DIALOG(popup));
  303 + gtk_widget_destroy(popup);
  304 +
  305 + }
  306 +
  307 + return ft != NULL;
  308 +}
  309 +
255 void download_action(GtkAction *action, GtkWidget *widget) 310 void download_action(GtkAction *action, GtkWidget *widget)
256 { 311 {
257 struct ftdialog dlg; 312 struct ftdialog dlg;
258 313
259 -  
260 if(lib3270_get_ft_state(v3270_get_session(widget)) != LIB3270_FT_STATE_NONE) 314 if(lib3270_get_ft_state(v3270_get_session(widget)) != LIB3270_FT_STATE_NONE)
261 { 315 {
262 error_dialog(widget,_( "Can't start download" ), _( "File transfer is already active" ), NULL); 316 error_dialog(widget,_( "Can't start download" ), _( "File transfer is already active" ), NULL);
@@ -289,29 +343,142 @@ void download_action(GtkAction *action, GtkWidget *widget) @@ -289,29 +343,142 @@ void download_action(GtkAction *action, GtkWidget *widget)
289 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg.dialog))),hbox,FALSE,FALSE,2); 343 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg.dialog))),hbox,FALSE,FALSE,2);
290 } 344 }
291 345
292 - gtk_widget_show_all(dlg.dialog); 346 + run_ft_dialog(widget,&dlg);
293 347
294 - if(gtk_dialog_run(GTK_DIALOG(dlg.dialog)) == GTK_RESPONSE_ACCEPT)  
295 - {  
296 - // Begin file transfer  
297 - } 348 + gtk_widget_destroy(dlg.dialog);
298 349
  350 +}
299 351
300 -// begin_ft_session(action,widget,LIB3270_FT_OPTION_RECEIVE); 352 +static void toggle_format(GtkToggleButton *button, const struct ftmask *option)
  353 +{
  354 + gboolean active = gtk_toggle_button_get_active(button);
  355 + struct ftdialog * dlg = (struct ftdialog *) g_object_get_data(G_OBJECT(button),"dlg");
  356 + const gchar * name = (const gchar *) g_object_get_data(G_OBJECT(button),"setupname");
301 357
302 - gtk_widget_destroy(dlg.dialog); 358 + dlg->option &= ~option->mask;
  359 + dlg->option |= option->flag;
303 360
  361 + if(active)
  362 + {
  363 + set_string_to_config(dlg->name,name,"%s",option->name);
  364 + trace("%s=%s (flags=%04x)",name,option->name,dlg->option);
  365 + }
304 } 366 }
305 367
306 void upload_action(GtkAction *action, GtkWidget *widget) 368 void upload_action(GtkAction *action, GtkWidget *widget)
307 { 369 {
  370 + struct ftdialog dlg;
  371 +
308 if(lib3270_get_ft_state(v3270_get_session(widget)) != LIB3270_FT_STATE_NONE) 372 if(lib3270_get_ft_state(v3270_get_session(widget)) != LIB3270_FT_STATE_NONE)
309 { 373 {
310 error_dialog(widget,_( "Can't start upload" ), _( "File transfer is already active" ), NULL); 374 error_dialog(widget,_( "Can't start upload" ), _( "File transfer is already active" ), NULL);
311 return; 375 return;
312 } 376 }
313 377
314 -// begin_ft_session(action,widget,LIB3270_FT_OPTION_SEND); 378 + memset(&dlg,0,sizeof(dlg));
  379 +
  380 + dlg.dialog = gtk_dialog_new_with_buttons( _( "Send file to host" ), \
  381 + GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  382 + GTK_DIALOG_DESTROY_WITH_PARENT, \
  383 + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, \
  384 + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, \
  385 + NULL );
  386 +
  387 + dlg.name = "upload";
  388 + dlg.option = LIB3270_FT_OPTION_SEND;
  389 + add_file_fields(G_OBJECT(action),&dlg);
  390 + add_transfer_options(G_OBJECT(action),&dlg);
  391 +
  392 + {
  393 +
  394 + static const struct ftmask recfm[] =
  395 + {
  396 + { LIB3270_FT_RECORD_FORMAT_DEFAULT, LIB3270_FT_RECORD_FORMAT_MASK, "default", N_( "Default" ) },
  397 + { LIB3270_FT_RECORD_FORMAT_FIXED, LIB3270_FT_RECORD_FORMAT_MASK, "fixed", N_( "Fixed" ) },
  398 + { LIB3270_FT_RECORD_FORMAT_VARIABLE, LIB3270_FT_RECORD_FORMAT_MASK, "variable", N_( "Variable" ) },
  399 + { LIB3270_FT_RECORD_FORMAT_UNDEFINED, LIB3270_FT_RECORD_FORMAT_MASK, "undefined", N_( "Undefined" ) },
  400 + };
  401 +
  402 + static const struct ftmask units[] =
  403 + {
  404 + { LIB3270_FT_ALLOCATION_UNITS_DEFAULT, LIB3270_FT_ALLOCATION_UNITS_MASK, "default", N_( "Default" ) },
  405 + { LIB3270_FT_ALLOCATION_UNITS_TRACKS, LIB3270_FT_ALLOCATION_UNITS_MASK, "tracks", N_( "Tracks" ) },
  406 + { LIB3270_FT_ALLOCATION_UNITS_CYLINDERS, LIB3270_FT_ALLOCATION_UNITS_MASK, "cilinders", N_( "Cylinders" ) },
  407 + { LIB3270_FT_ALLOCATION_UNITS_AVBLOCK, LIB3270_FT_ALLOCATION_UNITS_MASK, "avblock", N_( "Avblock" ) },
  408 + };
  409 +
  410 + static const struct _fdesc
  411 + {
  412 + const gchar * title;
  413 + const gchar * name;
  414 + const struct ftmask * option;
  415 + } fdesk[] =
  416 + {
  417 + { N_( "Record format" ), "recordformat", recfm },
  418 + { N_( "Space allocation units" ), "allocationunits", units }
  419 + };
  420 +
  421 + GtkWidget *box = gtk_hbox_new(TRUE,2);
  422 + int f;
  423 +
  424 + for(f=0;f<2;f++)
  425 + {
  426 + GtkWidget * frame = gtk_frame_new(gettext(fdesk[f].title));
  427 + GtkWidget * vbox = gtk_vbox_new(TRUE,2);
  428 + GSList * group = NULL;
  429 + const gchar * attr = g_object_get_data(G_OBJECT(action),fdesk[f].name);
  430 + gchar * setup;
  431 + int p;
  432 +
  433 + if(attr)
  434 + setup = g_strdup(attr);
  435 + else
  436 + setup = get_string_from_config(dlg.name,fdesk[f].name,fdesk[f].option[0].name);
  437 +
  438 + for(p=0;p<4;p++)
  439 + {
  440 + GtkWidget *widget = gtk_radio_button_new_with_label(group,gettext(fdesk[f].option[p].label));
  441 + g_object_set_data(G_OBJECT(widget),"dlg",(gpointer) &dlg);
  442 + g_object_set_data(G_OBJECT(widget),"setupname",(gpointer) fdesk[f].name);
  443 +
  444 + g_signal_connect(G_OBJECT(widget),"toggled", G_CALLBACK(toggle_format),(gpointer) &fdesk[f].option[p]);
  445 +
  446 + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),!g_strcasecmp(fdesk[f].option[p].name,setup));
  447 + group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(widget));
  448 + gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0);
  449 + }
  450 +
  451 + g_free(setup);
  452 +
  453 + gtk_container_add(GTK_CONTAINER(frame),GTK_WIDGET(vbox));
  454 + gtk_box_pack_start(GTK_BOX(box),frame,TRUE,TRUE,2);
  455 + }
  456 +
  457 +
  458 +
  459 +
  460 + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg.dialog))),box,TRUE,TRUE,2);
  461 + }
  462 +
  463 +
  464 +
  465 + {
  466 + // Add dft option
  467 + GtkWidget *hbox = gtk_hbox_new(FALSE,2);
  468 + GtkWidget *label = NULL;
  469 +
  470 + setup_dft(G_OBJECT(action),&dlg,&label);
  471 +
  472 + gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
  473 + gtk_box_pack_start(GTK_BOX(hbox),GTK_WIDGET(dlg.dft),FALSE,FALSE,0);
  474 + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg.dialog))),hbox,FALSE,FALSE,2);
  475 + }
  476 +
  477 + run_ft_dialog(widget,&dlg);
  478 +
  479 + gtk_widget_destroy(dlg.dialog);
  480 +
  481 +
315 } 482 }
316 483
317 484