Commit 59419215f1be4bd094cf70b09a1602652e83045f
1 parent
40091dae
Exists in
master
Importando fontes iniciais.
Showing
16 changed files
with
1326 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
1 | +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> | ||
2 | +<CodeBlocks_project_file> | ||
3 | + <FileVersion major="1" minor="6" /> | ||
4 | + <Project> | ||
5 | + <Option title="Gateway pw3270" /> | ||
6 | + <Option pch_mode="2" /> | ||
7 | + <Option compiler="gcc" /> | ||
8 | + <Build> | ||
9 | + <Target title="Debug"> | ||
10 | + <Option output=".bin/Debug/pw3270d" prefix_auto="1" extension_auto="1" /> | ||
11 | + <Option object_output=".obj/Debug/" /> | ||
12 | + <Option type="1" /> | ||
13 | + <Option compiler="gcc" /> | ||
14 | + <Compiler> | ||
15 | + <Add option="-g" /> | ||
16 | + <Add option="-DDEBUG=1" /> | ||
17 | + </Compiler> | ||
18 | + </Target> | ||
19 | + <Target title="Release"> | ||
20 | + <Option output=".bin/Release/pw3270d" prefix_auto="1" extension_auto="1" /> | ||
21 | + <Option object_output=".obj/Release/" /> | ||
22 | + <Option type="1" /> | ||
23 | + <Option compiler="gcc" /> | ||
24 | + <Compiler> | ||
25 | + <Add option="-O2" /> | ||
26 | + <Add option="-DNDEBUG=1" /> | ||
27 | + </Compiler> | ||
28 | + <Linker> | ||
29 | + <Add option="-s" /> | ||
30 | + </Linker> | ||
31 | + </Target> | ||
32 | + </Build> | ||
33 | + <Compiler> | ||
34 | + <Add option="-Wall" /> | ||
35 | + <Add option="`pkg-config --cflags dbus-glib-1 glib-2.0 dbus-1 lib3270`" /> | ||
36 | + </Compiler> | ||
37 | + <Linker> | ||
38 | + <Add option="`pkg-config --libs dbus-glib-1 glib-2.0 dbus-1 lib3270`" /> | ||
39 | + </Linker> | ||
40 | + <ExtraCommands> | ||
41 | + <Add before="dbus-binding-tool --mode=glib-server --output=src/dbus-glue.h --prefix=pw3270_dbus src/pw3270service.xml" /> | ||
42 | + </ExtraCommands> | ||
43 | + <Unit filename="src/gobject.c"> | ||
44 | + <Option compilerVar="CC" /> | ||
45 | + </Unit> | ||
46 | + <Unit filename="src/iocallback.c"> | ||
47 | + <Option compilerVar="CC" /> | ||
48 | + </Unit> | ||
49 | + <Unit filename="src/main.c"> | ||
50 | + <Option compilerVar="CC" /> | ||
51 | + </Unit> | ||
52 | + <Unit filename="src/private.h" /> | ||
53 | + <Unit filename="src/pw3270service.xml" /> | ||
54 | + <Unit filename="src/service.h" /> | ||
55 | + <Unit filename="src/session.c"> | ||
56 | + <Option compilerVar="CC" /> | ||
57 | + </Unit> | ||
58 | + <Unit filename="src/tn3270glue.c"> | ||
59 | + <Option compilerVar="CC" /> | ||
60 | + </Unit> | ||
61 | + <Extensions> | ||
62 | + <code_completion /> | ||
63 | + <envvars /> | ||
64 | + <debugger /> | ||
65 | + </Extensions> | ||
66 | + </Project> | ||
67 | +</CodeBlocks_project_file> |
@@ -0,0 +1,282 @@ | @@ -0,0 +1,282 @@ | ||
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. | ||
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 gobject.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * | ||
27 | + * Referencias: | ||
28 | + * | ||
29 | + * https://live.gnome.org/DBusGlibBindings | ||
30 | + * | ||
31 | + */ | ||
32 | + | ||
33 | +#include <glib.h> | ||
34 | +#include <dbus/dbus.h> | ||
35 | +#include <dbus/dbus-glib-lowlevel.h> | ||
36 | +#include <dbus/dbus-glib.h> | ||
37 | + | ||
38 | +#include <lib3270.h> | ||
39 | +#include <lib3270/actions.h> | ||
40 | + | ||
41 | +#include "service.h" | ||
42 | + | ||
43 | +/*---[ Globals ]---------------------------------------------------------------------------------*/ | ||
44 | + | ||
45 | + | ||
46 | +/*---[ Implement ]-------------------------------------------------------------------------------*/ | ||
47 | + | ||
48 | +G_DEFINE_TYPE(PW3270Dbus, pw3270_dbus, G_TYPE_OBJECT) | ||
49 | + | ||
50 | +static void pw3270_dbus_finalize(GObject *object) { | ||
51 | + G_OBJECT_CLASS(pw3270_dbus_parent_class)->finalize (object); | ||
52 | +} | ||
53 | + | ||
54 | +static void pw3270_dbus_class_init(PW3270DbusClass *klass) { | ||
55 | + GObjectClass *object_class; | ||
56 | + object_class = G_OBJECT_CLASS (klass); | ||
57 | + object_class->finalize = pw3270_dbus_finalize; | ||
58 | +} | ||
59 | + | ||
60 | +static void pw3270_dbus_init(PW3270Dbus *object) { | ||
61 | + | ||
62 | +} | ||
63 | + | ||
64 | +PW3270Dbus * pw3270_dbus_new(void) { | ||
65 | + g_message("Creating D-Bus proxy"); | ||
66 | + return g_object_new(PW3270_TYPE_DBUS, NULL); | ||
67 | +} | ||
68 | + | ||
69 | +static void pw3270_dbus_return_error(DBusGMethodInvocation *context, int err) { | ||
70 | + GError *error = g_error_new(ERROR_DOMAIN,err,"%s",g_strerror(err)); | ||
71 | + dbus_g_method_return_error(context,error); | ||
72 | + g_error_free(error); | ||
73 | +} | ||
74 | + | ||
75 | +void pw3270_dbus_get_revision(PW3270Dbus *object, DBusGMethodInvocation *context) { | ||
76 | + dbus_g_method_return(context,lib3270_get_revision()); | ||
77 | +} | ||
78 | + | ||
79 | +void pw3270_dbus_get_version(PW3270Dbus *object, DBusGMethodInvocation *context) { | ||
80 | + dbus_g_method_return(context,lib3270_get_version()); | ||
81 | +} | ||
82 | + | ||
83 | +void pw3270_dbus_create_session(PW3270Dbus *object, DBusGMethodInvocation *context) { | ||
84 | + | ||
85 | + struct session * ses = session_new(); | ||
86 | + gchar * key = g_strdup_printf("%p-%u",ses,ses->id); | ||
87 | + | ||
88 | + dbus_g_method_return(context,key); | ||
89 | + | ||
90 | + g_free(key); | ||
91 | +} | ||
92 | + | ||
93 | +void pw3270_dbus_destroy_session(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { | ||
94 | + | ||
95 | + struct session * ses = session_find(id); | ||
96 | + | ||
97 | + if(!ses) { | ||
98 | + dbus_g_method_return(context,ENOENT); | ||
99 | + return; | ||
100 | + } | ||
101 | + | ||
102 | + session_destroy(ses); | ||
103 | + | ||
104 | + dbus_g_method_return(context,0); | ||
105 | +} | ||
106 | + | ||
107 | +void pw3270_dbus_connect(PW3270Dbus *object, const gchar *id, const gchar *uri, DBusGMethodInvocation *context) { | ||
108 | + | ||
109 | + struct session * ses = session_find(id); | ||
110 | + | ||
111 | + if(!ses) { | ||
112 | + pw3270_dbus_return_error(context,ENOENT); | ||
113 | + return; | ||
114 | + } | ||
115 | + | ||
116 | + if(uri && *uri) { | ||
117 | + lib3270_set_url(ses->host,uri); | ||
118 | + } | ||
119 | + | ||
120 | + dbus_g_method_return(context,lib3270_connect(ses->host,0)); | ||
121 | + | ||
122 | +} | ||
123 | + | ||
124 | +void pw3270_dbus_disconnect(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { | ||
125 | + | ||
126 | + struct session * ses = session_find(id); | ||
127 | + | ||
128 | + if(!ses) { | ||
129 | + pw3270_dbus_return_error(context,ENOENT); | ||
130 | + return; | ||
131 | + } | ||
132 | + | ||
133 | + dbus_g_method_return(context,lib3270_disconnect(ses->host)); | ||
134 | +} | ||
135 | + | ||
136 | +void pw3270_dbus_enter(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { | ||
137 | + | ||
138 | + struct session * ses = session_find(id); | ||
139 | + | ||
140 | + if(!ses) { | ||
141 | + pw3270_dbus_return_error(context,ENOENT); | ||
142 | + return; | ||
143 | + } | ||
144 | + | ||
145 | + dbus_g_method_return(context,lib3270_enter(ses->host)); | ||
146 | +} | ||
147 | + | ||
148 | +void pw3270_dbus_pf_key(PW3270Dbus *object, const gchar *id, int key, DBusGMethodInvocation *context) { | ||
149 | + | ||
150 | + struct session * ses = session_find(id); | ||
151 | + | ||
152 | + if(!ses) { | ||
153 | + pw3270_dbus_return_error(context,ENOENT); | ||
154 | + return; | ||
155 | + } | ||
156 | + | ||
157 | + dbus_g_method_return(context,lib3270_pfkey(ses->host,key)); | ||
158 | +} | ||
159 | + | ||
160 | +void pw3270_dbus_pa_key(PW3270Dbus *object, const gchar *id, int key, DBusGMethodInvocation *context) { | ||
161 | + | ||
162 | + struct session * ses = session_find(id); | ||
163 | + | ||
164 | + if(!ses) { | ||
165 | + pw3270_dbus_return_error(context,ENOENT); | ||
166 | + return; | ||
167 | + } | ||
168 | + | ||
169 | + dbus_g_method_return(context,lib3270_pakey(ses->host,key)); | ||
170 | +} | ||
171 | + | ||
172 | +void pw3270_dbus_set_text_at(PW3270Dbus *object, const gchar *id, int row, int col, const gchar *utftext, DBusGMethodInvocation *context) { | ||
173 | + | ||
174 | + gchar * text; | ||
175 | + struct session * ses = session_find(id); | ||
176 | + | ||
177 | + if(!ses) { | ||
178 | + pw3270_dbus_return_error(context,ENOENT); | ||
179 | + return; | ||
180 | + } | ||
181 | + | ||
182 | + text = g_convert_with_fallback(utftext,-1,lib3270_get_display_charset(ses->host),"UTF-8","?",NULL,NULL,NULL); | ||
183 | + | ||
184 | + dbus_g_method_return(context,lib3270_set_string_at(ses->host,row,col,(const unsigned char *) text)); | ||
185 | + | ||
186 | + g_free(text); | ||
187 | +} | ||
188 | + | ||
189 | +void pw3270_dbus_get_text_at(PW3270Dbus *object, const gchar *id, int row, int col, int len, DBusGMethodInvocation *context) { | ||
190 | + | ||
191 | + gchar *text; | ||
192 | + struct session * ses = session_find(id); | ||
193 | + | ||
194 | + if(!ses) { | ||
195 | + pw3270_dbus_return_error(context,ENOENT); | ||
196 | + return; | ||
197 | + } | ||
198 | + | ||
199 | + text = lib3270_get_text_at(ses->host, row, col, len); | ||
200 | + if(!text) { | ||
201 | + | ||
202 | + pw3270_dbus_return_error(context,errno); | ||
203 | + | ||
204 | + } else { | ||
205 | + | ||
206 | + gchar * utftext = g_convert_with_fallback(text,-1,"UTF-8",lib3270_get_display_charset(ses->host),"?",NULL,NULL,NULL); | ||
207 | + lib3270_free(text); | ||
208 | + dbus_g_method_return(context,utftext); | ||
209 | + g_free(utftext); | ||
210 | + | ||
211 | + } | ||
212 | + | ||
213 | +} | ||
214 | + | ||
215 | +void pw3270_dbus_is_ready(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { | ||
216 | + | ||
217 | + struct session * ses = session_find(id); | ||
218 | + | ||
219 | + if(!ses) { | ||
220 | + pw3270_dbus_return_error(context,ENOENT); | ||
221 | + return; | ||
222 | + } | ||
223 | + | ||
224 | + dbus_g_method_return(context,lib3270_is_ready(ses->host)); | ||
225 | +} | ||
226 | + | ||
227 | +void pw3270_dbus_chk_id(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { | ||
228 | + | ||
229 | + struct session * ses = session_find(id); | ||
230 | + | ||
231 | + if(!ses) { | ||
232 | + dbus_g_method_return(context,ENOENT); | ||
233 | + return; | ||
234 | + } | ||
235 | + | ||
236 | + dbus_g_method_return(context,0); | ||
237 | + | ||
238 | +} | ||
239 | + | ||
240 | +void pw3270_dbus_cmp_text_at(PW3270Dbus *object, const gchar *id, int row, int col, const gchar *utftext, DBusGMethodInvocation *context) { | ||
241 | + | ||
242 | + gchar * text; | ||
243 | + struct session * ses = session_find(id); | ||
244 | + | ||
245 | + if(!ses) { | ||
246 | + pw3270_dbus_return_error(context,ENOENT); | ||
247 | + return; | ||
248 | + } | ||
249 | + | ||
250 | + text = g_convert_with_fallback(utftext,-1,lib3270_get_display_charset(ses->host),"UTF-8","?",NULL,NULL,NULL); | ||
251 | + | ||
252 | + dbus_g_method_return(context,lib3270_cmp_text_at(ses->host,row,col,text)); | ||
253 | + | ||
254 | + g_free(text); | ||
255 | + | ||
256 | +} | ||
257 | + | ||
258 | +void pw3270_dbus_is_connected(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { | ||
259 | + | ||
260 | + struct session * ses = session_find(id); | ||
261 | + | ||
262 | + if(!ses) { | ||
263 | + pw3270_dbus_return_error(context,ENOENT); | ||
264 | + return; | ||
265 | + } | ||
266 | + | ||
267 | + dbus_g_method_return(context,lib3270_is_connected(ses->host)); | ||
268 | + | ||
269 | +} | ||
270 | + | ||
271 | +void pw3270_dbus_get_connection_state(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { | ||
272 | + | ||
273 | + struct session * ses = session_find(id); | ||
274 | + | ||
275 | + if(!ses) { | ||
276 | + pw3270_dbus_return_error(context,ENOENT); | ||
277 | + return; | ||
278 | + } | ||
279 | + | ||
280 | + dbus_g_method_return(context,lib3270_get_connection_state(ses->host)); | ||
281 | + | ||
282 | +} |
@@ -0,0 +1,277 @@ | @@ -0,0 +1,277 @@ | ||
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. | ||
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 iocallback.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * | ||
27 | + */ | ||
28 | + | ||
29 | +#include "private.h" | ||
30 | +#include <lib3270.h> | ||
31 | +#include <poll.h> | ||
32 | +#include <string.h> | ||
33 | + | ||
34 | +static void * static_AddSource(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*proc)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata); | ||
35 | +static void static_RemoveSource(H3270 *session, void *id); | ||
36 | + | ||
37 | +static void * static_AddTimeOut(H3270 *session, unsigned long interval_ms, void (*proc)(H3270 *session)); | ||
38 | +static void static_RemoveTimeOut(H3270 *session, void * timer); | ||
39 | +static int static_Sleep(H3270 *hSession, int seconds); | ||
40 | +static int static_RunPendingEvents(H3270 *hSession, int wait); | ||
41 | + | ||
42 | +static gboolean IO_prepare(GSource *source, gint *timeout); | ||
43 | +static gboolean IO_check(GSource *source); | ||
44 | +static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer user_data); | ||
45 | +static void IO_finalize(GSource *source); /* Can be NULL */ | ||
46 | +static gboolean IO_closure(gpointer data); | ||
47 | + | ||
48 | +/*---[ Structs ]-------------------------------------------------------------------------------------------*/ | ||
49 | + | ||
50 | + typedef struct _IO_Source { | ||
51 | + GSource gsrc; | ||
52 | + GPollFD poll; | ||
53 | + int fd; | ||
54 | + void (*call)(H3270 *, int, LIB3270_IO_FLAG, void *); | ||
55 | + H3270 *session; | ||
56 | + void *userdata; | ||
57 | + } IO_Source; | ||
58 | + | ||
59 | + typedef struct _timer { | ||
60 | + unsigned char remove; | ||
61 | + void * userdata; | ||
62 | + void (*call)(H3270 *session); | ||
63 | + H3270 * session; | ||
64 | + } TIMER; | ||
65 | + | ||
66 | + static GSourceFuncs IOSources = { | ||
67 | + IO_prepare, | ||
68 | + IO_check, | ||
69 | + IO_dispatch, | ||
70 | + IO_finalize, | ||
71 | + IO_closure, | ||
72 | + NULL | ||
73 | + }; | ||
74 | + | ||
75 | +/*---[ Implement ]-----------------------------------------------------------------------------------------*/ | ||
76 | + | ||
77 | +static void * static_AddSource(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { | ||
78 | + | ||
79 | + IO_Source *src = (IO_Source *) g_source_new(&IOSources,sizeof(IO_Source)); | ||
80 | + | ||
81 | + src->fd = fd; | ||
82 | + src->call = call; | ||
83 | + src->userdata = userdata; | ||
84 | + src->session = session; | ||
85 | + | ||
86 | + src->poll.fd = (int) fd; | ||
87 | + src->poll.events = G_IO_HUP|G_IO_ERR; | ||
88 | + | ||
89 | + if(flag & LIB3270_IO_FLAG_READ) | ||
90 | + src->poll.events |= G_IO_IN; | ||
91 | + | ||
92 | + if(flag & LIB3270_IO_FLAG_WRITE) | ||
93 | + src->poll.events |= G_IO_OUT; | ||
94 | + | ||
95 | + g_source_attach((GSource *) src,NULL); | ||
96 | + g_source_add_poll((GSource *) src,&src->poll); | ||
97 | + | ||
98 | + return src; | ||
99 | +} | ||
100 | + | ||
101 | +static void static_RemoveSource(H3270 *session, void *id) { | ||
102 | + if(id) | ||
103 | + g_source_destroy((GSource *) id); | ||
104 | +} | ||
105 | + | ||
106 | +static gboolean do_timer(TIMER *t) { | ||
107 | + if(!t->remove) | ||
108 | + t->call(t->session); | ||
109 | + return FALSE; | ||
110 | +} | ||
111 | + | ||
112 | +static void * static_AddTimeOut(H3270 *session, unsigned long interval, void (*call)(H3270 *session)) { | ||
113 | + TIMER *t = g_malloc0(sizeof(TIMER)); | ||
114 | + | ||
115 | + t->call = call; | ||
116 | + t->session = session; | ||
117 | + | ||
118 | + g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) interval, (GSourceFunc) do_timer, t, g_free); | ||
119 | + | ||
120 | + return t; | ||
121 | +} | ||
122 | + | ||
123 | +static void static_RemoveTimeOut(H3270 *session, void * timer) { | ||
124 | + ((TIMER *) timer)->remove++; | ||
125 | +} | ||
126 | + | ||
127 | +static gboolean IO_prepare(GSource *source, gint *timeout) { | ||
128 | + /* | ||
129 | + * Called before all the file descriptors are polled. | ||
130 | + * If the source can determine that it is ready here | ||
131 | + * (without waiting for the results of the poll() call) | ||
132 | + * it should return TRUE. | ||
133 | + * | ||
134 | + * It can also return a timeout_ value which should be the maximum | ||
135 | + * timeout (in milliseconds) which should be passed to the poll() call. | ||
136 | + * The actual timeout used will be -1 if all sources returned -1, | ||
137 | + * or it will be the minimum of all the timeout_ values | ||
138 | + * returned which were >= 0. | ||
139 | + * | ||
140 | + */ | ||
141 | + return 0; | ||
142 | +} | ||
143 | + | ||
144 | +static gboolean IO_check(GSource *source) { | ||
145 | + /* | ||
146 | + * Called after all the file descriptors are polled. | ||
147 | + * The source should return TRUE if it is ready to be dispatched. | ||
148 | + * Note that some time may have passed since the previous prepare | ||
149 | + * function was called, so the source should be checked again here. | ||
150 | + * | ||
151 | + */ | ||
152 | +#ifdef _WIN32 | ||
153 | + | ||
154 | + fd_set rfds, wfds; | ||
155 | + struct timeval tm; | ||
156 | + | ||
157 | + memset(&tm,0,sizeof(tm)); | ||
158 | + | ||
159 | + FD_ZERO(&rfds); | ||
160 | + FD_ZERO(&wfds); | ||
161 | +// FD_ZERO(&xfds); | ||
162 | + | ||
163 | + if(((IO_Source *) source)->poll.events & G_IO_IN) { | ||
164 | + FD_SET(((IO_Source *) source)->poll.fd, &rfds); | ||
165 | + } | ||
166 | + | ||
167 | + if(((IO_Source *) source)->poll.events & G_IO_OUT) { | ||
168 | + FD_SET(((IO_Source *) source)->poll.fd, &wfds); | ||
169 | + } | ||
170 | + | ||
171 | + if(select(((IO_Source *) source)->poll.fd+1, &rfds, &wfds, NULL, &tm) > 0) | ||
172 | + return TRUE; | ||
173 | + | ||
174 | +#else | ||
175 | + | ||
176 | + struct pollfd fds; | ||
177 | + | ||
178 | + memset(&fds,0,sizeof(fds)); | ||
179 | + | ||
180 | + fds.fd = ((IO_Source *) source)->poll.fd; | ||
181 | + fds.events = ((IO_Source *) source)->poll.events; | ||
182 | + | ||
183 | + if(poll(&fds,1,0) > 0) | ||
184 | + return TRUE; | ||
185 | + | ||
186 | +#endif // _WIN32 | ||
187 | + | ||
188 | + return FALSE; | ||
189 | +} | ||
190 | + | ||
191 | +static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) { | ||
192 | + /* | ||
193 | + * Called to dispatch the event source, | ||
194 | + * after it has returned TRUE in either its prepare or its check function. | ||
195 | + * The dispatch function is passed in a callback function and data. | ||
196 | + * The callback function may be NULL if the source was never connected | ||
197 | + * to a callback using g_source_set_callback(). The dispatch function | ||
198 | + * should call the callback function with user_data and whatever additional | ||
199 | + * parameters are needed for this type of event source. | ||
200 | + */ | ||
201 | + IO_Source *obj = (IO_Source *) source; | ||
202 | + | ||
203 | + obj->call(obj->session,obj->fd,0,obj->userdata); | ||
204 | + | ||
205 | + return TRUE; | ||
206 | +} | ||
207 | + | ||
208 | +static void IO_finalize(GSource *source) { | ||
209 | + | ||
210 | +} | ||
211 | + | ||
212 | +static gboolean IO_closure(gpointer data) { | ||
213 | + return 0; | ||
214 | +} | ||
215 | + | ||
216 | +struct bgParameter { | ||
217 | + gboolean running; | ||
218 | + H3270 *session; | ||
219 | + int rc; | ||
220 | + int(*callback)(H3270 *session, void *); | ||
221 | + void *parm; | ||
222 | + | ||
223 | +}; | ||
224 | + | ||
225 | +gpointer BgCall(struct bgParameter *p) { | ||
226 | +// trace("%s starts",__FUNCTION__); | ||
227 | + p->rc = p->callback(p->session, p->parm); | ||
228 | + p->running = FALSE; | ||
229 | +// trace("%s ends",__FUNCTION__); | ||
230 | + return 0; | ||
231 | +} | ||
232 | + | ||
233 | +static int static_Sleep(H3270 *hSession, int seconds) { | ||
234 | + time_t end = time(0) + seconds; | ||
235 | + | ||
236 | + while(time(0) < end) { | ||
237 | + g_main_context_iteration(NULL, TRUE); | ||
238 | + } | ||
239 | + | ||
240 | + return 0; | ||
241 | +} | ||
242 | + | ||
243 | +static int static_RunPendingEvents(H3270 *hSession, int wait) { | ||
244 | + | ||
245 | + int rc = 0; | ||
246 | + while(g_main_context_iteration(NULL, wait ? TRUE : FALSE)) { | ||
247 | + rc = 1; | ||
248 | + } | ||
249 | + | ||
250 | + return rc; | ||
251 | +} | ||
252 | + | ||
253 | +static void beep(H3270 *session) { | ||
254 | +} | ||
255 | + | ||
256 | +void register_3270_io_handlers(void) { | ||
257 | + static const struct lib3270_callbacks hdl = { | ||
258 | + | ||
259 | + sizeof(struct lib3270_callbacks), | ||
260 | + | ||
261 | + static_AddTimeOut, | ||
262 | + static_RemoveTimeOut, | ||
263 | + | ||
264 | + static_AddSource, | ||
265 | + static_RemoveSource, | ||
266 | + | ||
267 | + static_Sleep, | ||
268 | + static_RunPendingEvents, | ||
269 | + beep | ||
270 | + | ||
271 | + }; | ||
272 | + | ||
273 | + if(lib3270_register_handlers(&hdl)) { | ||
274 | + g_error("%s","Can't set lib3270 I/O handlers"); | ||
275 | + } | ||
276 | + | ||
277 | +} |
@@ -0,0 +1,170 @@ | @@ -0,0 +1,170 @@ | ||
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. | ||
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 main.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Referencias: | ||
24 | + * | ||
25 | + * https://live.gnome.org/DBusGlibBindings | ||
26 | + * | ||
27 | + * Contatos: | ||
28 | + * | ||
29 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
30 | + * | ||
31 | + */ | ||
32 | + | ||
33 | +#include <glib.h> | ||
34 | +#include <glib-object.h> | ||
35 | +#include <dbus/dbus.h> | ||
36 | +#include <dbus/dbus-glib.h> | ||
37 | +#include <dbus/dbus-glib-bindings.h> | ||
38 | + | ||
39 | +#include "service.h" | ||
40 | +#include "dbus-glue.h" | ||
41 | + | ||
42 | +#include "private.h" | ||
43 | +#ifdef DEBUG | ||
44 | + #include <stdio.h> | ||
45 | +#endif // DEBUG | ||
46 | + | ||
47 | +#if defined( HAVE_SYSLOG ) | ||
48 | + #include <syslog.h> | ||
49 | +#endif // HAVE_SYSLOG | ||
50 | + | ||
51 | +#ifdef DEBUG | ||
52 | + static GBusType bustype = G_BUS_TYPE_SESSION; | ||
53 | +#else | ||
54 | + static GBusType bustype = G_BUS_TYPE_SYSTEM; | ||
55 | +#endif // DEBUG | ||
56 | + | ||
57 | +static DBusGConnection * connection = NULL; | ||
58 | +static DBusGProxy * proxy = NULL; | ||
59 | + | ||
60 | +GMainLoop * main_loop = NULL; | ||
61 | + | ||
62 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | ||
63 | + | ||
64 | +#if defined( HAVE_SYSLOG ) | ||
65 | +static void g_syslog(const gchar *log_domain,GLogLevelFlags log_level,const gchar *message,gpointer user_data) | ||
66 | +{ | ||
67 | + static const struct _logtype | ||
68 | + { | ||
69 | + GLogLevelFlags log_level; | ||
70 | + int priority; | ||
71 | + const gchar * msg; | ||
72 | + } logtype[] = | ||
73 | + { | ||
74 | + { G_LOG_FLAG_RECURSION, LOG_INFO, "recursion" }, | ||
75 | + { G_LOG_FLAG_FATAL, LOG_ERR, "fatal error" }, | ||
76 | + | ||
77 | + /* GLib log levels */ | ||
78 | + { G_LOG_LEVEL_ERROR, LOG_ERR, "error" }, | ||
79 | + { G_LOG_LEVEL_CRITICAL, LOG_ERR, "critical error" }, | ||
80 | + { G_LOG_LEVEL_WARNING, LOG_ERR, "warning" }, | ||
81 | + { G_LOG_LEVEL_MESSAGE, LOG_ERR, "message" }, | ||
82 | + { G_LOG_LEVEL_INFO, LOG_INFO, "info" }, | ||
83 | + { G_LOG_LEVEL_DEBUG, LOG_DEBUG, "debug" }, | ||
84 | + }; | ||
85 | + | ||
86 | + int f; | ||
87 | + | ||
88 | + for(f=0;f<G_N_ELEMENTS(logtype);f++) | ||
89 | + { | ||
90 | + if(logtype[f].log_level == log_level) | ||
91 | + { | ||
92 | + gchar *ptr; | ||
93 | + gchar *text = g_strdup_printf("%s: %s %s",logtype[f].msg,log_domain ? log_domain : "",message); | ||
94 | + for(ptr = text;*ptr;ptr++) | ||
95 | + { | ||
96 | + if(*ptr < ' ') | ||
97 | + *ptr = ' '; | ||
98 | + } | ||
99 | + | ||
100 | + syslog(logtype[f].priority,"%s",text); | ||
101 | + g_free(text); | ||
102 | + return; | ||
103 | + } | ||
104 | + } | ||
105 | + | ||
106 | + #ifdef DEBUG | ||
107 | + fprintf(stderr,"%s\n",message); | ||
108 | + fflush(stderr); | ||
109 | + #endif // DEBUG | ||
110 | + | ||
111 | + syslog(LOG_INFO,"%s %s",log_domain ? log_domain : "", message); | ||
112 | +} | ||
113 | +#endif // HAVE_SYSLOG | ||
114 | + | ||
115 | +static gboolean do_idle_check(gpointer dunno) { | ||
116 | + session_check_for_timeout(); | ||
117 | + return TRUE; | ||
118 | +} | ||
119 | + | ||
120 | +static int initialize(void) { | ||
121 | + | ||
122 | + GError * error = NULL; | ||
123 | + guint result; | ||
124 | + | ||
125 | + connection = dbus_g_bus_get_private(bustype, g_main_context_default(), &error); | ||
126 | + | ||
127 | + if(error) { | ||
128 | + g_message("Error \"%s\" getting D-Bus connection",error->message); | ||
129 | + g_error_free(error); | ||
130 | + return -1; | ||
131 | + } | ||
132 | + | ||
133 | + proxy = dbus_g_proxy_new_for_name(connection,DBUS_SERVICE_DBUS,DBUS_PATH_DBUS,DBUS_INTERFACE_DBUS); | ||
134 | + | ||
135 | + org_freedesktop_DBus_request_name(proxy, PW3270_SERVICE_DBUS_SERVICE, DBUS_NAME_FLAG_DO_NOT_QUEUE, &result, &error); | ||
136 | + if(error) { | ||
137 | + g_message("Error \"%s\" getting D-Bus name",error->message); | ||
138 | + g_error_free(error); | ||
139 | + return -1; | ||
140 | + } | ||
141 | + | ||
142 | + GType object_type = PW3270_TYPE_DBUS; | ||
143 | + GObject *object = g_object_new (object_type, NULL); | ||
144 | + dbus_g_object_type_install_info (object_type, &dbus_glib_pw3270_dbus_object_info); | ||
145 | + dbus_g_connection_register_g_object (connection, PW3270_SERVICE_DBUS_SERVICE_PATH, object); | ||
146 | + | ||
147 | + g_timeout_add_seconds (1, do_idle_check, NULL); | ||
148 | + | ||
149 | + return 0; | ||
150 | +} | ||
151 | + | ||
152 | + | ||
153 | + | ||
154 | +int main(int argc, char *argv[]) { | ||
155 | + | ||
156 | +#if defined( HAVE_SYSLOG ) | ||
157 | + openlog(g_get_prgname(), LOG_NDELAY, LOG_USER); | ||
158 | + g_log_set_default_handler(g_syslog,NULL); | ||
159 | +#endif // HAVE_SYSLOG | ||
160 | + | ||
161 | + initialize(); | ||
162 | + init_3270(); | ||
163 | + | ||
164 | + main_loop = g_main_loop_new(NULL, FALSE); | ||
165 | + | ||
166 | + g_main_loop_run(main_loop); | ||
167 | + | ||
168 | + return 0; | ||
169 | + | ||
170 | + } |
@@ -0,0 +1,59 @@ | @@ -0,0 +1,59 @@ | ||
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. | ||
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 private.h e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * | ||
27 | + */ | ||
28 | + | ||
29 | +#ifndef PRIVATE_H_INCLUDED | ||
30 | + | ||
31 | + #define PRIVATE_H_INCLUDED | ||
32 | + | ||
33 | + #define ERROR_DOMAIN g_quark_from_static_string("pw3270DBUS") | ||
34 | + | ||
35 | + // #define HAVE_SYSLOG 1 | ||
36 | + #define PW3270_SERVICE_DBUS_SERVICE_PATH "/br/com/bb/pw3270/service" | ||
37 | + #define PW3270_SERVICE_DBUS_SERVICE "br.com.bb.pw3270.service" | ||
38 | + | ||
39 | + #include <glib.h> | ||
40 | + #include <gio/gio.h> | ||
41 | + #include <lib3270.h> | ||
42 | + | ||
43 | + struct session { | ||
44 | + unsigned int id; ///< @brief Identificador da sessão. | ||
45 | + time_t activity; ///< @brief Timestamp da última atividade dessa sessão. | ||
46 | + H3270 * host; ///< @brief Sessão TN3270. | ||
47 | + }; | ||
48 | + | ||
49 | + G_GNUC_INTERNAL GMainLoop * main_loop; | ||
50 | + | ||
51 | + G_GNUC_INTERNAL void init_3270(void); | ||
52 | + G_GNUC_INTERNAL void register_3270_io_handlers(void); | ||
53 | + | ||
54 | + G_GNUC_INTERNAL struct session * session_new(); | ||
55 | + G_GNUC_INTERNAL struct session * session_find(const gchar *key); | ||
56 | + G_GNUC_INTERNAL void session_destroy(struct session *ses); | ||
57 | + G_GNUC_INTERNAL void session_check_for_timeout(void); | ||
58 | + | ||
59 | +#endif // PRIVATE_H_INCLUDED |
@@ -0,0 +1,114 @@ | @@ -0,0 +1,114 @@ | ||
1 | +<?xml version="1.0" encoding="UTF-8" ?> | ||
2 | + | ||
3 | +<node name="/br/com/bb/pw3270/service"> | ||
4 | + | ||
5 | + <interface name="br.com.bb.pw3270.service"> | ||
6 | + | ||
7 | + <method name="getRevision"> | ||
8 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
9 | + <arg type="s" name="revision" direction="out" /> | ||
10 | + </method> | ||
11 | + | ||
12 | + <method name="getVersion"> | ||
13 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
14 | + <arg type="s" name="revision" direction="out" /> | ||
15 | + </method> | ||
16 | + | ||
17 | + <method name="createSession"> | ||
18 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
19 | + <arg type="s" name="id" direction="out" /> | ||
20 | + </method> | ||
21 | + | ||
22 | + <method name="destroySession"> | ||
23 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
24 | + <arg type="s" name="id" direction="in" /> | ||
25 | + <arg type="i" name="rc" direction="out" /> | ||
26 | + </method> | ||
27 | + | ||
28 | + <method name="connect"> | ||
29 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
30 | + <arg type="s" name="id" direction="in" /> | ||
31 | + <arg type="s" name="uri" direction="in" /> | ||
32 | + <arg type="i" name="rc" direction="out" /> | ||
33 | + </method> | ||
34 | + | ||
35 | + <method name="disconnect"> | ||
36 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
37 | + <arg type="s" name="id" direction="in" /> | ||
38 | + <arg type="i" name="rc" direction="out" /> | ||
39 | + </method> | ||
40 | + | ||
41 | + <method name="enter"> | ||
42 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
43 | + <arg type="s" name="id" direction="in" /> | ||
44 | + <arg type="i" name="result" direction="out" /> | ||
45 | + </method> | ||
46 | + | ||
47 | + <method name="pfKey"> | ||
48 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
49 | + <arg type="s" name="id" direction="in" /> | ||
50 | + <arg type="i" name="key" direction="in" /> | ||
51 | + <arg type="i" name="result" direction="out" /> | ||
52 | + </method> | ||
53 | + | ||
54 | + <method name="paKey"> | ||
55 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
56 | + <arg type="s" name="id" direction="in" /> | ||
57 | + <arg type="i" name="key" direction="in" /> | ||
58 | + <arg type="i" name="result" direction="out" /> | ||
59 | + </method> | ||
60 | + | ||
61 | + <method name="setTextAt"> | ||
62 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
63 | + <arg type="s" name="id" direction="in" /> | ||
64 | + <arg type="i" name="row" direction="in" /> | ||
65 | + <arg type="i" name="col" direction="in" /> | ||
66 | + <arg type="s" name="text" direction="in" /> | ||
67 | + <arg type="i" name="result" direction="out" /> | ||
68 | + </method> | ||
69 | + | ||
70 | + <method name="cmpTextAt"> | ||
71 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
72 | + <arg type="s" name="id" direction="in" /> | ||
73 | + <arg type="i" name="row" direction="in" /> | ||
74 | + <arg type="i" name="col" direction="in" /> | ||
75 | + <arg type="s" name="text" direction="in" /> | ||
76 | + <arg type="i" name="result" direction="out" /> | ||
77 | + </method> | ||
78 | + | ||
79 | + <method name="getTextAt"> | ||
80 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
81 | + <arg type="s" name="id" direction="in" /> | ||
82 | + <arg type="i" name="row" direction="in" /> | ||
83 | + <arg type="i" name="col" direction="in" /> | ||
84 | + <arg type="i" name="len" direction="in" /> | ||
85 | + <arg type="s" name="text" direction="out" /> | ||
86 | + </method> | ||
87 | + | ||
88 | + <method name="isReady"> | ||
89 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
90 | + <arg type="s" name="id" direction="in" /> | ||
91 | + <arg type="i" name="result" direction="out" /> | ||
92 | + </method> | ||
93 | + | ||
94 | + <method name="chkId"> | ||
95 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
96 | + <arg type="s" name="id" direction="in" /> | ||
97 | + <arg type="i" name="result" direction="out" /> | ||
98 | + </method> | ||
99 | + | ||
100 | + <method name="isConnected"> | ||
101 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
102 | + <arg type="s" name="id" direction="in" /> | ||
103 | + <arg type="i" name="result" direction="out" /> | ||
104 | + </method> | ||
105 | + | ||
106 | + <method name="getConnectionState"> | ||
107 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | ||
108 | + <arg type="s" name="id" direction="in" /> | ||
109 | + <arg type="i" name="status" direction="out" /> | ||
110 | + </method> | ||
111 | + | ||
112 | + </interface> | ||
113 | + | ||
114 | +</node> |
@@ -0,0 +1,151 @@ | @@ -0,0 +1,151 @@ | ||
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. | ||
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 service.h e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * | ||
27 | + */ | ||
28 | + | ||
29 | +#ifndef _PW3270_DBUS_SERVICE_H | ||
30 | + | ||
31 | + #define _PW3270_DBUS_SERVICE_H 1 | ||
32 | + | ||
33 | + #include "private.h" | ||
34 | + | ||
35 | + #define PW3270_TYPE_DBUS (pw3270_dbus_get_type ()) | ||
36 | + #define PW3270_DBUS(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PW3270_TYPE_DBUS, PW3270Dbus)) | ||
37 | + #define PW3270_DBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PW3270_TYPE_DBUS, PW3270DbusClass)) | ||
38 | + #define IS_PW3270_DBUS(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PW3270_TYPE_DBUS)) | ||
39 | + #define IS_PW3270_DBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PW3270_TYPE_DBUS)) | ||
40 | + #define PW3270_DBUS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PW3270_TYPE_DBUS, PW3270DbusClass)) | ||
41 | + | ||
42 | + G_BEGIN_DECLS | ||
43 | + | ||
44 | + typedef struct _PW3270Dbus PW3270Dbus; | ||
45 | + typedef struct _PW3270DbusClass PW3270DbusClass; | ||
46 | + | ||
47 | + struct _PW3270Dbus | ||
48 | + { | ||
49 | + GObject parent; | ||
50 | + }; | ||
51 | + | ||
52 | + struct _PW3270DbusClass | ||
53 | + { | ||
54 | + GObjectClass parent; | ||
55 | + }; | ||
56 | + | ||
57 | + PW3270Dbus * pw3270_dbus_new (void); | ||
58 | + GType pw3270_dbus_get_type (void); | ||
59 | + | ||
60 | + void pw3270_dbus_get_revision(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
61 | + void pw3270_dbus_get_version(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
62 | + void pw3270_dbus_create_session(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
63 | + void pw3270_dbus_destroy_session(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context); | ||
64 | + void pw3270_dbus_connect(PW3270Dbus *object, const gchar *id, const gchar *uri, DBusGMethodInvocation *context); | ||
65 | + void pw3270_dbus_disconnect(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context); | ||
66 | + | ||
67 | + void pw3270_dbus_enter(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context); | ||
68 | + void pw3270_dbus_pf_key(PW3270Dbus *object, const gchar *id, int key, DBusGMethodInvocation *context); | ||
69 | + void pw3270_dbus_pa_key(PW3270Dbus *object, const gchar *id, int key, DBusGMethodInvocation *context); | ||
70 | + | ||
71 | + void pw3270_dbus_set_text_at(PW3270Dbus *object, const gchar *id, int row, int col, const gchar *text, DBusGMethodInvocation *context); | ||
72 | + void pw3270_dbus_get_text_at(PW3270Dbus *object, const gchar *id, int row, int col, int len, DBusGMethodInvocation *context); | ||
73 | + void pw3270_dbus_cmp_text_at(PW3270Dbus *object, const gchar *id, int row, int col, const gchar *text, DBusGMethodInvocation *context); | ||
74 | + | ||
75 | + void pw3270_dbus_is_ready(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context); | ||
76 | + void pw3270_dbus_is_connected(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context); | ||
77 | + void pw3270_dbus_wait_for_ready(PW3270Dbus *object, const gchar *id, int timeout, DBusGMethodInvocation *context); | ||
78 | + void pw3270_dbus_chk_id(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context); | ||
79 | + | ||
80 | + void pw3270_dbus_get_connection_state(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context); | ||
81 | + | ||
82 | +/* | ||
83 | + void pw3270_dbus_quit(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
84 | + void pw3270_dbus_connect(PW3270Dbus *object, const gchar *uri, DBusGMethodInvocation *context); | ||
85 | + void pw3270_dbus_get_ur_l(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
86 | + void pw3270_dbus_set_ur_l(PW3270Dbus *object, const gchar *uri, DBusGMethodInvocation *context); | ||
87 | + void pw3270_dbus_disconnect(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
88 | + | ||
89 | + void pw3270_dbus_get_message_id(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
90 | + void pw3270_dbus_get_connection_state(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
91 | + void pw3270_dbus_get_secure_state(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
92 | + | ||
93 | + void pw3270_dbus_get_screen_contents(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
94 | + H3270 * pw3270_dbus_get_session_handle(PW3270Dbus *object); | ||
95 | + GError * pw3270_dbus_get_error_from_errno(int code); | ||
96 | + | ||
97 | + void pw3270_dbus_is_ready(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
98 | + void pw3270_dbus_in_tn3270_e(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
99 | + | ||
100 | + void pw3270_dbus_set_cursor_at(PW3270Dbus *object, int row, int col, DBusGMethodInvocation *context); | ||
101 | + void pw3270_dbus_set_cursor_address(PW3270Dbus *object, int addr, DBusGMethodInvocation *context); | ||
102 | + void pw3270_dbus_get_cursor_address(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
103 | + | ||
104 | + void pw3270_dbus_get_screen_width(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
105 | + void pw3270_dbus_get_screen_height(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
106 | + void pw3270_dbus_get_screen_length(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
107 | + | ||
108 | + void pw3270_dbus_set_toggle(PW3270Dbus *object, int id, int value, DBusGMethodInvocation *context); | ||
109 | + | ||
110 | + void pw3270_dbus_wait_for_ready(PW3270Dbus *object, int timeout, DBusGMethodInvocation *context); | ||
111 | + | ||
112 | + void pw3270_dbus_get_field_start(PW3270Dbus *object, int baddr, DBusGMethodInvocation *context); | ||
113 | + void pw3270_dbus_get_field_length(PW3270Dbus *object, int baddr, DBusGMethodInvocation *context); | ||
114 | + void pw3270_dbus_get_next_unprotected(PW3270Dbus *object, int baddr, DBusGMethodInvocation *context); | ||
115 | + | ||
116 | + void pw3270_dbus_get_is_protected(PW3270Dbus *object, int baddr, DBusGMethodInvocation *context); | ||
117 | + void pw3270_dbus_get_is_protected_at(PW3270Dbus *object, int row, int col, DBusGMethodInvocation *context); | ||
118 | + | ||
119 | + void pw3270_dbus_set_script(PW3270Dbus *object, const gchar *text, int mode, DBusGMethodInvocation *context); | ||
120 | + | ||
121 | + void pw3270_dbus_show_popup(PW3270Dbus *object, int id, const gchar *title, const gchar *msg, const gchar *text, DBusGMethodInvocation *context); | ||
122 | + | ||
123 | + void pw3270_dbus_action(PW3270Dbus *object, const gchar *text, DBusGMethodInvocation *context); | ||
124 | + | ||
125 | + // Actions | ||
126 | + void pw3270_dbus_enter(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
127 | + void pw3270_dbus_pf_key(PW3270Dbus *object, int key, DBusGMethodInvocation *context); | ||
128 | + void pw3270_dbus_pa_key(PW3270Dbus *object, int key, DBusGMethodInvocation *context); | ||
129 | + void pw3270_dbus_get_text(PW3270Dbus *object, int offset, int len, DBusGMethodInvocation *context); | ||
130 | + void pw3270_dbus_input(PW3270Dbus *object, const gchar *utftext, DBusGMethodInvocation *context); | ||
131 | + | ||
132 | + void pw3270_dbus_set_clipboard(PW3270Dbus *object, const gchar *text, DBusGMethodInvocation *context); | ||
133 | + void pw3270_dbus_get_clipboard(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
134 | + | ||
135 | + void pw3270_dbus_get_display_charset(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
136 | + void pw3270_dbus_get_host_charset(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
137 | + void pw3270_dbus_set_host_charset(PW3270Dbus *object, const gchar *charset, DBusGMethodInvocation *context); | ||
138 | + void pw3270_dbus_erase_eof(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
139 | + void pw3270_dbus_print(PW3270Dbus *object, DBusGMethodInvocation *context); | ||
140 | + | ||
141 | + void pw3270_dbus_asc2ebc(PW3270Dbus *object, const gchar *from, DBusGMethodInvocation *context); | ||
142 | + void pw3270_dbus_ebc2asc(PW3270Dbus *object, const gchar *from, DBusGMethodInvocation *context); | ||
143 | + | ||
144 | + void pw3270_dbus_filetransfer(PW3270Dbus *object, const gchar *local, const gchar *remote, int flags, int lrecl, int blksize, int primspace, int secspace, int dft, DBusGMethodInvocation *context); | ||
145 | + | ||
146 | + void pw3270_dbus_set_unlock_delay(PW3270Dbus *object, int value, DBusGMethodInvocation *context); | ||
147 | +*/ | ||
148 | + | ||
149 | + G_END_DECLS | ||
150 | + | ||
151 | +#endif // _PW3270_DBUS_SERVICE_H |
@@ -0,0 +1,101 @@ | @@ -0,0 +1,101 @@ | ||
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. | ||
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 gobject.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * | ||
27 | + */ | ||
28 | + | ||
29 | + #include "private.h" | ||
30 | + | ||
31 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | ||
32 | + | ||
33 | +static GList * sessions = NULL; ///< @brief Lista de sessões ativas. | ||
34 | +static time_t maxidle = 300; | ||
35 | + | ||
36 | +struct session * session_new() { | ||
37 | + | ||
38 | + static unsigned int id = 0; | ||
39 | + | ||
40 | + struct session * rc = g_new0(struct session,1); | ||
41 | + | ||
42 | + rc->id = ++id; | ||
43 | + rc->activity = time(0); | ||
44 | + rc->host = lib3270_session_new(""); | ||
45 | + | ||
46 | + sessions = g_list_append(sessions,rc); | ||
47 | + | ||
48 | + return rc; | ||
49 | + | ||
50 | +}; | ||
51 | + | ||
52 | +struct session * session_find(const gchar *key) { | ||
53 | + | ||
54 | + struct session * rc = NULL; | ||
55 | + unsigned int id = 0; | ||
56 | + | ||
57 | + if(sscanf(key,"%p-%u",&rc,&id) != 2) { | ||
58 | + g_warning("Invalid session id: %s",key); | ||
59 | + return NULL; | ||
60 | + } | ||
61 | + | ||
62 | + if(!g_list_find(sessions,rc)) { | ||
63 | + return NULL; | ||
64 | + } | ||
65 | + | ||
66 | + if(rc->id != id) { | ||
67 | + g_warning("Unexpected session id: %s",key); | ||
68 | + return NULL; | ||
69 | + } | ||
70 | + | ||
71 | + rc->activity = time(0); | ||
72 | + | ||
73 | + return rc; | ||
74 | +}; | ||
75 | + | ||
76 | +void session_destroy(struct session *ses) { | ||
77 | + | ||
78 | + lib3270_session_free(ses->host); | ||
79 | + sessions = g_list_remove(sessions,ses); | ||
80 | + g_free(ses); | ||
81 | + | ||
82 | +} | ||
83 | + | ||
84 | +void session_check_for_timeout(void) { | ||
85 | + | ||
86 | + time_t timeout = time(NULL) - maxidle; | ||
87 | + GList * it; | ||
88 | + | ||
89 | + for(it = g_list_first(sessions); it != NULL; it = g_list_next(it)) { | ||
90 | + | ||
91 | + struct session *ses = (struct session *) it->data; | ||
92 | + | ||
93 | + if( ses->activity < timeout) { | ||
94 | + g_message("Closing IDLE session %p-%u",ses,ses->id); | ||
95 | + session_destroy(ses); | ||
96 | + break; | ||
97 | + } | ||
98 | + | ||
99 | + } | ||
100 | + | ||
101 | +} |
@@ -0,0 +1,30 @@ | @@ -0,0 +1,30 @@ | ||
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. | ||
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 status.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * | ||
27 | + */ | ||
28 | + #include "private.h" | ||
29 | + | ||
30 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ |
@@ -0,0 +1,43 @@ | @@ -0,0 +1,43 @@ | ||
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. | ||
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 tn3270glue.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * | ||
27 | + */ | ||
28 | + | ||
29 | +#include "private.h" | ||
30 | +#include <lib3270.h> | ||
31 | +#include <lib3270/log.h> | ||
32 | + | ||
33 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | ||
34 | + | ||
35 | +static void loghandler(H3270 *session, const char *module, int rc, const char *fmt, va_list args) { | ||
36 | + g_logv(module,rc ? G_LOG_LEVEL_WARNING : G_LOG_LEVEL_MESSAGE, fmt, args); | ||
37 | +} | ||
38 | + | ||
39 | +void init_3270(void) { | ||
40 | + lib3270_set_log_handler(loghandler); | ||
41 | + register_3270_io_handlers(); | ||
42 | + g_message("Bind to lib3270 %s-%s is complete",lib3270_get_version(),lib3270_get_revision()); | ||
43 | +} |