Commit 351a0d1482c53fbc84d96b20b898d9ffb092cfff
1 parent
83e47afa
Exists in
master
and in
3 other branches
Adding background tasks support.
Showing
9 changed files
with
98 additions
and
40 deletions
Show diff stats
src/include/lib3270.h
... | ... | @@ -809,12 +809,12 @@ |
809 | 809 | LIB3270_EXPORT void lib3270_update_poll_fd(H3270 *session, int fd, LIB3270_IO_FLAG flag); |
810 | 810 | |
811 | 811 | /** |
812 | - * @brief Callback table | |
812 | + * @brief I/O Controller. | |
813 | 813 | * |
814 | - * Structure with GUI unblocking I/O calls, used to replace the lib3270´s internal ones. | |
814 | + * GUI unblocking I/O calls, used to replace the lib3270´s internal ones. | |
815 | 815 | * |
816 | 816 | */ |
817 | - struct lib3270_callbacks | |
817 | + typedef struct lib3270_io_controller | |
818 | 818 | { |
819 | 819 | unsigned short sz; |
820 | 820 | |
... | ... | @@ -827,8 +827,9 @@ |
827 | 827 | int (*Wait)(H3270 *hSession, int seconds); |
828 | 828 | int (*event_dispatcher)(H3270 *session, int wait); |
829 | 829 | void (*ring_bell)(H3270 *session); |
830 | + int (*run_task)(int(*callback)(H3270 *, void *), H3270 *session, void *parm); | |
830 | 831 | |
831 | - }; | |
832 | + } LIB3270_IO_CONTROLLER; | |
832 | 833 | |
833 | 834 | /** |
834 | 835 | * Register application Handlers. |
... | ... | @@ -838,7 +839,7 @@ |
838 | 839 | * @return 0 if ok, error code if not. |
839 | 840 | * |
840 | 841 | */ |
841 | - LIB3270_EXPORT int lib3270_register_handlers(const struct lib3270_callbacks *cbk); | |
842 | + LIB3270_EXPORT int lib3270_register_io_controller(const LIB3270_IO_CONTROLLER *cbk); | |
842 | 843 | |
843 | 844 | /** |
844 | 845 | * Register time handlers. |
... | ... | @@ -1151,8 +1152,7 @@ |
1151 | 1152 | * @param Delay in milliseconds. |
1152 | 1153 | * |
1153 | 1154 | */ |
1154 | - LIB3270_EXPORT void lib3270_set_unlock_delay(H3270 *session, int delay); | |
1155 | - | |
1155 | + LIB3270_EXPORT int lib3270_set_unlock_delay(H3270 *session, int delay); | |
1156 | 1156 | LIB3270_EXPORT int lib3270_get_unlock_delay(H3270 *session); |
1157 | 1157 | |
1158 | 1158 | /** |
... | ... | @@ -1239,6 +1239,19 @@ |
1239 | 1239 | LIB3270_EXPORT LIB3270_POINTER lib3270_get_pointer(H3270 *hSession, int baddr); |
1240 | 1240 | |
1241 | 1241 | /** |
1242 | + * @brief Run background task. | |
1243 | + * | |
1244 | + * Call task in a separate thread, keep gui main loop running until | |
1245 | + * the function returns. | |
1246 | + * | |
1247 | + * @param hSession TN3270 session. | |
1248 | + * @param callback Function to call. | |
1249 | + * @param parm Parameter to callback function. | |
1250 | + * | |
1251 | + */ | |
1252 | + LIB3270_EXPORT int lib3270_run_task(H3270 *hSession, int(*callback)(H3270 *h, void *), void *parm); | |
1253 | + | |
1254 | + /** | |
1242 | 1255 | * The host is TSO? |
1243 | 1256 | * |
1244 | 1257 | * @param hSession Session Handle | ... | ... |
src/include/lib3270/session.h
... | ... | @@ -97,7 +97,7 @@ |
97 | 97 | * @return 0 if ok, error code if not. |
98 | 98 | * |
99 | 99 | */ |
100 | - LIB3270_EXPORT int lib3270_set_session_callbacks(const struct lib3270_callbacks *cbk); | |
100 | + LIB3270_EXPORT int lib3270_set_session_io_handler(const LIB3270_IO_CONTROLLER *cbk); | |
101 | 101 | |
102 | 102 | LIB3270_EXPORT int lib3270_getpeername(H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen); |
103 | 103 | LIB3270_EXPORT int lib3270_getsockname(H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen); | ... | ... |
src/lib3270/connect.c
... | ... | @@ -79,7 +79,7 @@ |
79 | 79 | |
80 | 80 | |
81 | 81 | //static void net_connected(H3270 *hSession) |
82 | -static void net_connected(H3270 *hSession, int fd, LIB3270_IO_FLAG flag, void *dunno) | |
82 | +static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag unused, void *dunno unused) | |
83 | 83 | { |
84 | 84 | int err; |
85 | 85 | socklen_t len = sizeof(err); |
... | ... | @@ -550,7 +550,7 @@ static void net_connected(H3270 *hSession, int fd, LIB3270_IO_FLAG flag, void *d |
550 | 550 | } |
551 | 551 | |
552 | 552 | lib3270_disconnect(hSession); |
553 | - lib3270_write_log(hSession,"connect", "%s",__FUNCTION__,strerror(ETIMEDOUT)); | |
553 | + lib3270_write_log(hSession,"connect", "%s: %s",__FUNCTION__,strerror(ETIMEDOUT)); | |
554 | 554 | return errno = ETIMEDOUT; |
555 | 555 | } |
556 | 556 | ... | ... |
src/lib3270/ft.c
... | ... | @@ -159,7 +159,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
159 | 159 | return 0; |
160 | 160 | } |
161 | 161 | |
162 | - static void def_complete(H3270 *hSession, unsigned long length,double kbytes_sec,const char *msg, void *userdata) | |
162 | + static void def_complete(H3270 *hSession, unsigned long length unused, double kbytes_sec unused, const char *msg, void *userdata unused) | |
163 | 163 | { |
164 | 164 | hSession->ft->cbk.message(hSession,msg,hSession->ft->user_data); |
165 | 165 | } |
... | ... | @@ -169,27 +169,27 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); |
169 | 169 | hSession->ft->cbk.complete(hSession,length,kbytes_sec,msg,userdata); |
170 | 170 | } |
171 | 171 | |
172 | - static void def_message(H3270 *hSession, const char *msg, void *userdata) | |
172 | + static void def_message(H3270 *hSession, const char *msg, void *userdata unused) | |
173 | 173 | { |
174 | 174 | lib3270_write_log(hSession,"ft","%s",msg); |
175 | 175 | } |
176 | 176 | |
177 | - static void def_update(H3270 *hSession, unsigned long current, unsigned long length, double kbytes_sec, void *userdata) | |
177 | + static void def_update(H3270 *hSession unused, unsigned long current unused, unsigned long length unused, double kbytes_sec unused, void *userdata unused) | |
178 | 178 | { |
179 | 179 | |
180 | 180 | } |
181 | 181 | |
182 | - static void def_running(H3270 *hSession, int is_cut, void *userdata) | |
182 | + static void def_running(H3270 *hSession unused, int is_cut unused, void *userdata unused) | |
183 | 183 | { |
184 | 184 | |
185 | 185 | } |
186 | 186 | |
187 | - static void def_aborting(H3270 *hSession, void *userdata) | |
187 | + static void def_aborting(H3270 *hSession unused, void *userdata unused) | |
188 | 188 | { |
189 | 189 | |
190 | 190 | } |
191 | 191 | |
192 | - static void def_state_changed(H3270 *hSession, LIB3270_FT_STATE state, const char *text, void *userdata) | |
192 | + static void def_state_changed(H3270 *hSession unused, LIB3270_FT_STATE state unused, const char *text unused, void *userdata unused) | |
193 | 193 | { |
194 | 194 | |
195 | 195 | } |
... | ... | @@ -662,14 +662,14 @@ void ft_aborting(H3270FT *h) |
662 | 662 | } |
663 | 663 | |
664 | 664 | /* Process a disconnect abort. */ |
665 | -static void ft_connected(H3270 *hSession, int ignored, void *dunno) | |
665 | +static void ft_connected(H3270 *hSession, int ignored unused, void *dunno unused) | |
666 | 666 | { |
667 | 667 | if (!CONNECTED && lib3270_get_ft_state(hSession) != LIB3270_FT_STATE_NONE) |
668 | 668 | ft_failed(get_ft_handle(hSession),_("Host disconnected, transfer cancelled")); |
669 | 669 | } |
670 | 670 | |
671 | 671 | /* Process an abort from no longer being in 3270 mode. */ |
672 | -static void ft_in3270(H3270 *hSession, int ignored, void *dunno) | |
672 | +static void ft_in3270(H3270 *hSession, int ignored unused, void *dunno unused) | |
673 | 673 | { |
674 | 674 | if (!IN_3270 && lib3270_get_ft_state(hSession) != LIB3270_FT_STATE_NONE) |
675 | 675 | ft_failed(get_ft_handle(hSession),_("Not in 3270 mode, transfer cancelled")); | ... | ... |
src/lib3270/iocalls.c
... | ... | @@ -45,15 +45,17 @@ |
45 | 45 | /*---[ Standard calls ]-------------------------------------------------------------------------------------*/ |
46 | 46 | |
47 | 47 | // Timeout calls |
48 | -static void internal_remove_timeout(H3270 *session, void *timer); | |
49 | -static void * internal_add_timeout(H3270 *session, unsigned long interval_ms, void (*proc)(H3270 *session)); | |
48 | + static void internal_remove_timeout(H3270 *session, void *timer); | |
49 | + static void * internal_add_timeout(H3270 *session, unsigned long interval_ms, void (*proc)(H3270 *session)); | |
50 | 50 | |
51 | -static void * internal_add_poll(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*proc)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata ); | |
52 | -static void internal_remove_poll(H3270 *session, void *id); | |
51 | + static void * internal_add_poll(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*proc)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata ); | |
52 | + static void internal_remove_poll(H3270 *session, void *id); | |
53 | 53 | |
54 | -static int internal_wait(H3270 *session, int seconds); | |
54 | + static int internal_wait(H3270 *session, int seconds); | |
55 | 55 | |
56 | -static void internal_ring_bell(H3270 *session); | |
56 | + static void internal_ring_bell(H3270 *session); | |
57 | + | |
58 | + static int internal_run_task(int(*callback)(H3270 *, void *), H3270 *session, void *parm); | |
57 | 59 | |
58 | 60 | /*---[ Active callbacks ]-----------------------------------------------------------------------------------*/ |
59 | 61 | |
... | ... | @@ -78,6 +80,9 @@ static void internal_ring_bell(H3270 *session); |
78 | 80 | static void (*ring_bell)(H3270 *) |
79 | 81 | = internal_ring_bell; |
80 | 82 | |
83 | + static int (*run_task)(H3270 *hSession, int(*callback)(H3270 *h, void *), void *parm) | |
84 | + = internal_run_task; | |
85 | + | |
81 | 86 | /*---[ Typedefs ]-------------------------------------------------------------------------------------------*/ |
82 | 87 | |
83 | 88 | #define TN (timeout_t *)NULL |
... | ... | @@ -205,7 +210,7 @@ static void * internal_add_poll(H3270 *session, int fd, LIB3270_IO_FLAG flag, vo |
205 | 210 | ip->userdata = userdata; |
206 | 211 | ip->call = call; |
207 | 212 | |
208 | - ip->next = session->inputs; | |
213 | + ip->next = (input_t *) session->inputs; | |
209 | 214 | |
210 | 215 | session->inputs = ip; |
211 | 216 | session->inputs_changed = 1; |
... | ... | @@ -218,7 +223,7 @@ static void internal_remove_poll(H3270 *session, void *id) |
218 | 223 | input_t *ip; |
219 | 224 | input_t *prev = (input_t *)NULL; |
220 | 225 | |
221 | - for (ip = session->inputs; ip != (input_t *)NULL; ip = ip->next) | |
226 | + for (ip = session->inputs; ip != (input_t *) NULL; ip = (input_t *) ip->next) | |
222 | 227 | { |
223 | 228 | if (ip == (input_t *)id) |
224 | 229 | break; |
... | ... | @@ -235,7 +240,7 @@ static void internal_remove_poll(H3270 *session, void *id) |
235 | 240 | if (prev != (input_t *)NULL) |
236 | 241 | prev->next = ip->next; |
237 | 242 | else |
238 | - session->inputs = ip->next; | |
243 | + session->inputs = (input_t *) ip->next; | |
239 | 244 | |
240 | 245 | lib3270_free(ip); |
241 | 246 | session->inputs_changed = 1; |
... | ... | @@ -379,13 +384,10 @@ LIB3270_EXPORT void lib3270_register_fd_handlers(void * (*add)(H3270 *session, i |
379 | 384 | remove_poll = rm; |
380 | 385 | } |
381 | 386 | |
382 | -LIB3270_EXPORT int lib3270_register_handlers(const struct lib3270_callbacks *cbk) | |
387 | +LIB3270_EXPORT int lib3270_register_io_controller(const LIB3270_IO_CONTROLLER *cbk) | |
383 | 388 | { |
384 | - if(!cbk) | |
385 | - return EINVAL; | |
386 | - | |
387 | - if(cbk->sz != sizeof(struct lib3270_callbacks)) | |
388 | - return EINVAL; | |
389 | + if(!cbk || cbk->sz != sizeof(LIB3270_IO_CONTROLLER)) | |
390 | + return errno = EINVAL; | |
389 | 391 | |
390 | 392 | lib3270_register_time_handlers(cbk->AddTimeOut,cbk->RemoveTimeOut); |
391 | 393 | lib3270_register_fd_handlers(cbk->add_poll,cbk->remove_poll); |
... | ... | @@ -447,5 +449,35 @@ LIB3270_EXPORT void lib3270_ring_bell(H3270 *session) |
447 | 449 | ring_bell(session); |
448 | 450 | } |
449 | 451 | |
452 | +int internal_run_task(int(*callback)(H3270 *, void *), H3270 *session, void *parm) { | |
453 | + return callback(session,parm); | |
454 | +} | |
455 | + | |
456 | +/** | |
457 | + * @brief Run background task. | |
458 | + * | |
459 | + * Call task in a separate thread, keep gui main loop running until | |
460 | + * the function returns. | |
461 | + * | |
462 | + * @param hSession TN3270 session. | |
463 | + * @param callback Function to call. | |
464 | + * @param parm Parameter to callback function. | |
465 | + * | |
466 | + */ | |
467 | +LIB3270_EXPORT int lib3270_run_task(H3270 *hSession, int(*callback)(H3270 *h, void *), void *parm) | |
468 | +{ | |
469 | + int rc; | |
470 | + | |
471 | + CHECK_SESSION_HANDLE(hSession); | |
472 | + | |
473 | + hSession->cbk.set_timer(hSession,1); | |
474 | + rc = run_task(callback,hSession,parm); | |
475 | + hSession->cbk.set_timer(hSession,0); | |
476 | + | |
477 | + return rc; | |
478 | + | |
479 | +} | |
480 | + | |
481 | + | |
450 | 482 | |
451 | 483 | ... | ... |
src/lib3270/kybd.c
... | ... | @@ -2922,13 +2922,15 @@ int kybd_prime(H3270 *hSession) |
2922 | 2922 | } |
2923 | 2923 | #endif /*]*/ |
2924 | 2924 | |
2925 | -LIB3270_EXPORT void lib3270_set_unlock_delay(H3270 *session, int delay) | |
2925 | +LIB3270_EXPORT int lib3270_set_unlock_delay(H3270 *session, int delay) | |
2926 | 2926 | { |
2927 | 2927 | CHECK_SESSION_HANDLE(session); |
2928 | 2928 | |
2929 | 2929 | trace("%s(%d)",__FUNCTION__,(int) delay); |
2930 | 2930 | |
2931 | 2931 | session->unlock_delay_ms = (unsigned short) delay; |
2932 | + | |
2933 | + return 0; | |
2932 | 2934 | } |
2933 | 2935 | |
2934 | 2936 | LIB3270_EXPORT int lib3270_get_unlock_delay(H3270 *session) | ... | ... |
src/lib3270/log.c
... | ... | @@ -35,6 +35,7 @@ |
35 | 35 | #include <windows.h> |
36 | 36 | #endif // WIN32 |
37 | 37 | |
38 | +#include "private.h" | |
38 | 39 | #include <stdio.h> |
39 | 40 | #include <stdarg.h> |
40 | 41 | #include <config.h> |
... | ... | @@ -80,7 +81,7 @@ |
80 | 81 | loghandler(session,module,0,fmt,arg); |
81 | 82 | } |
82 | 83 | |
83 | - static void defaultlog(H3270 *session, const char *module, int rc, const char *fmt, va_list arg_ptr) | |
84 | + static void defaultlog(H3270 *session unused, const char *module, int rc unused, const char *fmt, va_list arg_ptr) | |
84 | 85 | { |
85 | 86 | fprintf(stderr,"%s:\t",module); |
86 | 87 | vfprintf(stderr,fmt,arg_ptr); | ... | ... |
src/lib3270/properties.c
... | ... | @@ -251,6 +251,16 @@ |
251 | 251 | return properties; |
252 | 252 | } |
253 | 253 | |
254 | + static const char * get_version(H3270 *hSession unused) | |
255 | + { | |
256 | + return lib3270_get_version(); | |
257 | + } | |
258 | + | |
259 | + static const char * get_revision(H3270 *hSession unused) | |
260 | + { | |
261 | + return lib3270_get_revision(); | |
262 | + } | |
263 | + | |
254 | 264 | LIB3270_EXPORT const LIB3270_STRING_PROPERTY * lib3270_get_string_properties_list(void) |
255 | 265 | { |
256 | 266 | static const LIB3270_STRING_PROPERTY properties[] = { |
... | ... | @@ -300,14 +310,14 @@ |
300 | 310 | { |
301 | 311 | "version", // Property name. |
302 | 312 | N_( "lib3270 version" ), // Property description. |
303 | - lib3270_get_version, // Get value. | |
313 | + get_version, // Get value. | |
304 | 314 | NULL // Set value. |
305 | 315 | }, |
306 | 316 | |
307 | 317 | { |
308 | 318 | "revision", // Property name. |
309 | 319 | N_( "lib3270 revision" ), // Property description. |
310 | - lib3270_get_revision, // Get value. | |
320 | + get_revision, // Get value. | |
311 | 321 | NULL // Set value. |
312 | 322 | }, |
313 | 323 | |
... | ... | @@ -360,7 +370,7 @@ int lib3270_get_int_property(H3270 *hSession, const char *name, int seconds) |
360 | 370 | |
361 | 371 | // Check for boolean properties |
362 | 372 | properties = lib3270_get_boolean_properties_list(); |
363 | - for(ix = 0; ix < (sizeof(properties)/sizeof(properties[0])); ix++) | |
373 | + for(ix = 0; properties[ix].name; ix++) | |
364 | 374 | { |
365 | 375 | if(!strcasecmp(name,properties[ix].name)) |
366 | 376 | { |
... | ... | @@ -380,7 +390,7 @@ int lib3270_get_int_property(H3270 *hSession, const char *name, int seconds) |
380 | 390 | |
381 | 391 | // Check for int properties |
382 | 392 | properties = lib3270_get_int_properties_list(); |
383 | - for(ix = 0; ix < (sizeof(properties)/sizeof(properties[0])); ix++) | |
393 | + for(ix = 0; properties[ix].name; ix++) | |
384 | 394 | { |
385 | 395 | if(!strcasecmp(name,properties[ix].name)) |
386 | 396 | { | ... | ... |
src/lib3270/session.c