5#include <freerdp/freerdp.h>
6#include <freerdp/client.h>
7#include <freerdp/transport_io.h>
11static size_t s_attempts = 0;
12static UINT32 s_connectError = FREERDP_ERROR_SUCCESS;
16static int test_tcp_connect(rdpContext* context, WINPR_ATTR_UNUSED rdpSettings* settings,
17 WINPR_ATTR_UNUSED
const char* hostname, WINPR_ATTR_UNUSED
int port,
18 WINPR_ATTR_UNUSED DWORD timeout)
20 freerdp_set_last_error_log(context, s_connectError);
25static SSIZE_T test_retry_dialog(WINPR_ATTR_UNUSED freerdp* instance,
26 WINPR_ATTR_UNUSED
const char* what,
size_t current,
27 WINPR_ATTR_UNUSED
void* userarg)
29 s_attempts = current + 1;
34static BOOL test_reconnect(UINT32 connectError,
size_t expectedAttempts)
37 RDP_CLIENT_ENTRY_POINTS clientEntryPoints = WINPR_C_ARRAY_INIT;
38 clientEntryPoints.Size =
sizeof(RDP_CLIENT_ENTRY_POINTS);
39 clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION;
40 clientEntryPoints.ContextSize =
sizeof(rdpClientContext);
42 rdpContext* context = freerdp_client_context_new(&clientEntryPoints);
47 s_connectError = connectError;
48 context->instance->RetryDialog = test_retry_dialog;
50 rdpSettings* settings = context->settings;
56 const rdpTransportIo* defaultIo = freerdp_get_io_callbacks(context);
59 rdpTransportIo io = *defaultIo;
60 io.TCPConnect = test_tcp_connect;
61 if (!freerdp_set_io_callbacks(context, &io))
64 if (client_auto_reconnect_ex(context->instance,
nullptr))
66 (void)fprintf(stderr,
"[%s] reconnect succeeded\n",
67 freerdp_get_last_error_name(connectError));
71 if (s_attempts != expectedAttempts)
73 (void)fprintf(stderr,
"[%s] expected %" PRIuz
" attempts, got %" PRIuz
"\n",
74 freerdp_get_last_error_name(connectError), expectedAttempts, s_attempts);
78 const UINT32 lastError = freerdp_get_last_error(context);
79 if (lastError != connectError)
81 (void)fprintf(stderr,
"[%s] last error is %s\n", freerdp_get_last_error_name(connectError),
82 freerdp_get_last_error_name(lastError));
88 freerdp_client_context_free(context);
92int TestClientAutoReconnect(
int argc,
char* argv[])
98 if (!test_reconnect(FREERDP_ERROR_CONNECT_FAILED, MAX_RETRIES))
102 const UINT32 rejected[] = { FREERDP_ERROR_CONNECT_LOGON_FAILURE,
103 FREERDP_ERROR_CONNECT_WRONG_PASSWORD,
104 FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT };
105 for (
size_t x = 0; x < ARRAYSIZE(rejected); x++)
107 if (!test_reconnect(rejected[x], 1))
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL val)
Sets a BOOL settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 val)
Sets a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_string(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *val)
Sets a string settings value. The param is copied.