Commit e48d6f690ee10dd7326079a8f31aeddc742f1498

Authored by perry.werneck@gmail.com
1 parent 2497ea5b

Implementando dialogo de transferência de arquivos

Showing 2 changed files with 47 additions and 17 deletions   Show diff stats
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)
... ...
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  
... ...