Added ConnectionStateChangeEvent for clients
authorArmin Novak <armin.novak@thincast.com>
Mon, 8 Feb 2021 09:41:34 +0000 (10:41 +0100)
committerakallabeth <akallabeth@users.noreply.github.com>
Thu, 25 Feb 2021 08:51:41 +0000 (09:51 +0100)
Clients can now subscribe to connection state change events to
prevend data from being transmitted on sessions being redirected.

(cherry picked from commit 27f6df97783c6f18377f91c9e229cce2b7d6c694)

include/freerdp/event.h
libfreerdp/core/connection.c
libfreerdp/core/rdp.c

index 74346b3..1562362 100644 (file)
@@ -71,6 +71,11 @@ extern "C"
        BOOL firstActivation;
        DEFINE_EVENT_END(Activated)
 
+       DEFINE_EVENT_BEGIN(ConnectionStateChange)
+       int state;
+       BOOL active;
+       DEFINE_EVENT_END(ConnectionStateChange)
+
        DEFINE_EVENT_BEGIN(Terminate)
        int code;
        DEFINE_EVENT_END(Terminate)
index bbc6031..143a1cb 100644 (file)
@@ -1194,6 +1194,14 @@ int rdp_client_transition_to_state(rdpRdp* rdp, int state)
 
                case CONNECTION_STATE_ACTIVE:
                        rdp->state = CONNECTION_STATE_ACTIVE;
+                       {
+                               ActivatedEventArgs activatedEvent;
+                               rdpContext* context = rdp->context;
+                               EventArgsInit(&activatedEvent, "libfreerdp");
+                               activatedEvent.firstActivation = !rdp->deactivation_reactivation;
+                               PubSub_OnActivated(context->pubSub, context, &activatedEvent);
+                       }
+
                        break;
 
                default:
@@ -1201,6 +1209,15 @@ int rdp_client_transition_to_state(rdpRdp* rdp, int state)
                        break;
        }
 
+       {
+               ConnectionStateChangeEventArgs stateEvent;
+               rdpContext* context = rdp->context;
+               EventArgsInit(&stateEvent, "libfreerdp");
+               stateEvent.state = rdp->state;
+               stateEvent.active = rdp->state == CONNECTION_STATE_ACTIVE;
+               PubSub_OnConnectionStateChange(context->pubSub, context, &stateEvent);
+       }
+
        return status;
 }
 
index 090fdd6..7da499e 100644 (file)
@@ -1648,12 +1648,7 @@ int rdp_recv_callback(rdpTransport* transport, wStream* s, void* extra)
 
                        if ((status >= 0) && (rdp->finalize_sc_pdus == FINALIZE_SC_COMPLETE))
                        {
-                               ActivatedEventArgs activatedEvent;
-                               rdpContext* context = rdp->context;
                                rdp_client_transition_to_state(rdp, CONNECTION_STATE_ACTIVE);
-                               EventArgsInit(&activatedEvent, "libfreerdp");
-                               activatedEvent.firstActivation = !rdp->deactivation_reactivation;
-                               PubSub_OnActivated(context->pubSub, context, &activatedEvent);
                                return 2;
                        }