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