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