Commit 4330eeae8c4f4d20b524bb298d239b9564523fda

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

Implementando caixa de transferência

po/pt_BR.po
... ... @@ -5,8 +5,8 @@ msgid ""
5 5 msgstr ""
6 6 "Project-Id-Version: pw3270 5.0\n"
7 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 10 "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n"
11 11 "Language-Team: Português do Brasil <>\n"
12 12 "Language: pt_BR\n"
... ... @@ -264,18 +264,22 @@ msgstr &quot;&quot;
264 264 msgid "Can't set lib3270 I/O handlers"
265 265 msgstr "Não foi possível registrar manipuladores de I/O 3270"
266 266  
267   -#: filetransfer.c:262
  267 +#: filetransfer.c:307
268 268 msgid "Can't start download"
269 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 276 msgid "Can't start upload"
273 277 msgstr "Não foi possível iniciar upload"
274 278  
275 279 #: telnet.c:387
276 280 #, c-format
277 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 284 #: ft.c:157
281 285 msgid "Cancelled by user"
... ... @@ -311,6 +315,7 @@ msgid &quot;Colors&quot;
311 315 msgstr "Cores"
312 316  
313 317 #: ft_cut.c:326
  318 +#, fuzzy
314 319 msgid "Complete"
315 320 msgstr "Complete"
316 321  
... ... @@ -432,7 +437,11 @@ msgstr &quot;&quot;
432 437 msgid "Fields"
433 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 445 msgid "File transfer is already active"
437 446 msgstr "Transferência de arquivos já está ativa"
438 447  
... ... @@ -660,9 +669,9 @@ msgstr &quot;Púrpura&quot;
660 669 msgid "Receive file"
661 670 msgstr "Receber arquivo"
662 671  
663   -#: filetransfer.c:268
  672 +#: filetransfer.c:313
664 673 msgid "Receive file from host"
665   -msgstr "Receber arquivo"
  674 +msgstr "Receber arquivo do servidor"
666 675  
667 676 #: colors.c:353
668 677 msgid "Red"
... ... @@ -738,7 +747,7 @@ msgstr &quot;Seleção retangular&quot;
738 747  
739 748 #: filetransfer.c:86
740 749 msgid "Select file to receive"
741   -msgstr "Select file to receive"
  750 +msgstr "Selecione arquivo a receber"
742 751  
743 752 #: filetransfer.c:86
744 753 msgid "Select file to send"
... ... @@ -770,7 +779,7 @@ msgstr &quot;Enviar/Receber&quot;
770 779  
771 780 #: ui/00default.xml:142
772 781 msgid "Set hostname"
773   -msgstr "Selecione host"
  782 +msgstr "Selecione servidor"
774 783  
775 784 #: glue.c:325
776 785 msgid "Set terminal model (screen size)"
... ...
src/include/lib3270/filetransfer.h
... ... @@ -37,6 +37,18 @@
37 37  
38 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 52 typedef enum _lib3270_FT_FLAG
41 53 {
42 54 LIB3270_FT_OPTION_RECEIVE = 0x0001,
... ...
src/lib3270/api.h
... ... @@ -213,15 +213,15 @@
213 213 // #define LIB3270_FT_OPTION_TSO 0x0010
214 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 226 #define FT_NONE LIB3270_FT_STATE_NONE
227 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 206  
207 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 217 if(ftsession)
212 218 {
... ...
src/pw3270/filetransfer.c
... ... @@ -53,6 +53,14 @@
53 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 64 /*--[ Implement ]------------------------------------------------------------------------------------*/
57 65  
58 66  
... ... @@ -186,6 +194,7 @@ static void add_transfer_options(GObject *action, struct ftdialog *dlg)
186 194  
187 195 GtkTable * table = GTK_TABLE(gtk_table_new(3,2,TRUE));
188 196 GtkWidget * frame = gtk_frame_new( _( "Transfer options" ) );
  197 + GtkWidget * label = gtk_frame_get_label_widget(GTK_FRAME(frame));
189 198 int row, col, f;
190 199  
191 200 row=0;
... ... @@ -196,6 +205,7 @@ static void add_transfer_options(GObject *action, struct ftdialog *dlg)
196 205 GtkWidget * widget = gtk_check_button_new_with_mnemonic( gettext(option[f].label) );
197 206 gboolean active = FALSE;
198 207  
  208 +
199 209 gtk_widget_set_name(widget,option[f].name);
200 210  
201 211 if(val)
... ... @@ -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 310 void download_action(GtkAction *action, GtkWidget *widget)
256 311 {
257 312 struct ftdialog dlg;
258 313  
259   -
260 314 if(lib3270_get_ft_state(v3270_get_session(widget)) != LIB3270_FT_STATE_NONE)
261 315 {
262 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 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 368 void upload_action(GtkAction *action, GtkWidget *widget)
307 369 {
  370 + struct ftdialog dlg;
  371 +
308 372 if(lib3270_get_ft_state(v3270_get_session(widget)) != LIB3270_FT_STATE_NONE)
309 373 {
310 374 error_dialog(widget,_( "Can't start upload" ), _( "File transfer is already active" ), NULL);
311 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  
... ...