Commit 1cdb07ada791a8c61649c805795a88a513c8e3a3

Authored by Perry Werneck
1 parent 957c1f8d

Ajustando métodos de transferência de arquivos para facilitar implementação do n…

…ovo diálogo de transferência de arquivos.
Showing 2 changed files with 99 additions and 48 deletions   Show diff stats
ft.c
... ... @@ -101,21 +101,28 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
101 101 };
102 102  
103 103 int f;
  104 + const char *message = NULL;
104 105  
105 106 if(session->state == state)
106 107 return;
107   - session->state = state;
108   - session->state_changed(session,state);
  108 +
  109 + // State changed, notify
109 110  
110 111 for(f = 0; f < sizeof(msg)/sizeof(msg[0]);f++)
111 112 {
112 113 if(msg[f].state == state)
113 114 {
114   - ft_message(session,msg[f].text);
  115 + message = msg[f].text;
115 116 break;
116 117 }
117 118 }
118 119  
  120 + session->state = state;
  121 +
  122 + ft_message(session,message);
  123 + session->cbk.state_changed(session->host,state,message,session->user_data);
  124 +
  125 +
119 126 }
120 127  
121 128 void ft_init(H3270 *hSession)
... ... @@ -136,7 +143,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
136 143 if (ft->state == LIB3270_FT_STATE_RUNNING)
137 144 {
138 145 set_ft_state(ft,LIB3270_FT_STATE_ABORT_WAIT);
139   - ft->aborting(ft);
  146 + ft->cbk.aborting(hSession,ft->user_data);
140 147 return 0;
141 148 }
142 149  
... ... @@ -149,37 +156,37 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
149 156 return 0;
150 157 }
151 158  
152   - static void def_complete(H3270FT *ft,unsigned long length,double kbytes_sec,const char *msg)
  159 + static void def_complete(H3270 *hSession, unsigned long length,double kbytes_sec,const char *msg, void *userdata)
153 160 {
154   - ft->message(ft,msg);
  161 + hSession->ft->cbk.message(hSession,msg,hSession->ft->user_data);
155 162 }
156 163  
157   - static void def_failed(struct _h3270ft *ft,unsigned long length,double kbytes_sec,const char *msg)
  164 + static void def_failed(H3270 *hSession, unsigned long length,double kbytes_sec,const char *msg, void *userdata)
158 165 {
159   - ft->complete(ft,ft->ft_length,kbytes_sec,msg ? msg : N_("Transfer failed"));
  166 + hSession->ft->cbk.complete(hSession,length,kbytes_sec,msg,userdata);
160 167 }
161 168  
162   - static void def_message(H3270FT *ft, const char *errmsg)
  169 + static void def_message(H3270 *hSession, const char *msg, void *userdata)
163 170 {
164   - lib3270_write_log(ft->host,"ft","%s",errmsg);
  171 + lib3270_write_log(hSession,"ft","%s",msg);
165 172 }
166 173  
167   - static void def_update(H3270FT *ft, unsigned long current, unsigned long length, double kbytes_sec)
  174 + static void def_update(H3270 *hSession, unsigned long current, unsigned long length, double kbytes_sec, void *userdata)
168 175 {
169 176  
170 177 }
171 178  
172   - static void def_running(H3270FT *ft, int is_cut)
  179 + static void def_running(H3270 *hSession, int is_cut, void *userdata)
173 180 {
174 181  
175 182 }
176 183  
177   - static void def_aborting(H3270FT *ft)
  184 + static void def_aborting(H3270 *hSession, void *userdata)
178 185 {
179 186  
180 187 }
181 188  
182   - static void def_state_changed(H3270FT *ft, LIB3270_FT_STATE state)
  189 + static void def_state_changed(H3270 *hSession, LIB3270_FT_STATE state, const char *text, void *userdata)
183 190 {
184 191  
185 192 }
... ... @@ -281,32 +288,33 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
281 288 // Create & Initialize ft control structure.
282 289 ftHandle = lib3270_malloc(sizeof(H3270FT)+strlen(local)+strlen(remote)+3);
283 290  
284   - ftHandle->sz = sizeof(H3270FT);
285   - ftHandle->host = session;
286   -
287   - ftHandle->ft_last_cr = 0;
288   -
289   - ftHandle->ascii_flag = (flags & LIB3270_FT_OPTION_ASCII) ? 1 : 0;
290   - ftHandle->cr_flag = (flags & LIB3270_FT_OPTION_CRLF) ? 1 : 0;
291   - ftHandle->remap_flag = (flags & LIB3270_FT_OPTION_REMAP) ? 1 : 0;
292   - ftHandle->unix_text = (flags & LIB3270_FT_OPTION_UNIX) ? 1 : 0;
293   - ftHandle->ft_is_cut = 0;
294   - ftHandle->flags = flags;
295   - ftHandle->local_file = ft_local_file;
296   - ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK;
297   - ftHandle->complete = def_complete;
298   - ftHandle->failed = def_failed;
299   - ftHandle->message = def_message;
300   - ftHandle->update = def_update;
301   - ftHandle->running = def_running;
302   - ftHandle->aborting = def_aborting;
303   - ftHandle->state_changed = def_state_changed;
304   - ftHandle->lrecl = lrecl;
305   - ftHandle->blksize = blksize;
306   - ftHandle->primspace = primspace;
307   - ftHandle->secspace = secspace;
308   - ftHandle->dft = dft;
309   - ftHandle->quadrant = -1;
  291 + ftHandle->host = session;
  292 +
  293 + ftHandle->ft_last_cr = 0;
  294 +
  295 + ftHandle->ascii_flag = (flags & LIB3270_FT_OPTION_ASCII) ? 1 : 0;
  296 + ftHandle->cr_flag = (flags & LIB3270_FT_OPTION_CRLF) ? 1 : 0;
  297 + ftHandle->remap_flag = (flags & LIB3270_FT_OPTION_REMAP) ? 1 : 0;
  298 + ftHandle->unix_text = (flags & LIB3270_FT_OPTION_UNIX) ? 1 : 0;
  299 + ftHandle->ft_is_cut = 0;
  300 + ftHandle->flags = flags;
  301 + ftHandle->local_file = ft_local_file;
  302 + ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK;
  303 + ftHandle->lrecl = lrecl;
  304 + ftHandle->blksize = blksize;
  305 + ftHandle->primspace = primspace;
  306 + ftHandle->secspace = secspace;
  307 + ftHandle->dft = dft;
  308 + ftHandle->quadrant = -1;
  309 +
  310 + ftHandle->cbk.complete = def_complete;
  311 + ftHandle->cbk.failed = def_failed;
  312 + ftHandle->cbk.message = def_message;
  313 + ftHandle->cbk.update = def_update;
  314 + ftHandle->cbk.running = def_running;
  315 + ftHandle->cbk.aborting = def_aborting;
  316 + ftHandle->cbk.state_changed = def_state_changed;
  317 +
310 318  
311 319 // Setup file transfer charset.
312 320 memcpy(&ftHandle->charset,&session->charset,sizeof(struct lib3270_charset));
... ... @@ -330,6 +338,33 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
330 338 return ftHandle;
331 339 }
332 340  
  341 + LIB3270_EXPORT void lib3270_ft_set_user_data(H3270 *hSession, void *ptr)
  342 + {
  343 + H3270FT * ft;
  344 +
  345 + CHECK_SESSION_HANDLE(hSession);
  346 +
  347 + ft = get_ft_handle(hSession);
  348 + if(!ft)
  349 + return;
  350 +
  351 + ft->user_data = ptr;
  352 +
  353 + }
  354 +
  355 + LIB3270_EXPORT void * lib3270_ft_get_user_data(H3270 *hSession)
  356 + {
  357 + H3270FT * ft;
  358 +
  359 + CHECK_SESSION_HANDLE(hSession);
  360 +
  361 + ft = get_ft_handle(hSession);
  362 + if(!ft)
  363 + return NULL;
  364 +
  365 + return ft->user_data;
  366 + }
  367 +
333 368 LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession)
334 369 {
335 370 static const char * rec = "FVU";
... ... @@ -488,7 +523,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
488 523 void ft_message(H3270FT *ft, const char *msg)
489 524 {
490 525 lib3270_trace_event(ft->host,"%s\n",msg);
491   - ft->message(ft,msg);
  526 + ft->cbk.message(ft->host,msg,ft->user_data);
492 527 }
493 528  
494 529 static double finish(H3270FT *ft)
... ... @@ -518,12 +553,12 @@ static double finish(H3270FT *ft)
518 553  
519 554 void ft_complete(H3270FT *ft, const char *errmsg)
520 555 {
521   - ft->complete(ft,ft->ft_length,finish(ft),errmsg ? errmsg : N_("Transfer complete"));
  556 + ft->cbk.complete(ft->host,ft->ft_length,finish(ft),errmsg ? errmsg : N_("Transfer complete"),ft->user_data);
522 557 }
523 558  
524 559 void ft_failed(H3270FT *ft, const char *errmsg)
525 560 {
526   - ft->failed(ft,ft->ft_length,finish(ft),errmsg ? errmsg : N_("Transfer failed"));
  561 + ft->cbk.failed(ft->host,ft->ft_length,finish(ft),errmsg ? errmsg : N_("Transfer failed"),ft->user_data);
527 562 }
528 563  
529 564 LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession)
... ... @@ -569,7 +604,7 @@ void ft_update_length(H3270FT *session)
569 604 (double)(t1.tv_usec - session->starting_time.tv_usec) / 1.0e6);
570 605 }
571 606  
572   - session->update(session,session->ft_length,session->length,kbytes_sec);
  607 + session->cbk.update(session->host,session->ft_length,session->length,kbytes_sec,session->user_data);
573 608  
574 609 }
575 610  
... ... @@ -587,20 +622,36 @@ void ft_running(H3270FT *ft, Boolean is_cut)
587 622 if (ft->state == FT_AWAIT_ACK)
588 623 set_ft_state(ft,FT_RUNNING);
589 624  
590   - ft->running(ft,is_cut);
  625 + ft->cbk.running(ft->host,is_cut,ft->user_data);
591 626  
592 627 ft_update_length(ft);
593 628  
594 629 }
595 630  
  631 +LIB3270_EXPORT struct lib3270_ft_callbacks * lib3270_get_ft_callbacks(H3270 *session, unsigned short sz)
  632 +{
  633 +
  634 + CHECK_SESSION_HANDLE(session);
  635 +
  636 + if(sz != sizeof(struct lib3270_ft_callbacks))
  637 + return NULL;
  638 +
  639 + if(session->ft)
  640 + return &(session->ft->cbk);
  641 +
  642 + return NULL;
  643 +
  644 +}
  645 +
  646 +
596 647 // Process a protocol-generated abort.
597 648 void ft_aborting(H3270FT *h)
598 649 {
599 650 if (h->state == FT_RUNNING || h->state == FT_ABORT_WAIT)
600 651 {
601 652 set_ft_state(h,FT_ABORT_SENT);
602   - h->message(h,N_("Aborting..."));
603   - h->aborting(h);
  653 + h->cbk.message(h->host,N_("Aborting..."),h->user_data);
  654 + h->cbk.aborting(h->host,h->user_data);
604 655 }
605 656 }
606 657  
... ...
private.h
... ... @@ -373,7 +373,7 @@ struct _h3270
373 373 unsigned short current_port;
374 374  
375 375 // Misc
376   - void * ft; /**< Active file transfer data */
  376 + H3270FT * ft; /**< Active file transfer data */
377 377  
378 378 // screen info
379 379 int ov_rows;
... ...