/src/FreeRDP/channels/rail/client/client_rails.c
Line | Count | Source |
1 | | |
2 | | #include <winpr/cast.h> |
3 | | |
4 | | #include <freerdp/freerdp.h> |
5 | | #include <freerdp/client/rail.h> |
6 | | |
7 | | #include "rail_main.h" |
8 | | |
9 | | UINT rail_send_client_status(RailClientContext* context) |
10 | 0 | { |
11 | 0 | WINPR_ASSERT(context); |
12 | 0 | railPlugin* rail = context->handle; |
13 | 0 | WINPR_ASSERT(rail); |
14 | 0 | WINPR_ASSERT(rail->rdpcontext); |
15 | 0 | const rdpSettings* settings = rail->rdpcontext->settings; |
16 | 0 | WINPR_ASSERT(settings); |
17 | 0 | RAIL_CLIENT_STATUS_ORDER clientStatus = { .flags = freerdp_settings_get_uint32( |
18 | 0 | settings, FreeRDP_RemoteAppFeatureFlags) }; |
19 | 0 | if (freerdp_settings_get_bool(settings, FreeRDP_AutoReconnectionEnabled)) |
20 | 0 | clientStatus.flags |= TS_RAIL_CLIENTSTATUS_AUTORECONNECT; |
21 | 0 | else |
22 | 0 | clientStatus.flags &= ~TS_RAIL_CLIENTSTATUS_AUTORECONNECT; |
23 | 0 | return context->ClientInformation(context, &clientStatus); |
24 | 0 | } |
25 | | UINT client_rail_server_start_cmd(RailClientContext* context) |
26 | 0 | { |
27 | 0 | WINPR_ASSERT(context); |
28 | 0 | railPlugin* rail = context->handle; |
29 | 0 | WINPR_ASSERT(rail); |
30 | 0 | WINPR_ASSERT(rail->rdpcontext); |
31 | 0 | const rdpSettings* settings = rail->rdpcontext->settings; |
32 | 0 | WINPR_ASSERT(settings); |
33 | 0 | UINT status = rail_send_client_status(context); |
34 | 0 | if (status != CHANNEL_RC_OK) |
35 | 0 | return status; |
36 | | |
37 | 0 | if (freerdp_settings_get_bool(settings, FreeRDP_RemoteAppLanguageBarSupported)) |
38 | 0 | { |
39 | 0 | RAIL_LANGBAR_INFO_ORDER langBarInfo; |
40 | 0 | langBarInfo.languageBarStatus = 0x00000008; /* TF_SFT_HIDDEN */ |
41 | 0 | status = context->ClientLanguageBarInfo(context, &langBarInfo); |
42 | | |
43 | | /* We want the language bar, but the server might not support it. */ |
44 | 0 | switch (status) |
45 | 0 | { |
46 | 0 | case CHANNEL_RC_OK: |
47 | 0 | case ERROR_BAD_CONFIGURATION: |
48 | 0 | break; |
49 | 0 | default: |
50 | 0 | return status; |
51 | 0 | } |
52 | 0 | } |
53 | | |
54 | 0 | const UINT32 w = freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth); |
55 | 0 | const UINT32 h = freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight); |
56 | |
|
57 | 0 | const RAIL_SYSPARAM_ORDER sysparam = { |
58 | 0 | .params = SPI_MASK_SET_HIGH_CONTRAST | SPI_MASK_SET_MOUSE_BUTTON_SWAP | |
59 | 0 | SPI_MASK_SET_KEYBOARD_PREF | SPI_MASK_SET_DRAG_FULL_WINDOWS | |
60 | 0 | SPI_MASK_SET_KEYBOARD_CUES | SPI_MASK_SET_WORK_AREA, |
61 | 0 | .highContrast.flags = 0x7E, |
62 | 0 | .workArea.right = WINPR_ASSERTING_INT_CAST(UINT16, w), |
63 | 0 | .workArea.bottom = WINPR_ASSERTING_INT_CAST(UINT16, h) |
64 | 0 | }; |
65 | |
|
66 | 0 | status = context->ClientSystemParam(context, &sysparam); |
67 | |
|
68 | 0 | if (status != CHANNEL_RC_OK) |
69 | 0 | return status; |
70 | | |
71 | 0 | const char* RemoteApplicationFile = |
72 | 0 | freerdp_settings_get_string(settings, FreeRDP_RemoteApplicationFile); |
73 | 0 | const char* RemoteApplicationCmdLine = |
74 | 0 | freerdp_settings_get_string(settings, FreeRDP_RemoteApplicationCmdLine); |
75 | |
|
76 | 0 | char argsAndFile[520] = WINPR_C_ARRAY_INIT; |
77 | 0 | RAIL_EXEC_ORDER exec = WINPR_C_ARRAY_INIT; |
78 | 0 | if (RemoteApplicationFile && RemoteApplicationCmdLine) |
79 | 0 | { |
80 | 0 | (void)_snprintf(argsAndFile, ARRAYSIZE(argsAndFile), "%s %s", RemoteApplicationCmdLine, |
81 | 0 | RemoteApplicationFile); |
82 | 0 | exec.RemoteApplicationArguments = argsAndFile; |
83 | 0 | } |
84 | 0 | else if (RemoteApplicationFile) |
85 | 0 | exec.RemoteApplicationArguments = RemoteApplicationFile; |
86 | 0 | else |
87 | 0 | exec.RemoteApplicationArguments = RemoteApplicationCmdLine; |
88 | 0 | exec.RemoteApplicationProgram = |
89 | 0 | freerdp_settings_get_string(settings, FreeRDP_RemoteApplicationProgram); |
90 | 0 | exec.RemoteApplicationWorkingDir = |
91 | 0 | freerdp_settings_get_string(settings, FreeRDP_ShellWorkingDirectory); |
92 | 0 | return context->ClientExecute(context, &exec); |
93 | 0 | } |