diff --git a/client/common/cmdline.c b/client/common/cmdline.c index bcbb7385c..2aab96a72 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -72,6 +72,9 @@ #include #define TAG CLIENT_TAG("common.cmdline") +typedef int (*freerdp_command_line_handle_option_t)(const COMMAND_LINE_ARGUMENT_A* arg, + void* custom); + static const char str_force[] = "force"; static const char* option_starts_with(const char* what, const char* val); @@ -4230,82 +4233,403 @@ static void fill_credential_strings(COMMAND_LINE_ARGUMENT_A* args) } } -static int freerdp_client_settings_parse_command_line_arguments_int( - rdpSettings* settings, int argc, char* argv[], BOOL allowUnknown, - COMMAND_LINE_ARGUMENT_A* largs, size_t count, - int (*handle_option)(const COMMAND_LINE_ARGUMENT_A* arg, void* custom), void* handle_userdata) +static int parse_command_line_option_uint32(rdpSettings* settings, + const COMMAND_LINE_ARGUMENT_A* arg, + FreeRDP_Settings_Keys_UInt32 key, LONGLONG min, + LONGLONG max) +{ + LONGLONG val = 0; + + if (!value_to_int(arg->Value, &val, min, max)) + return fail_at(arg, COMMAND_LINE_ERROR_UNEXPECTED_VALUE); + + if (!freerdp_settings_set_uint32(settings, key, (UINT32)val)) + return fail_at(arg, COMMAND_LINE_ERROR); + return 0; +} + +#if defined(WITH_FREERDP_DEPRECATED_COMMANDLINE) +static int parse_deprecated_command_line(rdpSettings* settings, const COMMAND_LINE_ARGUMENT_A* arg) { - char* user = NULL; int status = 0; - BOOL ext = FALSE; - BOOL assist = FALSE; - DWORD flags = 0; - BOOL promptForPassword = FALSE; - BOOL compatibility = FALSE; - const COMMAND_LINE_ARGUMENT_A* arg = NULL; - /* Command line detection fails if only a .rdp or .msrcIncident file - * is supplied. Check this case first, only then try to detect - * legacy command line syntax. */ - if (argc > 1) + WINPR_ASSERT(settings); + WINPR_ASSERT(arg); + + BOOL enable = arg->Value ? TRUE : FALSE; + CommandLineSwitchStart(arg) CommandLineSwitchCase(arg, "gfx-thin-client") { - ext = option_is_rdp_file(argv[1]); - assist = option_is_incident_file(argv[1]); - } + WLog_WARN(TAG, "/gfx-thin-client is deprecated, use /gfx:thin-client[:on|off] instead"); + if (!freerdp_settings_set_bool(settings, FreeRDP_GfxThinClient, enable)) + return fail_at(arg, COMMAND_LINE_ERROR); - if (!ext && !assist) - compatibility = freerdp_client_detect_command_line(argc, argv, &flags); - else - compatibility = freerdp_client_detect_command_line(argc - 1, &argv[1], &flags); - - if (!freerdp_settings_set_string(settings, FreeRDP_ProxyHostname, NULL)) - return -1; - if (!freerdp_settings_set_string(settings, FreeRDP_ProxyUsername, NULL)) - return -1; - if (!freerdp_settings_set_string(settings, FreeRDP_ProxyPassword, NULL)) - return -1; - - if (compatibility) - { - WLog_WARN(TAG, "Unsupported command line syntax!"); - WLog_WARN(TAG, "FreeRDP 1.0 style syntax was dropped with version 3!"); - return -1; - } - else - { - if (allowUnknown) - flags |= COMMAND_LINE_IGN_UNKNOWN_KEYWORD; - - if (ext) + if (freerdp_settings_get_bool(settings, FreeRDP_GfxThinClient)) { - if (freerdp_client_settings_parse_connection_file(settings, argv[1])) - return COMMAND_LINE_ERROR_UNEXPECTED_VALUE; + if (!freerdp_settings_set_bool(settings, FreeRDP_GfxSmallCache, TRUE)) + return fail_at(arg, COMMAND_LINE_ERROR); } - if (assist) + if (!freerdp_settings_set_bool(settings, FreeRDP_SupportGraphicsPipeline, TRUE)) + return fail_at(arg, COMMAND_LINE_ERROR); + } + CommandLineSwitchCase(arg, "gfx-small-cache") + { + WLog_WARN(TAG, "/gfx-small-cache is deprecated, use /gfx:small-cache[:on|off] instead"); + if (!freerdp_settings_set_bool(settings, FreeRDP_GfxSmallCache, enable)) + return fail_at(arg, COMMAND_LINE_ERROR); + + if (enable) + if (!freerdp_settings_set_bool(settings, FreeRDP_SupportGraphicsPipeline, TRUE)) + return fail_at(arg, COMMAND_LINE_ERROR); + } + CommandLineSwitchCase(arg, "gfx-progressive") + { + WLog_WARN(TAG, "/gfx-progressive is deprecated, use /gfx:progressive[:on|off] instead"); + if (!freerdp_settings_set_bool(settings, FreeRDP_GfxProgressive, enable)) + return fail_at(arg, COMMAND_LINE_ERROR); + if (!freerdp_settings_set_bool(settings, FreeRDP_GfxThinClient, !enable)) + return fail_at(arg, COMMAND_LINE_ERROR); + + if (enable) { - if (freerdp_client_settings_parse_assistance_file(settings, argc, argv) < 0) - return COMMAND_LINE_ERROR_UNEXPECTED_VALUE; + if (!freerdp_settings_set_bool(settings, FreeRDP_SupportGraphicsPipeline, TRUE)) + return fail_at(arg, COMMAND_LINE_ERROR); + } + } +#ifdef WITH_GFX_H264 + CommandLineSwitchCase(arg, "gfx-h264") + { + WLog_WARN(TAG, "/gfx-h264 is deprecated, use /gfx:avc420 instead"); + int rc = parse_gfx_options(settings, arg); + if (rc != 0) + return fail_at(arg, rc); + } +#endif + CommandLineSwitchCase(arg, "app-workdir") + { + WLog_WARN(TAG, + "/app-workdir: is deprecated, use /app:workdir: instead"); + if (!freerdp_settings_set_string(settings, FreeRDP_RemoteApplicationWorkingDir, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_MEMORY); + } + CommandLineSwitchCase(arg, "app-name") + { + WLog_WARN(TAG, "/app-name: is deprecated, use /app:name: instead"); + if (!freerdp_settings_set_string(settings, FreeRDP_RemoteApplicationName, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_MEMORY); + } + CommandLineSwitchCase(arg, "app-icon") + { + WLog_WARN(TAG, "/app-icon: is deprecated, use /app:icon: instead"); + if (!freerdp_settings_set_string(settings, FreeRDP_RemoteApplicationIcon, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_MEMORY); + } + CommandLineSwitchCase(arg, "app-cmd") + { + WLog_WARN(TAG, "/app-cmd: is deprecated, use /app:cmd: instead"); + if (!freerdp_settings_set_string(settings, FreeRDP_RemoteApplicationCmdLine, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_MEMORY); + } + CommandLineSwitchCase(arg, "app-file") + { + WLog_WARN(TAG, "/app-file: is deprecated, use /app:file: instead"); + if (!freerdp_settings_set_string(settings, FreeRDP_RemoteApplicationFile, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_MEMORY); + } + CommandLineSwitchCase(arg, "app-guid") + { + WLog_WARN(TAG, "/app-guid: is deprecated, use /app:guid: instead"); + if (!freerdp_settings_set_string(settings, FreeRDP_RemoteApplicationGuid, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_MEMORY); + } + CommandLineSwitchCase(arg, "g") + { + if (!parse_gateway_host_option(settings, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR); + } + CommandLineSwitchCase(arg, "gu") + { + if (!parse_gateway_cred_option(settings, arg->Value, FreeRDP_GatewayUsername)) + return fail_at(arg, COMMAND_LINE_ERROR_UNEXPECTED_VALUE); + } + CommandLineSwitchCase(arg, "gd") + { + if (!parse_gateway_cred_option(settings, arg->Value, FreeRDP_GatewayDomain)) + return fail_at(arg, COMMAND_LINE_ERROR_UNEXPECTED_VALUE); + } + CommandLineSwitchCase(arg, "gp") + { + if (!parse_gateway_cred_option(settings, arg->Value, FreeRDP_GatewayPassword)) + return fail_at(arg, COMMAND_LINE_ERROR_UNEXPECTED_VALUE); + } + CommandLineSwitchCase(arg, "gt") + { + if (!parse_gateway_type_option(settings, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_UNEXPECTED_VALUE); + } + CommandLineSwitchCase(arg, "gat") + { + if (!freerdp_settings_set_string(settings, FreeRDP_GatewayAccessToken, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_MEMORY); + } + CommandLineSwitchCase(arg, "gateway-usage-method") + { + if (!parse_gateway_usage_option(settings, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_UNEXPECTED_VALUE); + } + CommandLineSwitchCase(arg, "kbd-remap") + { + WLog_WARN(TAG, "/kbd-remap:=,= is deprecated, use " + "/kbd:remap:=,remap:=,... instead"); + if (!freerdp_settings_set_string(settings, FreeRDP_KeyboardRemappingList, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_MEMORY); + } + CommandLineSwitchCase(arg, "kbd-lang") + { + LONGLONG val = 0; + + WLog_WARN(TAG, "/kbd-lang: is deprecated, use /kbd:lang: instead"); + if (!value_to_int(arg->Value, &val, 1, UINT32_MAX)) + { + WLog_ERR(TAG, "Could not identify keyboard active language %s", arg->Value); + WLog_ERR(TAG, "Use /list:kbd-lang to list available layouts"); + return fail_at(arg, COMMAND_LINE_ERROR_UNEXPECTED_VALUE); } - CommandLineClearArgumentsA(largs); - status = CommandLineParseArgumentsA(argc, argv, largs, flags, settings, - freerdp_client_command_line_pre_filter, - freerdp_client_command_line_post_filter); + if (!freerdp_settings_set_uint32(settings, FreeRDP_KeyboardCodePage, (UINT32)val)) + return fail_at(arg, COMMAND_LINE_ERROR); + } + CommandLineSwitchCase(arg, "kbd-type") + { + WLog_WARN(TAG, "/kbd-type: is deprecated, use /kbd:type: instead"); + const int rc = + parse_command_line_option_uint32(settings, arg, FreeRDP_KeyboardType, 0, UINT32_MAX); + if (rc != 0) + return fail_at(arg, rc); + } + CommandLineSwitchCase(arg, "kbd-unicode") + { + WLog_WARN(TAG, "/kbd-unicode is deprecated, use /kbd:unicode[:on|off] instead"); + if (!freerdp_settings_set_bool(settings, FreeRDP_UnicodeInput, enable)) + return fail_at(arg, COMMAND_LINE_ERROR_UNEXPECTED_VALUE); + } + CommandLineSwitchCase(arg, "kbd-subtype") + { + WLog_WARN(TAG, "/kbd-subtype: is deprecated, use /kbd:subtype: instead"); + const int rc = + parse_command_line_option_uint32(settings, arg, FreeRDP_KeyboardSubType, 0, UINT32_MAX); + if (rc != 0) + return fail_at(arg, rc); + } + CommandLineSwitchCase(arg, "kbd-fn-key") + { + WLog_WARN(TAG, "/kbd-fn-key: is deprecated, use /kbd:fn-key: instead"); + const int rc = parse_command_line_option_uint32(settings, arg, FreeRDP_KeyboardFunctionKey, + 0, UINT32_MAX); + if (rc != 0) + return fail_at(arg, rc); + } + CommandLineSwitchCase(arg, "bitmap-cache") + { + WLog_WARN(TAG, "/bitmap-cache is deprecated, use /cache:bitmap[:on|off] instead"); + if (!freerdp_settings_set_bool(settings, FreeRDP_BitmapCacheEnabled, enable)) + return fail_at(arg, COMMAND_LINE_ERROR); + } + CommandLineSwitchCase(arg, "persist-cache") + { + WLog_WARN(TAG, "/persist-cache is deprecated, use /cache:persist[:on|off] instead"); + if (!freerdp_settings_set_bool(settings, FreeRDP_BitmapCachePersistEnabled, enable)) + return fail_at(arg, COMMAND_LINE_ERROR_UNEXPECTED_VALUE); + } + CommandLineSwitchCase(arg, "persist-cache-file") + { + WLog_WARN(TAG, "/persist-cache-file: is deprecated, use " + "/cache:persist-file: instead"); + if (!freerdp_settings_set_string(settings, FreeRDP_BitmapCachePersistFile, arg->Value)) + return fail_at(arg, COMMAND_LINE_ERROR_MEMORY); - if (status < 0) - return status; + if (!freerdp_settings_set_bool(settings, FreeRDP_BitmapCachePersistEnabled, TRUE)) + return fail_at(arg, COMMAND_LINE_ERROR_UNEXPECTED_VALUE); + } + CommandLineSwitchCase(arg, "offscreen-cache") + { + WLog_WARN(TAG, "/bitmap-cache is deprecated, use /cache:bitmap[:on|off] instead"); + if (!freerdp_settings_set_uint32(settings, FreeRDP_OffscreenSupportLevel, (UINT32)enable)) + return fail_at(arg, COMMAND_LINE_ERROR); + } + CommandLineSwitchCase(arg, "glyph-cache") + { + WLog_WARN(TAG, "/glyph-cache is deprecated, use /cache:glyph[:on|off] instead"); + if (!freerdp_settings_set_uint32(settings, FreeRDP_GlyphSupportLevel, + arg->Value ? GLYPH_SUPPORT_FULL : GLYPH_SUPPORT_NONE)) + return fail_at(arg, COMMAND_LINE_ERROR); + } + CommandLineSwitchCase(arg, "codec-cache") + { + WLog_WARN(TAG, "/codec-cache: