From b9822c0d8eead0386c63dbf1538931484fc3646d Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Thu, 20 Dec 2018 11:17:14 -0200 Subject: [PATCH] Coding the new IPC interface with common code for windows and linux. --- pw3270-plugin-ipc.cbp | 8 ++++++-- src/linux/start.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/private.h | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/testprogram/testprogram.c | 27 +++++++++++++++++---------- 4 files changed, 273 insertions(+), 12 deletions(-) create mode 100644 src/linux/start.c create mode 100644 src/private.h diff --git a/pw3270-plugin-ipc.cbp b/pw3270-plugin-ipc.cbp index c698195..6a309ee 100644 --- a/pw3270-plugin-ipc.cbp +++ b/pw3270-plugin-ipc.cbp @@ -32,11 +32,15 @@ - + - + + + + diff --git a/src/linux/start.c b/src/linux/start.c new file mode 100644 index 0000000..c0e4c0f --- /dev/null +++ b/src/linux/start.c @@ -0,0 +1,178 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob + * o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como testprogram.c e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + + /** + * @brief Plugin startup/stop for linux. + * + */ + + #include "../private.h" + + #ifndef _WIN32 + + #include + #include + + static void pw3270_dbus_cleanup(struct DBusSession * dBus) { + + if(dBus->proxy) { + g_object_unref(dBus); + } + + } + + int pw3270_plugin_start(GtkWidget *window, GtkWidget *terminal) { + + struct DBusSession * dBus = g_new0(struct DBusSession,1); + GError * error = NULL; + int id; + + g_object_set_data_full(G_OBJECT(terminal), "dbus-session-info", dBus, (GDestroyNotify) pw3270_dbus_cleanup); + + dBus->connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); + + if(error) { + GtkWidget *dialog = gtk_message_dialog_new( + GTK_WINDOW(window), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _( "Can't get D-Bus connection" )); + + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); + g_error_free(error); + + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + + return -1; + } + + g_dbus_connection_set_exit_on_close(dBus->connection,FALSE); + + /* + dBus->proxy = g_dbus_proxy_new_sync( + dBus->connection, + G_DBUS_PROXY_FLAGS_NONE, + NULL, // GDBusInterfaceInfo + "br.com.bb." PACKAGE_NAME, // name + "/br/com/bb/" PACKAGE_NAME "/terminal", // object path + "br.com.bb." PACKAGE_NAME ".terminal", // interface + NULL, // GCancellable + &error ); + + if(error) { + + GtkWidget *dialog = gtk_message_dialog_new( + GTK_WINDOW(window), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _( "Can't get D-Bus proxy object" )); + + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); + g_error_free(error); + + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + + return -1; + } + */ + + for(id='a'; id < 'z' && !error && !dBus->proxy; id++) { + + gchar *name = g_strdup_printf("br.com.bb.%s.%c",gtk_widget_get_name(window),id); + + debug("Requesting \"%s\"",name); + + // https://dbus.freedesktop.org/doc/dbus-specification.html + GVariant * response = + g_dbus_connection_call_sync ( + dBus->connection, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS, + "RequestName", + g_variant_new ("(su)", name, DBUS_NAME_FLAG_DO_NOT_QUEUE), + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error + ); + + if(error) { + g_message("Can't request \"%s\": %s",name,error->message); + g_error_free(error); + error = NULL; + } + + if(response) { + + guint32 reply = 0; + g_variant_get(response, "(u)", &reply); + g_variant_unref(response); + + if(reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + + dBus->proxy = g_dbus_proxy_new_sync( + dBus->connection, + G_DBUS_PROXY_FLAGS_NONE, + NULL, // GDBusInterfaceInfo + name, // name + "/br/com/bb/" PACKAGE_NAME "/terminal", // object path + "br.com.bb." PACKAGE_NAME ".terminal", // interface + NULL, // GCancellable + &error ); + + gchar * widget_name = g_strdup_printf("%s:%c",gtk_widget_get_name(window),id); + v3270_set_session_name(terminal, widget_name); + g_free(widget_name); + + g_message("Got %s - %s", name, v3270_get_session_name(terminal)); + + } + + } + + g_free(name); + + } + + + return 0; + + } + + #endif // !_WIN32 + + diff --git a/src/private.h b/src/private.h new file mode 100644 index 0000000..f2484c6 --- /dev/null +++ b/src/private.h @@ -0,0 +1,72 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob + * o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + /** + * @brief Private definitions for pw3270 IPC plugin. + * + */ + +#ifndef PRIVATE_H_INCLUDED + + #define PRIVATE_H_INCLUDED + + #define PACKAGE_NAME "pw3270" + + #include + #include + #include + #include + + #include + + #ifdef _WIN32 + + #include + + #else + + G_GNUC_INTERNAL struct DBusSession { + GDBusConnection * connection; + GDBusProxy * proxy; + } dBus; + + #endif // _WIN32 + + #ifdef DEBUG + #define debug( fmt, ... ) fprintf(stderr,"%s(%d) " fmt "\n", __FILE__, (int) __LINE__, __VA_ARGS__ ); fflush(stderr); + #else + #define debug(...) /* __VA_ARGS */ + #endif + + + int pw3270_plugin_start(GtkWidget *window, GtkWidget *terminal); + int pw3270_plugin_stop(GtkWidget *window, GtkWidget *terminal); + +#endif // PRIVATE_H_INCLUDED diff --git a/src/testprogram/testprogram.c b/src/testprogram/testprogram.c index aac4157..37287e2 100644 --- a/src/testprogram/testprogram.c +++ b/src/testprogram/testprogram.c @@ -28,9 +28,13 @@ * */ - #include - #include - #include + + /** + * @brief Test program for pw3270 IPC plugin. + * + */ + + #include "../private.h" #include /*---[ Implement ]----------------------------------------------------------------------------------*/ @@ -39,7 +43,16 @@ static void activate(GtkApplication* app, gpointer user_data) { GtkWidget * window = gtk_application_window_new(app); GtkWidget * terminal = v3270_new(); - gchar * filename = NULL; + + gtk_widget_set_name(window,"pw3270"); + + // Setup and show window + gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); + gtk_window_set_default_size (GTK_WINDOW (window), 800, 500); + gtk_container_add(GTK_CONTAINER(window),terminal); + gtk_widget_show_all (window); + + pw3270_plugin_start(window, terminal); const gchar *url = getenv("LIB3270_DEFAULT_HOST"); if(url) { @@ -56,12 +69,6 @@ static void activate(GtkApplication* app, gpointer user_data) { } - // Setup and show window - gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); - gtk_window_set_default_size (GTK_WINDOW (window), 800, 500); - gtk_container_add(GTK_CONTAINER(window),terminal); - gtk_widget_show_all (window); - } int main (int argc, char **argv) { -- libgit2 0.21.2