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
@@ -101,21 +101,28 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); @@ -101,21 +101,28 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
101 }; 101 };
102 102
103 int f; 103 int f;
  104 + const char *message = NULL;
104 105
105 if(session->state == state) 106 if(session->state == state)
106 return; 107 return;
107 - session->state = state;  
108 - session->state_changed(session,state); 108 +
  109 + // State changed, notify
109 110
110 for(f = 0; f < sizeof(msg)/sizeof(msg[0]);f++) 111 for(f = 0; f < sizeof(msg)/sizeof(msg[0]);f++)
111 { 112 {
112 if(msg[f].state == state) 113 if(msg[f].state == state)
113 { 114 {
114 - ft_message(session,msg[f].text); 115 + message = msg[f].text;
115 break; 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 void ft_init(H3270 *hSession) 128 void ft_init(H3270 *hSession)
@@ -136,7 +143,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); @@ -136,7 +143,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
136 if (ft->state == LIB3270_FT_STATE_RUNNING) 143 if (ft->state == LIB3270_FT_STATE_RUNNING)
137 { 144 {
138 set_ft_state(ft,LIB3270_FT_STATE_ABORT_WAIT); 145 set_ft_state(ft,LIB3270_FT_STATE_ABORT_WAIT);
139 - ft->aborting(ft); 146 + ft->cbk.aborting(hSession,ft->user_data);
140 return 0; 147 return 0;
141 } 148 }
142 149
@@ -149,37 +156,37 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); @@ -149,37 +156,37 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
149 return 0; 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,32 +288,33 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
281 // Create & Initialize ft control structure. 288 // Create & Initialize ft control structure.
282 ftHandle = lib3270_malloc(sizeof(H3270FT)+strlen(local)+strlen(remote)+3); 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 // Setup file transfer charset. 319 // Setup file transfer charset.
312 memcpy(&ftHandle->charset,&session->charset,sizeof(struct lib3270_charset)); 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,6 +338,33 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
330 return ftHandle; 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 LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession) 368 LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession)
334 { 369 {
335 static const char * rec = "FVU"; 370 static const char * rec = "FVU";
@@ -488,7 +523,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); @@ -488,7 +523,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
488 void ft_message(H3270FT *ft, const char *msg) 523 void ft_message(H3270FT *ft, const char *msg)
489 { 524 {
490 lib3270_trace_event(ft->host,"%s\n",msg); 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 static double finish(H3270FT *ft) 529 static double finish(H3270FT *ft)
@@ -518,12 +553,12 @@ static double finish(H3270FT *ft) @@ -518,12 +553,12 @@ static double finish(H3270FT *ft)
518 553
519 void ft_complete(H3270FT *ft, const char *errmsg) 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 void ft_failed(H3270FT *ft, const char *errmsg) 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 LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession) 564 LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession)
@@ -569,7 +604,7 @@ void ft_update_length(H3270FT *session) @@ -569,7 +604,7 @@ void ft_update_length(H3270FT *session)
569 (double)(t1.tv_usec - session->starting_time.tv_usec) / 1.0e6); 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,20 +622,36 @@ void ft_running(H3270FT *ft, Boolean is_cut)
587 if (ft->state == FT_AWAIT_ACK) 622 if (ft->state == FT_AWAIT_ACK)
588 set_ft_state(ft,FT_RUNNING); 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 ft_update_length(ft); 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 // Process a protocol-generated abort. 647 // Process a protocol-generated abort.
597 void ft_aborting(H3270FT *h) 648 void ft_aborting(H3270FT *h)
598 { 649 {
599 if (h->state == FT_RUNNING || h->state == FT_ABORT_WAIT) 650 if (h->state == FT_RUNNING || h->state == FT_ABORT_WAIT)
600 { 651 {
601 set_ft_state(h,FT_ABORT_SENT); 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
@@ -373,7 +373,7 @@ struct _h3270 @@ -373,7 +373,7 @@ struct _h3270
373 unsigned short current_port; 373 unsigned short current_port;
374 374
375 // Misc 375 // Misc
376 - void * ft; /**< Active file transfer data */ 376 + H3270FT * ft; /**< Active file transfer data */
377 377
378 // screen info 378 // screen info
379 int ov_rows; 379 int ov_rows;