19#include <winpr/stream.h>
21#include <freerdp/peer.h>
22#include <freerdp/transport_io.h>
27#define TPKT_X224_HEADER_LENGTH 7
28#define DISCONNECT_PROVIDER_ULTIMATUM_LENGTH 9
30static BYTE captured[DISCONNECT_PROVIDER_ULTIMATUM_LENGTH] = WINPR_C_ARRAY_INIT;
31static size_t capturedLength = 0;
33static int capture_write_pdu(WINPR_ATTR_UNUSED rdpTransport* transport,
wStream* s)
35 const size_t length = Stream_GetPosition(s);
36 if (length >
sizeof(captured))
39 memcpy(captured, Stream_Buffer(s), length);
40 capturedLength = length;
46static BOOL test_disconnect_provider_ultimatum(rdpMcs* mcs,
enum Disconnect_Ultimatum reason,
50 if (!mcs_send_disconnect_provider_ultimatum(mcs, reason))
52 (void)fprintf(stderr,
"failed to send reason %d\n", reason);
56 if (capturedLength != DISCONNECT_PROVIDER_ULTIMATUM_LENGTH)
58 (void)fprintf(stderr,
"reason %d: unexpected length %" PRIuz
"\n", reason, capturedLength);
62 if ((captured[TPKT_X224_HEADER_LENGTH] != b1) || (captured[TPKT_X224_HEADER_LENGTH + 1] != b2))
65 "reason %d: got %02" PRIx8
" %02" PRIx8
", expected %02" PRIx8
" %02" PRIx8
67 reason, captured[TPKT_X224_HEADER_LENGTH],
68 captured[TPKT_X224_HEADER_LENGTH + 1], b1, b2);
72 wStream sbuffer = WINPR_C_ARRAY_INIT;
73 wStream* s = Stream_StaticConstInit(&sbuffer, captured, capturedLength);
74 if (!Stream_SetPosition(s, TPKT_X224_HEADER_LENGTH + 1))
78 if (!mcs_recv_disconnect_provider_ultimatum(mcs, s, &decoded))
80 (void)fprintf(stderr,
"failed to receive reason %d\n", reason);
84 if (decoded != (
int)reason)
86 (void)fprintf(stderr,
"reason %d decoded as %d\n", reason, decoded);
93int TestMcs(WINPR_ATTR_UNUSED
int argc, WINPR_ATTR_UNUSED
char* argv[])
97 freerdp_peer* client = calloc(1,
sizeof(freerdp_peer));
101 client->ContextSize =
sizeof(rdpContext);
102 if (!freerdp_peer_context_new(client))
106 const rdpTransportIo* io = freerdp_get_io_callbacks(client->context);
110 rdpTransportIo capture = *io;
111 capture.WritePdu = capture_write_pdu;
112 if (!freerdp_set_io_callbacks(client->context, &capture))
117 rdpMcs* mcs = client->context->rdp->mcs;
118 if (!test_disconnect_provider_ultimatum(mcs, Disconnect_Ultimatum_domain_disconnected, 0x20,
121 if (!test_disconnect_provider_ultimatum(mcs, Disconnect_Ultimatum_provider_initiated, 0x20,
124 if (!test_disconnect_provider_ultimatum(mcs, Disconnect_Ultimatum_token_purged, 0x21, 0x00))
126 if (!test_disconnect_provider_ultimatum(mcs, Disconnect_Ultimatum_user_requested, 0x21,
129 if (!test_disconnect_provider_ultimatum(mcs, Disconnect_Ultimatum_channel_purged, 0x22,
136 freerdp_peer_context_free(client);