From b169dfd9309bd8a7f236056c2b0bdad575af6263 Mon Sep 17 00:00:00 2001 From: "zihao.jiang" Date: Thu, 9 Apr 2015 01:37:41 +0800 Subject: [PATCH] server/shadow: add connect/disconnect anchor in subsystem callback Other implementation of subsystem may want to track connect/disconnect of each client --- include/freerdp/server/shadow.h | 4 ++++ server/shadow/shadow_client.c | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/include/freerdp/server/shadow.h b/include/freerdp/server/shadow.h index eb8233a04..64a134e40 100644 --- a/include/freerdp/server/shadow.h +++ b/include/freerdp/server/shadow.h @@ -64,6 +64,8 @@ typedef int (*pfnShadowEnumMonitors)(MONITOR_DEF* monitors, int maxMonitors); typedef int (*pfnShadowAuthenticate)(rdpShadowSubsystem* subsystem, const char* user, const char* domain, const char* password); +typedef int (*pfnShadowClientConnect)(rdpShadowSubsystem* subsystem, freerdp_peer* peer); +typedef void (*pfnShadowClientDisconnect)(rdpShadowSubsystem* subsystem, freerdp_peer* peer); typedef int (*pfnShadowSynchronizeEvent)(rdpShadowSubsystem* subsystem, UINT32 flags); typedef int (*pfnShadowKeyboardEvent)(rdpShadowSubsystem* subsystem, UINT16 flags, UINT16 code); @@ -158,6 +160,8 @@ struct _RDP_SHADOW_ENTRY_POINTS pfnShadowExtendedMouseEvent ExtendedMouseEvent; \ \ pfnShadowAuthenticate Authenticate; \ + pfnShadowClientConnect ClientConnect; \ + pfnShadowClientDisconnect ClientDisconnect; \ \ rdpShadowServer* server diff --git a/server/shadow/shadow_client.c b/server/shadow/shadow_client.c index e332688d9..a39e0463d 100644 --- a/server/shadow/shadow_client.c +++ b/server/shadow/shadow_client.c @@ -248,6 +248,14 @@ BOOL shadow_client_post_connect(freerdp_peer* peer) } } + if (subsystem->ClientConnect) + { + if (subsystem->ClientConnect(subsystem, peer)) + return TRUE; + else + return FALSE; + } + return TRUE; } @@ -1074,6 +1082,11 @@ void* shadow_client_thread(rdpShadowClient* client) UpdateSubscriber = NULL; } + if (peer->connected && subsystem->ClientDisconnect) + { + subsystem->ClientDisconnect(subsystem, peer); + } + out: peer->Disconnect(peer);