Commit f9c59e98e598286c244bbea6a5f29e7af7de475c
1 parent
8471bd91
Exists in
master
and in
5 other branches
Implementando dialogo de transferência de arquivos
Showing
4 changed files
with
164 additions
and
31 deletions
Show diff stats
src/include/lib3270/filetransfer.h
| ... | ... | @@ -74,11 +74,12 @@ |
| 74 | 74 | H3270 * host; |
| 75 | 75 | void * widget; /**< File transfer dialog handle */ |
| 76 | 76 | FILE * ft_local_file; /**< File descriptor for local file */ |
| 77 | + unsigned long length; /**< File length */ | |
| 78 | + | |
| 77 | 79 | LIB3270_FT_STATE state; |
| 78 | 80 | |
| 79 | 81 | void (*complete)(struct _h3270ft *ft, const char *errmsg,unsigned long length,double kbytes_sec,const char *mode); |
| 80 | - void (*setlength)(struct _h3270ft *ft, unsigned long length); | |
| 81 | - void (*update)(struct _h3270ft *ft, unsigned long length, double kbytes_sec); | |
| 82 | + void (*update)(struct _h3270ft *ft, unsigned long current, unsigned long length, double kbytes_sec); | |
| 82 | 83 | void (*running)(struct _h3270ft *ft, int is_cut); |
| 83 | 84 | void (*aborting)(struct _h3270ft *ft); |
| 84 | 85 | void (*state_changed)(struct _h3270ft *ft, LIB3270_FT_STATE state); |
| ... | ... | @@ -102,7 +103,8 @@ |
| 102 | 103 | * @return Filetransfer handle if ok, NULL if failed |
| 103 | 104 | * |
| 104 | 105 | */ |
| 105 | - 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); | |
| 106 | + LIB3270_EXPORT H3270FT * lib3270_ft_new(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); | |
| 107 | + LIB3270_EXPORT void lib3270_ft_destroy(H3270FT *ft); | |
| 106 | 108 | |
| 107 | 109 | LIB3270_EXPORT int lib3270_ft_cancel(H3270FT *ft, int force); |
| 108 | 110 | ... | ... |
src/lib3270/api.h
| ... | ... | @@ -226,20 +226,21 @@ |
| 226 | 226 | LOCAL_EXTERN int CancelFileTransfer(int force); |
| 227 | 227 | // LOCAL_EXTERN enum ft_state GetFileTransferState(void); |
| 228 | 228 | |
| 229 | +/* | |
| 229 | 230 | struct filetransfer_callbacks |
| 230 | 231 | { |
| 231 | 232 | unsigned short sz; |
| 232 | 233 | |
| 233 | 234 | void (*begin)(unsigned short flags, const char *local, const char *remote); |
| 234 | 235 | void (*complete)(const char *errmsg,unsigned long length,double kbytes_sec,const char *mode); |
| 235 | - void (*setlength)(unsigned long length); | |
| 236 | - void (*update)(unsigned long length,double kbytes_sec); | |
| 236 | + void (*update)(unsigned long length,unsigned long total,double kbytes_sec); | |
| 237 | 237 | void (*running)(int is_cut); |
| 238 | 238 | void (*aborting)(void); |
| 239 | 239 | |
| 240 | 240 | }; |
| 241 | 241 | |
| 242 | 242 | LOCAL_EXTERN int RegisterFTCallbacks(const struct filetransfer_callbacks *cbk); |
| 243 | +*/ | |
| 243 | 244 | |
| 244 | 245 | #define PCONNECTED lib3270_pconnected(NULL) |
| 245 | 246 | #define HALF_CONNECTED lib3270_half_connected(NULL) | ... | ... |
src/lib3270/ft.c
| ... | ... | @@ -165,12 +165,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 165 | 165 | |
| 166 | 166 | } |
| 167 | 167 | |
| 168 | - static void def_setlength(H3270FT *ft, unsigned long length) | |
| 169 | - { | |
| 170 | - | |
| 171 | - } | |
| 172 | - | |
| 173 | - static void def_update(H3270FT *ft, unsigned long length,double kbytes_sec) | |
| 168 | + static void def_update(H3270FT *ft, unsigned long current, unsigned long length, double kbytes_sec) | |
| 174 | 169 | { |
| 175 | 170 | |
| 176 | 171 | } |
| ... | ... | @@ -191,7 +186,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 191 | 186 | } |
| 192 | 187 | |
| 193 | 188 | |
| 194 | - 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) | |
| 189 | + LIB3270_EXPORT H3270FT * lib3270_ft_new(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) | |
| 195 | 190 | { |
| 196 | 191 | H3270FT * ftHandle = NULL; |
| 197 | 192 | static const char * rec = "fvu"; |
| ... | ... | @@ -201,6 +196,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 201 | 196 | unsigned short units = (flags & FT_ALLOCATION_UNITS_MASK) >> 12; |
| 202 | 197 | |
| 203 | 198 | FILE * ft_local_file = NULL; |
| 199 | + unsigned long ft_length = 0L; | |
| 204 | 200 | |
| 205 | 201 | char op[4096]; |
| 206 | 202 | char buffer[4096]; |
| ... | ... | @@ -215,16 +211,16 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 215 | 211 | return NULL; |
| 216 | 212 | } |
| 217 | 213 | |
| 218 | - if(ftsession) | |
| 214 | + if(session->ft) | |
| 219 | 215 | { |
| 220 | - *msg = N_( "File transfer is already active" ); | |
| 216 | + *msg = N_( "File transfer is already active in this session" ); | |
| 221 | 217 | errno = EBUSY; |
| 222 | 218 | return NULL; |
| 223 | 219 | } |
| 224 | 220 | |
| 225 | - if(session->ft) | |
| 221 | + if(ftsession) | |
| 226 | 222 | { |
| 227 | - *msg = N_( "File transfer is already active in this session" ); | |
| 223 | + *msg = N_( "File transfer is already active" ); | |
| 228 | 224 | errno = EBUSY; |
| 229 | 225 | return NULL; |
| 230 | 226 | } |
| ... | ... | @@ -254,7 +250,25 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 254 | 250 | cr_flag = ((flags & LIB3270_FT_OPTION_CRLF) != 0); |
| 255 | 251 | remap_flag = ((flags & LIB3270_FT_OPTION_ASCII) != 0); |
| 256 | 252 | |
| 257 | - lib3270_write_log(session, "%s file \"%s\"",(flags & LIB3270_FT_OPTION_RECEIVE) ? "Receiving" : "Sending", local); | |
| 253 | + if(flags & LIB3270_FT_OPTION_RECEIVE) | |
| 254 | + { | |
| 255 | + // Receiving file | |
| 256 | + lib3270_write_log(session,"ft","Receiving file %s",local); | |
| 257 | + } | |
| 258 | + else | |
| 259 | + { | |
| 260 | + // Sending file | |
| 261 | + if(fseek(ft_local_file,0L,SEEK_END) < 0) | |
| 262 | + { | |
| 263 | + *msg = N_( "Can't get file size" ); | |
| 264 | + return NULL; | |
| 265 | + } | |
| 266 | + | |
| 267 | + ft_length = ftell(ft_local_file); | |
| 268 | + | |
| 269 | + lib3270_write_log(session,"ft","Sending file %s (%ld bytes)",local,ft_length); | |
| 270 | + rewind(ft_local_file); | |
| 271 | + } | |
| 258 | 272 | |
| 259 | 273 | /* Build the ind$file command */ |
| 260 | 274 | snprintf(op,4095,"%s%s%s", |
| ... | ... | @@ -331,7 +345,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 331 | 345 | return NULL; |
| 332 | 346 | } |
| 333 | 347 | |
| 334 | - trace("Command: \"%s\"",buffer); | |
| 348 | + trace_event("Sending FT request:\n%s\n",buffer); | |
| 335 | 349 | |
| 336 | 350 | (void) lib3270_emulate_input(NULL, buffer, strlen(buffer), False); |
| 337 | 351 | |
| ... | ... | @@ -345,9 +359,9 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
| 345 | 359 | ftHandle->sz = sizeof(H3270FT); |
| 346 | 360 | ftHandle->host = session; |
| 347 | 361 | ftHandle->ft_local_file = ft_local_file; |
| 362 | + ftHandle->length = ft_length; | |
| 348 | 363 | ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK; |
| 349 | 364 | ftHandle->complete = def_complete; |
| 350 | - ftHandle->setlength = def_setlength; | |
| 351 | 365 | ftHandle->update = def_update; |
| 352 | 366 | ftHandle->running = def_running; |
| 353 | 367 | ftHandle->aborting = def_aborting; |
| ... | ... | @@ -390,6 +404,21 @@ void ft_complete(H3270FT *session, const char *errmsg) |
| 390 | 404 | |
| 391 | 405 | session->complete(session,errmsg,ft_length,kbytes_sec,ft_is_cut ? "CUT" : "DFT"); |
| 392 | 406 | |
| 407 | +} | |
| 408 | + | |
| 409 | +LIB3270_EXPORT void lib3270_ft_destroy(H3270FT *session) | |
| 410 | +{ | |
| 411 | + CHECK_FT_HANDLE(session); | |
| 412 | + | |
| 413 | + if (session->state != LIB3270_FT_STATE_NONE) | |
| 414 | + lib3270_ft_cancel(session,1); | |
| 415 | + | |
| 416 | + if(session->ft_local_file) | |
| 417 | + { | |
| 418 | + fclose(session->ft_local_file); | |
| 419 | + session->ft_local_file = NULL; | |
| 420 | + } | |
| 421 | + | |
| 393 | 422 | if(session == ftsession) |
| 394 | 423 | ftsession = NULL; |
| 395 | 424 | |
| ... | ... | @@ -417,7 +446,7 @@ void ft_update_length(H3270FT *session) |
| 417 | 446 | (double)(t1.tv_usec - starting_time.tv_usec) / 1.0e6); |
| 418 | 447 | } |
| 419 | 448 | |
| 420 | - session->update(session,ft_length,kbytes_sec); | |
| 449 | + session->update(session,ft_length,session->length,kbytes_sec); | |
| 421 | 450 | |
| 422 | 451 | } |
| 423 | 452 | ... | ... |
src/pw3270/filetransfer.c
| ... | ... | @@ -174,7 +174,6 @@ static void add_file_fields(GObject *action, struct ftdialog *dlg) |
| 174 | 174 | gtk_table_attach(GTK_TABLE(table),widget,0,1,f,f+1,GTK_FILL,GTK_FILL,2,2); |
| 175 | 175 | |
| 176 | 176 | dlg->file[f] = GTK_ENTRY(gtk_entry_new()); |
| 177 | - g_signal_connect(G_OBJECT(dlg->file[f]),"changed",G_CALLBACK(check_entry),dlg); | |
| 178 | 177 | |
| 179 | 178 | gtk_widget_set_name(GTK_WIDGET(dlg->file[f]),attr[f]); |
| 180 | 179 | |
| ... | ... | @@ -196,6 +195,8 @@ static void add_file_fields(GObject *action, struct ftdialog *dlg) |
| 196 | 195 | |
| 197 | 196 | gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg->dialog))),GTK_WIDGET(table),FALSE,FALSE,2); |
| 198 | 197 | |
| 198 | + for(f=0;f<2;f++) | |
| 199 | + g_signal_connect(G_OBJECT(dlg->file[f]),"changed",G_CALLBACK(check_entry),dlg); | |
| 199 | 200 | } |
| 200 | 201 | |
| 201 | 202 | static void toggle_option(GtkToggleButton *button, const struct ftoption *option) |
| ... | ... | @@ -282,13 +283,28 @@ static void setup_dft(GObject *action, struct ftdialog *dlg, GtkWidget **label) |
| 282 | 283 | |
| 283 | 284 | } |
| 284 | 285 | |
| 285 | -static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialog *dlg) | |
| 286 | + | |
| 287 | +static void ft_complete(H3270FT *ft, const char *errmsg,unsigned long length,double kbytes_sec,const char *mode) | |
| 288 | +{ | |
| 289 | + if(!ft->widget) | |
| 290 | + return; | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + ft->widget = NULL; | |
| 295 | +} | |
| 296 | + | |
| 297 | + | |
| 298 | +static void run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialog *dlg) | |
| 286 | 299 | { |
| 287 | 300 | H3270FT * ft = NULL; |
| 288 | 301 | const char * msg = NULL; |
| 289 | 302 | int f; |
| 290 | 303 | int parm[G_N_ELEMENTS(dlg->parm)]; |
| 291 | 304 | |
| 305 | + for(f=0;f<2;f++) | |
| 306 | + gtk_widget_set_sensitive(dlg->ready,is_dialog_ok(GTK_EDITABLE(dlg->file[f]),dlg)); | |
| 307 | + | |
| 292 | 308 | gtk_widget_show_all(dlg->dialog); |
| 293 | 309 | |
| 294 | 310 | for(f=0;f<G_N_ELEMENTS(dlg->parm);f++) |
| ... | ... | @@ -303,7 +319,11 @@ static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialo |
| 303 | 319 | } |
| 304 | 320 | |
| 305 | 321 | if(gtk_dialog_run(GTK_DIALOG(dlg->dialog)) != GTK_RESPONSE_ACCEPT) |
| 306 | - return FALSE; | |
| 322 | + { | |
| 323 | + gtk_widget_destroy(dlg->dialog); | |
| 324 | + dlg->dialog = NULL; | |
| 325 | + return; | |
| 326 | + } | |
| 307 | 327 | |
| 308 | 328 | for(f=0;f<G_N_ELEMENTS(dlg->parm);f++) |
| 309 | 329 | { |
| ... | ... | @@ -321,7 +341,7 @@ static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialo |
| 321 | 341 | set_string_to_config(dlg->name,"local","%s",gtk_entry_get_text(dlg->file[0])); |
| 322 | 342 | set_string_to_config(dlg->name,"remote","%s",gtk_entry_get_text(dlg->file[1])); |
| 323 | 343 | |
| 324 | - ft = lib3270_ft_start( v3270_get_session(widget), | |
| 344 | + ft = lib3270_ft_new( v3270_get_session(widget), | |
| 325 | 345 | dlg->option, |
| 326 | 346 | gtk_entry_get_text(dlg->file[0]), |
| 327 | 347 | gtk_entry_get_text(dlg->file[1]), |
| ... | ... | @@ -332,6 +352,9 @@ static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialo |
| 332 | 352 | parm[4], // dft |
| 333 | 353 | &msg ); |
| 334 | 354 | |
| 355 | + | |
| 356 | + gtk_widget_set_visible(dlg->dialog,FALSE); | |
| 357 | + | |
| 335 | 358 | if(msg) |
| 336 | 359 | { |
| 337 | 360 | GtkWidget *popup = gtk_message_dialog_new_with_markup( |
| ... | ... | @@ -351,10 +374,90 @@ static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialo |
| 351 | 374 | |
| 352 | 375 | } |
| 353 | 376 | |
| 354 | - if(!ft) | |
| 355 | - return FALSE; | |
| 377 | + if(ft) | |
| 378 | + { | |
| 379 | + // Setup FT callbacks, create popup window | |
| 380 | + /* | |
| 381 | + http://www.suggestsoft.com/images/medieval-software/medieval-bluetooth-obex-file-transfer.gif | |
| 382 | + | |
| 383 | + --Informations---------------------------------------- | |
| 384 | + | | |
| 385 | + | From: xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx | |
| 386 | + | | |
| 387 | + | To: xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx | |
| 388 | + | | |
| 389 | + | Status: xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx | |
| 390 | + ------------------------------------------------------ | |
| 391 | + | |
| 392 | + --Progress---------------------------------------------- | |
| 393 | + | | |
| 394 | + | Total: xxx.xxx.xxx Current: xxx.xxx.xxx | |
| 395 | + | | |
| 396 | + | Started: xx:xx:xx ETA: xx:xx:xx | |
| 397 | + | | |
| 398 | + | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | |
| 399 | + -------------------------------------------------------- | |
| 400 | + | |
| 401 | + [Cancel] | |
| 402 | + */ | |
| 403 | + GtkWidget *container; | |
| 404 | + | |
| 405 | + ft->widget = gtk_dialog_new_with_buttons( _( "File transfer" ), | |
| 406 | + GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
| 407 | + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 408 | + GTK_STOCK_CLOSE,GTK_RESPONSE_CLOSE ); | |
| 409 | + | |
| 410 | + | |
| 411 | + container = gtk_vbox_new(FALSE,2); | |
| 412 | + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(ft->widget))),container,TRUE,TRUE,2); | |
| 413 | + | |
| 414 | + // Information frame | |
| 415 | + { | |
| 416 | + static const gchar *text[] = { N_( "_From:" ), N_( "_To:" ), N_( "_Status:" ) }; | |
| 417 | + | |
| 418 | + GtkWidget * frame = gtk_frame_new( _( "Informations" ) ); | |
| 419 | + GtkWidget * table = gtk_table_new(G_N_ELEMENTS(text),2,FALSE); | |
| 420 | + int f; | |
| 421 | + GtkWidget **entry = g_new0(GtkWidget *, G_N_ELEMENTS(text)); | |
| 422 | + | |
| 423 | + g_object_set_data_full(G_OBJECT(ft->widget),"info",entry,g_free); | |
| 424 | + gtk_container_set_border_width(GTK_CONTAINER(frame),3); | |
| 425 | + | |
| 426 | + for(f=0;f<G_N_ELEMENTS(text);f++) | |
| 427 | + { | |
| 428 | + GtkWidget *label = gtk_label_new_with_mnemonic(gettext(text[f])); | |
| 429 | + gtk_misc_set_alignment(GTK_MISC(label),0,.5); | |
| 430 | + gtk_table_attach(GTK_TABLE(table),label,0,1,f,f+1,GTK_FILL,GTK_FILL,2,2); | |
| 431 | + | |
| 432 | + entry[f] = gtk_entry_new(); | |
| 433 | + gtk_entry_set_width_chars(GTK_ENTRY(entry[f]),70); | |
| 434 | + gtk_editable_set_editable(GTK_EDITABLE(entry[f]),FALSE); | |
| 435 | + gtk_table_attach(GTK_TABLE(table),entry[f],1,2,f,f+1,GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND,2,2); | |
| 436 | + | |
| 437 | + gtk_label_set_mnemonic_widget(GTK_LABEL(label),entry[f]); | |
| 438 | + } | |
| 439 | + | |
| 440 | + for(f=0;f<2;f++) | |
| 441 | + gtk_entry_set_text(GTK_ENTRY(entry[f]),gtk_entry_get_text(dlg->file[f])); | |
| 442 | + | |
| 443 | + gtk_container_add(GTK_CONTAINER(frame),table); | |
| 444 | + gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,2); | |
| 445 | + | |
| 446 | + } | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + gtk_widget_show_all(ft->widget); | |
| 451 | + gtk_dialog_run(GTK_DIALOG(ft->widget)); | |
| 452 | + gtk_widget_destroy(ft->widget); | |
| 453 | + | |
| 454 | + lib3270_ft_destroy(ft); | |
| 455 | + | |
| 456 | + } | |
| 457 | + | |
| 458 | + gtk_widget_destroy(dlg->dialog); | |
| 459 | + dlg->dialog = NULL; | |
| 356 | 460 | |
| 357 | - return TRUE; | |
| 358 | 461 | } |
| 359 | 462 | |
| 360 | 463 | static void add_buttons(struct ftdialog *dlg) |
| ... | ... | @@ -409,8 +512,6 @@ void download_action(GtkAction *action, GtkWidget *widget) |
| 409 | 512 | |
| 410 | 513 | run_ft_dialog(G_OBJECT(action),widget,&dlg); |
| 411 | 514 | |
| 412 | - gtk_widget_destroy(dlg.dialog); | |
| 413 | - | |
| 414 | 515 | } |
| 415 | 516 | |
| 416 | 517 | static void toggle_format(GtkToggleButton *button, const struct ftmask *option) |
| ... | ... | @@ -565,9 +666,9 @@ void upload_action(GtkAction *action, GtkWidget *widget) |
| 565 | 666 | |
| 566 | 667 | } |
| 567 | 668 | |
| 568 | - run_ft_dialog(G_OBJECT(action),widget,&dlg); | |
| 669 | + trace("Running ft fialog %p",&dlg); | |
| 569 | 670 | |
| 570 | - gtk_widget_destroy(dlg.dialog); | |
| 671 | + run_ft_dialog(G_OBJECT(action),widget,&dlg); | |
| 571 | 672 | |
| 572 | 673 | |
| 573 | 674 | } | ... | ... |