Commit df8fdf4c7031f2d55c891aa16cbd7621e8e3e6d8
1 parent
6ba51440
Exists in
master
and in
3 other branches
Adding listeners for action group state changes (required for the new
UI).
Showing
80 changed files
with
1178 additions
and
1065 deletions
Show diff stats
lib3270.cbp
... | ... | @@ -116,6 +116,9 @@ |
116 | 116 | <Unit filename="src/core/keyboard/properties.c"> |
117 | 117 | <Option compilerVar="CC" /> |
118 | 118 | </Unit> |
119 | + <Unit filename="src/core/linkedlist.c"> | |
120 | + <Option compilerVar="CC" /> | |
121 | + </Unit> | |
119 | 122 | <Unit filename="src/core/linux/connect.c"> |
120 | 123 | <Option compilerVar="CC" /> |
121 | 124 | </Unit> |
... | ... | @@ -242,8 +245,8 @@ |
242 | 245 | <Unit filename="src/include/ft_dftc.h" /> |
243 | 246 | <Unit filename="src/include/ftc.h" /> |
244 | 247 | <Unit filename="src/include/hostc.h" /> |
248 | + <Unit filename="src/include/internals.h" /> | |
245 | 249 | <Unit filename="src/include/kybdc.h" /> |
246 | - <Unit filename="src/include/lib3270-internals.h" /> | |
247 | 250 | <Unit filename="src/include/lib3270.h" /> |
248 | 251 | <Unit filename="src/include/lib3270/actions.h" /> |
249 | 252 | <Unit filename="src/include/lib3270/charset.h" /> | ... | ... |
src/core/actions/actions.c
... | ... | @@ -27,10 +27,17 @@ |
27 | 27 | * |
28 | 28 | */ |
29 | 29 | |
30 | -#include <lib3270-internals.h> | |
30 | +#include <internals.h> | |
31 | +#include <lib3270/log.h> | |
31 | 32 | #include <lib3270/trace.h> |
32 | 33 | #include <lib3270/actions.h> |
33 | 34 | |
35 | +struct lib3270_action_callback | |
36 | +{ | |
37 | + LIB3270_LINKED_LIST_HEAD | |
38 | + void (*func)(H3270 *, void *); /**< @brief Function to call */ | |
39 | +}; | |
40 | + | |
34 | 41 | /*---[ Implement ]------------------------------------------------------------------------------------------------------------*/ |
35 | 42 | |
36 | 43 | const LIB3270_ACTION * lib3270_action_get_by_name(const char *name) |
... | ... | @@ -89,3 +96,40 @@ LIB3270_EXPORT int lib3270_action(H3270 *hSession, const char *name) |
89 | 96 | { |
90 | 97 | return lib3270_action_activate_by_name(name,hSession); |
91 | 98 | } |
99 | + | |
100 | +LIB3270_INTERNAL void lib3270_notify_actions(H3270 *hSession, LIB3270_ACTION_GROUP group) | |
101 | +{ | |
102 | + | |
103 | + if(group < (sizeof(hSession->listeners.actions)/sizeof(hSession->listeners.actions[0]))) | |
104 | + { | |
105 | + struct lib3270_linked_list_node * node; | |
106 | + | |
107 | + for(node = hSession->listeners.actions[group].first; node; node = node->next) | |
108 | + { | |
109 | + ((struct lib3270_action_callback *) node)->func(hSession,node->userdata); | |
110 | + } | |
111 | + | |
112 | + } | |
113 | + | |
114 | +} | |
115 | + | |
116 | +LIB3270_EXPORT const void * lib3270_register_action_group_listener(H3270 *hSession, LIB3270_ACTION_GROUP group, void (*func)(H3270 *, void *),void *data) | |
117 | +{ | |
118 | + | |
119 | + if(group < (sizeof(hSession->listeners.actions)/sizeof(hSession->listeners.actions[0]))) | |
120 | + { | |
121 | + struct lib3270_action_callback *st = (struct lib3270_action_callback *) lib3270_linked_list_append_node(&hSession->listeners.actions[group], sizeof(struct lib3270_action_callback), data); | |
122 | + st->func = func; | |
123 | + return (void *) st; | |
124 | + } | |
125 | + | |
126 | + return NULL; | |
127 | +} | |
128 | + | |
129 | +LIB3270_EXPORT int lib3270_unregister_action_group_listener(H3270 *hSession, LIB3270_ACTION_GROUP group, const void *id) | |
130 | +{ | |
131 | + if(group < (sizeof(hSession->listeners.actions)/sizeof(hSession->listeners.actions[0]))) | |
132 | + return lib3270_linked_list_delete_node(&hSession->listeners.actions[group], id); | |
133 | + | |
134 | + return errno = EINVAL; | |
135 | +} | ... | ... |
src/core/actions/table.c
... | ... | @@ -32,7 +32,7 @@ |
32 | 32 | * |
33 | 33 | */ |
34 | 34 | |
35 | -#include <lib3270-internals.h> | |
35 | +#include <internals.h> | |
36 | 36 | #include <lib3270/trace.h> |
37 | 37 | #include <lib3270/actions.h> |
38 | 38 | #include <lib3270/toggle.h> |
... | ... | @@ -210,7 +210,7 @@ |
210 | 210 | .summary = N_( "Save selected area." ), |
211 | 211 | .activate = save_selected, |
212 | 212 | |
213 | - .group = LIB3270_ACTION_GROUP_SELECTION, | |
213 | + .group = LIB3270_ACTION_GROUP_SELECTED, | |
214 | 214 | .activatable = lib3270_has_selection |
215 | 215 | }, |
216 | 216 | |
... | ... | @@ -591,7 +591,7 @@ |
591 | 591 | .summary = N_( "Print selected area." ), |
592 | 592 | .activate = lib3270_print_selected, |
593 | 593 | |
594 | - .group = LIB3270_ACTION_GROUP_SELECTION, | |
594 | + .group = LIB3270_ACTION_GROUP_SELECTED, | |
595 | 595 | .activatable = lib3270_has_selection |
596 | 596 | }, |
597 | 597 | ... | ... |
src/core/ansi.c
src/core/bounds.c
src/core/charset/charset.c
src/core/charset/convert.c
src/core/charset/getset.c
src/core/charset/remap.c
src/core/charset/utf8.c
src/core/charset/view.c
src/core/connect.c
... | ... | @@ -28,7 +28,7 @@ |
28 | 28 | */ |
29 | 29 | |
30 | 30 | #include <config.h> |
31 | -#include <lib3270-internals.h> | |
31 | +#include <internals.h> | |
32 | 32 | #include "telnetc.h" |
33 | 33 | #include <errno.h> |
34 | 34 | #include <lib3270/log.h> |
... | ... | @@ -83,7 +83,7 @@ |
83 | 83 | if(hSession->auto_reconnect_inprogress || hSession->popups) |
84 | 84 | return errno = EAGAIN; |
85 | 85 | |
86 | - if(hSession->sock > 0) | |
86 | + if(hSession->connection.sock > 0) | |
87 | 87 | return errno = EISCONN; |
88 | 88 | |
89 | 89 | if(!(hSession->host.current && hSession->host.srvc)) | ... | ... |
src/core/ctlr.c
src/core/cursor.c
src/core/ft/ft.c
src/core/ft/ft_cut.c
src/core/ft/ft_dft.c
src/core/ft/ftmessages.c
src/core/host.c
... | ... | @@ -38,7 +38,7 @@ |
38 | 38 | #pragma GCC diagnostic ignored "-Wsign-compare" |
39 | 39 | |
40 | 40 | #include <malloc.h> |
41 | -#include <lib3270-internals.h> | |
41 | +#include <internals.h> | |
42 | 42 | #include "resources.h" |
43 | 43 | |
44 | 44 | #include "hostc.h" |
... | ... | @@ -122,6 +122,36 @@ int host_disconnect(H3270 *hSession, int failed) |
122 | 122 | |
123 | 123 | } |
124 | 124 | |
125 | +int lib3270_set_cstate(H3270 *hSession, LIB3270_CSTATE cstate) | |
126 | +{ | |
127 | + if(hSession->connection.state != cstate) | |
128 | + { | |
129 | + // Salve old states. | |
130 | + int connected = lib3270_is_connected(hSession); | |
131 | + int disconnected = lib3270_is_disconnected(hSession); | |
132 | + | |
133 | + // Cstate has changed. | |
134 | + hSession->connection.state = cstate; | |
135 | + | |
136 | + // Do I need to send notifications? | |
137 | + | |
138 | + if(connected != lib3270_is_connected(hSession)) { | |
139 | + // Online state has changed, fire LIB3270_ACTION_GROUP_ONLINE | |
140 | + lib3270_notify_actions(hSession, LIB3270_ACTION_GROUP_ONLINE); | |
141 | + } | |
142 | + | |
143 | + if(disconnected != lib3270_is_disconnected(hSession)) { | |
144 | + // Offline state has changed, fire LIB3270_ACTION_GROUP_OFFLINE | |
145 | + lib3270_notify_actions(hSession, LIB3270_ACTION_GROUP_OFFLINE); | |
146 | + } | |
147 | + | |
148 | + return 1; | |
149 | + } | |
150 | + | |
151 | + return 0; | |
152 | + | |
153 | +} | |
154 | + | |
125 | 155 | /** |
126 | 156 | * @brief The host has entered 3270 or ANSI mode, or switched between them. |
127 | 157 | */ |
... | ... | @@ -131,14 +161,15 @@ void host_in3270(H3270 *hSession, LIB3270_CSTATE new_cstate) |
131 | 161 | new_cstate == LIB3270_CONNECTED_SSCP || |
132 | 162 | new_cstate == LIB3270_CONNECTED_TN3270E); |
133 | 163 | |
134 | - hSession->cstate = new_cstate; | |
164 | + lib3270_set_cstate(hSession,new_cstate); | |
135 | 165 | hSession->ever_3270 = now3270; |
136 | 166 | lib3270_st_changed(hSession, LIB3270_STATE_3270_MODE, now3270); |
137 | 167 | } |
138 | 168 | |
139 | 169 | void lib3270_set_connected_initial(H3270 *hSession) |
140 | 170 | { |
141 | - hSession->cstate = LIB3270_CONNECTED_INITIAL; | |
171 | + lib3270_set_cstate(hSession,LIB3270_CONNECTED_INITIAL); | |
172 | + | |
142 | 173 | hSession->starting = 1; // Enable autostart |
143 | 174 | |
144 | 175 | lib3270_st_changed(hSession, LIB3270_STATE_CONNECT, True); |
... | ... | @@ -150,7 +181,7 @@ void lib3270_set_disconnected(H3270 *hSession) |
150 | 181 | { |
151 | 182 | CHECK_SESSION_HANDLE(hSession); |
152 | 183 | |
153 | - hSession->cstate = LIB3270_NOT_CONNECTED; | |
184 | + lib3270_set_cstate(hSession,LIB3270_NOT_CONNECTED); | |
154 | 185 | hSession->starting = 0; |
155 | 186 | |
156 | 187 | #if defined(HAVE_LIBSSL) |
... | ... | @@ -202,19 +233,6 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) |
202 | 233 | ((struct lib3270_state_callback *) node)->func(h,mode,node->userdata); |
203 | 234 | } |
204 | 235 | |
205 | - /* | |
206 | - struct lib3270_state_callback *st; | |
207 | - | |
208 | - CHECK_SESSION_HANDLE(h); | |
209 | - | |
210 | - trace("%s is %d on session %p",state_name[tx],mode,h); | |
211 | - | |
212 | - for(st = h->listeners.state.callbacks[tx];st;st = st->next) | |
213 | - { | |
214 | - st->func(h,mode,st->data); | |
215 | - } | |
216 | - */ | |
217 | - | |
218 | 236 | trace("%s ends",__FUNCTION__); |
219 | 237 | } |
220 | 238 | ... | ... |
src/core/html.c
src/core/init.c
src/core/iocalls.c
... | ... | @@ -29,7 +29,7 @@ |
29 | 29 | * |
30 | 30 | */ |
31 | 31 | |
32 | -#include <lib3270-internals.h> | |
32 | +#include <internals.h> | |
33 | 33 | #include <sys/time.h> |
34 | 34 | #include <sys/types.h> |
35 | 35 | #include "xioc.h" |
... | ... | @@ -301,7 +301,7 @@ static void internal_remove_poll(H3270 *session, void *id) |
301 | 301 | |
302 | 302 | LIB3270_EXPORT void lib3270_remove_poll(H3270 *session, void *id) |
303 | 303 | { |
304 | - debug("%s(%d,%p)",__FUNCTION__,session->sock,id); | |
304 | + debug("%s(%d,%p)",__FUNCTION__,session->connection.sock,id); | |
305 | 305 | remove_poll(session, id); |
306 | 306 | } |
307 | 307 | |
... | ... | @@ -309,7 +309,7 @@ LIB3270_EXPORT void lib3270_set_poll_state(H3270 *session, void *id, int enabled |
309 | 309 | { |
310 | 310 | if(id) |
311 | 311 | { |
312 | - debug("%s: Polling on %d (%p) is %s",__FUNCTION__,session->sock,id,(enabled ? "enabled" : "disabled")); | |
312 | + debug("%s: Polling on %d (%p) is %s",__FUNCTION__,session->connection.sock,id,(enabled ? "enabled" : "disabled")); | |
313 | 313 | set_poll_state(session, id, enabled); |
314 | 314 | } |
315 | 315 | } |
... | ... | @@ -349,7 +349,7 @@ LIB3270_EXPORT void lib3270_update_poll_fd(H3270 *session, int fd, LIB3270_IO_FL |
349 | 349 | } |
350 | 350 | |
351 | 351 | LIB3270_EXPORT void * lib3270_add_poll_fd(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata ) { |
352 | - debug("%s(%d)",__FUNCTION__,session->sock); | |
352 | + debug("%s(%d)",__FUNCTION__,session->connection.sock); | |
353 | 353 | return add_poll(session,fd,flag,call,userdata); |
354 | 354 | } |
355 | 355 | |
... | ... | @@ -400,10 +400,10 @@ void x_except_on(H3270 *h) |
400 | 400 | if(reading) |
401 | 401 | lib3270_remove_poll(h,h->xio.read); |
402 | 402 | |
403 | - h->xio.except = lib3270_add_poll_fd(h,h->sock,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); | |
403 | + h->xio.except = lib3270_add_poll_fd(h,h->connection.sock,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); | |
404 | 404 | |
405 | 405 | if(reading) |
406 | - h->xio.read = lib3270_add_poll_fd(h,h->sock,LIB3270_IO_FLAG_READ,net_input,0); | |
406 | + h->xio.read = lib3270_add_poll_fd(h,h->connection.sock,LIB3270_IO_FLAG_READ,net_input,0); | |
407 | 407 | debug("%s",__FUNCTION__); |
408 | 408 | |
409 | 409 | } |
... | ... | @@ -523,7 +523,7 @@ LIB3270_EXPORT int lib3270_run_task(H3270 *hSession, int(*callback)(H3270 *h, vo |
523 | 523 | int non_blocking(H3270 *hSession, Boolean on) |
524 | 524 | { |
525 | 525 | |
526 | - if(hSession->sock < 0) | |
526 | + if(hSession->connection.sock < 0) | |
527 | 527 | return 0; |
528 | 528 | |
529 | 529 | #ifdef WIN32 |
... | ... | @@ -545,7 +545,7 @@ int non_blocking(H3270 *hSession, Boolean on) |
545 | 545 | |
546 | 546 | int f; |
547 | 547 | |
548 | - if ((f = fcntl(hSession->sock, F_GETFL, 0)) == -1) | |
548 | + if ((f = fcntl(hSession->connection.sock, F_GETFL, 0)) == -1) | |
549 | 549 | { |
550 | 550 | lib3270_popup_dialog( hSession, |
551 | 551 | LIB3270_NOTIFY_ERROR, |
... | ... | @@ -562,7 +562,7 @@ int non_blocking(H3270 *hSession, Boolean on) |
562 | 562 | else |
563 | 563 | f &= ~O_NDELAY; |
564 | 564 | |
565 | - if (fcntl(hSession->sock, F_SETFL, f) < 0) | |
565 | + if (fcntl(hSession->connection.sock, F_SETFL, f) < 0) | |
566 | 566 | { |
567 | 567 | lib3270_popup_dialog( hSession, |
568 | 568 | LIB3270_NOTIFY_ERROR, | ... | ... |
src/core/keyboard/actions.c
src/core/keyboard/kybd.c
src/core/keyboard/properties.c
src/core/linux/connect.c
... | ... | @@ -28,7 +28,7 @@ |
28 | 28 | */ |
29 | 29 | |
30 | 30 | #include <config.h> |
31 | -#include <lib3270-internals.h> | |
31 | +#include <internals.h> | |
32 | 32 | #include <errno.h> |
33 | 33 | #include <lib3270/trace.h> |
34 | 34 | #include <lib3270/toggle.h> |
... | ... | @@ -46,7 +46,7 @@ |
46 | 46 | // #include <iconv.h> |
47 | 47 | // #endif // HAVE_ICONV |
48 | 48 | |
49 | -#define SOCK_CLOSE(s) close(s->sock); s->sock = -1; | |
49 | +#define SOCK_CLOSE(s) close(s->connection.sock); s->connection.sock = -1; | |
50 | 50 | |
51 | 51 | #include <stdlib.h> |
52 | 52 | |
... | ... | @@ -73,7 +73,7 @@ static void net_connected(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG |
73 | 73 | hSession->xio.write = NULL; |
74 | 74 | } |
75 | 75 | |
76 | - if(getsockopt(hSession->sock, SOL_SOCKET, SO_ERROR, (char *) &err, &len) < 0) | |
76 | + if(getsockopt(hSession->connection.sock, SOL_SOCKET, SO_ERROR, (char *) &err, &len) < 0) | |
77 | 77 | { |
78 | 78 | lib3270_disconnect(hSession); |
79 | 79 | lib3270_popup_dialog( |
... | ... | @@ -102,8 +102,8 @@ static void net_connected(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG |
102 | 102 | return; |
103 | 103 | } |
104 | 104 | |
105 | - hSession->xio.except = lib3270_add_poll_fd(hSession,hSession->sock,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); | |
106 | - hSession->xio.read = lib3270_add_poll_fd(hSession,hSession->sock,LIB3270_IO_FLAG_READ,net_input,0); | |
105 | + hSession->xio.except = lib3270_add_poll_fd(hSession,hSession->connection.sock,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); | |
106 | + hSession->xio.read = lib3270_add_poll_fd(hSession,hSession->connection.sock,LIB3270_IO_FLAG_READ,net_input,0); | |
107 | 107 | |
108 | 108 | #if defined(HAVE_LIBSSL) |
109 | 109 | if(hSession->ssl.con && hSession->ssl.state == LIB3270_SSL_UNDEFINED) |
... | ... | @@ -147,17 +147,17 @@ static void net_connected(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG |
147 | 147 | |
148 | 148 | status_connecting(hSession); |
149 | 149 | |
150 | - for(rp = result; hSession->sock < 0 && rp != NULL; rp = rp->ai_next) | |
150 | + for(rp = result; hSession->connection.sock < 0 && rp != NULL; rp = rp->ai_next) | |
151 | 151 | { |
152 | - hSession->sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); | |
153 | - if(hSession->sock < 0) | |
152 | + hSession->connection.sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); | |
153 | + if(hSession->connection.sock < 0) | |
154 | 154 | { |
155 | 155 | ((struct resolver *) host)->message = strerror(errno); |
156 | 156 | continue; |
157 | 157 | } |
158 | 158 | |
159 | 159 | // Connected! |
160 | - if(connect(hSession->sock, rp->ai_addr, rp->ai_addrlen)) | |
160 | + if(connect(hSession->connection.sock, rp->ai_addr, rp->ai_addrlen)) | |
161 | 161 | { |
162 | 162 | SOCK_CLOSE(hSession); |
163 | 163 | ((struct resolver *) host)->message = strerror(errno); |
... | ... | @@ -178,7 +178,7 @@ static void net_connected(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG |
178 | 178 | memset(&host,0,sizeof(host)); |
179 | 179 | |
180 | 180 | // Connect to host |
181 | - if(lib3270_run_task(hSession, background_connect, &host) || hSession->sock < 0) | |
181 | + if(lib3270_run_task(hSession, background_connect, &host) || hSession->connection.sock < 0) | |
182 | 182 | { |
183 | 183 | char buffer[4096]; |
184 | 184 | snprintf(buffer,4095,_( "Can't connect to %s:%s"), hSession->host.current, hSession->host.srvc); |
... | ... | @@ -195,7 +195,7 @@ static void net_connected(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG |
195 | 195 | } |
196 | 196 | |
197 | 197 | /* don't share the socket with our children */ |
198 | - (void) fcntl(hSession->sock, F_SETFD, 1); | |
198 | + (void) fcntl(hSession->connection.sock, F_SETFD, 1); | |
199 | 199 | |
200 | 200 | hSession->ever_3270 = False; |
201 | 201 | |
... | ... | @@ -212,7 +212,7 @@ static void net_connected(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG |
212 | 212 | |
213 | 213 | // set options for inline out-of-band data and keepalives |
214 | 214 | int optval = 1; |
215 | - if (setsockopt(hSession->sock, SOL_SOCKET, SO_OOBINLINE, (char *)&optval,sizeof(optval)) < 0) | |
215 | + if (setsockopt(hSession->connection.sock, SOL_SOCKET, SO_OOBINLINE, (char *)&optval,sizeof(optval)) < 0) | |
216 | 216 | { |
217 | 217 | int rc = errno; |
218 | 218 | lib3270_popup_dialog( hSession, |
... | ... | @@ -226,7 +226,7 @@ static void net_connected(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG |
226 | 226 | } |
227 | 227 | |
228 | 228 | optval = lib3270_get_toggle(hSession,LIB3270_TOGGLE_KEEP_ALIVE) ? 1 : 0; |
229 | - if (setsockopt(hSession->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) < 0) | |
229 | + if (setsockopt(hSession->connection.sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) < 0) | |
230 | 230 | { |
231 | 231 | int rc = errno; |
232 | 232 | |
... | ... | @@ -260,10 +260,10 @@ static void net_connected(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG |
260 | 260 | */ |
261 | 261 | |
262 | 262 | // Connecting, set callbacks, wait for connection |
263 | - hSession->cstate = LIB3270_PENDING; | |
263 | + lib3270_set_cstate(hSession, LIB3270_PENDING); | |
264 | 264 | lib3270_st_changed(hSession, LIB3270_STATE_HALF_CONNECT, True); |
265 | 265 | |
266 | - hSession->xio.write = lib3270_add_poll_fd(hSession,hSession->sock,LIB3270_IO_FLAG_WRITE,net_connected,0); | |
266 | + hSession->xio.write = lib3270_add_poll_fd(hSession,hSession->connection.sock,LIB3270_IO_FLAG_WRITE,net_connected,0); | |
267 | 267 | // hSession->ns_write_id = AddOutput(hSession->sock, hSession, net_connected); |
268 | 268 | |
269 | 269 | trace("%s: Connection in progress",__FUNCTION__); |
... | ... | @@ -276,7 +276,7 @@ static void net_connected(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG |
276 | 276 | { |
277 | 277 | lib3270_main_iterate(hSession,1); |
278 | 278 | |
279 | - switch(hSession->cstate) | |
279 | + switch(hSession->connection.state) | |
280 | 280 | { |
281 | 281 | case LIB3270_PENDING: |
282 | 282 | case LIB3270_CONNECTED_INITIAL: |
... | ... | @@ -297,7 +297,7 @@ static void net_connected(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG |
297 | 297 | break; |
298 | 298 | |
299 | 299 | default: |
300 | - lib3270_write_log(hSession,"connect", "%s: State changed to unexpected state %d",__FUNCTION__,hSession->cstate); | |
300 | + lib3270_write_log(hSession,"connect", "%s: State changed to unexpected state %d",__FUNCTION__,hSession->connection.state); | |
301 | 301 | return errno = EINVAL; |
302 | 302 | } |
303 | 303 | ... | ... |
src/core/linux/curl.c
src/core/linux/event_dispatcher.c
src/core/linux/log.c
src/core/linux/util.c
src/core/log.c
src/core/model.c
... | ... | @@ -27,7 +27,7 @@ |
27 | 27 | * |
28 | 28 | */ |
29 | 29 | |
30 | - #include <lib3270-internals.h> | |
30 | + #include <internals.h> | |
31 | 31 | #include "screen.h" |
32 | 32 | #include "ctlrc.h" |
33 | 33 | #include "popupsc.h" |
... | ... | @@ -42,7 +42,7 @@ |
42 | 42 | |
43 | 43 | int lib3270_set_oversize(H3270 *hSession, const char *value) |
44 | 44 | { |
45 | - if(hSession->cstate != LIB3270_NOT_CONNECTED) | |
45 | + if(hSession->connection.state != LIB3270_NOT_CONNECTED) | |
46 | 46 | return errno = EISCONN; |
47 | 47 | |
48 | 48 | if(!hSession->extended) |
... | ... | @@ -177,7 +177,7 @@ int lib3270_set_model(H3270 *hSession, const char *model) |
177 | 177 | { |
178 | 178 | int model_number; |
179 | 179 | |
180 | - if(hSession->cstate != LIB3270_NOT_CONNECTED) | |
180 | + if(hSession->connection.state != LIB3270_NOT_CONNECTED) | |
181 | 181 | return errno = EISCONN; |
182 | 182 | |
183 | 183 | strncpy(hSession->full_model_name,"IBM-",LIB3270_FULL_MODEL_NAME_LENGTH); | ... | ... |
src/core/options.c
... | ... | @@ -29,7 +29,7 @@ |
29 | 29 | * |
30 | 30 | */ |
31 | 31 | |
32 | -#include <lib3270-internals.h> | |
32 | +#include <internals.h> | |
33 | 33 | |
34 | 34 | /*---[ Globals ]--------------------------------------------------------------------------------------------------------------*/ |
35 | 35 | |
... | ... | @@ -94,7 +94,7 @@ LIB3270_EXPORT int lib3270_set_color_type(H3270 *hSession, int colortype) |
94 | 94 | { |
95 | 95 | CHECK_SESSION_HANDLE(hSession); |
96 | 96 | |
97 | - if(hSession->cstate != LIB3270_NOT_CONNECTED) | |
97 | + if(hSession->connection.state != LIB3270_NOT_CONNECTED) | |
98 | 98 | return errno = EISCONN; |
99 | 99 | |
100 | 100 | switch(colortype) | ... | ... |
src/core/paste.c
src/core/print.c
src/core/printer.c
src/core/properties/boolean.c
src/core/properties/get.c
src/core/properties/signed.c
src/core/properties/string.c
src/core/properties/unsigned.c
src/core/resources.c
src/core/rpq.c
src/core/screen.c
... | ... | @@ -34,7 +34,7 @@ |
34 | 34 | * |
35 | 35 | */ |
36 | 36 | |
37 | -#include <lib3270-internals.h> | |
37 | +#include <internals.h> | |
38 | 38 | #include <signal.h> |
39 | 39 | #include "3270ds.h" |
40 | 40 | #include "resources.h" |
... | ... | @@ -550,7 +550,7 @@ void status_oerr(H3270 *session, int error_type) |
550 | 550 | */ |
551 | 551 | void status_resolving(H3270 *hSession) |
552 | 552 | { |
553 | - hSession->cstate = LIB3270_RESOLVING; | |
553 | + lib3270_set_cstate(hSession,LIB3270_RESOLVING); | |
554 | 554 | lib3270_st_changed(hSession, LIB3270_STATE_RESOLVING, True); |
555 | 555 | |
556 | 556 | mcursor_set(hSession,LIB3270_POINTER_LOCKED); |
... | ... | @@ -559,7 +559,7 @@ void status_resolving(H3270 *hSession) |
559 | 559 | |
560 | 560 | void status_connecting(H3270 *hSession) |
561 | 561 | { |
562 | - hSession->cstate = LIB3270_RESOLVING; | |
562 | + lib3270_set_cstate(hSession,LIB3270_RESOLVING); | |
563 | 563 | lib3270_st_changed(hSession, LIB3270_STATE_CONNECTING, True); |
564 | 564 | |
565 | 565 | mcursor_set(hSession,LIB3270_POINTER_LOCKED); | ... | ... |
src/core/see.c
src/core/session.c
... | ... | @@ -33,7 +33,7 @@ |
33 | 33 | #include <stdlib.h> |
34 | 34 | #endif // !ANDROID |
35 | 35 | |
36 | -#include <lib3270-internals.h> | |
36 | +#include <internals.h> | |
37 | 37 | #include "kybdc.h" |
38 | 38 | #include "ansic.h" |
39 | 39 | #include "togglesc.h" |
... | ... | @@ -95,6 +95,10 @@ void lib3270_session_free(H3270 *h) |
95 | 95 | for(f=0;f<LIB3270_TOGGLE_COUNT;f++) |
96 | 96 | lib3270_linked_list_free(&h->listeners.toggle[f]); |
97 | 97 | |
98 | + // Release action listeners. | |
99 | + for(f=0;f<LIB3270_ACTION_GROUP_CUSTOM;f++) | |
100 | + lib3270_linked_list_free(&h->listeners.actions[f]); | |
101 | + | |
98 | 102 | // Release memory |
99 | 103 | #define release_pointer(x) lib3270_free(x); x = NULL; |
100 | 104 | |
... | ... | @@ -331,9 +335,9 @@ static void lib3270_session_init(H3270 *hSession, const char *model, const char |
331 | 335 | hSession->unlock_delay = 1; |
332 | 336 | hSession->icrnl = 1; |
333 | 337 | hSession->onlcr = 1; |
334 | - hSession->sock = -1; | |
338 | + hSession->connection.sock = -1; | |
335 | 339 | hSession->model_num = -1; |
336 | - hSession->cstate = LIB3270_NOT_CONNECTED; | |
340 | + hSession->connection.state = LIB3270_NOT_CONNECTED; | |
337 | 341 | hSession->oia.status = -1; |
338 | 342 | hSession->kybdlock = KL_NOT_CONNECTED; |
339 | 343 | hSession->aid = AID_NO; |
... | ... | @@ -453,7 +457,7 @@ LIB3270_INTERNAL int check_online_session(const H3270 *hSession) { |
453 | 457 | return errno = EINVAL; |
454 | 458 | |
455 | 459 | // Is it connected? |
456 | - if((int) hSession->cstate < (int)LIB3270_CONNECTED_INITIAL) | |
460 | + if((int) hSession->connection.state < (int)LIB3270_CONNECTED_INITIAL) | |
457 | 461 | return errno = ENOTCONN; |
458 | 462 | |
459 | 463 | return 0; |
... | ... | @@ -466,7 +470,7 @@ LIB3270_INTERNAL int check_offline_session(const H3270 *hSession) { |
466 | 470 | return errno = EINVAL; |
467 | 471 | |
468 | 472 | // Is it connected? |
469 | - if((int) hSession->cstate >= (int)LIB3270_CONNECTED_INITIAL) | |
473 | + if((int) hSession->connection.state >= (int)LIB3270_CONNECTED_INITIAL) | |
470 | 474 | return errno = EISCONN; |
471 | 475 | |
472 | 476 | return 0; | ... | ... |
src/core/sf.c
src/core/state.c
... | ... | @@ -27,63 +27,63 @@ |
27 | 27 | * |
28 | 28 | */ |
29 | 29 | |
30 | -#include <lib3270-internals.h> | |
30 | +#include <internals.h> | |
31 | 31 | |
32 | 32 | /*---[ Implement ]------------------------------------------------------------------------------------------------------------*/ |
33 | 33 | |
34 | 34 | LIB3270_EXPORT LIB3270_CSTATE lib3270_get_connection_state(const H3270 *h) |
35 | 35 | { |
36 | - return h->cstate; | |
36 | + return h->connection.state; | |
37 | 37 | } |
38 | 38 | |
39 | 39 | LIB3270_EXPORT int lib3270_pconnected(const H3270 *h) |
40 | 40 | { |
41 | - return (((int) h->cstate) >= (int)LIB3270_RESOLVING); | |
41 | + return (((int) h->connection.state) >= (int)LIB3270_RESOLVING); | |
42 | 42 | } |
43 | 43 | |
44 | 44 | LIB3270_EXPORT int lib3270_half_connected(const H3270 *h) |
45 | 45 | { |
46 | - return (h->cstate == LIB3270_RESOLVING || h->cstate == LIB3270_PENDING); | |
46 | + return (h->connection.state == LIB3270_RESOLVING || h->connection.state == LIB3270_PENDING); | |
47 | 47 | } |
48 | 48 | |
49 | 49 | LIB3270_EXPORT int lib3270_is_disconnected(const H3270 *h) |
50 | 50 | { |
51 | - return ((int) h->cstate == (int)LIB3270_NOT_CONNECTED); | |
51 | + return ((int) h->connection.state == (int)LIB3270_NOT_CONNECTED); | |
52 | 52 | } |
53 | 53 | |
54 | 54 | LIB3270_EXPORT int lib3270_in_neither(const H3270 *h) |
55 | 55 | { |
56 | - return (h->cstate == LIB3270_CONNECTED_INITIAL); | |
56 | + return (h->connection.state == LIB3270_CONNECTED_INITIAL); | |
57 | 57 | } |
58 | 58 | |
59 | 59 | LIB3270_EXPORT int lib3270_in_ansi(const H3270 *h) |
60 | 60 | { |
61 | - return (h->cstate == LIB3270_CONNECTED_ANSI || h->cstate == LIB3270_CONNECTED_NVT); | |
61 | + return (h->connection.state == LIB3270_CONNECTED_ANSI || h->connection.state == LIB3270_CONNECTED_NVT); | |
62 | 62 | } |
63 | 63 | |
64 | 64 | LIB3270_EXPORT int lib3270_in_3270(const H3270 *h) |
65 | 65 | { |
66 | - return (h->cstate == LIB3270_CONNECTED_3270 || h->cstate == LIB3270_CONNECTED_TN3270E || h->cstate == LIB3270_CONNECTED_SSCP); | |
66 | + return (h->connection.state == LIB3270_CONNECTED_3270 || h->connection.state == LIB3270_CONNECTED_TN3270E || h->connection.state == LIB3270_CONNECTED_SSCP); | |
67 | 67 | } |
68 | 68 | |
69 | 69 | LIB3270_EXPORT int lib3270_in_sscp(const H3270 *h) |
70 | 70 | { |
71 | - return (h->cstate == LIB3270_CONNECTED_SSCP); | |
71 | + return (h->connection.state == LIB3270_CONNECTED_SSCP); | |
72 | 72 | } |
73 | 73 | |
74 | 74 | LIB3270_EXPORT int lib3270_in_tn3270e(const H3270 *h) |
75 | 75 | { |
76 | - return (h->cstate == LIB3270_CONNECTED_TN3270E); | |
76 | + return (h->connection.state == LIB3270_CONNECTED_TN3270E); | |
77 | 77 | } |
78 | 78 | |
79 | 79 | LIB3270_EXPORT int lib3270_is_connected(const H3270 *h) |
80 | 80 | { |
81 | - return ((int) h->cstate >= (int)LIB3270_CONNECTED_INITIAL); | |
81 | + return ((int) h->connection.state >= (int)LIB3270_CONNECTED_INITIAL); | |
82 | 82 | } |
83 | 83 | |
84 | 84 | LIB3270_EXPORT int lib3270_in_e(const H3270 *h) |
85 | 85 | { |
86 | - return (h->cstate >= LIB3270_CONNECTED_INITIAL_E); | |
86 | + return (h->connection.state >= LIB3270_CONNECTED_INITIAL_E); | |
87 | 87 | } |
88 | 88 | |
89 | 89 | ... | ... |
src/core/telnet.c
... | ... | @@ -55,7 +55,7 @@ |
55 | 55 | #include <openssl/err.h> |
56 | 56 | #endif |
57 | 57 | |
58 | -#include <lib3270-internals.h> | |
58 | +#include <internals.h> | |
59 | 59 | #include <errno.h> |
60 | 60 | |
61 | 61 | #if defined(_WIN32) |
... | ... | @@ -550,17 +550,17 @@ LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession) |
550 | 550 | hSession->xio.write = 0; |
551 | 551 | } |
552 | 552 | |
553 | - if(hSession->sock >= 0) | |
553 | + if(hSession->connection.sock >= 0) | |
554 | 554 | { |
555 | - shutdown(hSession->sock, 2); | |
556 | - SOCK_CLOSE(hSession->sock); | |
557 | - hSession->sock = -1; | |
555 | + shutdown(hSession->connection.sock, 2); | |
556 | + SOCK_CLOSE(hSession->connection.sock); | |
557 | + hSession->connection.sock = -1; | |
558 | 558 | } |
559 | + | |
559 | 560 | } |
560 | 561 | |
561 | -/* | |
562 | - * net_disconnect | |
563 | - * Shut down the socket. | |
562 | +/** | |
563 | + * @brief Shut down the socket. | |
564 | 564 | */ |
565 | 565 | void net_disconnect(H3270 *session) |
566 | 566 | { |
... | ... | @@ -641,7 +641,7 @@ void net_input(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG GNUC_UNUSED |
641 | 641 | for (;;) |
642 | 642 | #endif |
643 | 643 | { |
644 | - if (hSession->sock < 0) | |
644 | + if (hSession->connection.sock < 0) | |
645 | 645 | return; |
646 | 646 | |
647 | 647 | #if defined(X3270_ANSI) |
... | ... | @@ -652,9 +652,9 @@ void net_input(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG GNUC_UNUSED |
652 | 652 | if (hSession->ssl.con != NULL) |
653 | 653 | nr = SSL_read(hSession->ssl.con, (char *) buffer, BUFSZ); |
654 | 654 | else |
655 | - nr = recv(hSession->sock, (char *) buffer, BUFSZ, 0); | |
655 | + nr = recv(hSession->connection.sock, (char *) buffer, BUFSZ, 0); | |
656 | 656 | #else |
657 | - nr = recv(hSession->sock, (char *) buffer, BUFSZ, 0); | |
657 | + nr = recv(hSession->connection.sock, (char *) buffer, BUFSZ, 0); | |
658 | 658 | #endif // HAVE_LIBSSL |
659 | 659 | |
660 | 660 | if (nr < 0) |
... | ... | @@ -1638,9 +1638,9 @@ LIB3270_INTERNAL int lib3270_sock_send(H3270 *hSession, unsigned const char *buf |
1638 | 1638 | if(hSession->ssl.con != NULL) |
1639 | 1639 | rc = SSL_write(hSession->ssl.con, (const char *) buf, len); |
1640 | 1640 | else |
1641 | - rc = send(hSession->sock, (const char *) buf, len, 0); | |
1641 | + rc = send(hSession->connection.sock, (const char *) buf, len, 0); | |
1642 | 1642 | #else |
1643 | - rc = send(hSession->sock, (const char *) buf, len, 0); | |
1643 | + rc = send(hSession->connection.sock, (const char *) buf, len, 0); | |
1644 | 1644 | #endif // HAVE_LIBSSL |
1645 | 1645 | |
1646 | 1646 | if(rc > 0) |
... | ... | @@ -2076,14 +2076,14 @@ static void check_in3270(H3270 *hSession) |
2076 | 2076 | hSession->hisopts[TELOPT_BINARY] && |
2077 | 2077 | hSession->hisopts[TELOPT_EOR]) { |
2078 | 2078 | new_cstate = LIB3270_CONNECTED_3270; |
2079 | - } else if (hSession->cstate == LIB3270_CONNECTED_INITIAL) { | |
2079 | + } else if (hSession->connection.state == LIB3270_CONNECTED_INITIAL) { | |
2080 | 2080 | /* Nothing has happened, yet. */ |
2081 | 2081 | return; |
2082 | 2082 | } else { |
2083 | 2083 | new_cstate = LIB3270_CONNECTED_ANSI; |
2084 | 2084 | } |
2085 | 2085 | |
2086 | - if (new_cstate != hSession->cstate) { | |
2086 | + if (new_cstate != hSession->connection.state) { | |
2087 | 2087 | #if defined(X3270_TN3270E) /*[*/ |
2088 | 2088 | int was_in_e = IN_E; |
2089 | 2089 | #endif /*]*/ |
... | ... | @@ -2658,7 +2658,7 @@ void net_abort(H3270 *hSession) |
2658 | 2658 | /* Return the local address for the socket. */ |
2659 | 2659 | int net_getsockname(const H3270 *session, void *buf, int *len) |
2660 | 2660 | { |
2661 | - if (session->sock < 0) | |
2661 | + if (session->connection.sock < 0) | |
2662 | 2662 | return -1; |
2663 | - return getsockname(session->sock, buf, (socklen_t *)(void *)len); | |
2663 | + return getsockname(session->connection.sock, buf, (socklen_t *)(void *)len); | |
2664 | 2664 | } | ... | ... |
src/core/toggles/getset.c
src/core/toggles/init.c
... | ... | @@ -46,7 +46,7 @@ |
46 | 46 | |
47 | 47 | #include <config.h> |
48 | 48 | #include <lib3270/toggle.h> |
49 | -#include <lib3270-internals.h> | |
49 | +#include <internals.h> | |
50 | 50 | |
51 | 51 | #include "ansic.h" |
52 | 52 | #include "ctlrc.h" |
... | ... | @@ -79,12 +79,12 @@ static void toggle_nop(H3270 GNUC_UNUSED(*session), struct lib3270_toggle GNUC_U |
79 | 79 | |
80 | 80 | static void toggle_keepalive(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) |
81 | 81 | { |
82 | - if(session->sock > 0) | |
82 | + if(session->connection.sock > 0) | |
83 | 83 | { |
84 | 84 | // Update keep-alive option |
85 | 85 | int optval = t->value ? 1 : 0; |
86 | 86 | |
87 | - if (setsockopt(session->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) < 0) | |
87 | + if (setsockopt(session->connection.sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) < 0) | |
88 | 88 | { |
89 | 89 | popup_a_sockerr(session, N_( "Can't %s network keep-alive" ), optval ? _( "enable" ) : _( "disable" )); |
90 | 90 | } | ... | ... |
src/core/toggles/listener.c
src/core/toggles/table.c
src/core/trace_ds.c
src/core/util.c
... | ... | @@ -34,7 +34,7 @@ |
34 | 34 | |
35 | 35 | #define _GNU_SOURCE |
36 | 36 | |
37 | -#include <lib3270-internals.h> | |
37 | +#include <internals.h> | |
38 | 38 | #include "utilc.h" |
39 | 39 | #include "popupsc.h" |
40 | 40 | #include <lib3270/selection.h> |
... | ... | @@ -705,12 +705,12 @@ LIB3270_EXPORT int lib3270_getpeername(H3270 *hSession, struct sockaddr *addr, s |
705 | 705 | |
706 | 706 | memset(addr,0,*addrlen); |
707 | 707 | |
708 | - if(hSession->sock < 0) { | |
708 | + if(hSession->connection.sock < 0) { | |
709 | 709 | errno = ENOTCONN; |
710 | 710 | return -1; |
711 | 711 | } |
712 | 712 | |
713 | - return getpeername(hSession->sock, addr, addrlen); | |
713 | + return getpeername(hSession->connection.sock, addr, addrlen); | |
714 | 714 | |
715 | 715 | } |
716 | 716 | |
... | ... | @@ -720,12 +720,12 @@ LIB3270_EXPORT int lib3270_getsockname(H3270 *hSession, struct sockaddr *addr, s |
720 | 720 | |
721 | 721 | memset(addr,0,*addrlen); |
722 | 722 | |
723 | - if(hSession->sock < 0) { | |
723 | + if(hSession->connection.sock < 0) { | |
724 | 724 | errno = ENOTCONN; |
725 | 725 | return -1; |
726 | 726 | } |
727 | 727 | |
728 | - return getsockname(hSession->sock, addr, addrlen); | |
728 | + return getsockname(hSession->connection.sock, addr, addrlen); | |
729 | 729 | } |
730 | 730 | |
731 | 731 | static int xdigit_value(const char scanner) | ... | ... |
src/core/wait.c
src/core/windows/connect.c
src/core/windows/event_dispatcher.c
src/core/windows/http.c
src/core/windows/log.c
src/core/windows/util.c
... | ... | @@ -0,0 +1,882 @@ |
1 | +/* | |
2 | + * "Software G3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | + * | |
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | + * | |
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | + * os termos da GPL v.2 - Licença Pública Geral ', conforme publicado pela | |
10 | + * Free Software Foundation. | |
11 | + * | |
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | + * obter mais detalhes. | |
16 | + * | |
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | + * | |
21 | + * Este programa está nomeado como private.h e possui - linhas de código. | |
22 | + * | |
23 | + * Contatos: | |
24 | + * | |
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) | |
27 | + * | |
28 | + */ | |
29 | + | |
30 | +#ifdef WIN32 | |
31 | + #include <winsock2.h> | |
32 | + #include <windows.h> | |
33 | +#endif // WIN32 | |
34 | + | |
35 | +#include <config.h> /* autoconf settings */ | |
36 | +#include <lib3270.h> /* lib3270 API calls and defs */ | |
37 | +#include <linkedlist.h> | |
38 | +#include <lib3270/charset.h> | |
39 | +#include <lib3270/session.h> | |
40 | +#include <lib3270/actions.h> | |
41 | + | |
42 | +#if defined(HAVE_LIBSSL) | |
43 | + #include <openssl/ssl.h> | |
44 | + #include <openssl/x509v3.h> | |
45 | + | |
46 | +#endif // HAVE_LIBSSL | |
47 | + | |
48 | +#if defined(X3270_TN3270E) && !defined(X3270_ANSI) /*[*/ | |
49 | + #define X3270_ANSI 1 /* RFC2355 requires NVT mode */ | |
50 | +#endif /*]*/ | |
51 | + | |
52 | +#if defined(HAVE_VASPRINTF) && !defined(_GNU_SOURCE) /*[*/ | |
53 | + #define _GNU_SOURCE /* vasprintf isn't POSIX */ | |
54 | +#endif /*]*/ | |
55 | + | |
56 | +/* | |
57 | + * gettext stuff | |
58 | + */ | |
59 | +#ifdef ANDROID | |
60 | + #undef HAVE_LIBINTL | |
61 | + #undef HAVE_LIBSSL | |
62 | +#endif | |
63 | + | |
64 | +#ifdef HAVE_LIBINTL | |
65 | + #include <libintl.h> | |
66 | + #define _( x ) gettext(x) | |
67 | + #define N_( x ) x | |
68 | +#else | |
69 | + #define _( x ) x | |
70 | + #define N_( x ) x | |
71 | +#endif // HAVE_LIBINTL | |
72 | + | |
73 | +#define action_name(x) #x | |
74 | + | |
75 | +// | |
76 | +// Compiler-specific #defines. | |
77 | +// | |
78 | +// Reference: GLIBC gmacros.h | |
79 | +// | |
80 | +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) | |
81 | + | |
82 | + #define GNUC_UNUSED \ | |
83 | + __attribute__((__unused__)) | |
84 | + | |
85 | +#else | |
86 | + | |
87 | + #define unused | |
88 | + #define GNUC_UNUSED | |
89 | + #define printflike(s, f) | |
90 | + | |
91 | +#endif | |
92 | + | |
93 | +#if defined(_WIN32) || defined(_MSC_VER) | |
94 | + | |
95 | + #include <winsock2.h> | |
96 | + #include <windows.h> | |
97 | + | |
98 | +#else | |
99 | + | |
100 | + #include <unistd.h> /* Unix system calls */ | |
101 | + #include <sys/time.h> /* System time-related data types */ | |
102 | + | |
103 | +#endif // _WIN32 | |
104 | + | |
105 | +/* | |
106 | + * Prerequisite #includes. | |
107 | + */ | |
108 | +#include <stdio.h> /* Unix standard I/O library */ | |
109 | +#include <ctype.h> /* Character classes */ | |
110 | +#include <string.h> /* String manipulations */ | |
111 | +#include <sys/types.h> /* Basic system data types */ | |
112 | +#include <time.h> /* C library time functions */ | |
113 | +#include "localdefs.h" /* {s,tcl,c}3270-specific defines */ | |
114 | + | |
115 | +/* | |
116 | + * Cancel out contradictory parts. | |
117 | + */ | |
118 | +#if !defined(X3270_DISPLAY) /*[*/ | |
119 | + #undef X3270_KEYPAD | |
120 | + #undef X3270_MENUS | |
121 | +#endif /*]*/ | |
122 | + | |
123 | +#define RECONNECT_MS 2000 /**< @brief 2 sec before reconnecting to host. */ | |
124 | +#define RECONNECT_ERR_MS 5000 /**< @brief 5 sec before reconnecting to host when failed */ | |
125 | + | |
126 | +/** | |
127 | + * @brief types of internal actions | |
128 | + */ | |
129 | +enum iaction { | |
130 | + IA_STRING, IA_PASTE, IA_REDRAW, | |
131 | + IA_KEYPAD, IA_DEFAULT, IA_KEY, | |
132 | + IA_MACRO, IA_SCRIPT, IA_PEEK, | |
133 | + IA_TYPEAHEAD, IA_FT, IA_COMMAND, IA_KEYMAP, | |
134 | + IA_IDLE | |
135 | +}; | |
136 | + | |
137 | +// Version strings | |
138 | +LIB3270_INTERNAL const char * build; | |
139 | +LIB3270_INTERNAL const char * app_defaults_version; | |
140 | +LIB3270_INTERNAL const char * sccsid; | |
141 | +LIB3270_INTERNAL const char * build_rpq_timestamp; | |
142 | +LIB3270_INTERNAL const char * build_rpq_version; | |
143 | +LIB3270_INTERNAL const char * build_rpq_revision; | |
144 | + | |
145 | +#if defined(X3270_DBCS) /*[*/ | |
146 | + LIB3270_INTERNAL Boolean dbcs; | |
147 | +#endif /*]*/ | |
148 | + | |
149 | + | |
150 | +/** | |
151 | + * @brief toggle names | |
152 | + */ /* | |
153 | +struct toggle_name { | |
154 | + const char *name; | |
155 | + int index; | |
156 | +}; */ | |
157 | + | |
158 | +/// @brief State macros | |
159 | +#define PCONNECTED lib3270_pconnected(hSession) | |
160 | +#define HALF_CONNECTED lib3270_half_connected(hSession) | |
161 | +#define CONNECTED lib3270_is_connected(hSession) | |
162 | + | |
163 | +#define IN_NEITHER lib3270_in_neither(hSession) | |
164 | +#define IN_ANSI lib3270_in_ansi(hSession) | |
165 | +#define IN_3270 lib3270_in_3270(hSession) | |
166 | +#define IN_SSCP lib3270_in_sscp(hSession) | |
167 | +#define IN_TN3270E lib3270_in_tn3270e(hSession) | |
168 | +#define IN_E lib3270_in_e(hSession) | |
169 | + | |
170 | +/// @brief Naming convention for private actions. | |
171 | +#define PA_PFX "PA-" | |
172 | + | |
173 | +#define GR_BLINK 0x01 | |
174 | +#define GR_REVERSE 0x02 | |
175 | +#define GR_UNDERLINE 0x04 | |
176 | +#define GR_INTENSIFY 0x08 | |
177 | + | |
178 | +#define CS_MASK 0x03 ///< @brief mask for specific character sets */ | |
179 | +#define CS_BASE 0x00 ///< @brief base character set (X'00') */ | |
180 | +#define CS_APL 0x01 ///< @brief APL character set (X'01' or GE) */ | |
181 | +#define CS_LINEDRAW 0x02 ///< @brief DEC line-drawing character set (ANSI) */ | |
182 | +#define CS_DBCS 0x03 ///< @brief DBCS character set (X'F8') */ | |
183 | +#define CS_GE 0x04 ///< @brief cs flag for Graphic Escape */ | |
184 | + | |
185 | +/// @brief Shorthand macros | |
186 | +#define CN ((char *) NULL) | |
187 | +#define PN ((XtPointer) NULL) | |
188 | +#define Replace(var, value) { lib3270_free(var); var = (value); }; | |
189 | + | |
190 | +/// @brief Configuration change masks. | |
191 | +//#define NO_CHANGE 0x0000 /// @brief no change | |
192 | +// #define MODEL_CHANGE 0x0001 /// @brief screen dimensions changed | |
193 | +//#define FONT_CHANGE 0x0002 /// @brief emulator font changed | |
194 | +//#define COLOR_CHANGE 0x0004 /// @brief color scheme or 3278/9 mode changed | |
195 | +//#define SCROLL_CHANGE 0x0008 /// @brief scrollbar snapped on or off | |
196 | +//#define CHARSET_CHANGE 0x0010 /// @brief character set changed | |
197 | +// #define ALL_CHANGE 0xffff /// @brief everything changed | |
198 | + | |
199 | +/* Portability macros */ | |
200 | + | |
201 | +/* Equivalent of setlinebuf */ | |
202 | + | |
203 | +#if defined(_IOLBF) /*[*/ | |
204 | + #define SETLINEBUF(s) setvbuf(s, (char *)NULL, _IOLBF, BUFSIZ) | |
205 | +#else /*][*/ | |
206 | + #define SETLINEBUF(s) setlinebuf(s) | |
207 | +#endif /*]*/ | |
208 | + | |
209 | +/* Motorola version of gettimeofday */ | |
210 | + | |
211 | +#if defined(MOTOROLA) | |
212 | + #define gettimeofday(tp,tz) gettimeofday(tp) | |
213 | +#endif | |
214 | + | |
215 | +/* Default DFT file transfer buffer size. */ | |
216 | +#if defined(X3270_FT) && !defined(DFT_BUF) /*[*/ | |
217 | + #define DFT_BUF (4 * 1024) | |
218 | +#endif /*]*/ | |
219 | + | |
220 | +/* DBCS Preedit Types */ /* | |
221 | +#if defined(X3270_DBCS) | |
222 | + #define PT_ROOT "Root" | |
223 | + #define PT_OVER_THE_SPOT "OverTheSpot" | |
224 | + #define PT_OFF_THE_SPOT "OffTheSpot" | |
225 | + #define PT_ON_THE_SPOT "OnTheSpot" | |
226 | +#endif */ | |
227 | + | |
228 | +/** | |
229 | + * @brief input key type | |
230 | + */ | |
231 | +enum keytype | |
232 | +{ | |
233 | + KT_STD, | |
234 | + KT_GE | |
235 | +}; | |
236 | + | |
237 | +LIB3270_INTERNAL struct _ansictl | |
238 | +{ | |
239 | + char vintr; | |
240 | + char vquit; | |
241 | + char verase; | |
242 | + char vkill; | |
243 | + char veof; | |
244 | + char vwerase; | |
245 | + char vrprnt; | |
246 | + char vlnext; | |
247 | +} ansictl; | |
248 | + | |
249 | +/** | |
250 | + * @brief Extended attributes | |
251 | + */ | |
252 | +struct lib3270_ea | |
253 | +{ | |
254 | + unsigned char cc; ///< @brief EBCDIC or ASCII character code | |
255 | + unsigned char fa; ///< @brief field attribute, it nonzero | |
256 | + unsigned char fg; ///< @brief foreground color (0x00 or 0xf<n>) | |
257 | + unsigned char bg; ///< @brief background color (0x00 or 0xf<n>) | |
258 | + unsigned char gr; ///< @brief ANSI graphics rendition bits | |
259 | + unsigned char cs; ///< @brief character set (GE flag, or 0..2) | |
260 | + unsigned char ic; ///< @brief input control (DBCS) | |
261 | + unsigned char db; ///< @brief DBCS state | |
262 | +}; | |
263 | + | |
264 | +struct lib3270_text | |
265 | +{ | |
266 | + unsigned char chr; ///< @brief ASCII character code | |
267 | + unsigned short attr; ///< @brief Converted character attribute (color & etc) | |
268 | +}; | |
269 | + | |
270 | +#ifndef LIB3270_TA | |
271 | + #define LIB3270_TA void | |
272 | +#endif // !LIB3270_TA | |
273 | + | |
274 | +#define LIB3270_MB_MAX 16 | |
275 | + | |
276 | +#define LIB3270_FULL_MODEL_NAME_LENGTH 13 | |
277 | +#define LIB3270_LU_MAX 32 | |
278 | + | |
279 | +#define LIB3270_TELNET_N_OPTS 256 | |
280 | + | |
281 | +/** | |
282 | + * | |
283 | + * @brief Timeout control structure. | |
284 | + * | |
285 | + */ | |
286 | +typedef struct timeout | |
287 | +{ | |
288 | + LIB3270_LINKED_LIST_HEAD | |
289 | + | |
290 | + unsigned char in_play; | |
291 | + | |
292 | +#if defined(_WIN32) /*[*/ | |
293 | + unsigned long long ts; | |
294 | +#else /*][*/ | |
295 | + struct timeval tv; | |
296 | +#endif /*]*/ | |
297 | + | |
298 | + int (*proc)(H3270 *session); | |
299 | + | |
300 | +} timeout_t; | |
301 | + | |
302 | + | |
303 | +/** | |
304 | + * | |
305 | + * @brief I/O events. | |
306 | + * | |
307 | + */ | |
308 | +typedef struct _input_t | |
309 | +{ | |
310 | + LIB3270_LINKED_LIST_HEAD | |
311 | + | |
312 | + unsigned char enabled; | |
313 | + int fd; | |
314 | + LIB3270_IO_FLAG flag; | |
315 | + | |
316 | + void (*call)(H3270 *, int, LIB3270_IO_FLAG, void *); | |
317 | + | |
318 | +} input_t; | |
319 | + | |
320 | +struct lib3270_state_callback | |
321 | +{ | |
322 | + LIB3270_LINKED_LIST_HEAD | |
323 | + | |
324 | + void (*func)(H3270 *, int, void *); /**< @brief Function to call */ | |
325 | +}; | |
326 | + | |
327 | +struct lib3270_toggle_callback | |
328 | +{ | |
329 | + LIB3270_LINKED_LIST_HEAD | |
330 | + | |
331 | + void (*func)(H3270 *, LIB3270_TOGGLE_ID, char, void *); /**< @brief Function to call */ | |
332 | +}; | |
333 | + | |
334 | +/** | |
335 | + * | |
336 | + * @brief lib3270 session data | |
337 | + * | |
338 | + */ | |
339 | +struct _h3270 | |
340 | +{ | |
341 | + struct lib3270_session_callbacks cbk; ///< @brief Callback table - Always the first one. | |
342 | + | |
343 | + // Session info | |
344 | + char id; ///< @brief Session Identifier. | |
345 | + | |
346 | + // Connection info | |
347 | + struct { | |
348 | + int sock; ///< @brief Network socket. | |
349 | + LIB3270_CSTATE state; ///< @brief Connection state. | |
350 | + } connection; | |
351 | + | |
352 | + // flags | |
353 | + LIB3270_HOST_TYPE host_type; ///< @brief Host type. | |
354 | + | |
355 | + int selected : 1; ///< @brief Has selected region? | |
356 | + int rectsel : 1; ///< @brief Selected region is a rectangle ? | |
357 | + int vcontrol : 1; ///< @brief Visible control ? | |
358 | + int modified_sel : 1; | |
359 | + int mono : 1; ///< @brief Forces monochrome display | |
360 | + int m3279 : 1; | |
361 | + int extended : 1; ///< @brief Extended data stream. | |
362 | + int typeahead : 1; | |
363 | + int numeric_lock : 1; | |
364 | + int oerr_lock : 1; ///< @brief If true, operator errors will lock the keyboard. | |
365 | + int unlock_delay : 1; ///< @brief If true the unlock delay feature is enabled. @see lib3270_set_unlock_delay | |
366 | + int auto_reconnect_inprogress : 1; | |
367 | + unsigned int colors : 5; | |
368 | + int apl_mode : 1; ///< @brief If true enables APL mode. | |
369 | + int icrnl : 1; | |
370 | + int inlcr : 1; | |
371 | + int onlcr : 1; | |
372 | + int bsd_tm : 1; | |
373 | + int syncing : 1; | |
374 | + int reverse : 1; /**< @brief reverse-input mode */ | |
375 | + int dbcs : 1; | |
376 | + int linemode : 1; | |
377 | + int trace_skipping : 1; | |
378 | + int need_tls_follows : 1; | |
379 | + int cut_xfer_in_progress : 1; | |
380 | +// int auto_keymap : 1; | |
381 | + int formatted : 1; /**< @brief Formatted screen flag */ | |
382 | + int starting : 1; /**< @brief Is starting (no first screen)? */ | |
383 | + | |
384 | + struct lib3270_toggle | |
385 | + { | |
386 | + char value; /**< toggle value */ | |
387 | + void (*upcall)(H3270 *, struct lib3270_toggle *, LIB3270_TOGGLE_TYPE); /**< change value */ | |
388 | + } toggle[LIB3270_TOGGLE_COUNT]; | |
389 | + | |
390 | + // Network & Termtype | |
391 | + char * connected_type; | |
392 | + char full_model_name[LIB3270_FULL_MODEL_NAME_LENGTH+1]; | |
393 | + char * model_name; | |
394 | + unsigned int model_num; | |
395 | + char * termtype; | |
396 | + | |
397 | + struct | |
398 | + { | |
399 | + char * url; /**< The host URL, for use in reconnecting */ | |
400 | + char * current; /**< The hostname part, stripped of qualifiers, luname and port number */ | |
401 | + char * srvc; /**< The service name */ | |
402 | + char * qualified; | |
403 | + } host; | |
404 | + | |
405 | + char * termname; | |
406 | + | |
407 | + struct lib3270_charset charset; | |
408 | + | |
409 | + struct | |
410 | + { | |
411 | + LIB3270_MESSAGE status; | |
412 | + unsigned char flag[LIB3270_FLAG_COUNT]; | |
413 | + } oia; | |
414 | + | |
415 | + unsigned short current_port; | |
416 | + | |
417 | + // Misc | |
418 | + H3270FT * ft; /**< @brief Active file transfer data */ | |
419 | + | |
420 | + // screen info | |
421 | + | |
422 | + // Oversize. | |
423 | + struct | |
424 | + { | |
425 | + char * str; | |
426 | + unsigned int rows; | |
427 | + unsigned int cols; | |
428 | + } oversize; | |
429 | + | |
430 | + // Maximum screen size. | |
431 | + struct | |
432 | + { | |
433 | + unsigned int rows; | |
434 | + unsigned int cols; | |
435 | + } max; | |
436 | + | |
437 | + // View size | |
438 | + struct { | |
439 | + unsigned int rows; | |
440 | + unsigned int cols; | |
441 | + } view; | |
442 | + | |
443 | + LIB3270_POINTER pointer; /**< @brief Current pointer. */ | |
444 | + int cursor_addr; | |
445 | + int buffer_addr; | |
446 | + char flipped; | |
447 | + int screen_alt; /**< @brief alternate screen? */ | |
448 | + int is_altbuffer; | |
449 | + | |
450 | + // Screen contents | |
451 | + void * buffer[2]; /**< @brief Internal buffers */ | |
452 | + struct lib3270_ea * ea_buf; /**< @brief 3270 device buffer. ea_buf[-1] is the dummy default field attribute */ | |
453 | + struct lib3270_ea * aea_buf; /**< @brief alternate 3270 extended attribute buffer */ | |
454 | + struct lib3270_text * text; /**< @brief Converted 3270 chars */ | |
455 | + | |
456 | + // host.c | |
457 | + char std_ds_host; | |
458 | + char no_login_host; | |
459 | + char non_tn3270e_host; | |
460 | + char passthru_host; | |
461 | + char ever_3270; | |
462 | + | |
463 | + // ctlr.c | |
464 | + int sscp_start; | |
465 | + unsigned char default_fg; | |
466 | + unsigned char default_bg; | |
467 | + unsigned char default_gr; | |
468 | + unsigned char default_cs; | |
469 | + unsigned char default_ic; | |
470 | + char reply_mode; | |
471 | + int trace_primed : 1; | |
472 | + int ticking : 1; | |
473 | + int mticking : 1; | |
474 | + int crm_nattr; | |
475 | + unsigned char crm_attr[16]; | |
476 | + unsigned char * zero_buf; /**< @brief Empty buffer, for area clears */ | |
477 | + | |
478 | + struct timeval t_start; | |
479 | + void * tick_id; | |
480 | + struct timeval t_want; | |
481 | + | |
482 | + // Telnet.c | |
483 | + unsigned char * ibuf; | |
484 | + int ibuf_size; /**< @brief size of ibuf */ | |
485 | + time_t ns_time; | |
486 | + int ns_brcvd; | |
487 | + int ns_rrcvd; | |
488 | + int ns_bsent; | |
489 | + int ns_rsent; | |
490 | + struct timeval ds_ts; | |
491 | + unsigned short e_xmit_seq; /**< @brief transmit sequence number */ | |
492 | + int response_required; | |
493 | + int ansi_data; | |
494 | + int lnext; | |
495 | + int backslashed; | |
496 | + char plu_name[LIB3270_BIND_PLU_NAME_MAX+1]; | |
497 | + | |
498 | + /* | |
499 | + /// @brief Proxy | |
500 | + struct | |
501 | + { | |
502 | + char * proxy; ///< Proxy server (type:host[:port]) | |
503 | + int type; | |
504 | + char * host; | |
505 | + char * portname; | |
506 | + unsigned short port; | |
507 | + } proxy; | |
508 | + */ | |
509 | + | |
510 | + /// @brief LU | |
511 | + char **curr_lu; | |
512 | + char * try_lu; | |
513 | + char **lus; ///< @brief Array with the LU names to try. | |
514 | + struct | |
515 | + { | |
516 | + char reported[LIB3270_LU_MAX+1]; | |
517 | + char * connected; | |
518 | + char name[LIB3270_LUNAME_LENGTH+1]; | |
519 | + | |
520 | + } lu; | |
521 | + | |
522 | + char reported_type[LIB3270_LU_MAX+1]; | |
523 | + | |
524 | + // TN3270e | |
525 | + enum | |
526 | + { | |
527 | + E_NONE, | |
528 | + E_3270, | |
529 | + E_NVT, | |
530 | + E_SSCP | |
531 | + } tn3270e_submode; | |
532 | + | |
533 | + unsigned long e_funcs; /**< @brief negotiated TN3270E functions */ | |
534 | + int tn3270e_bound; | |
535 | + int tn3270e_negotiated; | |
536 | + | |
537 | + // Line mode | |
538 | + unsigned char * lbuf; /**< @brief line-mode input buffer */ | |
539 | + unsigned char * lbptr; | |
540 | + | |
541 | + // 3270 input buffer | |
542 | + unsigned char * ibptr; | |
543 | + | |
544 | + // Output buffer. | |
545 | + struct | |
546 | + { | |
547 | + unsigned char * buf; ///< @brief 3270 output buffer */ | |
548 | + unsigned char * base; | |
549 | + int length; ///< @brief Length of the output buffer. | |
550 | + unsigned char * ptr; | |
551 | + } output; | |
552 | + | |
553 | + // network input buffer | |
554 | + unsigned char * sbbuf; | |
555 | + | |
556 | + // telnet sub-option buffer | |
557 | + unsigned char * sbptr; | |
558 | + unsigned char telnet_state; | |
559 | + | |
560 | + unsigned char myopts[LIB3270_TELNET_N_OPTS]; | |
561 | + unsigned char hisopts[LIB3270_TELNET_N_OPTS]; | |
562 | + | |
563 | + // kybd.c | |
564 | + unsigned int kybdlock; ///< @brief @brief keyboard lock state. | |
565 | + unsigned char aid; ///< @brief @brief current attention ID. | |
566 | + void * unlock_id; | |
567 | + time_t unlock_delay_time; | |
568 | + unsigned long unlock_delay_ms; ///< @brief Delay before actually unlocking the keyboard after the host permits it. | |
569 | + LIB3270_TA * ta_head; | |
570 | + LIB3270_TA * ta_tail; | |
571 | + | |
572 | + // ft_dft.c | |
573 | + int dft_buffersize; ///< @brief Buffer size (LIMIN, LIMOUT) | |
574 | + | |
575 | + // rpq.c | |
576 | + int rpq_complained : 1; | |
577 | +#if !defined(_WIN32) | |
578 | + int omit_due_space_limit : 1; | |
579 | +#endif | |
580 | + | |
581 | + char * rpq_warnbuf; | |
582 | + int rpq_wbcnt; | |
583 | + | |
584 | + // User data (Usually points to session's widget) | |
585 | + void * user_data; | |
586 | + | |
587 | + // selection | |
588 | + char * paste_buffer; | |
589 | + struct | |
590 | + { | |
591 | + int start; | |
592 | + int end; | |
593 | + } select; | |
594 | + | |
595 | + // ansi.c | |
596 | + int scroll_top; | |
597 | + int scroll_bottom; | |
598 | + int once_cset; | |
599 | + int saved_cursor; | |
600 | + | |
601 | + int held_wrap : 1; | |
602 | + | |
603 | + int insert_mode : 1; | |
604 | + int auto_newline_mode : 1; | |
605 | + | |
606 | + int appl_cursor : 1; | |
607 | + int saved_appl_cursor : 1; | |
608 | + | |
609 | + int wraparound_mode : 1; | |
610 | + int saved_wraparound_mode : 1; | |
611 | + | |
612 | + int rev_wraparound_mode : 1; | |
613 | + int saved_rev_wraparound_mode : 1; | |
614 | + | |
615 | + int allow_wide_mode : 1; | |
616 | + int saved_allow_wide_mode : 1; | |
617 | + | |
618 | + int wide_mode : 1; | |
619 | + int saved_wide_mode : 1; | |
620 | + | |
621 | + int saved_altbuffer : 1; | |
622 | + int ansi_reset : 1; /**< @brief Non zero if the ansi_reset() was called in this session */ | |
623 | + | |
624 | + int ansi_ch; | |
625 | + int cs_to_change; | |
626 | + | |
627 | + /** @brief ANSI Character sets. */ | |
628 | + enum lib3270_ansi_cs | |
629 | + { | |
630 | + LIB3270_ANSI_CS_G0 = 0, | |
631 | + LIB3270_ANSI_CS_G1 = 1, | |
632 | + LIB3270_ANSI_CS_G2 = 2, | |
633 | + LIB3270_ANSI_CS_G3 = 3 | |
634 | + } cset; | |
635 | + enum lib3270_ansi_cs saved_cset; | |
636 | + | |
637 | + /** @brief Character set designations. */ | |
638 | + enum lib3270_ansi_csd | |
639 | + { | |
640 | + LIB3270_ANSI_CSD_LD = 0, | |
641 | + LIB3270_ANSI_CSD_UK = 1, | |
642 | + LIB3270_ANSI_CSD_US = 2 | |
643 | + } csd[4]; | |
644 | + enum lib3270_ansi_csd saved_csd[4]; | |
645 | + | |
646 | + enum lib3270_ansi_state | |
647 | + { | |
648 | + LIB3270_ANSI_STATE_DATA = 0, | |
649 | + LIB3270_ANSI_STATE_ESC = 1, | |
650 | + LIB3270_ANSI_STATE_CSDES = 2, | |
651 | + LIB3270_ANSI_STATE_N1 = 3, | |
652 | + LIB3270_ANSI_STATE_DECP = 4, | |
653 | + LIB3270_ANSI_STATE_TEXT = 5, | |
654 | + LIB3270_ANSI_STATE_TEXT2 = 6, | |
655 | + LIB3270_ANSI_STATE_MBPEND = 7 | |
656 | + } state; | |
657 | + | |
658 | + unsigned char * tabs; | |
659 | + | |
660 | + int pmi; | |
661 | + char pending_mbs[LIB3270_MB_MAX]; | |
662 | + | |
663 | + unsigned char gr; | |
664 | + unsigned char saved_gr; | |
665 | + | |
666 | + unsigned char fg; | |
667 | + unsigned char saved_fg; | |
668 | + | |
669 | + unsigned char bg; | |
670 | + unsigned char saved_bg; | |
671 | + | |
672 | + // xio | |
673 | + struct { | |
674 | + void * read; | |
675 | + void * write; | |
676 | + void * except; | |
677 | + } xio; | |
678 | + | |
679 | + size_t popups; ///< @brief Count open popups. | |
680 | + | |
681 | +#ifdef HAVE_LIBSSL | |
682 | + /// @brief SSL Data. | |
683 | + struct | |
684 | + { | |
685 | + char enabled; | |
686 | + char host; | |
687 | + LIB3270_SSL_STATE state; | |
688 | + unsigned long error; | |
689 | +#ifdef SSL_ENABLE_CRL_CHECK | |
690 | + struct | |
691 | + { | |
692 | + char * prefer; ///< @brief Prefered protocol for CRL. | |
693 | + char * url; ///< @brief URL for CRL download. | |
694 | + X509_CRL * cert; ///< @brief Loaded CRL (can be null). | |
695 | + } crl; | |
696 | +#endif // SSL_ENABLE_CRL_CHECK | |
697 | + SSL * con; | |
698 | + } ssl; | |
699 | +#endif // HAVE_LIBSSL | |
700 | + | |
701 | + struct lib3270_linked_list_head timeouts; | |
702 | + | |
703 | + struct | |
704 | + { | |
705 | + struct lib3270_linked_list_head list; | |
706 | + int changed : 1; | |
707 | + } input; | |
708 | + | |
709 | + // Trace methods. | |
710 | + struct | |
711 | + { | |
712 | + void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args); | |
713 | + void *userdata; | |
714 | + } trace; | |
715 | + | |
716 | + /// @brief Event Listeners. | |
717 | + struct | |
718 | + { | |
719 | + /// @brief State listeners. | |
720 | + struct lib3270_linked_list_head state[LIB3270_STATE_USER]; | |
721 | + | |
722 | + /// @brief Toggle listeners. | |
723 | + struct lib3270_linked_list_head toggle[LIB3270_TOGGLE_COUNT]; | |
724 | + | |
725 | + /// @brief Action listeners. | |
726 | + struct lib3270_linked_list_head actions[LIB3270_ACTION_GROUP_CUSTOM]; | |
727 | + | |
728 | + } listeners; | |
729 | + | |
730 | + | |
731 | +}; | |
732 | + | |
733 | +#define SELECTION_LEFT 0x01 | |
734 | +#define SELECTION_TOP 0x02 | |
735 | +#define SELECTION_RIGHT 0x04 | |
736 | +#define SELECTION_BOTTOM 0x08 | |
737 | + | |
738 | +#define SELECTION_SINGLE_COL 0x10 | |
739 | +#define SELECTION_SINGLE_ROW 0x20 | |
740 | + | |
741 | +#define SELECTION_ACTIVE 0x80 | |
742 | + | |
743 | +#ifdef _WIN32 | |
744 | +/// @brief Windows Event Log Handler. | |
745 | +LIB3270_INTERNAL HANDLE hEventLog; | |
746 | +LIB3270_INTERNAL HANDLE hModule; | |
747 | +#endif // _WIN32 | |
748 | + | |
749 | +#ifdef HAVE_SYSLOG | |
750 | +/// @brief Windows Event Log Handler. | |
751 | +LIB3270_INTERNAL int use_syslog; | |
752 | +#endif // HAVE_SYSLOG | |
753 | + | |
754 | + | |
755 | +/* Library internal calls */ | |
756 | +LIB3270_INTERNAL int key_ACharacter(H3270 *hSession, unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped); | |
757 | +LIB3270_INTERNAL int cursor_move(H3270 *session, int baddr); | |
758 | + | |
759 | +LIB3270_INTERNAL void toggle_rectselect(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt); | |
760 | +LIB3270_INTERNAL void remove_input_calls(H3270 *session); | |
761 | + | |
762 | +LIB3270_INTERNAL int lib3270_sock_send(H3270 *hSession, unsigned const char *buf, int len); | |
763 | +LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession); | |
764 | + | |
765 | +LIB3270_INTERNAL int lib3270_default_event_dispatcher(H3270 *hSession, int block); | |
766 | + | |
767 | +LIB3270_INTERNAL void do_select(H3270 *h, unsigned int start, unsigned int end, unsigned int rect); | |
768 | + | |
769 | + | |
770 | +/** | |
771 | + * @brief Called from timer to attempt an automatic reconnection. | |
772 | + */ | |
773 | +LIB3270_INTERNAL int lib3270_check_for_auto_reconnect(H3270 *hSession); | |
774 | + | |
775 | +#if defined(DEBUG) | |
776 | + #define CHECK_SESSION_HANDLE(x) check_session_handle(&x,__FUNCTION__); | |
777 | + LIB3270_INTERNAL void check_session_handle(H3270 **hSession, const char *fname); | |
778 | +#else | |
779 | + #define CHECK_SESSION_HANDLE(x) check_session_handle(&x); | |
780 | + LIB3270_INTERNAL void check_session_handle(H3270 **hSession); | |
781 | +#endif // DEBUG | |
782 | + | |
783 | +LIB3270_INTERNAL int check_online_session(const H3270 *hSession); | |
784 | +LIB3270_INTERNAL int check_offline_session(const H3270 *hSession); | |
785 | + | |
786 | +/// @brief Returns -1 if the session is invalid or not online (sets errno). | |
787 | +#define FAIL_IF_NOT_ONLINE(x) if(check_online_session(x)) return errno; | |
788 | + | |
789 | +/// @brief Returns -1 if the session is invalid or online (sets errno). | |
790 | +#define FAIL_IF_ONLINE(x) if(check_offline_session(x)) return errno; | |
791 | + | |
792 | +LIB3270_INTERNAL int non_blocking(H3270 *session, Boolean on); | |
793 | + | |
794 | +#if defined(HAVE_LIBSSL) | |
795 | + | |
796 | + typedef struct _ssl_error_message | |
797 | + { | |
798 | + int error; | |
799 | + const char * title; | |
800 | + const char * text; | |
801 | + const char * description; | |
802 | +#ifdef _WIN32 | |
803 | + DWORD lasterror; | |
804 | +#endif // _WIN32 | |
805 | + } SSL_ERROR_MESSAGE; | |
806 | + | |
807 | + struct ssl_status_msg | |
808 | + { | |
809 | + long id; | |
810 | + LIB3270_NOTIFY icon; | |
811 | + const char * iconName; // Icon name from https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html | |
812 | + const char * message; | |
813 | + const char * description; | |
814 | + }; | |
815 | + | |
816 | + LIB3270_INTERNAL int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE *message); | |
817 | + LIB3270_INTERNAL int ssl_init(H3270 *session); | |
818 | + LIB3270_INTERNAL int ssl_negotiate(H3270 *hSession); | |
819 | + LIB3270_INTERNAL void set_ssl_state(H3270 *session, LIB3270_SSL_STATE state); | |
820 | + LIB3270_INTERNAL const struct ssl_status_msg * ssl_get_status_from_error_code(long id); | |
821 | + | |
822 | + | |
823 | + #if OPENSSL_VERSION_NUMBER >= 0x00907000L | |
824 | + #define INFO_CONST const | |
825 | + #else | |
826 | + #define INFO_CONST | |
827 | + #endif | |
828 | + | |
829 | + LIB3270_INTERNAL void ssl_info_callback(INFO_CONST SSL *s, int where, int ret); | |
830 | + | |
831 | + /** | |
832 | + * @brief Global SSL_CTX object as framework to establish TLS/SSL or DTLS enabled connections. | |
833 | + * | |
834 | + */ | |
835 | + LIB3270_INTERNAL SSL_CTX * ssl_ctx; | |
836 | + | |
837 | + /** | |
838 | + * @brief Index of h3270 handle in SSL session. | |
839 | + * | |
840 | + */ | |
841 | + LIB3270_INTERNAL int ssl_3270_ex_index; | |
842 | + | |
843 | + /** | |
844 | + * @brief Emit popup on ssl error. | |
845 | + * | |
846 | + */ | |
847 | + LIB3270_INTERNAL int popup_ssl_error(H3270 *session, int rc, const char *title, const char *summary, const char *body); | |
848 | + | |
849 | + /** | |
850 | + * @brief Emite popup on SSL error. | |
851 | + * | |
852 | + */ | |
853 | + LIB3270_INTERNAL int notify_ssl_error(H3270 *hSession, int rc, const SSL_ERROR_MESSAGE *message); | |
854 | + | |
855 | +#endif | |
856 | + | |
857 | + /// @brief Clear element at adress. | |
858 | + LIB3270_INTERNAL void clear_chr(H3270 *hSession, int baddr); | |
859 | + | |
860 | + LIB3270_INTERNAL unsigned char get_field_attribute(H3270 *session, int baddr); | |
861 | + | |
862 | + /// @brief Default log writer. | |
863 | + LIB3270_INTERNAL void default_log_writer(H3270 *session, const char *module, int rc, const char *fmt, va_list arg_ptr); | |
864 | + | |
865 | + LIB3270_INTERNAL char * lib3270_get_user_name(); | |
866 | + | |
867 | + /// @brief Query data from URL. | |
868 | + /// | |
869 | + /// @param hSession Handle of the TN3270 Session. | |
870 | + /// @param url The url to get. | |
871 | + /// @param length Pointer to the response lenght (can be NULL). | |
872 | + /// @param error_message Pointer to the error message. | |
873 | + /// | |
874 | + /// @return The data from URL (release it with lib3270_free) or NULL on error. | |
875 | + /// | |
876 | + LIB3270_INTERNAL char * lib3270_get_from_url(H3270 *hSession, const char *url, size_t *length, const char **error_message); | |
877 | + | |
878 | + /// @brief Fire CState change. | |
879 | + LIB3270_INTERNAL int lib3270_set_cstate(H3270 *hSession, LIB3270_CSTATE cstate); | |
880 | + | |
881 | + /// @brief Notify actions. | |
882 | + LIB3270_INTERNAL void lib3270_notify_actions(H3270 *hSession, LIB3270_ACTION_GROUP group); | ... | ... |
src/include/lib3270-internals.h
... | ... | @@ -1,888 +0,0 @@ |
1 | -/* | |
2 | - * "Software G3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | - * | |
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | - * | |
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | - * os termos da GPL v.2 - Licença Pública Geral ', conforme publicado pela | |
10 | - * Free Software Foundation. | |
11 | - * | |
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | - * obter mais detalhes. | |
16 | - * | |
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | - * | |
21 | - * Este programa está nomeado como private.h e possui - linhas de código. | |
22 | - * | |
23 | - * Contatos: | |
24 | - * | |
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) | |
27 | - * | |
28 | - */ | |
29 | - | |
30 | -#ifdef WIN32 | |
31 | - #include <winsock2.h> | |
32 | - #include <windows.h> | |
33 | -#endif // WIN32 | |
34 | - | |
35 | -#include <config.h> /* autoconf settings */ | |
36 | -#include <lib3270.h> /* lib3270 API calls and defs */ | |
37 | -#include <linkedlist.h> | |
38 | -#include <lib3270/charset.h> | |
39 | -#include <lib3270/session.h> | |
40 | -// #include "api.h" | |
41 | - | |
42 | -#if defined(HAVE_LIBSSL) | |
43 | - #include <openssl/ssl.h> | |
44 | - #include <openssl/x509v3.h> | |
45 | - | |
46 | -#endif // HAVE_LIBSSL | |
47 | - | |
48 | -#if defined(X3270_TN3270E) && !defined(X3270_ANSI) /*[*/ | |
49 | - #define X3270_ANSI 1 /* RFC2355 requires NVT mode */ | |
50 | -#endif /*]*/ | |
51 | - | |
52 | -#if defined(HAVE_VASPRINTF) && !defined(_GNU_SOURCE) /*[*/ | |
53 | - #define _GNU_SOURCE /* vasprintf isn't POSIX */ | |
54 | -#endif /*]*/ | |
55 | - | |
56 | -/* | |
57 | - * gettext stuff | |
58 | - */ | |
59 | -#ifdef ANDROID | |
60 | - #undef HAVE_LIBINTL | |
61 | - #undef HAVE_LIBSSL | |
62 | -#endif | |
63 | - | |
64 | -#ifdef HAVE_LIBINTL | |
65 | - #include <libintl.h> | |
66 | - #define _( x ) gettext(x) | |
67 | - #define N_( x ) x | |
68 | -#else | |
69 | - #define _( x ) x | |
70 | - #define N_( x ) x | |
71 | -#endif // HAVE_LIBINTL | |
72 | - | |
73 | -#define action_name(x) #x | |
74 | - | |
75 | -/* | |
76 | - * OS-specific #defines. Except for the blocking-connect workarounds, these | |
77 | - * should be replaced with autoconf probes as soon as possible. | |
78 | - */ | |
79 | - | |
80 | -/* | |
81 | - * BLOCKING_CONNECT_ONLY | |
82 | - * Use only blocking sockets. | |
83 | - */ | |
84 | -#if defined(sco) /*[*/ | |
85 | - #define BLOCKING_CONNECT_ONLY 1 | |
86 | -#endif /*]*/ | |
87 | - | |
88 | -#if defined(apollo) /*[*/ | |
89 | - #define BLOCKING_CONNECT_ONLY 1 | |
90 | -#endif /*]*/ | |
91 | - | |
92 | -// | |
93 | -// Compiler-specific #defines. | |
94 | -// | |
95 | -// Reference: GLIBC gmacros.h | |
96 | -// | |
97 | -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) | |
98 | - | |
99 | - #define GNUC_UNUSED \ | |
100 | - __attribute__((__unused__)) | |
101 | - | |
102 | -#else | |
103 | - | |
104 | - #define unused | |
105 | - #define GNUC_UNUSED | |
106 | - #define printflike(s, f) | |
107 | - | |
108 | -#endif | |
109 | - | |
110 | -#if defined(_WIN32) || defined(_MSC_VER) | |
111 | - | |
112 | - #include <winsock2.h> | |
113 | - #include <windows.h> | |
114 | - | |
115 | -#else | |
116 | - | |
117 | - #include <unistd.h> /* Unix system calls */ | |
118 | - #include <sys/time.h> /* System time-related data types */ | |
119 | - | |
120 | -#endif // _WIN32 | |
121 | - | |
122 | -/* | |
123 | - * Prerequisite #includes. | |
124 | - */ | |
125 | -#include <stdio.h> /* Unix standard I/O library */ | |
126 | -#include <ctype.h> /* Character classes */ | |
127 | -#include <string.h> /* String manipulations */ | |
128 | -#include <sys/types.h> /* Basic system data types */ | |
129 | -#include <time.h> /* C library time functions */ | |
130 | -#include "localdefs.h" /* {s,tcl,c}3270-specific defines */ | |
131 | - | |
132 | -/* | |
133 | - * Cancel out contradictory parts. | |
134 | - */ | |
135 | -#if !defined(X3270_DISPLAY) /*[*/ | |
136 | - #undef X3270_KEYPAD | |
137 | - #undef X3270_MENUS | |
138 | -#endif /*]*/ | |
139 | - | |
140 | -#define RECONNECT_MS 2000 /**< @brief 2 sec before reconnecting to host. */ | |
141 | -#define RECONNECT_ERR_MS 5000 /**< @brief 5 sec before reconnecting to host when failed */ | |
142 | - | |
143 | -/** | |
144 | - * @brief types of internal actions | |
145 | - */ | |
146 | -enum iaction { | |
147 | - IA_STRING, IA_PASTE, IA_REDRAW, | |
148 | - IA_KEYPAD, IA_DEFAULT, IA_KEY, | |
149 | - IA_MACRO, IA_SCRIPT, IA_PEEK, | |
150 | - IA_TYPEAHEAD, IA_FT, IA_COMMAND, IA_KEYMAP, | |
151 | - IA_IDLE | |
152 | -}; | |
153 | - | |
154 | -// Version strings | |
155 | -LIB3270_INTERNAL const char * build; | |
156 | -LIB3270_INTERNAL const char * app_defaults_version; | |
157 | -LIB3270_INTERNAL const char * sccsid; | |
158 | -LIB3270_INTERNAL const char * build_rpq_timestamp; | |
159 | -LIB3270_INTERNAL const char * build_rpq_version; | |
160 | -LIB3270_INTERNAL const char * build_rpq_revision; | |
161 | - | |
162 | -#if defined(X3270_DBCS) /*[*/ | |
163 | - LIB3270_INTERNAL Boolean dbcs; | |
164 | -#endif /*]*/ | |
165 | - | |
166 | - | |
167 | -/** | |
168 | - * @brief toggle names | |
169 | - */ /* | |
170 | -struct toggle_name { | |
171 | - const char *name; | |
172 | - int index; | |
173 | -}; */ | |
174 | - | |
175 | -/// @brief State macros | |
176 | -#define PCONNECTED lib3270_pconnected(hSession) | |
177 | -#define HALF_CONNECTED lib3270_half_connected(hSession) | |
178 | -#define CONNECTED lib3270_is_connected(hSession) | |
179 | - | |
180 | -#define IN_NEITHER lib3270_in_neither(hSession) | |
181 | -#define IN_ANSI lib3270_in_ansi(hSession) | |
182 | -#define IN_3270 lib3270_in_3270(hSession) | |
183 | -#define IN_SSCP lib3270_in_sscp(hSession) | |
184 | -#define IN_TN3270E lib3270_in_tn3270e(hSession) | |
185 | -#define IN_E lib3270_in_e(hSession) | |
186 | - | |
187 | -/// @brief Naming convention for private actions. | |
188 | -#define PA_PFX "PA-" | |
189 | - | |
190 | -#define GR_BLINK 0x01 | |
191 | -#define GR_REVERSE 0x02 | |
192 | -#define GR_UNDERLINE 0x04 | |
193 | -#define GR_INTENSIFY 0x08 | |
194 | - | |
195 | -#define CS_MASK 0x03 ///< @brief mask for specific character sets */ | |
196 | -#define CS_BASE 0x00 ///< @brief base character set (X'00') */ | |
197 | -#define CS_APL 0x01 ///< @brief APL character set (X'01' or GE) */ | |
198 | -#define CS_LINEDRAW 0x02 ///< @brief DEC line-drawing character set (ANSI) */ | |
199 | -#define CS_DBCS 0x03 ///< @brief DBCS character set (X'F8') */ | |
200 | -#define CS_GE 0x04 ///< @brief cs flag for Graphic Escape */ | |
201 | - | |
202 | -/// @brief Shorthand macros | |
203 | -#define CN ((char *) NULL) | |
204 | -#define PN ((XtPointer) NULL) | |
205 | -#define Replace(var, value) { lib3270_free(var); var = (value); }; | |
206 | - | |
207 | -/// @brief Configuration change masks. | |
208 | -//#define NO_CHANGE 0x0000 /// @brief no change | |
209 | -// #define MODEL_CHANGE 0x0001 /// @brief screen dimensions changed | |
210 | -//#define FONT_CHANGE 0x0002 /// @brief emulator font changed | |
211 | -//#define COLOR_CHANGE 0x0004 /// @brief color scheme or 3278/9 mode changed | |
212 | -//#define SCROLL_CHANGE 0x0008 /// @brief scrollbar snapped on or off | |
213 | -//#define CHARSET_CHANGE 0x0010 /// @brief character set changed | |
214 | -// #define ALL_CHANGE 0xffff /// @brief everything changed | |
215 | - | |
216 | -/* Portability macros */ | |
217 | - | |
218 | -/* Equivalent of setlinebuf */ | |
219 | - | |
220 | -#if defined(_IOLBF) /*[*/ | |
221 | - #define SETLINEBUF(s) setvbuf(s, (char *)NULL, _IOLBF, BUFSIZ) | |
222 | -#else /*][*/ | |
223 | - #define SETLINEBUF(s) setlinebuf(s) | |
224 | -#endif /*]*/ | |
225 | - | |
226 | -/* Motorola version of gettimeofday */ | |
227 | - | |
228 | -#if defined(MOTOROLA) | |
229 | - #define gettimeofday(tp,tz) gettimeofday(tp) | |
230 | -#endif | |
231 | - | |
232 | -/* Default DFT file transfer buffer size. */ | |
233 | -#if defined(X3270_FT) && !defined(DFT_BUF) /*[*/ | |
234 | - #define DFT_BUF (4 * 1024) | |
235 | -#endif /*]*/ | |
236 | - | |
237 | -/* DBCS Preedit Types */ /* | |
238 | -#if defined(X3270_DBCS) | |
239 | - #define PT_ROOT "Root" | |
240 | - #define PT_OVER_THE_SPOT "OverTheSpot" | |
241 | - #define PT_OFF_THE_SPOT "OffTheSpot" | |
242 | - #define PT_ON_THE_SPOT "OnTheSpot" | |
243 | -#endif */ | |
244 | - | |
245 | -/** | |
246 | - * @brief input key type | |
247 | - */ | |
248 | -enum keytype | |
249 | -{ | |
250 | - KT_STD, | |
251 | - KT_GE | |
252 | -}; | |
253 | - | |
254 | -LIB3270_INTERNAL struct _ansictl | |
255 | -{ | |
256 | - char vintr; | |
257 | - char vquit; | |
258 | - char verase; | |
259 | - char vkill; | |
260 | - char veof; | |
261 | - char vwerase; | |
262 | - char vrprnt; | |
263 | - char vlnext; | |
264 | -} ansictl; | |
265 | - | |
266 | -/** | |
267 | - * @brief Extended attributes | |
268 | - */ | |
269 | -struct lib3270_ea | |
270 | -{ | |
271 | - unsigned char cc; ///< @brief EBCDIC or ASCII character code | |
272 | - unsigned char fa; ///< @brief field attribute, it nonzero | |
273 | - unsigned char fg; ///< @brief foreground color (0x00 or 0xf<n>) | |
274 | - unsigned char bg; ///< @brief background color (0x00 or 0xf<n>) | |
275 | - unsigned char gr; ///< @brief ANSI graphics rendition bits | |
276 | - unsigned char cs; ///< @brief character set (GE flag, or 0..2) | |
277 | - unsigned char ic; ///< @brief input control (DBCS) | |
278 | - unsigned char db; ///< @brief DBCS state | |
279 | -}; | |
280 | - | |
281 | -struct lib3270_text | |
282 | -{ | |
283 | - unsigned char chr; ///< @brief ASCII character code | |
284 | - unsigned short attr; ///< @brief Converted character attribute (color & etc) | |
285 | -}; | |
286 | - | |
287 | -#ifndef LIB3270_TA | |
288 | - #define LIB3270_TA void | |
289 | -#endif // !LIB3270_TA | |
290 | - | |
291 | -#define LIB3270_MB_MAX 16 | |
292 | - | |
293 | -#define LIB3270_FULL_MODEL_NAME_LENGTH 13 | |
294 | -#define LIB3270_LU_MAX 32 | |
295 | - | |
296 | -#define LIB3270_TELNET_N_OPTS 256 | |
297 | - | |
298 | -/** | |
299 | - * | |
300 | - * @brief Timeout control structure. | |
301 | - * | |
302 | - */ | |
303 | -typedef struct timeout | |
304 | -{ | |
305 | - LIB3270_LINKED_LIST_HEAD | |
306 | - | |
307 | - unsigned char in_play; | |
308 | - | |
309 | -#if defined(_WIN32) /*[*/ | |
310 | - unsigned long long ts; | |
311 | -#else /*][*/ | |
312 | - struct timeval tv; | |
313 | -#endif /*]*/ | |
314 | - | |
315 | - int (*proc)(H3270 *session); | |
316 | - | |
317 | -} timeout_t; | |
318 | - | |
319 | - | |
320 | -/** | |
321 | - * | |
322 | - * @brief I/O events. | |
323 | - * | |
324 | - */ | |
325 | -typedef struct _input_t | |
326 | -{ | |
327 | - LIB3270_LINKED_LIST_HEAD | |
328 | - | |
329 | - unsigned char enabled; | |
330 | - int fd; | |
331 | - LIB3270_IO_FLAG flag; | |
332 | - | |
333 | - void (*call)(H3270 *, int, LIB3270_IO_FLAG, void *); | |
334 | - | |
335 | -} input_t; | |
336 | - | |
337 | -struct lib3270_state_callback | |
338 | -{ | |
339 | - LIB3270_LINKED_LIST_HEAD | |
340 | - | |
341 | - void (*func)(H3270 *, int, void *); /**< @brief Function to call */ | |
342 | -}; | |
343 | - | |
344 | -struct lib3270_toggle_callback | |
345 | -{ | |
346 | - LIB3270_LINKED_LIST_HEAD | |
347 | - | |
348 | - void (*func)(H3270 *, LIB3270_TOGGLE_ID, char, void *); /**< @brief Function to call */ | |
349 | -}; | |
350 | - | |
351 | -/** | |
352 | - * | |
353 | - * @brief lib3270 session data | |
354 | - * | |
355 | - */ | |
356 | -struct _h3270 | |
357 | -{ | |
358 | - struct lib3270_session_callbacks cbk; ///< @brief Callback table - Always the first one. | |
359 | - | |
360 | - // Session info | |
361 | - char id; ///< @brief Session Identifier. | |
362 | - | |
363 | - // Connection info | |
364 | - int sock; ///< @brief Network socket. | |
365 | - LIB3270_CSTATE cstate; ///< @brief Connection state. | |
366 | - | |
367 | - // flags | |
368 | - LIB3270_HOST_TYPE host_type; ///< @brief Host type. | |
369 | - | |
370 | - int selected : 1; ///< @brief Has selected region? | |
371 | - int rectsel : 1; ///< @brief Selected region is a rectangle ? | |
372 | - int vcontrol : 1; ///< @brief Visible control ? | |
373 | - int modified_sel : 1; | |
374 | - int mono : 1; ///< @brief Forces monochrome display | |
375 | - int m3279 : 1; | |
376 | - int extended : 1; ///< @brief Extended data stream. | |
377 | - int typeahead : 1; | |
378 | - int numeric_lock : 1; | |
379 | - int oerr_lock : 1; ///< @brief If true, operator errors will lock the keyboard. | |
380 | - int unlock_delay : 1; ///< @brief If true the unlock delay feature is enabled. @see lib3270_set_unlock_delay | |
381 | - int auto_reconnect_inprogress : 1; | |
382 | - unsigned int colors : 5; | |
383 | - int apl_mode : 1; ///< @brief If true enables APL mode. | |
384 | - int icrnl : 1; | |
385 | - int inlcr : 1; | |
386 | - int onlcr : 1; | |
387 | - int bsd_tm : 1; | |
388 | - int syncing : 1; | |
389 | - int reverse : 1; /**< @brief reverse-input mode */ | |
390 | - int dbcs : 1; | |
391 | - int linemode : 1; | |
392 | - int trace_skipping : 1; | |
393 | - int need_tls_follows : 1; | |
394 | - int cut_xfer_in_progress : 1; | |
395 | -// int auto_keymap : 1; | |
396 | - int formatted : 1; /**< @brief Formatted screen flag */ | |
397 | - int starting : 1; /**< @brief Is starting (no first screen)? */ | |
398 | - | |
399 | - struct lib3270_toggle | |
400 | - { | |
401 | - char value; /**< toggle value */ | |
402 | - void (*upcall)(H3270 *, struct lib3270_toggle *, LIB3270_TOGGLE_TYPE); /**< change value */ | |
403 | - } toggle[LIB3270_TOGGLE_COUNT]; | |
404 | - | |
405 | - // Network & Termtype | |
406 | - char * connected_type; | |
407 | - char full_model_name[LIB3270_FULL_MODEL_NAME_LENGTH+1]; | |
408 | - char * model_name; | |
409 | - unsigned int model_num; | |
410 | - char * termtype; | |
411 | - | |
412 | - struct | |
413 | - { | |
414 | - char * url; /**< The host URL, for use in reconnecting */ | |
415 | - char * current; /**< The hostname part, stripped of qualifiers, luname and port number */ | |
416 | - char * srvc; /**< The service name */ | |
417 | - char * qualified; | |
418 | - } host; | |
419 | - | |
420 | - char * termname; | |
421 | - | |
422 | - struct lib3270_charset charset; | |
423 | - | |
424 | - struct | |
425 | - { | |
426 | - LIB3270_MESSAGE status; | |
427 | - unsigned char flag[LIB3270_FLAG_COUNT]; | |
428 | - } oia; | |
429 | - | |
430 | - unsigned short current_port; | |
431 | - | |
432 | - // Misc | |
433 | - H3270FT * ft; /**< @brief Active file transfer data */ | |
434 | - | |
435 | - // screen info | |
436 | - | |
437 | - // Oversize. | |
438 | - struct | |
439 | - { | |
440 | - char * str; | |
441 | - unsigned int rows; | |
442 | - unsigned int cols; | |
443 | - } oversize; | |
444 | - | |
445 | - // Maximum screen size. | |
446 | - struct | |
447 | - { | |
448 | - unsigned int rows; | |
449 | - unsigned int cols; | |
450 | - } max; | |
451 | - | |
452 | - // View size | |
453 | - struct { | |
454 | - unsigned int rows; | |
455 | - unsigned int cols; | |
456 | - } view; | |
457 | - | |
458 | - LIB3270_POINTER pointer; /**< @brief Current pointer. */ | |
459 | - int cursor_addr; | |
460 | - int buffer_addr; | |
461 | - char flipped; | |
462 | - int screen_alt; /**< @brief alternate screen? */ | |
463 | - int is_altbuffer; | |
464 | - | |
465 | - // Screen contents | |
466 | - void * buffer[2]; /**< @brief Internal buffers */ | |
467 | - struct lib3270_ea * ea_buf; /**< @brief 3270 device buffer. ea_buf[-1] is the dummy default field attribute */ | |
468 | - struct lib3270_ea * aea_buf; /**< @brief alternate 3270 extended attribute buffer */ | |
469 | - struct lib3270_text * text; /**< @brief Converted 3270 chars */ | |
470 | - | |
471 | - // host.c | |
472 | - char std_ds_host; | |
473 | - char no_login_host; | |
474 | - char non_tn3270e_host; | |
475 | - char passthru_host; | |
476 | - char ever_3270; | |
477 | - | |
478 | - // ctlr.c | |
479 | - int sscp_start; | |
480 | - unsigned char default_fg; | |
481 | - unsigned char default_bg; | |
482 | - unsigned char default_gr; | |
483 | - unsigned char default_cs; | |
484 | - unsigned char default_ic; | |
485 | - char reply_mode; | |
486 | - int trace_primed : 1; | |
487 | - int ticking : 1; | |
488 | - int mticking : 1; | |
489 | - int crm_nattr; | |
490 | - unsigned char crm_attr[16]; | |
491 | - unsigned char * zero_buf; /**< @brief Empty buffer, for area clears */ | |
492 | - | |
493 | - struct timeval t_start; | |
494 | - void * tick_id; | |
495 | - struct timeval t_want; | |
496 | - | |
497 | - // Telnet.c | |
498 | - unsigned char * ibuf; | |
499 | - int ibuf_size; /**< @brief size of ibuf */ | |
500 | - time_t ns_time; | |
501 | - int ns_brcvd; | |
502 | - int ns_rrcvd; | |
503 | - int ns_bsent; | |
504 | - int ns_rsent; | |
505 | - struct timeval ds_ts; | |
506 | - unsigned short e_xmit_seq; /**< @brief transmit sequence number */ | |
507 | - int response_required; | |
508 | - int ansi_data; | |
509 | - int lnext; | |
510 | - int backslashed; | |
511 | - char plu_name[LIB3270_BIND_PLU_NAME_MAX+1]; | |
512 | - | |
513 | - /* | |
514 | - /// @brief Proxy | |
515 | - struct | |
516 | - { | |
517 | - char * proxy; ///< Proxy server (type:host[:port]) | |
518 | - int type; | |
519 | - char * host; | |
520 | - char * portname; | |
521 | - unsigned short port; | |
522 | - } proxy; | |
523 | - */ | |
524 | - | |
525 | - /// @brief LU | |
526 | - char **curr_lu; | |
527 | - char * try_lu; | |
528 | - char **lus; ///< @brief Array with the LU names to try. | |
529 | - struct | |
530 | - { | |
531 | - char reported[LIB3270_LU_MAX+1]; | |
532 | - char * connected; | |
533 | - char name[LIB3270_LUNAME_LENGTH+1]; | |
534 | - | |
535 | - } lu; | |
536 | - | |
537 | - char reported_type[LIB3270_LU_MAX+1]; | |
538 | - | |
539 | - // TN3270e | |
540 | - enum | |
541 | - { | |
542 | - E_NONE, | |
543 | - E_3270, | |
544 | - E_NVT, | |
545 | - E_SSCP | |
546 | - } tn3270e_submode; | |
547 | - | |
548 | - unsigned long e_funcs; /**< @brief negotiated TN3270E functions */ | |
549 | - int tn3270e_bound; | |
550 | - int tn3270e_negotiated; | |
551 | - | |
552 | - // Line mode | |
553 | - unsigned char * lbuf; /**< @brief line-mode input buffer */ | |
554 | - unsigned char * lbptr; | |
555 | - | |
556 | - // 3270 input buffer | |
557 | - unsigned char * ibptr; | |
558 | - | |
559 | - // Output buffer. | |
560 | - struct | |
561 | - { | |
562 | - unsigned char * buf; ///< @brief 3270 output buffer */ | |
563 | - unsigned char * base; | |
564 | - int length; ///< @brief Length of the output buffer. | |
565 | - unsigned char * ptr; | |
566 | - } output; | |
567 | - | |
568 | - // network input buffer | |
569 | - unsigned char * sbbuf; | |
570 | - | |
571 | - // telnet sub-option buffer | |
572 | - unsigned char * sbptr; | |
573 | - unsigned char telnet_state; | |
574 | - | |
575 | - unsigned char myopts[LIB3270_TELNET_N_OPTS]; | |
576 | - unsigned char hisopts[LIB3270_TELNET_N_OPTS]; | |
577 | - | |
578 | - // kybd.c | |
579 | - unsigned int kybdlock; ///< @brief @brief keyboard lock state. | |
580 | - unsigned char aid; ///< @brief @brief current attention ID. | |
581 | - void * unlock_id; | |
582 | - time_t unlock_delay_time; | |
583 | - unsigned long unlock_delay_ms; ///< @brief Delay before actually unlocking the keyboard after the host permits it. | |
584 | - LIB3270_TA * ta_head; | |
585 | - LIB3270_TA * ta_tail; | |
586 | - | |
587 | - // ft_dft.c | |
588 | - int dft_buffersize; ///< @brief Buffer size (LIMIN, LIMOUT) | |
589 | - | |
590 | - // rpq.c | |
591 | - int rpq_complained : 1; | |
592 | -#if !defined(_WIN32) | |
593 | - int omit_due_space_limit : 1; | |
594 | -#endif | |
595 | - | |
596 | - char * rpq_warnbuf; | |
597 | - int rpq_wbcnt; | |
598 | - | |
599 | - // User data (Usually points to session's widget) | |
600 | - void * user_data; | |
601 | - | |
602 | - // selection | |
603 | - char * paste_buffer; | |
604 | - struct | |
605 | - { | |
606 | - int start; | |
607 | - int end; | |
608 | - } select; | |
609 | - | |
610 | - // ansi.c | |
611 | - int scroll_top; | |
612 | - int scroll_bottom; | |
613 | - int once_cset; | |
614 | - int saved_cursor; | |
615 | - | |
616 | - int held_wrap : 1; | |
617 | - | |
618 | - int insert_mode : 1; | |
619 | - int auto_newline_mode : 1; | |
620 | - | |
621 | - int appl_cursor : 1; | |
622 | - int saved_appl_cursor : 1; | |
623 | - | |
624 | - int wraparound_mode : 1; | |
625 | - int saved_wraparound_mode : 1; | |
626 | - | |
627 | - int rev_wraparound_mode : 1; | |
628 | - int saved_rev_wraparound_mode : 1; | |
629 | - | |
630 | - int allow_wide_mode : 1; | |
631 | - int saved_allow_wide_mode : 1; | |
632 | - | |
633 | - int wide_mode : 1; | |
634 | - int saved_wide_mode : 1; | |
635 | - | |
636 | - int saved_altbuffer : 1; | |
637 | - int ansi_reset : 1; /**< @brief Non zero if the ansi_reset() was called in this session */ | |
638 | - | |
639 | - int ansi_ch; | |
640 | - int cs_to_change; | |
641 | - | |
642 | - /** @brief ANSI Character sets. */ | |
643 | - enum lib3270_ansi_cs | |
644 | - { | |
645 | - LIB3270_ANSI_CS_G0 = 0, | |
646 | - LIB3270_ANSI_CS_G1 = 1, | |
647 | - LIB3270_ANSI_CS_G2 = 2, | |
648 | - LIB3270_ANSI_CS_G3 = 3 | |
649 | - } cset; | |
650 | - enum lib3270_ansi_cs saved_cset; | |
651 | - | |
652 | - /** @brief Character set designations. */ | |
653 | - enum lib3270_ansi_csd | |
654 | - { | |
655 | - LIB3270_ANSI_CSD_LD = 0, | |
656 | - LIB3270_ANSI_CSD_UK = 1, | |
657 | - LIB3270_ANSI_CSD_US = 2 | |
658 | - } csd[4]; | |
659 | - enum lib3270_ansi_csd saved_csd[4]; | |
660 | - | |
661 | - enum lib3270_ansi_state | |
662 | - { | |
663 | - LIB3270_ANSI_STATE_DATA = 0, | |
664 | - LIB3270_ANSI_STATE_ESC = 1, | |
665 | - LIB3270_ANSI_STATE_CSDES = 2, | |
666 | - LIB3270_ANSI_STATE_N1 = 3, | |
667 | - LIB3270_ANSI_STATE_DECP = 4, | |
668 | - LIB3270_ANSI_STATE_TEXT = 5, | |
669 | - LIB3270_ANSI_STATE_TEXT2 = 6, | |
670 | - LIB3270_ANSI_STATE_MBPEND = 7 | |
671 | - } state; | |
672 | - | |
673 | - unsigned char * tabs; | |
674 | - | |
675 | - int pmi; | |
676 | - char pending_mbs[LIB3270_MB_MAX]; | |
677 | - | |
678 | - unsigned char gr; | |
679 | - unsigned char saved_gr; | |
680 | - | |
681 | - unsigned char fg; | |
682 | - unsigned char saved_fg; | |
683 | - | |
684 | - unsigned char bg; | |
685 | - unsigned char saved_bg; | |
686 | - | |
687 | - // xio | |
688 | - struct { | |
689 | - void * read; | |
690 | - void * write; | |
691 | - void * except; | |
692 | - } xio; | |
693 | - | |
694 | - size_t popups; ///< @brief Count open popups. | |
695 | - | |
696 | -#ifdef HAVE_LIBSSL | |
697 | - /// @brief SSL Data. | |
698 | - struct | |
699 | - { | |
700 | - char enabled; | |
701 | - char host; | |
702 | - LIB3270_SSL_STATE state; | |
703 | - unsigned long error; | |
704 | -#ifdef SSL_ENABLE_CRL_CHECK | |
705 | - struct | |
706 | - { | |
707 | - char * prefer; ///< @brief Prefered protocol for CRL. | |
708 | - char * url; ///< @brief URL for CRL download. | |
709 | - X509_CRL * cert; ///< @brief Loaded CRL (can be null). | |
710 | - } crl; | |
711 | -#endif // SSL_ENABLE_CRL_CHECK | |
712 | - SSL * con; | |
713 | - } ssl; | |
714 | -#endif // HAVE_LIBSSL | |
715 | - | |
716 | - struct lib3270_linked_list_head timeouts; | |
717 | - | |
718 | - struct | |
719 | - { | |
720 | - struct lib3270_linked_list_head list; | |
721 | - int changed : 1; | |
722 | - } input; | |
723 | - | |
724 | - // Trace methods. | |
725 | - struct | |
726 | - { | |
727 | - void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args); | |
728 | - void *userdata; | |
729 | - } trace; | |
730 | - | |
731 | - /// @brief Event Listeners. | |
732 | - struct | |
733 | - { | |
734 | - /// @brief State listeners. | |
735 | - struct lib3270_linked_list_head state[LIB3270_STATE_USER]; | |
736 | - | |
737 | - /// @brief Toggle listeners. | |
738 | - struct lib3270_linked_list_head toggle[LIB3270_TOGGLE_COUNT]; | |
739 | - | |
740 | - } listeners; | |
741 | - | |
742 | - | |
743 | -}; | |
744 | - | |
745 | -#define SELECTION_LEFT 0x01 | |
746 | -#define SELECTION_TOP 0x02 | |
747 | -#define SELECTION_RIGHT 0x04 | |
748 | -#define SELECTION_BOTTOM 0x08 | |
749 | - | |
750 | -#define SELECTION_SINGLE_COL 0x10 | |
751 | -#define SELECTION_SINGLE_ROW 0x20 | |
752 | - | |
753 | -#define SELECTION_ACTIVE 0x80 | |
754 | - | |
755 | -#ifdef _WIN32 | |
756 | -/// @brief Windows Event Log Handler. | |
757 | -LIB3270_INTERNAL HANDLE hEventLog; | |
758 | -LIB3270_INTERNAL HANDLE hModule; | |
759 | -#endif // _WIN32 | |
760 | - | |
761 | -#ifdef HAVE_SYSLOG | |
762 | -/// @brief Windows Event Log Handler. | |
763 | -LIB3270_INTERNAL int use_syslog; | |
764 | -#endif // HAVE_SYSLOG | |
765 | - | |
766 | - | |
767 | -/* Library internal calls */ | |
768 | -LIB3270_INTERNAL int key_ACharacter(H3270 *hSession, unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped); | |
769 | -LIB3270_INTERNAL int cursor_move(H3270 *session, int baddr); | |
770 | - | |
771 | -LIB3270_INTERNAL void toggle_rectselect(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt); | |
772 | -LIB3270_INTERNAL void remove_input_calls(H3270 *session); | |
773 | - | |
774 | -LIB3270_INTERNAL int lib3270_sock_send(H3270 *hSession, unsigned const char *buf, int len); | |
775 | -LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession); | |
776 | - | |
777 | -LIB3270_INTERNAL int lib3270_default_event_dispatcher(H3270 *hSession, int block); | |
778 | - | |
779 | -LIB3270_INTERNAL void do_select(H3270 *h, unsigned int start, unsigned int end, unsigned int rect); | |
780 | - | |
781 | - | |
782 | -/** | |
783 | - * @brief Called from timer to attempt an automatic reconnection. | |
784 | - */ | |
785 | -LIB3270_INTERNAL int lib3270_check_for_auto_reconnect(H3270 *hSession); | |
786 | - | |
787 | -#if defined(DEBUG) | |
788 | - #define CHECK_SESSION_HANDLE(x) check_session_handle(&x,__FUNCTION__); | |
789 | - LIB3270_INTERNAL void check_session_handle(H3270 **hSession, const char *fname); | |
790 | -#else | |
791 | - #define CHECK_SESSION_HANDLE(x) check_session_handle(&x); | |
792 | - LIB3270_INTERNAL void check_session_handle(H3270 **hSession); | |
793 | -#endif // DEBUG | |
794 | - | |
795 | -LIB3270_INTERNAL int check_online_session(const H3270 *hSession); | |
796 | -LIB3270_INTERNAL int check_offline_session(const H3270 *hSession); | |
797 | - | |
798 | -/// @brief Returns -1 if the session is invalid or not online (sets errno). | |
799 | -#define FAIL_IF_NOT_ONLINE(x) if(check_online_session(x)) return errno; | |
800 | - | |
801 | -/// @brief Returns -1 if the session is invalid or online (sets errno). | |
802 | -#define FAIL_IF_ONLINE(x) if(check_offline_session(x)) return errno; | |
803 | - | |
804 | -LIB3270_INTERNAL int non_blocking(H3270 *session, Boolean on); | |
805 | - | |
806 | -#if defined(HAVE_LIBSSL) | |
807 | - | |
808 | - typedef struct _ssl_error_message | |
809 | - { | |
810 | - int error; | |
811 | - const char * title; | |
812 | - const char * text; | |
813 | - const char * description; | |
814 | -#ifdef _WIN32 | |
815 | - DWORD lasterror; | |
816 | -#endif // _WIN32 | |
817 | - } SSL_ERROR_MESSAGE; | |
818 | - | |
819 | - struct ssl_status_msg | |
820 | - { | |
821 | - long id; | |
822 | - LIB3270_NOTIFY icon; | |
823 | - const char * iconName; // Icon name from https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html | |
824 | - const char * message; | |
825 | - const char * description; | |
826 | - }; | |
827 | - | |
828 | - LIB3270_INTERNAL int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE *message); | |
829 | - LIB3270_INTERNAL int ssl_init(H3270 *session); | |
830 | - LIB3270_INTERNAL int ssl_negotiate(H3270 *hSession); | |
831 | - LIB3270_INTERNAL void set_ssl_state(H3270 *session, LIB3270_SSL_STATE state); | |
832 | - LIB3270_INTERNAL const struct ssl_status_msg * ssl_get_status_from_error_code(long id); | |
833 | - | |
834 | - | |
835 | - #if OPENSSL_VERSION_NUMBER >= 0x00907000L | |
836 | - #define INFO_CONST const | |
837 | - #else | |
838 | - #define INFO_CONST | |
839 | - #endif | |
840 | - | |
841 | - LIB3270_INTERNAL void ssl_info_callback(INFO_CONST SSL *s, int where, int ret); | |
842 | - | |
843 | - /** | |
844 | - * @brief Global SSL_CTX object as framework to establish TLS/SSL or DTLS enabled connections. | |
845 | - * | |
846 | - */ | |
847 | - LIB3270_INTERNAL SSL_CTX * ssl_ctx; | |
848 | - | |
849 | - /** | |
850 | - * @brief Index of h3270 handle in SSL session. | |
851 | - * | |
852 | - */ | |
853 | - LIB3270_INTERNAL int ssl_3270_ex_index; | |
854 | - | |
855 | - /** | |
856 | - * @brief Emit popup on ssl error. | |
857 | - * | |
858 | - */ | |
859 | - LIB3270_INTERNAL int popup_ssl_error(H3270 *session, int rc, const char *title, const char *summary, const char *body); | |
860 | - | |
861 | - /** | |
862 | - * @brief Emite popup on SSL error. | |
863 | - * | |
864 | - */ | |
865 | - LIB3270_INTERNAL int notify_ssl_error(H3270 *hSession, int rc, const SSL_ERROR_MESSAGE *message); | |
866 | - | |
867 | -#endif | |
868 | - | |
869 | - /// @brief Clear element at adress. | |
870 | - LIB3270_INTERNAL void clear_chr(H3270 *hSession, int baddr); | |
871 | - | |
872 | - LIB3270_INTERNAL unsigned char get_field_attribute(H3270 *session, int baddr); | |
873 | - | |
874 | - /// @brief Default log writer. | |
875 | - LIB3270_INTERNAL void default_log_writer(H3270 *session, const char *module, int rc, const char *fmt, va_list arg_ptr); | |
876 | - | |
877 | - LIB3270_INTERNAL char * lib3270_get_user_name(); | |
878 | - | |
879 | - /// @brief Query data from URL. | |
880 | - /// | |
881 | - /// @param hSession Handle of the TN3270 Session. | |
882 | - /// @param url The url to get. | |
883 | - /// @param length Pointer to the response lenght (can be NULL). | |
884 | - /// @param error_message Pointer to the error message. | |
885 | - /// | |
886 | - /// @return The data from URL (release it with lib3270_free) or NULL on error. | |
887 | - /// | |
888 | - LIB3270_INTERNAL char * lib3270_get_from_url(H3270 *hSession, const char *url, size_t *length, const char **error_message); |
src/include/lib3270.h
... | ... | @@ -1000,7 +1000,6 @@ |
1000 | 1000 | LIB3270_EXPORT int lib3270_in_e(const H3270 *h); |
1001 | 1001 | |
1002 | 1002 | LIB3270_EXPORT int lib3270_is_ready(const H3270 *h); |
1003 | - LIB3270_EXPORT int lib3270_is_connected(const H3270 *h); | |
1004 | 1003 | LIB3270_EXPORT int lib3270_is_secure(const H3270 *h); |
1005 | 1004 | |
1006 | 1005 | LIB3270_EXPORT LIB3270_MESSAGE lib3270_get_lock_status(const H3270 *h); | ... | ... |
src/include/lib3270/actions.h
... | ... | @@ -38,15 +38,28 @@ |
38 | 38 | LIB3270_ACTION_GROUP_NONE, ///< @brief Simple action, no signals os special treatment. |
39 | 39 | LIB3270_ACTION_GROUP_ONLINE, ///< @brief Action requires online state. |
40 | 40 | LIB3270_ACTION_GROUP_OFFLINE, ///< @brief Action requires offline state. |
41 | - LIB3270_ACTION_GROUP_SELECTION, ///< @brief Action requires an active selection. | |
41 | + LIB3270_ACTION_GROUP_SELECTED, ///< @brief Action requires an active selection. | |
42 | 42 | LIB3270_ACTION_GROUP_UNSELECTED, ///< @brief Action fails if there has a selection. |
43 | + | |
44 | + LIB3270_ACTION_GROUP_CUSTOM ///< @brief Custom group/Number of groups. | |
43 | 45 | } LIB3270_ACTION_GROUP; |
44 | 46 | |
47 | + typedef enum _lib3270_action_type | |
48 | + { | |
49 | + LIB3270_ACTION_TYPE_GENERIC, ///< @brief Generic action. | |
50 | + LIB3270_ACTION_TYPE_NAVIGATION, ///< @brief Cursor and field navigation. | |
51 | + LIB3270_ACTION_CONNECTION, ///< @brief Connection action. | |
52 | + LIB3270_ACTION_CLIPBOARD, ///< @brief Clipboard action. | |
53 | + | |
54 | + LIB3270_ACTION_CUSTOM ///< @brief Custom action/Number of actions. | |
55 | + } LIB3270_ACTION_TYPE; | |
56 | + | |
45 | 57 | typedef struct _lib3270_action |
46 | 58 | { |
47 | 59 | LIB3270_PROPERTY_HEAD |
48 | 60 | |
49 | 61 | LIB3270_ACTION_GROUP group; ///< @brief Action group. |
62 | + LIB3270_ACTION_TYPE type; ///< @brief Action type. | |
50 | 63 | |
51 | 64 | int (*activate)(H3270 *hSession); ///< @brief lib3270 associated method. |
52 | 65 | int (*activatable)(const H3270 *hSession); ///< @brief Is the action activatable? |
... | ... | @@ -57,6 +70,32 @@ |
57 | 70 | |
58 | 71 | } LIB3270_ACTION; |
59 | 72 | |
73 | + | |
74 | +/** | |
75 | + * @brief Register an action group listener. | |
76 | + * | |
77 | + * @param hSession TN3270 Session handle. | |
78 | + * @param group The group to listen. | |
79 | + * @param func Callback for group events. | |
80 | + * @param data Argument data for callback. | |
81 | + * | |
82 | + * @return Listener ID (for removal) or NULL if error. | |
83 | + * | |
84 | + */ | |
85 | + LIB3270_EXPORT const void * lib3270_register_action_group_listener(H3270 *hSession, LIB3270_ACTION_GROUP group, void (*func)(H3270 *, void *),void *data); | |
86 | + | |
87 | +/** | |
88 | + * @brief Unregister an action group listener. | |
89 | + * | |
90 | + * @param hSession TN3270 Session handle. | |
91 | + * @param group The group to listen. | |
92 | + * @param id ID of the listener to remove. | |
93 | + * | |
94 | + * @return 0 if ok, error code if not. | |
95 | + * | |
96 | + */ | |
97 | + LIB3270_EXPORT int lib3270_unregister_action_group_listener(H3270 *hSession, LIB3270_ACTION_GROUP group, const void *id); | |
98 | + | |
60 | 99 | /** |
61 | 100 | * |
62 | 101 | * @brief Call lib3270 action by name. | ... | ... |
src/mkfb/mkfb.c
... | ... | @@ -384,7 +384,7 @@ main(int argc, char *argv[]) |
384 | 384 | fprintf(t, "/* This file was created automatically from %s by mkfb. */\n\n", |
385 | 385 | filename); |
386 | 386 | if (cmode) { |
387 | - fprintf(t, "#include \"lib3270-internals.h\"\n"); | |
387 | + fprintf(t, "#include \"internals.h\"\n"); | |
388 | 388 | fprintf(t, "static unsigned char fsd[] = {\n"); |
389 | 389 | } else { |
390 | 390 | fprintf(t, "unsigned char common_fallbacks[] = {\n"); | ... | ... |
src/selection/actions.c
... | ... | @@ -27,7 +27,7 @@ |
27 | 27 | * |
28 | 28 | */ |
29 | 29 | |
30 | - #include <lib3270-internals.h> | |
30 | + #include <internals.h> | |
31 | 31 | #include <lib3270.h> |
32 | 32 | #include <lib3270/actions.h> |
33 | 33 | #include <lib3270/session.h> |
... | ... | @@ -63,6 +63,8 @@ LIB3270_EXPORT int lib3270_unselect(H3270 *hSession) |
63 | 63 | |
64 | 64 | hSession->cbk.set_selection(hSession,0); |
65 | 65 | hSession->cbk.update_selection(hSession,-1,-1); |
66 | + lib3270_notify_actions(hSession,LIB3270_ACTION_GROUP_UNSELECTED); | |
67 | + | |
66 | 68 | } |
67 | 69 | |
68 | 70 | return 0; | ... | ... |
src/selection/get.c
src/selection/selection.c
... | ... | @@ -27,7 +27,7 @@ |
27 | 27 | * |
28 | 28 | */ |
29 | 29 | |
30 | - #include <lib3270-internals.h> | |
30 | + #include <internals.h> | |
31 | 31 | #include <lib3270.h> |
32 | 32 | #include <lib3270/actions.h> |
33 | 33 | #include <lib3270/session.h> |
... | ... | @@ -165,37 +165,38 @@ void toggle_rectselect(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LI |
165 | 165 | update_selected_region(session); |
166 | 166 | } |
167 | 167 | |
168 | -void do_select(H3270 *h, unsigned int start, unsigned int end, unsigned int rect) | |
168 | +void do_select(H3270 *hSession, unsigned int start, unsigned int end, unsigned int rect) | |
169 | 169 | { |
170 | - if(end > (h->view.rows * h->view.cols)) | |
170 | + if(end > (hSession->view.rows * hSession->view.cols)) | |
171 | 171 | return; |
172 | 172 | |
173 | 173 | // Do we really need to change selection? |
174 | - if( ((int) start) == h->select.start && ((int) end) == h->select.end && h->selected) | |
174 | + if( ((int) start) == hSession->select.start && ((int) end) == hSession->select.end && hSession->selected) | |
175 | 175 | return; |
176 | 176 | |
177 | 177 | // Start address is inside the screen? |
178 | - h->select.start = start; | |
179 | - h->select.end = end; | |
178 | + hSession->select.start = start; | |
179 | + hSession->select.end = end; | |
180 | 180 | |
181 | 181 | if(rect) |
182 | 182 | { |
183 | - h->rectsel = 1; | |
184 | - update_selected_rectangle(h); | |
183 | + hSession->rectsel = 1; | |
184 | + update_selected_rectangle(hSession); | |
185 | 185 | } |
186 | 186 | else |
187 | 187 | { |
188 | - h->rectsel = 0; | |
189 | - update_selected_region(h); | |
188 | + hSession->rectsel = 0; | |
189 | + update_selected_region(hSession); | |
190 | 190 | } |
191 | 191 | |
192 | - if(!h->selected) | |
192 | + if(!hSession->selected) | |
193 | 193 | { |
194 | - h->selected = 1; | |
195 | - h->cbk.set_selection(h,1); | |
194 | + hSession->selected = 1; | |
195 | + hSession->cbk.set_selection(hSession,1); | |
196 | + lib3270_notify_actions(hSession,LIB3270_ACTION_GROUP_SELECTED); | |
196 | 197 | } |
197 | 198 | |
198 | - h->cbk.update_selection(h,start,end); | |
199 | + hSession->cbk.update_selection(hSession,start,end); | |
199 | 200 | |
200 | 201 | } |
201 | 202 | ... | ... |
src/ssl/crl.c
src/ssl/linux/init.c
src/ssl/linux/ldap.c
src/ssl/linux/private.h
src/ssl/negotiate.c
... | ... | @@ -34,7 +34,7 @@ |
34 | 34 | |
35 | 35 | |
36 | 36 | #include <config.h> |
37 | -#include <lib3270-internals.h> | |
37 | +#include <internals.h> | |
38 | 38 | |
39 | 39 | #if defined(HAVE_LIBSSL) |
40 | 40 | |
... | ... | @@ -150,7 +150,7 @@ static int background_ssl_negotiation(H3270 *hSession, void *message) |
150 | 150 | } |
151 | 151 | |
152 | 152 | /* Set up the TLS/SSL connection. */ |
153 | - if(SSL_set_fd(hSession->ssl.con, hSession->sock) != 1) | |
153 | + if(SSL_set_fd(hSession->ssl.con, hSession->connection.sock) != 1) | |
154 | 154 | { |
155 | 155 | trace_ssl(hSession,"%s","SSL_set_fd failed!\n"); |
156 | 156 | ... | ... |
src/ssl/notify.c
src/ssl/properties.c
src/ssl/state.c
src/ssl/windows/init.c
src/ssl/windows/private.h
src/testprogram/testprogram.c
... | ... | @@ -4,7 +4,7 @@ |
4 | 4 | #include <stdlib.h> |
5 | 5 | #include <getopt.h> |
6 | 6 | |
7 | -#include <lib3270-internals.h> | |
7 | +#include <internals.h> | |
8 | 8 | #include <lib3270.h> |
9 | 9 | #include <lib3270/actions.h> |
10 | 10 | #include <lib3270/trace.h> |
... | ... | @@ -24,6 +24,11 @@ static void write_trace(H3270 GNUC_UNUSED(*session), void GNUC_UNUSED(*userdata) |
24 | 24 | } |
25 | 25 | } |
26 | 26 | |
27 | +static void online_group_state_changed(H3270 GNUC_UNUSED(*hSession), void GNUC_UNUSED(*dunno)) | |
28 | +{ | |
29 | + printf("\n\n%s\n\n",__FUNCTION__); | |
30 | +} | |
31 | + | |
27 | 32 | int main(int argc, char *argv[]) |
28 | 33 | { |
29 | 34 | // #pragma GCC diagnostic push |
... | ... | @@ -102,6 +107,8 @@ int main(int argc, char *argv[]) |
102 | 107 | |
103 | 108 | printf("\nConnecting to %s\n",lib3270_get_url(h)); |
104 | 109 | |
110 | + const void * online_listener = lib3270_register_action_group_listener(h,LIB3270_ACTION_GROUP_ONLINE,online_group_state_changed,NULL); | |
111 | + | |
105 | 112 | rc = lib3270_reconnect(h,120); |
106 | 113 | printf("\n\nConnect exits with rc=%d (%s)\n\n",rc,strerror(rc)); |
107 | 114 | |
... | ... | @@ -139,6 +146,8 @@ int main(int argc, char *argv[]) |
139 | 146 | |
140 | 147 | } |
141 | 148 | |
149 | + lib3270_unregister_action_group_listener(h,LIB3270_ACTION_GROUP_ONLINE,online_listener); | |
150 | + | |
142 | 151 | lib3270_session_free(h); |
143 | 152 | |
144 | 153 | return 0; | ... | ... |