Coverage Report

Created: 2026-10-15 06:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}