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