Commit c25520588b9810beff16e7b811e833b55316e076
1 parent
4e846202
Exists in
master
and in
1 other branch
Reimplementing pw3270 service module.
Showing
5 changed files
with
225 additions
and
13 deletions
Show diff stats
Makefile.in
... | ... | @@ -102,10 +102,10 @@ CFLAGS= \ |
102 | 102 | |
103 | 103 | GTK_LIBS=@GTK_LIBS@ |
104 | 104 | V3270_LIBS=@V3270_LIBS@ |
105 | +GLIB_LIBS=@GLIB_LIBS@ | |
105 | 106 | |
106 | 107 | LIBS= \ |
107 | 108 | @LIBS@ \ |
108 | - @GLIB_LIBS@ \ | |
109 | 109 | @LIBICONV@ \ |
110 | 110 | @INTL_LIBS@ \ |
111 | 111 | @LIB3270_LIBS@ |
... | ... | @@ -183,7 +183,8 @@ all: \ |
183 | 183 | $(POTDIR)/$(MODULE_NAME).pot |
184 | 184 | |
185 | 185 | Release: \ |
186 | - $(BINRLS)/$(MODULE_NAME)@DLLEXT@ | |
186 | + $(BINRLS)/@DLLPREFIX@$(MODULE_NAME)@DLLEXT@ \ | |
187 | + $(BINRLS)/$(PACKAGE_NAME)d@EXEEXT@ | |
187 | 188 | |
188 | 189 | $(BINRLS)/lib$(MODULE_NAME).a: \ |
189 | 190 | $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJRLS)/$(SRC).o) |
... | ... | @@ -209,6 +210,21 @@ $(BINRLS)/$(MODULE_NAME)@DLLEXT@: \ |
209 | 210 | $(LIBS) \ |
210 | 211 | $(GTK_LIBS) |
211 | 212 | |
213 | +$(BINRLS)/$(PACKAGE_NAME)d@EXEEXT@: \ | |
214 | + $(foreach SRC, $(basename $(SERVICE_SOURCES)), $(OBJRLS)/$(SRC).o) \ | |
215 | + $(BINRLS)/lib$(MODULE_NAME).a | |
216 | + | |
217 | + @$(MKDIR) `dirname $@` | |
218 | + @echo $< ... | |
219 | + @$(LD) \ | |
220 | + -o $@ \ | |
221 | + $(foreach SRC, $(basename $(SERVICE_SOURCES)), $(OBJRLS)/$(SRC).o) \ | |
222 | + -L$(BINRLS) \ | |
223 | + $(LDFLAGS) \ | |
224 | + $(LIBS) \ | |
225 | + -l$(MODULE_NAME) \ | |
226 | + $(GLIB_LIBS) | |
227 | + | |
212 | 228 | |
213 | 229 | #---[ Install Targets ]------------------------------------------------------------------ |
214 | 230 | |
... | ... | @@ -241,7 +257,8 @@ locale: \ |
241 | 257 | |
242 | 258 | Debug: \ |
243 | 259 | $(BINDBG)/@DLLPREFIX@$(MODULE_NAME)@DLLEXT@ \ |
244 | - $(BINDBG)/$(MODULE_NAME)@EXEEXT@ | |
260 | + $(BINDBG)/$(MODULE_NAME)@EXEEXT@ \ | |
261 | + $(BINDBG)/$(PACKAGE_NAME)d@EXEEXT@ | |
245 | 262 | |
246 | 263 | Debug-plugin: \ |
247 | 264 | $(BINDBG)/@DLLPREFIX@$(MODULE_NAME)@DLLEXT@ \ |
... | ... | @@ -250,9 +267,6 @@ Debug-plugin: \ |
250 | 267 | Debug-service: \ |
251 | 268 | $(BINDBG)/$(PACKAGE_NAME)d@EXEEXT@ |
252 | 269 | |
253 | -x: | |
254 | - @echo $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJDBG)/$(SRC).o) | |
255 | - | |
256 | 270 | $(BINDBG)/lib$(MODULE_NAME).a: \ |
257 | 271 | $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJDBG)/$(SRC).o) |
258 | 272 | |
... | ... | @@ -275,7 +289,9 @@ $(BINDBG)/$(MODULE_NAME)@EXEEXT@: \ |
275 | 289 | -Wl,-rpath,$(BINDBG) \ |
276 | 290 | $(LDFLAGS) \ |
277 | 291 | $(LIBS) \ |
278 | - -l$(MODULE_NAME) | |
292 | + -l$(MODULE_NAME) \ | |
293 | + $(V3270_LIBS) \ | |
294 | + $(GTK_LIBS) | |
279 | 295 | |
280 | 296 | $(BINDBG)/$(PACKAGE_NAME)d@EXEEXT@: \ |
281 | 297 | $(foreach SRC, $(basename $(SERVICE_SOURCES)), $(OBJDBG)/$(SRC).o) \ |
... | ... | @@ -285,12 +301,13 @@ $(BINDBG)/$(PACKAGE_NAME)d@EXEEXT@: \ |
285 | 301 | @echo $< ... |
286 | 302 | @$(LD) \ |
287 | 303 | -o $@ \ |
288 | - $^ \ | |
304 | + $(foreach SRC, $(basename $(SERVICE_SOURCES)), $(OBJDBG)/$(SRC).o) \ | |
289 | 305 | -L$(BINDBG) \ |
290 | 306 | -Wl,-rpath,$(BINDBG) \ |
291 | 307 | $(LDFLAGS) \ |
292 | 308 | $(LIBS) \ |
293 | - -l$(MODULE_NAME) | |
309 | + -l$(MODULE_NAME) \ | |
310 | + $(GLIB_LIBS) | |
294 | 311 | |
295 | 312 | run-plugin: \ |
296 | 313 | $(BINDBG)/$(MODULE_NAME)@EXEEXT@ |
... | ... | @@ -298,6 +315,12 @@ run-plugin: \ |
298 | 315 | @LD_LIBRARY_PATH=$(BINDBG) \ |
299 | 316 | $(BINDBG)/$(MODULE_NAME)@EXEEXT@ |
300 | 317 | |
318 | +run-service: \ | |
319 | + $(BINDBG)/$(PACKAGE_NAME)d@EXEEXT@ | |
320 | + | |
321 | + @LD_LIBRARY_PATH=$(BINDBG) \ | |
322 | + $(BINDBG)/$(PACKAGE_NAME)d@EXEEXT@ | |
323 | + | |
301 | 324 | $(BINDBG)/@DLLPREFIX@$(MODULE_NAME)@DLLEXT@: \ |
302 | 325 | $(BINDBG)/@DLLPREFIX@$(MODULE_NAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ |
303 | 326 | ... | ... |
pw3270-plugin-ipc.cbp
... | ... | @@ -96,9 +96,13 @@ |
96 | 96 | <Unit filename="src/plugin/start.c"> |
97 | 97 | <Option compilerVar="CC" /> |
98 | 98 | </Unit> |
99 | + <Unit filename="src/service/private.h" /> | |
99 | 100 | <Unit filename="src/service/service.c"> |
100 | 101 | <Option compilerVar="CC" /> |
101 | 102 | </Unit> |
103 | + <Unit filename="src/service/session.c"> | |
104 | + <Option compilerVar="CC" /> | |
105 | + </Unit> | |
102 | 106 | <Unit filename="src/testprogram/testprogram.c"> |
103 | 107 | <Option compilerVar="CC" /> |
104 | 108 | </Unit> | ... | ... |
... | ... | @@ -0,0 +1,81 @@ |
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 | + #include <config.h> | |
33 | + | |
34 | + #define ERROR_DOMAIN g_quark_from_static_string(PACKAGE_NAME) | |
35 | + | |
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 | + G_BEGIN_DECLS | |
44 | + | |
45 | + #define GLIB_TYPE_SESSION (session_get_type ()) | |
46 | + #define SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLIB_TYPE_SESSION, session)) | |
47 | + #define SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLIB_TYPE_SESSION, sessionClass)) | |
48 | + #define IS_SESSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLIB_TYPE_SESSION)) | |
49 | + #define IS_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLIB_TYPE_SESSION)) | |
50 | + #define SESSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLIB_TYPE_SESSION, sessionClass)) | |
51 | + | |
52 | + typedef struct _session session; | |
53 | + typedef struct _sessionClass sessionClass; | |
54 | + | |
55 | + G_END_DECLS | |
56 | + | |
57 | + | |
58 | + /* | |
59 | + struct session { | |
60 | + unsigned int id; ///< @brief Identificador da sessão. | |
61 | + time_t activity; ///< @brief Timestamp da última atividade dessa sessão. | |
62 | + time_t timeout; ///< @brief Após quantos segundos eu encerro a sessao? | |
63 | + time_t maxidle; ///< @brief Tempo máximo que a sessão pode ficar IDLE | |
64 | + time_t autoclose; ///< @brief Destroi a sessão quantos segundos após a desconexão? | |
65 | + H3270 * host; ///< @brief Sessão TN3270. | |
66 | + }; | |
67 | + */ | |
68 | + | |
69 | + G_GNUC_INTERNAL GMainLoop * main_loop; | |
70 | + | |
71 | + /* | |
72 | + G_GNUC_INTERNAL void init_3270(void); | |
73 | + G_GNUC_INTERNAL void register_3270_io_handlers(void); | |
74 | + | |
75 | + G_GNUC_INTERNAL struct session * session_new(); | |
76 | + G_GNUC_INTERNAL struct session * session_find(const gchar *key); | |
77 | + G_GNUC_INTERNAL void session_destroy(struct session *ses); | |
78 | + G_GNUC_INTERNAL void session_check_for_timeout(void); | |
79 | + */ | |
80 | + | |
81 | +#endif // PRIVATE_H_INCLUDED | ... | ... |
src/service/service.c
... | ... | @@ -26,14 +26,20 @@ |
26 | 26 | * |
27 | 27 | */ |
28 | 28 | |
29 | -#include <config.h> | |
30 | -#include <glib.h> | |
29 | +#include "private.h" | |
31 | 30 | #include <errno.h> |
32 | 31 | #include <string.h> |
32 | +#include <stdlib.h> | |
33 | 33 | #include <lib3270/ipc.h> |
34 | 34 | |
35 | 35 | GMainLoop * main_loop = NULL; |
36 | 36 | |
37 | +#ifdef DEBUG | |
38 | + static gchar * pidfile = PACKAGE_NAME ".pid"; | |
39 | +#else | |
40 | + static gchar * pidfile = "/var/run/" PACKAGE_NAME ".pid"; | |
41 | +#endif // DEBUG | |
42 | + | |
37 | 43 | #if defined( HAVE_SYSLOG ) |
38 | 44 | static void g_syslog(const gchar *log_domain,GLogLevelFlags log_level,const gchar *message,gpointer user_data) |
39 | 45 | { |
... | ... | @@ -95,6 +101,14 @@ static gboolean do_idle_check(G_GNUC_UNUSED gpointer dunno) { |
95 | 101 | return TRUE; |
96 | 102 | } |
97 | 103 | |
104 | +static void cleanup() { | |
105 | + | |
106 | + if(pidfile) { | |
107 | + remove(pidfile); | |
108 | + } | |
109 | + | |
110 | +} | |
111 | + | |
98 | 112 | int main(int argc, char *argv[]) { |
99 | 113 | |
100 | 114 | static gboolean asDaemon = FALSE; |
... | ... | @@ -106,7 +120,7 @@ int main(int argc, char *argv[]) { |
106 | 120 | |
107 | 121 | // Verifica argumentos |
108 | 122 | static const GOptionEntry app_options[] = { |
109 | -// { "pidfile", 'p', 0, G_OPTION_ARG_STRING, &pidfile, "Path to pidfile" , NULL }, | |
123 | + { "pidfile", 'p', 0, G_OPTION_ARG_STRING, &pidfile, "Path to pidfile" , NULL }, | |
110 | 124 | { "daemon", 'd', 0, G_OPTION_ARG_NONE, &asDaemon, "Run as daemon", NULL }, |
111 | 125 | { NULL } |
112 | 126 | }; |
... | ... | @@ -122,16 +136,30 @@ int main(int argc, char *argv[]) { |
122 | 136 | return -1; |
123 | 137 | } |
124 | 138 | |
139 | + atexit(cleanup); | |
140 | + | |
141 | + if(pidfile) { | |
142 | + FILE * hpid = fopen(pidfile,"w"); | |
143 | + if(hpid) { | |
144 | + fprintf(hpid,"%u",(unsigned int) getpid()); | |
145 | + fclose(hpid); | |
146 | + } | |
147 | + } | |
148 | + | |
125 | 149 | #ifndef _WIN32 |
126 | 150 | if(asDaemon && daemon(0,0)) { |
127 | - fprintf(stderr,"%s\n",strerror(errno)); | |
151 | + g_print("%s can't start: %s\n",argv[0],strerror(errno)); | |
128 | 152 | return -1; |
129 | 153 | } |
130 | 154 | #endif // _WIN32 |
131 | 155 | |
156 | + g_print("%s starts\n",argv[0]); | |
157 | + | |
132 | 158 | main_loop = g_main_loop_new(NULL, FALSE); |
133 | 159 | g_main_loop_run(main_loop); |
134 | 160 | |
161 | + g_print("%s ends\n",argv[0]); | |
162 | + | |
135 | 163 | return 0; |
136 | 164 | } |
137 | 165 | ... | ... |
... | ... | @@ -0,0 +1,76 @@ |
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 | + * 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 | +#include "private.h" | |
31 | +#include <lib3270/ipc.h> | |
32 | + | |
33 | +struct _session { | |
34 | + GObject parent; | |
35 | + time_t activity; ///< @brief Timestamp da última atividade dessa sessão. | |
36 | + time_t timeout; ///< @brief Após quantos segundos eu encerro a sessao? | |
37 | + time_t maxidle; ///< @brief Tempo máximo que a sessão pode ficar IDLE | |
38 | + time_t autoclose; ///< @brief Destroi a sessão quantos segundos após a desconexão? | |
39 | +}; | |
40 | + | |
41 | +struct _sessionClass { | |
42 | + GObjectClass parent; | |
43 | +}; | |
44 | + | |
45 | +G_DEFINE_TYPE(session, session, GLIB_TYPE_IPC3270) | |
46 | + | |
47 | +static void session_finalize(GObject *object) { | |
48 | + | |
49 | + lib3270_session_free(ipc3270_get_session(IPC3270(object))); | |
50 | + G_OBJECT_CLASS(session_parent_class)->finalize(object); | |
51 | + | |
52 | +} | |
53 | + | |
54 | +static void session_class_init(sessionClass *klass) { | |
55 | + | |
56 | + debug("%s",__FUNCTION__); | |
57 | + | |
58 | + GObjectClass *object_class; | |
59 | + object_class = G_OBJECT_CLASS (klass); | |
60 | + object_class->finalize = session_finalize; | |
61 | + | |
62 | +} | |
63 | + | |
64 | +static void session_init(session *object) { | |
65 | + | |
66 | + debug("%s",__FUNCTION__); | |
67 | + | |
68 | + ipc3270 *ipc = IPC3270(object); | |
69 | + ipc3270_set_session(ipc,lib3270_session_new(""),PACKAGE_NAME,NULL); | |
70 | + | |
71 | +} | |
72 | + | |
73 | +GObject * session_new() { | |
74 | + return g_object_new(GLIB_TYPE_SESSION, NULL); | |
75 | +} | |
76 | + | ... | ... |