Commit e48d6f690ee10dd7326079a8f31aeddc742f1498
1 parent
2497ea5b
Exists in
master
and in
3 other branches
Implementando dialogo de transferência de arquivos
Showing
2 changed files
with
47 additions
and
17 deletions
Show diff stats
| ... | ... | @@ -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) | ... | ... |
| ... | ... | @@ -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 | ... | ... |