diff --git a/src/plugins/dbus3270/main.c b/src/plugins/dbus3270/main.c index b486bc3..69e1778 100644 --- a/src/plugins/dbus3270/main.c +++ b/src/plugins/dbus3270/main.c @@ -46,6 +46,7 @@ static DBusGConnection * connection = NULL; static DBusGProxy * proxy = NULL; + static gchar * service_name = NULL; /*---[ Implement ]-------------------------------------------------------------------------------*/ @@ -54,8 +55,9 @@ { GError * error = NULL; - gchar * service_path = NULL; guint result; + char session_id = 0; + char id = 'a'; connection = dbus_g_bus_get_private(DBUS_BUS_SESSION, g_main_context_default(), &error); if(error) @@ -81,18 +83,26 @@ proxy = dbus_g_proxy_new_for_name(connection,DBUS_SERVICE_DBUS,DBUS_PATH_DBUS,DBUS_INTERFACE_DBUS); + for(id='a'; id < 'z' && !error && !service_name; id++) { - gchar * service_name = g_strdup_printf("br.com.bb.%s",pw3270_get_session_name(window)); - - service_path = g_strdup_printf("/br/com/bb/%s",pw3270_get_session_name(window)); - - trace("DBUS service path is %s",service_path); - trace("DBUS service name is %s",service_name); - - org_freedesktop_DBus_request_name(proxy, service_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &result, &error); - - g_free(service_name); - + gboolean has_owner = FALSE; + + service_name = g_strdup_printf("br.com.bb.%s.%c",pw3270_get_session_name(window),(int) id); + + org_freedesktop_DBus_name_has_owner(proxy, service_name, &has_owner, NULL); + + if(has_owner) + { + trace("Service \"%s\" has owner",service_name) + g_free(service_name); + service_name = NULL; + } + else + { + session_id = id; + trace("DBUS service name is %s",service_name); + org_freedesktop_DBus_request_name(proxy, service_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &result, &error); + } } if(error) @@ -116,15 +126,32 @@ return -1; } - pw3270_dbus_register_object(connection,proxy,PW3270_TYPE_DBUS,&dbus_glib_pw3270_dbus_object_info,service_path); + if(session_id) + { + gchar * path = g_strdup_printf("/br/com/bb/%s",pw3270_get_session_name(window)); + gchar * session = g_strdup_printf("%s:%c",pw3270_get_session_name(window),g_ascii_toupper(session_id)); + pw3270_set_session_name(window,session); + g_free(session); + + trace("DBUS service path is %s",path); + + pw3270_dbus_register_object(connection,proxy,PW3270_TYPE_DBUS,&dbus_glib_pw3270_dbus_object_info,path); - g_free(service_path); + g_free(path); + } return 0; } LIB3270_EXPORT int pw3270_plugin_deinit(GtkWidget *window) { + if(service_name) + { + // org_freedesktop_DBus_release_name + + g_free(service_name); + service_name = NULL; + } return 0; } diff --git a/src/plugins/dbus3270/test.sh b/src/plugins/dbus3270/test.sh index 3d5c552..959ebce 100755 --- a/src/plugins/dbus3270/test.sh +++ b/src/plugins/dbus3270/test.sh @@ -1,42 +1,96 @@ #!/bin/bash -case $1 in +SESSION=a +DEST=br.com.bb.pw3270 +BPATH=/br/com/bb/pw3270 - revision) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.getRevision - ;; +run_command() +{ - message) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.getMessageID - ;; + case $1 in - connect) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.connect string:$2 - ;; + revision) + dbus-send --session --print-reply --dest=$DEST.$SESSION $BPATH $DEST.getRevision + ;; - disconnect) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.disconnect - ;; + message) + dbus-send --session --print-reply --dest=$DEST.$SESSION $BPATH $DEST.getMessageID + ;; - quit) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.quit - ;; + connect) + dbus-send --session --print-reply --dest=$DEST.$SESSION $BPATH $DEST.connect string:$2 + ;; - get) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.getScreenContents - ;; + disconnect) + dbus-send --session --print-reply --dest=$DEST.$SESSION $BPATH $DEST.disconnect + ;; - set) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.setTextAt int32:$2 int32:$3 string:$4 - ;; + quit) + dbus-send --session --print-reply --dest=$DEST.$SESSION $BPATH $DEST.quit + ;; - enter) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.enter - ;; + get) + dbus-send --session --print-reply --dest=$DEST.$SESSION $BPATH $DEST.getScreenContents + ;; - *) - echo "Comando $1 desconhecido" - ;; + set) + dbus-send --session --print-reply --dest=$DEST.$SESSION $BPATH $DEST.setTextAt int32:$2 int32:$3 string:$4 + ;; -esac + enter) + dbus-send --session --print-reply --dest=$DEST $BPATH $DEST.enter + ;; + + *) + echo "Comando $1 desconhecido" + ;; + + esac +} + + + +until [ -z "$1" ] +do + if [ ${1:0:2} = '--' ]; then + tmp=${1:2} + parameter=${tmp%%=*} + parameter=$(echo $parameter | tr "[:lower:]" "[:upper:]") + value=${tmp##*=} + + case "$parameter" in + SESSION) + SESSION=$value + ;; + HELP) + echo "$0 options" + echo "" + echo "Options:" + echo "" + echo " --session pw3270's session manager" + echo "" + exit 0 + ;; + + *) + eval $parameter=$value + ;; + + esac + + elif [ -d $1 ]; then + + IMGNAME=$1 + + if [ -e $IMGNAME/matriz.conf ]; then + . $IMGNAME/matriz.conf + fi + + else + run_command $@ + exit 0 + fi + + shift +done -- libgit2 0.21.2