5#include <freerdp/freerdp.h>
6#include <freerdp/client.h>
7#include <freerdp/transport_io.h>
9#include "../connection.h"
11static rdpContext* s_context =
nullptr;
12static pTransportFkt s_defaultDisconnect =
nullptr;
13static size_t s_disconnects = 0;
14static size_t s_activeDisconnects = 0;
19static BOOL test_transport_disconnect(rdpTransport* transport)
22 if (freerdp_is_active_state(s_context))
23 s_activeDisconnects++;
25 return s_defaultDisconnect(transport);
28int TestDisconnect(
int argc,
char* argv[])
34 RDP_CLIENT_ENTRY_POINTS clientEntryPoints = WINPR_C_ARRAY_INIT;
35 clientEntryPoints.Size =
sizeof(RDP_CLIENT_ENTRY_POINTS);
36 clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION;
37 clientEntryPoints.ContextSize =
sizeof(rdpClientContext);
39 s_context = freerdp_client_context_new(&clientEntryPoints);
43 const rdpTransportIo* defaultIo = freerdp_get_io_callbacks(s_context);
46 rdpTransportIo io = *defaultIo;
47 s_defaultDisconnect = io.TransportDisconnect;
48 io.TransportDisconnect = test_transport_disconnect;
49 if (!freerdp_set_io_callbacks(s_context, &io))
52 if (!rdp_client_transition_to_state(s_context->rdp, CONNECTION_STATE_ACTIVE))
55 if (!rdp_client_disconnect(s_context->rdp))
58 if (s_disconnects == 0)
60 (void)fprintf(stderr,
"the transport was not disconnected\n");
64 if (s_activeDisconnects != 0)
67 "%" PRIuz
" of %" PRIuz
" transport disconnects ran in the active state\n",
68 s_activeDisconnects, s_disconnects);
74 freerdp_client_context_free(s_context);