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 | ... | ... |