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 | + | ... | ... |