Commit cf6fe3dabf0b1d67a231e2ceb3a675af4513c127

Authored by Perry Werneck
1 parent d7c6dace

Creating standard chained list managers.

@@ -113,6 +113,9 @@ @@ -113,6 +113,9 @@
113 <Unit filename="src/core/keyboard/properties.c"> 113 <Unit filename="src/core/keyboard/properties.c">
114 <Option compilerVar="CC" /> 114 <Option compilerVar="CC" />
115 </Unit> 115 </Unit>
  116 + <Unit filename="src/core/linkelist.c">
  117 + <Option compilerVar="CC" />
  118 + </Unit>
116 <Unit filename="src/core/linux/connect.c"> 119 <Unit filename="src/core/linux/connect.c">
117 <Option compilerVar="CC" /> 120 <Option compilerVar="CC" />
118 </Unit> 121 </Unit>
@@ -248,6 +251,7 @@ @@ -248,6 +251,7 @@
248 <Unit filename="src/include/lib3270/session.h" /> 251 <Unit filename="src/include/lib3270/session.h" />
249 <Unit filename="src/include/lib3270/toggle.h" /> 252 <Unit filename="src/include/lib3270/toggle.h" />
250 <Unit filename="src/include/lib3270/trace.h" /> 253 <Unit filename="src/include/lib3270/trace.h" />
  254 + <Unit filename="src/include/linkedlist.h" />
251 <Unit filename="src/include/localdefs.h" /> 255 <Unit filename="src/include/localdefs.h" />
252 <Unit filename="src/include/popupsc.h" /> 256 <Unit filename="src/include/popupsc.h" />
253 <Unit filename="src/include/proxyc.h" /> 257 <Unit filename="src/include/proxyc.h" />
src/core/host.c
@@ -174,97 +174,11 @@ void lib3270_set_disconnected(H3270 *hSession) @@ -174,97 +174,11 @@ void lib3270_set_disconnected(H3270 *hSession)
174 } 174 }
175 175
176 /** 176 /**
177 - * @brief Register a function interested in a state change.  
178 - *  
179 - * @param hSession Session handle.  
180 - * @param tx State ID  
181 - * @param func Callback  
182 - * @param data Data  
183 - *  
184 - * @return State change identifier.  
185 - *  
186 - */  
187 -LIB3270_EXPORT const void * lib3270_register_schange(H3270 *hSession, LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data)  
188 -{  
189 - struct lib3270_state_callback *st;  
190 -  
191 - CHECK_SESSION_HANDLE(hSession);  
192 -  
193 - st = (struct lib3270_state_callback *) lib3270_malloc(sizeof(struct lib3270_state_callback));  
194 - st->func = func;  
195 - st->data = data;  
196 -  
197 - if (hSession->listeners.state.last[tx])  
198 - hSession->listeners.state.last[tx]->next = st;  
199 - else  
200 - hSession->listeners.state.callbacks[tx] = st;  
201 -  
202 - hSession->listeners.state.last[tx] = st;  
203 -  
204 - return (void *) st;  
205 -  
206 -}  
207 -  
208 -LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, const void * id)  
209 -{  
210 - struct lib3270_state_callback *st;  
211 - struct lib3270_state_callback *prev = (struct lib3270_state_callback *) NULL;  
212 -  
213 -#ifdef DEBUG  
214 - {  
215 - debug("Before remove of %p (last=%p):",id,hSession->listeners.state.last[tx]);  
216 -  
217 - for (st = hSession->listeners.state.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next)  
218 - {  
219 - debug("%p",st);  
220 - }  
221 - }  
222 -#endif // DEBUG  
223 -  
224 - for (st = hSession->listeners.state.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next)  
225 - {  
226 - if (st == (struct lib3270_state_callback *)id)  
227 - break;  
228 -  
229 - prev = st;  
230 - }  
231 -  
232 - if (st == (struct lib3270_state_callback *)NULL)  
233 - {  
234 - lib3270_write_log(hSession,"lib3270","Invalid call to (%s): %p wasnt found in the list",__FUNCTION__,id);  
235 - return errno = ENOENT;  
236 - }  
237 -  
238 - if (prev != (struct lib3270_state_callback *) NULL)  
239 - prev->next = st->next;  
240 - else  
241 - hSession->listeners.state.callbacks[tx] = (struct lib3270_state_callback *) st->next;  
242 -  
243 - for(st = hSession->listeners.state.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next)  
244 - hSession->listeners.state.last[tx] = st;  
245 -  
246 - lib3270_free((void *) id);  
247 -  
248 -#ifdef DEBUG  
249 - {  
250 - debug("After Remove of %p (last=%p):",id,hSession->listeners.state.last[tx]);  
251 -  
252 - for (st = hSession->listeners.state.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next)  
253 - {  
254 - debug("%p",st);  
255 - }  
256 - }  
257 -#endif // DEBUG  
258 -  
259 - return 0;  
260 -}  
261 -  
262 -  
263 -/**  
264 * @brief Signal a state change. 177 * @brief Signal a state change.
265 */ 178 */
266 void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) 179 void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode)
267 { 180 {
  181 + /*
268 #if defined(DEBUG) 182 #if defined(DEBUG)
269 static const char * state_name[LIB3270_STATE_USER] = 183 static const char * state_name[LIB3270_STATE_USER] =
270 { 184 {
@@ -280,7 +194,16 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) @@ -280,7 +194,16 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode)
280 "LIB3270_STATE_CHARSET" 194 "LIB3270_STATE_CHARSET"
281 }; 195 };
282 #endif // DEBUG 196 #endif // DEBUG
  197 + */
  198 +
  199 + struct lib3270_linked_list_node * node;
  200 +
  201 + for(node = h->listeners.state[tx].first; node; node = node->next)
  202 + {
  203 + ((struct lib3270_state_callback *) node)->func(h,mode,node->userdata);
  204 + }
283 205
  206 + /*
284 struct lib3270_state_callback *st; 207 struct lib3270_state_callback *st;
285 208
286 CHECK_SESSION_HANDLE(h); 209 CHECK_SESSION_HANDLE(h);
@@ -291,6 +214,7 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) @@ -291,6 +214,7 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode)
291 { 214 {
292 st->func(h,mode,st->data); 215 st->func(h,mode,st->data);
293 } 216 }
  217 + */
294 218
295 trace("%s ends",__FUNCTION__); 219 trace("%s ends",__FUNCTION__);
296 } 220 }
src/core/keyboard/properties.c
@@ -45,11 +45,22 @@ LIB3270_EXPORT int lib3270_set_lock_on_operator_error(H3270 *hSession, int enabl @@ -45,11 +45,22 @@ LIB3270_EXPORT int lib3270_set_lock_on_operator_error(H3270 *hSession, int enabl
45 return 0; 45 return 0;
46 } 46 }
47 47
  48 +LIB3270_EXPORT int lib3270_set_numeric_lock(H3270 *hSession, int enable)
  49 +{
  50 + hSession->numeric_lock = (enable ? 1 : 0);
  51 + return 0;
  52 +}
  53 +
48 int lib3270_get_lock_on_operator_error(const H3270 *hSession) 54 int lib3270_get_lock_on_operator_error(const H3270 *hSession)
49 { 55 {
50 return (int) hSession->oerr_lock; 56 return (int) hSession->oerr_lock;
51 } 57 }
52 58
  59 +int lib3270_get_numeric_lock(const H3270 *hSession)
  60 +{
  61 + return (int) hSession->numeric_lock;
  62 +}
  63 +
53 LIB3270_EXPORT int lib3270_set_unlock_delay(H3270 *hSession, unsigned int delay) 64 LIB3270_EXPORT int lib3270_set_unlock_delay(H3270 *hSession, unsigned int delay)
54 { 65 {
55 hSession->unlock_delay = (delay == 0 ? 0 : 1); 66 hSession->unlock_delay = (delay == 0 ? 0 : 1);
src/core/linkelist.c 0 → 100644
@@ -0,0 +1,139 @@ @@ -0,0 +1,139 @@
  1 +/*
  2 + * "Software pw3270, 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. 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 GNU, 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 linkedlist.c 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 Mendonça)
  27 + *
  28 + */
  29 +
  30 +
  31 +/**
  32 + * @brief Handle linked lists.
  33 + */
  34 +
  35 + #include <lib3270.h>
  36 + #include <lib3270/log.h>
  37 + #include <linkedlist.h>
  38 + #include <string.h>
  39 +
  40 +/*---[ Implement ]------------------------------------------------------------------------------------------------------------*/
  41 +
  42 +void * lib3270_linked_list_append_node(struct lib3270_linked_list_head *head, size_t szBlock, void *userdata)
  43 +{
  44 + struct lib3270_linked_list_node * node = lib3270_malloc(szBlock);
  45 +
  46 + memset(node,0,szBlock);
  47 + node->userdata = userdata;
  48 +
  49 + if(head->last)
  50 + {
  51 + head->last->next = node;
  52 + node->prev = head->last;
  53 + }
  54 + else
  55 + {
  56 + head->first = node;
  57 + }
  58 +
  59 + head->last = node;
  60 +
  61 +#ifdef DEBUG
  62 + {
  63 + struct lib3270_linked_list_node * dCurrent;
  64 +
  65 + debug("%s: head=%p first=%p last=%p", __FUNCTION__, head, head->first, head->last);
  66 +
  67 + for(dCurrent = head->first; dCurrent; dCurrent = dCurrent->next)
  68 + {
  69 + debug("node=%p prev=%p next=%p",dCurrent,dCurrent->prev,dCurrent->next);
  70 + }
  71 +
  72 + }
  73 +#endif // DEBUG
  74 +
  75 + return (void *) node;
  76 +
  77 +}
  78 +
  79 +int lib3270_linked_list_delete_node(struct lib3270_linked_list_head *head, const void *node)
  80 +{
  81 +
  82 + struct lib3270_linked_list_node * current;
  83 +
  84 + for(current = head->first;current;current = current->next)
  85 + {
  86 +
  87 + if(current == node)
  88 + {
  89 +
  90 + if(current->prev)
  91 + current->prev->next = current->next;
  92 + else
  93 + head->first = current->next;
  94 +
  95 + if(current->next)
  96 + current->next->prev = current->prev;
  97 + else
  98 + head->last = current->prev;
  99 +
  100 + lib3270_free(current);
  101 +
  102 +#ifdef DEBUG
  103 + {
  104 + struct lib3270_linked_list_node * dCurrent;
  105 +
  106 + debug("%s: head=%p first=%p last=%p", __FUNCTION__, head, head->first, head->last);
  107 +
  108 + for(dCurrent = head->first; dCurrent; dCurrent = dCurrent->next)
  109 + {
  110 + debug("node=%p prev=%p next=%p",dCurrent,dCurrent->prev,dCurrent->next);
  111 + }
  112 +
  113 + }
  114 +#endif // DEBUG
  115 +
  116 + return 0;
  117 +
  118 + }
  119 +
  120 + }
  121 +
  122 + return errno = ENOENT;
  123 +}
  124 +
  125 +void lib3270_linked_list_free(struct lib3270_linked_list_head *head)
  126 +{
  127 + struct lib3270_linked_list_node * node = head->first;
  128 +
  129 + while(node)
  130 + {
  131 + void * ptr = (void *) node;
  132 + node = node->next;
  133 + lib3270_free(ptr);
  134 + }
  135 +
  136 + head->first = head->last = NULL;
  137 +
  138 +}
  139 +
src/core/properties/boolean.c
@@ -163,6 +163,13 @@ @@ -163,6 +163,13 @@
163 }, 163 },
164 164
165 { 165 {
  166 + .name = "numericlock", // Property name.
  167 + .description = N_( "numeric lock" ), // Property description.
  168 + .get = lib3270_get_numeric_lock, // Get value.
  169 + .set = lib3270_set_numeric_lock // Set value.
  170 + },
  171 +
  172 + {
166 .name = NULL, 173 .name = NULL,
167 .description = NULL, 174 .description = NULL,
168 .get = NULL, 175 .get = NULL,
src/core/session.c
@@ -91,25 +91,12 @@ void lib3270_session_free(H3270 *h) @@ -91,25 +91,12 @@ void lib3270_session_free(H3270 *h)
91 91
92 // Release state change callbacks 92 // Release state change callbacks
93 for(f=0;f<LIB3270_STATE_USER;f++) 93 for(f=0;f<LIB3270_STATE_USER;f++)
94 - {  
95 - while(h->listeners.state.callbacks[f])  
96 - {  
97 - struct lib3270_state_callback *next = h->listeners.state.callbacks[f]->next;  
98 - lib3270_free(h->listeners.state.callbacks[f]);  
99 - h->listeners.state.callbacks[f] = next;  
100 - }  
101 - } 94 + lib3270_linked_list_free(&h->listeners.state[f]);
  95 +
102 96
103 // Release toggle change listeners. 97 // Release toggle change listeners.
104 for(f=0;f<LIB3270_TOGGLE_COUNT;f++) 98 for(f=0;f<LIB3270_TOGGLE_COUNT;f++)
105 - {  
106 - while(h->listeners.toggle.callbacks[f])  
107 - {  
108 - struct lib3270_toggle_callback *next = h->listeners.toggle.callbacks[f]->next;  
109 - lib3270_free(h->listeners.toggle.callbacks[f]);  
110 - h->listeners.toggle.callbacks[f] = next;  
111 - }  
112 - } 99 + lib3270_linked_list_free(&h->listeners.toggle[f]);
113 100
114 // Release memory 101 // Release memory
115 #define release_pointer(x) lib3270_free(x); x = NULL; 102 #define release_pointer(x) lib3270_free(x); x = NULL;
src/core/toggles/getset.c
@@ -57,18 +57,26 @@ LIB3270_EXPORT unsigned char lib3270_get_toggle(const H3270 *hSession, LIB3270_T @@ -57,18 +57,26 @@ LIB3270_EXPORT unsigned char lib3270_get_toggle(const H3270 *hSession, LIB3270_T
57 */ 57 */
58 static void toggle_notify(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_ID ix) 58 static void toggle_notify(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_ID ix)
59 { 59 {
60 - struct lib3270_toggle_callback * st;  
61 -  
62 trace("%s: ix=%d upcall=%p",__FUNCTION__,ix,t->upcall); 60 trace("%s: ix=%d upcall=%p",__FUNCTION__,ix,t->upcall);
  61 +
63 t->upcall(session, t, LIB3270_TOGGLE_TYPE_INTERACTIVE); 62 t->upcall(session, t, LIB3270_TOGGLE_TYPE_INTERACTIVE);
64 63
65 if(session->cbk.update_toggle) 64 if(session->cbk.update_toggle)
66 session->cbk.update_toggle(session,ix,t->value,LIB3270_TOGGLE_TYPE_INTERACTIVE,toggle_descriptor[ix].name); 65 session->cbk.update_toggle(session,ix,t->value,LIB3270_TOGGLE_TYPE_INTERACTIVE,toggle_descriptor[ix].name);
67 66
  67 + // Notify customers.
  68 + struct lib3270_linked_list_node * node;
  69 + for(node = session->listeners.toggle[ix].first; node; node = node->next)
  70 + {
  71 + ((struct lib3270_toggle_callback *) node)->func(session, ix, t->value, node->userdata);
  72 + }
  73 +
  74 + /*
68 for(st = session->listeners.toggle.callbacks[ix]; st != (struct lib3270_toggle_callback *) NULL; st = (struct lib3270_toggle_callback *) st->next) 75 for(st = session->listeners.toggle.callbacks[ix]; st != (struct lib3270_toggle_callback *) NULL; st = (struct lib3270_toggle_callback *) st->next)
69 { 76 {
70 st->func(session, ix, t->value, st->data); 77 st->func(session, ix, t->value, st->data);
71 } 78 }
  79 + */
72 80
73 } 81 }
74 82
src/core/toggles/listener.c
@@ -46,20 +46,9 @@ @@ -46,20 +46,9 @@
46 46
47 LIB3270_EXPORT const void * lib3270_register_toggle_listener(H3270 *hSession, LIB3270_TOGGLE_ID tx, void (*func)(H3270 *, LIB3270_TOGGLE_ID, char, void *),void *data) 47 LIB3270_EXPORT const void * lib3270_register_toggle_listener(H3270 *hSession, LIB3270_TOGGLE_ID tx, void (*func)(H3270 *, LIB3270_TOGGLE_ID, char, void *),void *data)
48 { 48 {
49 - struct lib3270_toggle_callback *st; 49 + struct lib3270_toggle_callback *st = (struct lib3270_toggle_callback *) lib3270_linked_list_append_node(&hSession->listeners.toggle[tx], sizeof(struct lib3270_toggle_callback), data);
50 50
51 - CHECK_SESSION_HANDLE(hSession);  
52 -  
53 - st = (struct lib3270_toggle_callback *) lib3270_malloc(sizeof(struct lib3270_toggle_callback));  
54 - st->func = func;  
55 - st->data = data;  
56 -  
57 - if (hSession->listeners.toggle.last[tx])  
58 - hSession->listeners.toggle.last[tx]->next = st;  
59 - else  
60 - hSession->listeners.toggle.callbacks[tx] = st;  
61 -  
62 - hSession->listeners.toggle.last[tx] = st; 51 + st->func = func;
63 52
64 return (void *) st; 53 return (void *) st;
65 54
@@ -67,33 +56,33 @@ LIB3270_EXPORT const void * lib3270_register_toggle_listener(H3270 *hSession, LI @@ -67,33 +56,33 @@ LIB3270_EXPORT const void * lib3270_register_toggle_listener(H3270 *hSession, LI
67 56
68 LIB3270_EXPORT int lib3270_unregister_toggle_listener(H3270 *hSession, LIB3270_TOGGLE_ID tx, const void *id) 57 LIB3270_EXPORT int lib3270_unregister_toggle_listener(H3270 *hSession, LIB3270_TOGGLE_ID tx, const void *id)
69 { 58 {
70 - struct lib3270_toggle_callback *st;  
71 - struct lib3270_toggle_callback *prev = (struct lib3270_toggle_callback *) NULL;  
72 -  
73 - for (st = hSession->listeners.toggle.callbacks[tx]; st != (struct lib3270_toggle_callback *) NULL; st = (struct lib3270_toggle_callback *) st->next)  
74 - {  
75 - if (st == (struct lib3270_toggle_callback *)id)  
76 - break; 59 + return lib3270_linked_list_delete_node(&hSession->listeners.toggle[tx], id);
  60 +}
77 61
78 - prev = st;  
79 - } 62 +/**
  63 + * @brief Register a function interested in a state change.
  64 + *
  65 + * @param hSession Session handle.
  66 + * @param tx State ID
  67 + * @param func Callback
  68 + * @param data Data
  69 + *
  70 + * @return State change identifier.
  71 + *
  72 + */
  73 +LIB3270_EXPORT const void * lib3270_register_schange(H3270 *hSession, LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data)
  74 +{
  75 + struct lib3270_state_callback * st = (struct lib3270_state_callback *) lib3270_linked_list_append_node(&hSession->listeners.state[tx], sizeof(struct lib3270_state_callback), data);
80 76
81 - if (st == (struct lib3270_toggle_callback *)NULL)  
82 - {  
83 - lib3270_write_log(hSession,"lib3270","Invalid call to (%s): %p wasnt found in the list",__FUNCTION__,id);  
84 - return errno = ENOENT;  
85 - } 77 + st->func = func;
86 78
87 - if (prev != (struct lib3270_toggle_callback *) NULL)  
88 - prev->next = st->next;  
89 - else  
90 - hSession->listeners.toggle.callbacks[tx] = (struct lib3270_toggle_callback *) st->next; 79 + return (void *) st;
  80 +}
91 81
92 - for(st = hSession->listeners.toggle.callbacks[tx]; st != (struct lib3270_toggle_callback *) NULL; st = (struct lib3270_toggle_callback *) st->next)  
93 - hSession->listeners.toggle.last[tx] = st; 82 +LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, const void * id)
  83 +{
  84 + return lib3270_linked_list_delete_node(&hSession->listeners.state[tx], id);
  85 +}
94 86
95 - lib3270_free((void *) id);  
96 87
97 - return 0;  
98 88
99 -}  
src/include/lib3270-internals.h
@@ -32,9 +32,9 @@ @@ -32,9 +32,9 @@
32 #include <windows.h> 32 #include <windows.h>
33 #endif // WIN32 33 #endif // WIN32
34 34
35 -/* Autoconf settings. */  
36 #include <config.h> /* autoconf settings */ 35 #include <config.h> /* autoconf settings */
37 #include <lib3270.h> /* lib3270 API calls and defs */ 36 #include <lib3270.h> /* lib3270 API calls and defs */
  37 +#include <linkedlist.h>
38 #include <lib3270/charset.h> 38 #include <lib3270/charset.h>
39 #include <lib3270/session.h> 39 #include <lib3270/session.h>
40 // #include "api.h" 40 // #include "api.h"
@@ -323,15 +323,15 @@ typedef struct _input_t @@ -323,15 +323,15 @@ typedef struct _input_t
323 323
324 struct lib3270_state_callback 324 struct lib3270_state_callback
325 { 325 {
326 - struct lib3270_state_callback * next; /**< @brief Next callback in chain */  
327 - void * data; /**< @brief User data */  
328 - void (*func)(H3270 *, int, void *); /**< @brief Function to call */ 326 + LIB3270_LINKED_LIST_HEAD;
  327 +
  328 + void (*func)(H3270 *, int, void *); /**< @brief Function to call */
329 }; 329 };
330 330
331 struct lib3270_toggle_callback 331 struct lib3270_toggle_callback
332 { 332 {
333 - struct lib3270_toggle_callback * next; /**< @brief Next callback in chain */  
334 - void * data; /**< @brief User data */ 333 + LIB3270_LINKED_LIST_HEAD;
  334 +
335 void (*func)(H3270 *, LIB3270_TOGGLE_ID, char, void *); /**< @brief Function to call */ 335 void (*func)(H3270 *, LIB3270_TOGGLE_ID, char, void *); /**< @brief Function to call */
336 }; 336 };
337 337
@@ -695,22 +695,14 @@ struct _h3270 @@ -695,22 +695,14 @@ struct _h3270
695 void *userdata; 695 void *userdata;
696 } trace; 696 } trace;
697 697
698 - // Listeners. 698 + /// @brief Event Listeners.
699 struct 699 struct
700 { 700 {
701 - // State.  
702 - struct  
703 - {  
704 - struct lib3270_state_callback * callbacks[LIB3270_STATE_USER];  
705 - struct lib3270_state_callback * last[LIB3270_STATE_USER];  
706 - } state; 701 + /// @brief State listeners.
  702 + struct lib3270_linked_list_head state[LIB3270_STATE_USER];
707 703
708 - // Toggle change listeners  
709 - struct  
710 - {  
711 - struct lib3270_toggle_callback * callbacks[LIB3270_TOGGLE_COUNT];  
712 - struct lib3270_toggle_callback * last[LIB3270_TOGGLE_COUNT];  
713 - } toggle; 704 + /// @brief Toggle listeners.
  705 + struct lib3270_linked_list_head toggle[LIB3270_TOGGLE_COUNT];
714 706
715 } listeners; 707 } listeners;
716 708
src/include/lib3270/keyboard.h
@@ -85,6 +85,10 @@ @@ -85,6 +85,10 @@
85 LIB3270_EXPORT int lib3270_set_lock_on_operator_error(H3270 *hSession, int enable); 85 LIB3270_EXPORT int lib3270_set_lock_on_operator_error(H3270 *hSession, int enable);
86 LIB3270_EXPORT int lib3270_get_lock_on_operator_error(const H3270 *hSession); 86 LIB3270_EXPORT int lib3270_get_lock_on_operator_error(const H3270 *hSession);
87 87
  88 + LIB3270_EXPORT int lib3270_set_numeric_lock(H3270 *hSession, int enable);
  89 + LIB3270_EXPORT int lib3270_get_numeric_lock(const H3270 *hSession);
  90 +
  91 +
88 #ifdef __cplusplus 92 #ifdef __cplusplus
89 } 93 }
90 #endif 94 #endif
src/include/linkedlist.h 0 → 100644
@@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
  1 +/*
  2 + * "Software pw3270, 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. 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 GNU, 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 - 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 Mendonça)
  27 + *
  28 + */
  29 +
  30 +/**
  31 + * @file linkedlist.h
  32 + * @brief Global declarations for linkedlist.c.
  33 + */
  34 +
  35 +#ifndef LIB3270_LINKED_LIST_H_INCLUDED
  36 +
  37 + #define LIB3270_LINKED_LIST_H_INCLUDED
  38 +
  39 + #include <stddef.h>
  40 + #include <lib3270.h>
  41 +
  42 + #define LIB3270_LINKED_LIST_HEAD \
  43 + struct lib3270_linked_list_node * prev; \
  44 + struct lib3270_linked_list_node * next; \
  45 + void * userdata;
  46 +
  47 + struct lib3270_linked_list_node
  48 + {
  49 + LIB3270_LINKED_LIST_HEAD
  50 + };
  51 +
  52 + struct lib3270_linked_list_head
  53 + {
  54 + struct lib3270_linked_list_node * first;
  55 + struct lib3270_linked_list_node * last;
  56 + };
  57 +
  58 + LIB3270_INTERNAL void * lib3270_linked_list_append_node(struct lib3270_linked_list_head *head, size_t szBlock, void *userdata);
  59 + LIB3270_INTERNAL int lib3270_linked_list_delete_node(struct lib3270_linked_list_head *head, const void *node);
  60 + LIB3270_INTERNAL void lib3270_linked_list_free(struct lib3270_linked_list_head *head);
  61 +
  62 +#endif // LIB3270_LINKED_LIST_H_INCLUDED