Commit 24bc3c60bf65343058c0e610da749cb14d76e7e5

Authored by Perry Werneck
1 parent d90797ee

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

…ovo diálogo de transferência de arquivos.
pw3270.cbp
... ... @@ -214,9 +214,6 @@
214 214 <Option compilerVar="CC" />
215 215 </Unit>
216 216 <Unit filename="src/lib3270/ctlrc.h" />
217   - <Unit filename="src/lib3270/dispatcher.c">
218   - <Option compilerVar="CC" />
219   - </Unit>
220 217 <Unit filename="src/lib3270/ft.c">
221 218 <Option compilerVar="CC" />
222 219 </Unit>
... ...
src/include/lib3270.h
... ... @@ -332,7 +332,8 @@
332 332 LIB3270_STATE_USER // Always the last one
333 333 } LIB3270_STATE;
334 334  
335   - typedef struct _h3270 H3270;
  335 + typedef struct _h3270 H3270;
  336 + typedef struct _h3270ft H3270FT;
336 337  
337 338 /**
338 339 * Get current screen size.
... ...
src/include/lib3270/filetransfer.h
... ... @@ -87,9 +87,24 @@
87 87  
88 88 #define LIB3270_XLATE_NBUF 4
89 89  
90   - typedef struct _h3270ft
  90 + struct lib3270_ft_callbacks
91 91 {
92   - unsigned short sz; ///< @brief Size of FT data structure
  92 + void (*complete)(H3270 *hSession, unsigned long length,double kbytes_sec,const char *msg, void *userdata);
  93 + void (*failed)(H3270 *hSession, unsigned long length,double kbytes_sec,const char *msg, void *userdata);
  94 + void (*message)(H3270 *hSession, const char *msg, void *userdata);
  95 + void (*update)(H3270 *hSession, unsigned long current, unsigned long length, double kbytes_sec, void *userdata);
  96 + void (*running)(H3270 *hSession, int is_cut, void *userdata);
  97 + void (*aborting)(H3270 *hSession, void *userdata);
  98 + void (*state_changed)(H3270 *hSession, LIB3270_FT_STATE state, const char *text, void *userdata);
  99 + };
  100 +
  101 + /**
  102 + * @brief File transfer data.
  103 + *
  104 + */
  105 + struct _h3270ft
  106 + {
  107 + struct lib3270_ft_callbacks cbk; ///< @brief Callback table - Always the first one.
93 108  
94 109 int ft_last_cr : 1; ///< @brief CR was last char in local file
95 110 int remap_flag : 1; ///< @brief Remap ASCII<->EBCDIC
... ... @@ -102,7 +117,7 @@
102 117  
103 118  
104 119 H3270 * host;
105   - void * widget; ///< @brief File transfer dialog handle
  120 + void * user_data; ///< @brief File transfer dialog handle
106 121 FILE * local_file; ///< @brief File descriptor for local file
107 122 unsigned long length; ///< @brief File length
108 123  
... ... @@ -115,12 +130,12 @@
115 130 int secspace;
116 131 int dft;
117 132  
118   - unsigned long ft_length; /**< Length of transfer */
  133 + unsigned long ft_length; ///< Length of transfer
119 134  
120   - struct timeval starting_time; /**< Starting time */
  135 + struct timeval starting_time; ///< Starting time
121 136  
122   - const char * local; /**< Local filename */
123   - const char * remote; /**< Remote filename */
  137 + const char * local; ///< Local filename
  138 + const char * remote; ///< Remote filename
124 139  
125 140 // ft_dft.c
126 141 char * abort_string;
... ... @@ -133,23 +148,16 @@
133 148 int quadrant;
134 149 unsigned long expanded_length;
135 150 char * saved_errmsg;
136   - int xlate_buffered; /**< buffer count */
137   - int xlate_buf_ix; /**< buffer index */
138   - unsigned char xlate_buf[LIB3270_XLATE_NBUF]; /**< buffer */
  151 + int xlate_buffered; ///< buffer count
  152 + int xlate_buf_ix; ///< buffer index
  153 + unsigned char xlate_buf[LIB3270_XLATE_NBUF]; ///< buffer
139 154  
140 155 // Charset
141 156 struct lib3270_charset charset;
142 157  
143   - // Callbacks
144   - void (*complete)(struct _h3270ft *ft,unsigned long length,double kbytes_sec,const char *msg);
145   - void (*failed)(struct _h3270ft *ft,unsigned long length,double kbytes_sec,const char *msg);
146   - void (*message)(struct _h3270ft *ft, const char *msg);
147   - void (*update)(struct _h3270ft *ft, unsigned long current, unsigned long length, double kbytes_sec);
148   - void (*running)(struct _h3270ft *ft, int is_cut);
149   - void (*aborting)(struct _h3270ft *ft);
150   - void (*state_changed)(struct _h3270ft *ft, LIB3270_FT_STATE state);
  158 + };
  159 +
151 160  
152   - } H3270FT;
153 161  
154 162 /**
155 163 * Create a new file transfer session.
... ... @@ -165,18 +173,22 @@
165 173 * @param dft
166 174 * @param msg Pointer to receive message text.
167 175 *
168   - * @return Filetransfer handle if ok, NULL if failed
  176 + * @return Filetransfer callback table
169 177 *
170 178 */
171   - LIB3270_EXPORT H3270FT * lib3270_ft_new(H3270 *hSession, LIB3270_FT_OPTION flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft, const char **msg);
  179 + LIB3270_EXPORT H3270FT * lib3270_ft_new(H3270 *hSession, LIB3270_FT_OPTION flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft, const char **msg);
  180 +
  181 + LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession);
  182 + LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession);
172 183  
173   - LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession);
174   - LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession);
  184 + LIB3270_EXPORT int lib3270_ft_cancel(H3270 *hSession, int force);
175 185  
176   - LIB3270_EXPORT int lib3270_ft_cancel(H3270 *hSession, int force);
  186 + LIB3270_EXPORT void lib3270_ft_set_user_data(H3270 *h, void *ptr);
  187 + LIB3270_EXPORT void * lib3270_ft_get_user_data(H3270 *h);
177 188  
  189 + LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session);
178 190  
179   - LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session);
  191 + LIB3270_EXPORT struct lib3270_ft_callbacks * lib3270_get_ft_callbacks(H3270 *session, unsigned short sz);
180 192  
181 193  
182 194 #endif // LIB3270_FILETRANSFER_INCLUDED
... ...
src/include/lib3270/session.h
... ... @@ -68,6 +68,17 @@
68 68  
69 69 };
70 70  
  71 + /**
  72 + * Register application Handlers.
  73 + *
  74 + * @param cbk Structure with the application I/O handles to set.
  75 + *
  76 + * @return 0 if ok, error code if not.
  77 + *
  78 + */
  79 + int LIB3270_EXPORT lib3270_set_session_callbacks(const struct lib3270_callbacks *cbk);
  80 +
  81 +
71 82 LIB3270_EXPORT struct lib3270_session_callbacks * lib3270_get_session_callbacks(H3270 *session, unsigned short sz);
72 83  
73 84 #endif // LIB3270_SESSION_H_INCLUDED
... ...
src/lib3270/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  
... ...
src/lib3270/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;
... ...
src/pw3270/filetransfer.c
... ... @@ -34,7 +34,7 @@
34 34 #include <stdlib.h>
35 35 #include "globals.h"
36 36 #include "ft/v3270ft.h"
37   -
  37 +#include <lib3270/filetransfer.h>
38 38  
39 39 /*--[ Constants ]------------------------------------------------------------------------------------*/
40 40  
... ... @@ -207,39 +207,28 @@ static void ft_dialog_save(GtkWidget *widget, const gchar *name)
207 207  
208 208 }
209 209  
210   -static void ft_complete(H3270FT *ft, unsigned long length,double kbytes_sec, const char *msg)
211   -{
212   - v3270_ft_progress_complete(GTK_WIDGET(ft->widget),length,kbytes_sec);
213   - v3270_ft_progress_set_message(GTK_WIDGET(ft->widget),gettext(msg));
214   -}
215   -
216   -static void ft_message(struct _h3270ft *ft, const char *text)
217   -{
218   - v3270_ft_progress_set_message(GTK_WIDGET(ft->widget),gettext(text));
219   -}
220   -
221   -static void ft_update(H3270FT *ft, unsigned long current, unsigned long length, double kbytes_sec)
  210 +static void ft_complete(H3270 *hSession, unsigned long length,double kbytes_sec, const char *msg, void *widget)
222 211 {
223   - v3270_ft_progress_update(GTK_WIDGET(ft->widget), current, length, kbytes_sec);
  212 + v3270_ft_progress_complete(GTK_WIDGET(widget),length,kbytes_sec);
  213 + v3270_ft_progress_set_message(GTK_WIDGET(widget),gettext(msg));
224 214 }
225 215  
226   -static void ft_running(H3270FT *ft, int is_cut)
  216 +static void ft_message(H3270 *hSession, const char *text, void *widget)
227 217 {
  218 + v3270_ft_progress_set_message(GTK_WIDGET(widget),gettext(text));
228 219 }
229 220  
230   -static void ft_aborting(H3270FT *ft)
231   -{
232   -}
233   -
234   -static void ft_state_changed(H3270FT *ft, LIB3270_FT_STATE state)
  221 +static void ft_update(H3270 *hSession, unsigned long current, unsigned long length, double kbytes_sec, void *widget)
235 222 {
  223 + v3270_ft_progress_update(GTK_WIDGET(widget), current, length, kbytes_sec);
236 224 }
237 225  
238 226 gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION options, const gchar *local, const gchar *remote, int lrecl, int blksize, int primspace, int secspace, int dft)
239 227 {
240 228 g_return_val_if_fail(GTK_IS_V3270(widget),0);
241 229  
242   - H3270FT * ft = lib3270_ft_new(v3270_get_session(widget),options,local,remote,lrecl,blksize,primspace,secspace,dft,NULL);
  230 + H3270 * hSession = v3270_get_session(widget);
  231 + H3270FT * ft = lib3270_ft_new(hSession,options,local,remote,lrecl,blksize,primspace,secspace,dft,NULL);
243 232  
244 233 if(!ft)
245 234 return -1;
... ... @@ -254,14 +243,18 @@ gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION options, const gch
254 243 // Create FT progress dialog
255 244 GtkWidget * progress = v3270_ft_progress_new();
256 245  
257   - ft->widget = progress;
258   - ft->complete = ft_complete;
259   - ft->failed = ft_complete;
260   - ft->update = ft_update;
261   - ft->running = ft_running;
262   - ft->aborting = ft_aborting;
263   - ft->state_changed = ft_state_changed;
264   - ft->message = ft_message;
  246 + lib3270_ft_set_user_data(hSession,progress);
  247 +
  248 +
  249 + struct lib3270_ft_callbacks *cbk = lib3270_get_ft_callbacks(hSession,sizeof(struct lib3270_ft_callbacks));
  250 +
  251 + cbk->complete = ft_complete;
  252 + cbk->failed = ft_complete;
  253 + cbk->update = ft_update;
  254 +// cbk->running = ft_running;
  255 +// cbk->aborting = ft_aborting;
  256 +// cbk->state_changed = ft_state_changed;
  257 + cbk->message = ft_message;
265 258  
266 259 if(options & LIB3270_FT_OPTION_RECEIVE) {
267 260  
... ...