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,20 +226,21 @@ | ||
226 | LOCAL_EXTERN int CancelFileTransfer(int force); | 226 | LOCAL_EXTERN int CancelFileTransfer(int force); |
227 | // LOCAL_EXTERN enum ft_state GetFileTransferState(void); | 227 | // LOCAL_EXTERN enum ft_state GetFileTransferState(void); |
228 | 228 | ||
229 | +/* | ||
229 | struct filetransfer_callbacks | 230 | struct filetransfer_callbacks |
230 | { | 231 | { |
231 | unsigned short sz; | 232 | unsigned short sz; |
232 | 233 | ||
233 | void (*begin)(unsigned short flags, const char *local, const char *remote); | 234 | void (*begin)(unsigned short flags, const char *local, const char *remote); |
234 | void (*complete)(const char *errmsg,unsigned long length,double kbytes_sec,const char *mode); | 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 | void (*running)(int is_cut); | 237 | void (*running)(int is_cut); |
238 | void (*aborting)(void); | 238 | void (*aborting)(void); |
239 | 239 | ||
240 | }; | 240 | }; |
241 | 241 | ||
242 | LOCAL_EXTERN int RegisterFTCallbacks(const struct filetransfer_callbacks *cbk); | 242 | LOCAL_EXTERN int RegisterFTCallbacks(const struct filetransfer_callbacks *cbk); |
243 | +*/ | ||
243 | 244 | ||
244 | #define PCONNECTED lib3270_pconnected(NULL) | 245 | #define PCONNECTED lib3270_pconnected(NULL) |
245 | #define HALF_CONNECTED lib3270_half_connected(NULL) | 246 | #define HALF_CONNECTED lib3270_half_connected(NULL) |
@@ -165,12 +165,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -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,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 | H3270FT * ftHandle = NULL; | 191 | H3270FT * ftHandle = NULL; |
197 | static const char * rec = "fvu"; | 192 | static const char * rec = "fvu"; |
@@ -201,6 +196,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -201,6 +196,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
201 | unsigned short units = (flags & FT_ALLOCATION_UNITS_MASK) >> 12; | 196 | unsigned short units = (flags & FT_ALLOCATION_UNITS_MASK) >> 12; |
202 | 197 | ||
203 | FILE * ft_local_file = NULL; | 198 | FILE * ft_local_file = NULL; |
199 | + unsigned long ft_length = 0L; | ||
204 | 200 | ||
205 | char op[4096]; | 201 | char op[4096]; |
206 | char buffer[4096]; | 202 | char buffer[4096]; |
@@ -215,16 +211,16 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -215,16 +211,16 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
215 | return NULL; | 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 | errno = EBUSY; | 217 | errno = EBUSY; |
222 | return NULL; | 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 | errno = EBUSY; | 224 | errno = EBUSY; |
229 | return NULL; | 225 | return NULL; |
230 | } | 226 | } |
@@ -254,7 +250,25 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -254,7 +250,25 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
254 | cr_flag = ((flags & LIB3270_FT_OPTION_CRLF) != 0); | 250 | cr_flag = ((flags & LIB3270_FT_OPTION_CRLF) != 0); |
255 | remap_flag = ((flags & LIB3270_FT_OPTION_ASCII) != 0); | 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 | /* Build the ind$file command */ | 273 | /* Build the ind$file command */ |
260 | snprintf(op,4095,"%s%s%s", | 274 | snprintf(op,4095,"%s%s%s", |
@@ -331,7 +345,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | @@ -331,7 +345,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
331 | return NULL; | 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 | (void) lib3270_emulate_input(NULL, buffer, strlen(buffer), False); | 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,9 +359,9 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); | ||
345 | ftHandle->sz = sizeof(H3270FT); | 359 | ftHandle->sz = sizeof(H3270FT); |
346 | ftHandle->host = session; | 360 | ftHandle->host = session; |
347 | ftHandle->ft_local_file = ft_local_file; | 361 | ftHandle->ft_local_file = ft_local_file; |
362 | + ftHandle->length = ft_length; | ||
348 | ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK; | 363 | ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK; |
349 | ftHandle->complete = def_complete; | 364 | ftHandle->complete = def_complete; |
350 | - ftHandle->setlength = def_setlength; | ||
351 | ftHandle->update = def_update; | 365 | ftHandle->update = def_update; |
352 | ftHandle->running = def_running; | 366 | ftHandle->running = def_running; |
353 | ftHandle->aborting = def_aborting; | 367 | ftHandle->aborting = def_aborting; |
@@ -390,6 +404,21 @@ void ft_complete(H3270FT *session, const char *errmsg) | @@ -390,6 +404,21 @@ void ft_complete(H3270FT *session, const char *errmsg) | ||
390 | 404 | ||
391 | session->complete(session,errmsg,ft_length,kbytes_sec,ft_is_cut ? "CUT" : "DFT"); | 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 | if(session == ftsession) | 422 | if(session == ftsession) |
394 | ftsession = NULL; | 423 | ftsession = NULL; |
395 | 424 | ||
@@ -417,7 +446,7 @@ void ft_update_length(H3270FT *session) | @@ -417,7 +446,7 @@ void ft_update_length(H3270FT *session) | ||
417 | (double)(t1.tv_usec - starting_time.tv_usec) / 1.0e6); | 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 |