From 089758f967aefb7159423b2a76eab3f71b75a471 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 25 Jan 2026 07:35:08 +0100 Subject: [PATCH 1/7] [crypto] adjust deprecation warning due to new API functions next release will be 3.22.0 --- include/freerdp/crypto/der.h | 18 +++++------ include/freerdp/crypto/er.h | 58 ++++++++++++++++++------------------ 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/include/freerdp/crypto/der.h b/include/freerdp/crypto/der.h index 70d5ed2ed..9c5423c6a 100644 --- a/include/freerdp/crypto/der.h +++ b/include/freerdp/crypto/der.h @@ -31,18 +31,18 @@ extern "C" #endif // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp) - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int _der_skip_length(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int der_write_length(wStream* s, int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int der_get_content_length(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int der_skip_octet_string(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int der_skip_sequence_tag(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int _der_skip_length(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int der_write_length(wStream* s, int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int der_get_content_length(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int der_skip_octet_string(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int der_skip_sequence_tag(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int der_write_sequence_tag(wStream* s, int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int der_skip_contextual_tag(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int der_skip_contextual_tag(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int der_write_contextual_tag(wStream* s, BYTE tag, int length, BOOL pc)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API void der_write_octet_string(wStream* s, BYTE* oct_str, int length)); diff --git a/include/freerdp/crypto/er.h b/include/freerdp/crypto/er.h index fc1096e3b..196bafdec 100644 --- a/include/freerdp/crypto/er.h +++ b/include/freerdp/crypto/er.h @@ -63,65 +63,65 @@ extern "C" { #endif - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API void er_read_length(wStream* s, int* length)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API void er_read_length(wStream* s, int* length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_write_length(wStream* s, int length, BOOL flag)); // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp) - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int _er_skip_length(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int er_get_content_length(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int _er_skip_length(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_get_content_length(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_read_universal_tag(wStream* s, BYTE tag, BOOL pc)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API void er_write_universal_tag(wStream* s, BYTE tag, BOOL pc)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_read_application_tag(wStream* s, BYTE tag, int* length)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API void er_write_application_tag(wStream* s, BYTE tag, int length, BOOL flag)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_read_enumerated(wStream* s, BYTE* enumerated, BYTE count)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API void er_write_enumerated(wStream* s, BYTE enumerated, BYTE count, BOOL flag)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_read_contextual_tag(wStream* s, BYTE tag, int* length, BOOL pc)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_write_contextual_tag(wStream* s, BYTE tag, int length, BOOL pc, BOOL flag)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int er_skip_contextual_tag(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_skip_contextual_tag(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_read_sequence_tag(wStream* s, int* length)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_write_sequence_tag(wStream* s, int length, BOOL flag)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int er_skip_sequence(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int er_skip_sequence_tag(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_skip_sequence(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_skip_sequence_tag(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_read_bit_string(wStream* s, int* length, BYTE* padding)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_write_bit_string_tag(wStream* s, UINT32 length, BYTE padding, BOOL flag)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_read_octet_string(wStream* s, int* length)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API void er_write_octet_string(wStream* s, BYTE* oct_str, int length, BOOL flag)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_write_octet_string_tag(wStream* s, int length, BOOL flag)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int er_skip_octet_string(int length)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API BOOL er_read_BOOL(wStream* s, BOOL* value)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API void er_write_BOOL(wStream* s, BOOL value)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_skip_octet_string(int length)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_read_BOOL(wStream* s, BOOL* value)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API void er_write_BOOL(wStream* s, BOOL value)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_read_integer(wStream* s, UINT32* value)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int er_write_integer(wStream* s, INT32 value)); - WINPR_DEPRECATED_VAR("since 3.21.1", + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_write_integer(wStream* s, INT32 value)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API BOOL er_read_integer_length(wStream* s, int* length)); - WINPR_DEPRECATED_VAR("since 3.21.1", FREERDP_API int er_skip_integer(INT32 value)); + WINPR_DEPRECATED_VAR("since 3.22.0", FREERDP_API int er_skip_integer(INT32 value)); #ifdef __cplusplus } From a8ca59e2909597a601cb656149eba17d57693d06 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 25 Jan 2026 07:50:34 +0100 Subject: [PATCH 2/7] [channels,disp] Unify definitions and add stringify * Unify FreeRDP_DesktopRotationFlags definitions (needed in settings and display channel) * Add stringify function for the flags --- include/freerdp/channels/disp.h | 4 ---- include/freerdp/settings_types.h | 11 +++++++---- include/freerdp/utils/string.h | 9 +++++++++ libfreerdp/utils/string.c | 19 +++++++++++++++++++ 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/include/freerdp/channels/disp.h b/include/freerdp/channels/disp.h index 8e08bf263..9d66363e7 100644 --- a/include/freerdp/channels/disp.h +++ b/include/freerdp/channels/disp.h @@ -30,10 +30,6 @@ #define DISP_CHANNEL_NAME "disp" #define DISP_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::DisplayControl" -#define ORIENTATION_LANDSCAPE 0 -#define ORIENTATION_PORTRAIT 90 -#define ORIENTATION_LANDSCAPE_FLIPPED 180 -#define ORIENTATION_PORTRAIT_FLIPPED 270 #define DISPLAY_CONTROL_MONITOR_PRIMARY 0x00000001 #define DISPLAY_CONTROL_HEADER_LENGTH 0x00000008 diff --git a/include/freerdp/settings_types.h b/include/freerdp/settings_types.h index 33f426cc9..8c5947c92 100644 --- a/include/freerdp/settings_types.h +++ b/include/freerdp/settings_types.h @@ -326,10 +326,13 @@ extern "C" #define PACKET_COMPR_TYPE_RDP8 0x04 /* Desktop Rotation Flags */ -#define ORIENTATION_LANDSCAPE 0 -#define ORIENTATION_PORTRAIT 90 -#define ORIENTATION_LANDSCAPE_FLIPPED 180 -#define ORIENTATION_PORTRAIT_FLIPPED 270 +enum FreeRDP_DesktopRotationFlags +{ + ORIENTATION_LANDSCAPE = 0, + ORIENTATION_PORTRAIT = 90, + ORIENTATION_LANDSCAPE_FLIPPED = 180, + ORIENTATION_PORTRAIT_FLIPPED = 270 +}; /* Clipboard feature mask */ #define CLIPRDR_FLAG_LOCAL_TO_REMOTE 0x01 diff --git a/include/freerdp/utils/string.h b/include/freerdp/utils/string.h index 41f28ec05..097e2dc2a 100644 --- a/include/freerdp/utils/string.h +++ b/include/freerdp/utils/string.h @@ -47,6 +47,15 @@ extern "C" */ FREERDP_API BOOL freerdp_extract_key_value(const char* str, UINT32* pkey, UINT32* pvalue); + /** @brief Convert \ref FreeRDP_DesktopRotationFlags to string + * + * @param flags The value to convert + * @return A constant string representation of \ref flags or the string \b ORIENTATION_UNKNOWN + * for an invalid value + * @since verstion 3.22.0 + */ + FREERDP_API WINPR_ATTR_NODISCARD const char* + freerdp_desktop_rotation_flags_to_string(UINT32 flags); #ifdef __cplusplus } #endif diff --git a/libfreerdp/utils/string.c b/libfreerdp/utils/string.c index f7c97e206..a55a99b0f 100644 --- a/libfreerdp/utils/string.c +++ b/libfreerdp/utils/string.c @@ -126,3 +126,22 @@ BOOL freerdp_extract_key_value(const char* str, UINT32* pkey, UINT32* pvalue) *pvalue = (UINT32)val; return TRUE; } + +const char* freerdp_desktop_rotation_flags_to_string(UINT32 flags) +{ +#define ENTRY(x) \ + case x: \ + return #x + + switch (flags) + { + ENTRY(ORIENTATION_LANDSCAPE); + ENTRY(ORIENTATION_PORTRAIT); + ENTRY(ORIENTATION_LANDSCAPE_FLIPPED); + ENTRY(ORIENTATION_PORTRAIT_FLIPPED); + default: + return "ORIENTATION_UNKNOWN"; + } +#undef ENTRY +} + From d4ae1a546faf0fd72a860e9698c4e1091ef9f9e6 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 25 Jan 2026 07:55:37 +0100 Subject: [PATCH 3/7] [client,common] add FREERDP_TOUCH_CANCEL * Add flag FREERDP_TOUCH_CANCEL * Add function freerdp_handle_touch_cancel --- client/common/client.c | 38 ++++++++++++++++++++++++++++++++++++++ include/freerdp/client.h | 1 + 2 files changed, 39 insertions(+) diff --git a/client/common/client.c b/client/common/client.c index 947a1a9bc..07b3324b8 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -1993,6 +1993,42 @@ static BOOL freerdp_handle_touch_motion(rdpClientContext* cctx, const FreeRDP_To #endif } +static BOOL freerdp_handle_touch_cancel(rdpClientContext* cctx, const FreeRDP_TouchContact* contact) +{ + WINPR_ASSERT(cctx); + WINPR_ASSERT(contact); + +#if defined(CHANNEL_RDPEI_CLIENT) + RdpeiClientContext* rdpei = cctx->rdpei; + + if (!rdpei) + return freerdp_handle_touch_to_mouse(cctx, false, contact); + + int contactId = 0; + + if (rdpei->TouchRawEvent) + { + const UINT32 flags = RDPINPUT_CONTACT_FLAG_UPDATE | RDPINPUT_CONTACT_FLAG_CANCELED; + const UINT32 contactFlags = ((contact->flags & FREERDP_TOUCH_HAS_PRESSURE) != 0) + ? CONTACT_DATA_PRESSURE_PRESENT + : 0; + rdpei->TouchRawEvent(rdpei, contact->id, contact->x, contact->y, &contactId, flags, + contactFlags, contact->pressure); + } + else + { + WINPR_ASSERT(rdpei->TouchUpdate); + rdpei->TouchEnd(rdpei, contact->id, contact->x, contact->y, &contactId); + } + + return TRUE; +#else + WLog_WARN(TAG, "Touch event detected but RDPEI support not compiled in. Recompile with " + "-DCHANNEL_RDPEI_CLIENT=ON"); + return freerdp_handle_touch_to_mouse(cctx, false, contact); +#endif +} + static BOOL freerdp_client_touch_update(rdpClientContext* cctx, UINT32 flags, INT32 touchId, UINT32 pressure, INT32 x, INT32 y, FreeRDP_TouchContact* pcontact) @@ -2047,6 +2083,8 @@ BOOL freerdp_client_handle_touch(rdpClientContext* cctx, UINT32 flags, INT32 fin return freerdp_handle_touch_up(cctx, &contact); case FREERDP_TOUCH_MOTION: return freerdp_handle_touch_motion(cctx, &contact); + case FREERDP_TOUCH_CANCEL: + return freerdp_handle_touch_cancel(cctx, &contact); default: WLog_WARN(TAG, "Unhandled FreeRDPTouchEventType %" PRIu32 ", ignoring", flags); return FALSE; diff --git a/include/freerdp/client.h b/include/freerdp/client.h index 74d73eb12..ca8908c79 100644 --- a/include/freerdp/client.h +++ b/include/freerdp/client.h @@ -264,6 +264,7 @@ extern "C" FREERDP_TOUCH_DOWN = 0x01, FREERDP_TOUCH_UP = 0x02, FREERDP_TOUCH_MOTION = 0x04, + FREERDP_TOUCH_CANCEL = 0x08, /** @since version 3.22.0 */ FREERDP_TOUCH_HAS_PRESSURE = 0x100 } FreeRDPTouchEventType; From 6673e8a86f151e0d87fe8146031e945eab28b249 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 25 Jan 2026 07:58:16 +0100 Subject: [PATCH 4/7] [core,utils] add freerdp_input_touch_state_string * Add freerdp_input_touch_state_string * Remove duplicate from xfreerdp --- client/X11/xf_input.c | 20 -------------------- include/freerdp/utils/string.h | 10 ++++++++++ libfreerdp/utils/string.c | 26 ++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/client/X11/xf_input.c b/client/X11/xf_input.c index f968bb8df..27245c660 100644 --- a/client/X11/xf_input.c +++ b/client/X11/xf_input.c @@ -569,26 +569,6 @@ static int xf_input_handle_event_local(xfContext* xfc, const XEvent* event) return 0; } -#ifdef WITH_DEBUG_X11 -static char* xf_input_touch_state_string(DWORD flags) -{ - if (flags & RDPINPUT_CONTACT_FLAG_DOWN) - return "RDPINPUT_CONTACT_FLAG_DOWN"; - else if (flags & RDPINPUT_CONTACT_FLAG_UPDATE) - return "RDPINPUT_CONTACT_FLAG_UPDATE"; - else if (flags & RDPINPUT_CONTACT_FLAG_UP) - return "RDPINPUT_CONTACT_FLAG_UP"; - else if (flags & RDPINPUT_CONTACT_FLAG_INRANGE) - return "RDPINPUT_CONTACT_FLAG_INRANGE"; - else if (flags & RDPINPUT_CONTACT_FLAG_INCONTACT) - return "RDPINPUT_CONTACT_FLAG_INCONTACT"; - else if (flags & RDPINPUT_CONTACT_FLAG_CANCELED) - return "RDPINPUT_CONTACT_FLAG_CANCELED"; - else - return "RDPINPUT_CONTACT_FLAG_UNKNOWN"; -} -#endif - static void xf_input_hide_cursor(xfContext* xfc) { #ifdef WITH_XCURSOR diff --git a/include/freerdp/utils/string.h b/include/freerdp/utils/string.h index 097e2dc2a..690e51021 100644 --- a/include/freerdp/utils/string.h +++ b/include/freerdp/utils/string.h @@ -56,6 +56,16 @@ extern "C" */ FREERDP_API WINPR_ATTR_NODISCARD const char* freerdp_desktop_rotation_flags_to_string(UINT32 flags); + + /** @brief Convert a single \ref RDPINPUT_CONTACT_FLAGS to string + * + * @param flags The value to convert + * @return A constant string representation of \ref flag or the string \b + * RDPINPUT_CONTACT_FLAG_UNKNOWN for an invalid value + * @since verstion 3.22.0 + */ + FREERDP_API WINPR_ATTR_NODISCARD const char* freerdp_input_touch_state_string(DWORD flags); + #ifdef __cplusplus } #endif diff --git a/libfreerdp/utils/string.c b/libfreerdp/utils/string.c index a55a99b0f..49a22d58b 100644 --- a/libfreerdp/utils/string.c +++ b/libfreerdp/utils/string.c @@ -24,6 +24,10 @@ #include #include +#if defined(CHANNEL_RDPEI) +#include +#endif + const char* rdp_redirection_flags_to_string(UINT32 flags, char* buffer, size_t size) { struct map_t @@ -145,3 +149,25 @@ const char* freerdp_desktop_rotation_flags_to_string(UINT32 flags) #undef ENTRY } +const char* freerdp_input_touch_state_string(DWORD flags) +{ +#if defined(CHANNEL_RDPEI) + if (flags & RDPINPUT_CONTACT_FLAG_DOWN) + return "RDPINPUT_CONTACT_FLAG_DOWN"; + else if (flags & RDPINPUT_CONTACT_FLAG_UPDATE) + return "RDPINPUT_CONTACT_FLAG_UPDATE"; + else if (flags & RDPINPUT_CONTACT_FLAG_UP) + return "RDPINPUT_CONTACT_FLAG_UP"; + else if (flags & RDPINPUT_CONTACT_FLAG_INRANGE) + return "RDPINPUT_CONTACT_FLAG_INRANGE"; + else if (flags & RDPINPUT_CONTACT_FLAG_INCONTACT) + return "RDPINPUT_CONTACT_FLAG_INCONTACT"; + else if (flags & RDPINPUT_CONTACT_FLAG_CANCELED) + return "RDPINPUT_CONTACT_FLAG_CANCELED"; + else + return "RDPINPUT_CONTACT_FLAG_UNKNOWN"; +#else + return "CHANNEL_RDPEI not supported"; +#endif +} + From 09ae30a0f93a7eaabf6e38d4e4f1afdb48c30be1 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 25 Jan 2026 08:15:56 +0100 Subject: [PATCH 5/7] [core,settings] define OrderSupport flags and stringify * Define OrderSupportFlags as enum * Add public API stringify function --- include/freerdp/settings_types.h | 69 +++++++++++++++++--------------- include/freerdp/utils/string.h | 9 +++++ libfreerdp/utils/string.c | 45 +++++++++++++++++++++ 3 files changed, 90 insertions(+), 33 deletions(-) diff --git a/include/freerdp/settings_types.h b/include/freerdp/settings_types.h index 8c5947c92..3e5984546 100644 --- a/include/freerdp/settings_types.h +++ b/include/freerdp/settings_types.h @@ -233,39 +233,42 @@ extern "C" /* General capability set */ #define TS_CAPS_PROTOCOLVERSION 0x200 /** @since version 3.6.0 */ -/* Order Support */ -#define NEG_DSTBLT_INDEX 0x00 -#define NEG_PATBLT_INDEX 0x01 -#define NEG_SCRBLT_INDEX 0x02 -#define NEG_MEMBLT_INDEX 0x03 -#define NEG_MEM3BLT_INDEX 0x04 -#define NEG_ATEXTOUT_INDEX 0x05 -#define NEG_AEXTTEXTOUT_INDEX 0x06 /* Must be ignored */ -#define NEG_DRAWNINEGRID_INDEX 0x07 /* Must be ignored */ -#define NEG_LINETO_INDEX 0x08 -#define NEG_MULTI_DRAWNINEGRID_INDEX 0x09 -#define NEG_OPAQUE_RECT_INDEX 0x0A /* Must be ignored */ -#define NEG_SAVEBITMAP_INDEX 0x0B -#define NEG_WTEXTOUT_INDEX 0x0C /* Must be ignored */ -#define NEG_MEMBLT_V2_INDEX 0x0D /* Must be ignored */ -#define NEG_MEM3BLT_V2_INDEX 0x0E /* Must be ignored */ -#define NEG_MULTIDSTBLT_INDEX 0x0F -#define NEG_MULTIPATBLT_INDEX 0x10 -#define NEG_MULTISCRBLT_INDEX 0x11 -#define NEG_MULTIOPAQUERECT_INDEX 0x12 -#define NEG_FAST_INDEX_INDEX 0x13 -#define NEG_POLYGON_SC_INDEX 0x14 -#define NEG_POLYGON_CB_INDEX 0x15 -#define NEG_POLYLINE_INDEX 0x16 -#define NEG_UNUSED23_INDEX 0x17 /* Must be ignored */ -#define NEG_FAST_GLYPH_INDEX 0x18 -#define NEG_ELLIPSE_SC_INDEX 0x19 -#define NEG_ELLIPSE_CB_INDEX 0x1A -#define NEG_GLYPH_INDEX_INDEX 0x1B -#define NEG_GLYPH_WEXTTEXTOUT_INDEX 0x1C /* Must be ignored */ -#define NEG_GLYPH_WLONGTEXTOUT_INDEX 0x1D /* Must be ignored */ -#define NEG_GLYPH_WLONGEXTTEXTOUT_INDEX 0x1E /* Must be ignored */ -#define NEG_UNUSED31_INDEX 0x1F /* Must be ignored */ + /* Order Support */ + typedef enum + { + NEG_DSTBLT_INDEX = 0x00, + NEG_PATBLT_INDEX = 0x01, + NEG_SCRBLT_INDEX = 0x02, + NEG_MEMBLT_INDEX = 0x03, + NEG_MEM3BLT_INDEX = 0x04, + NEG_ATEXTOUT_INDEX = 0x05, + NEG_AEXTTEXTOUT_INDEX = 0x06, /* Must be ignored */ + NEG_DRAWNINEGRID_INDEX = 0x07, /* Must be ignored */ + NEG_LINETO_INDEX = 0x08, + NEG_MULTI_DRAWNINEGRID_INDEX = 0x09, + NEG_OPAQUE_RECT_INDEX = 0x0A, /* Must be ignored */ + NEG_SAVEBITMAP_INDEX = 0x0B, + NEG_WTEXTOUT_INDEX = 0x0C, /* Must be ignored */ + NEG_MEMBLT_V2_INDEX = 0x0D, /* Must be ignored */ + NEG_MEM3BLT_V2_INDEX = 0x0E, /* Must be ignored */ + NEG_MULTIDSTBLT_INDEX = 0x0F, + NEG_MULTIPATBLT_INDEX = 0x10, + NEG_MULTISCRBLT_INDEX = 0x11, + NEG_MULTIOPAQUERECT_INDEX = 0x12, + NEG_FAST_INDEX_INDEX = 0x13, + NEG_POLYGON_SC_INDEX = 0x14, + NEG_POLYGON_CB_INDEX = 0x15, + NEG_POLYLINE_INDEX = 0x16, + NEG_UNUSED23_INDEX = 0x17, /* Must be ignored */ + NEG_FAST_GLYPH_INDEX = 0x18, + NEG_ELLIPSE_SC_INDEX = 0x19, + NEG_ELLIPSE_CB_INDEX = 0x1A, + NEG_GLYPH_INDEX_INDEX = 0x1B, + NEG_GLYPH_WEXTTEXTOUT_INDEX = 0x1C, /* Must be ignored */ + NEG_GLYPH_WLONGTEXTOUT_INDEX = 0x1D, /* Must be ignored */ + NEG_GLYPH_WLONGEXTTEXTOUT_INDEX = 0x1E, /* Must be ignored */ + NEG_UNUSED31_INDEX = 0x1F /* Must be ignored */ + } FreeRDP_OrderSupportFlagConstants; /* Glyph Support Level */ #define GLYPH_SUPPORT_NONE 0x0000 diff --git a/include/freerdp/utils/string.h b/include/freerdp/utils/string.h index 690e51021..7ca4551ed 100644 --- a/include/freerdp/utils/string.h +++ b/include/freerdp/utils/string.h @@ -66,6 +66,15 @@ extern "C" */ FREERDP_API WINPR_ATTR_NODISCARD const char* freerdp_input_touch_state_string(DWORD flags); + /** @brief Convert a single \ref FreeRDP_OrderSupportFlags to string + * + * @param type The value to convert + * @return A constant string representation of \ref type or the string \b + * UNKNOWN for an invalid value + * @since verstion 3.22.0 + */ + FREERDP_API WINPR_ATTR_NODISCARD const char* freerdp_order_support_flags_string(UINT8 type); + #ifdef __cplusplus } #endif diff --git a/libfreerdp/utils/string.c b/libfreerdp/utils/string.c index 49a22d58b..06f08355e 100644 --- a/libfreerdp/utils/string.c +++ b/libfreerdp/utils/string.c @@ -171,3 +171,48 @@ const char* freerdp_input_touch_state_string(DWORD flags) #endif } +const char* freerdp_order_support_flags_string(UINT8 type) +{ +#define ENTRY(x) \ + case x: \ + return #x + + switch (type) + { + ENTRY(NEG_DSTBLT_INDEX); + ENTRY(NEG_PATBLT_INDEX); + ENTRY(NEG_SCRBLT_INDEX); + ENTRY(NEG_MEMBLT_INDEX); + ENTRY(NEG_MEM3BLT_INDEX); + ENTRY(NEG_ATEXTOUT_INDEX); + ENTRY(NEG_AEXTTEXTOUT_INDEX); + ENTRY(NEG_DRAWNINEGRID_INDEX); + ENTRY(NEG_LINETO_INDEX); + ENTRY(NEG_MULTI_DRAWNINEGRID_INDEX); + ENTRY(NEG_OPAQUE_RECT_INDEX); + ENTRY(NEG_SAVEBITMAP_INDEX); + ENTRY(NEG_WTEXTOUT_INDEX); + ENTRY(NEG_MEMBLT_V2_INDEX); + ENTRY(NEG_MEM3BLT_V2_INDEX); + ENTRY(NEG_MULTIDSTBLT_INDEX); + ENTRY(NEG_MULTIPATBLT_INDEX); + ENTRY(NEG_MULTISCRBLT_INDEX); + ENTRY(NEG_MULTIOPAQUERECT_INDEX); + ENTRY(NEG_FAST_INDEX_INDEX); + ENTRY(NEG_POLYGON_SC_INDEX); + ENTRY(NEG_POLYGON_CB_INDEX); + ENTRY(NEG_POLYLINE_INDEX); + ENTRY(NEG_UNUSED23_INDEX); + ENTRY(NEG_FAST_GLYPH_INDEX); + ENTRY(NEG_ELLIPSE_SC_INDEX); + ENTRY(NEG_ELLIPSE_CB_INDEX); + ENTRY(NEG_GLYPH_INDEX_INDEX); + ENTRY(NEG_GLYPH_WEXTTEXTOUT_INDEX); + ENTRY(NEG_GLYPH_WLONGTEXTOUT_INDEX); + ENTRY(NEG_GLYPH_WLONGEXTTEXTOUT_INDEX); + ENTRY(NEG_UNUSED31_INDEX); + default: + return "UNKNOWN"; + } +#undef ENTRY +} From eb83f339b4f807826f695b0dc0bfa09e97577e42 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 25 Jan 2026 08:08:05 +0100 Subject: [PATCH 6/7] [channels,rdpdr] flag definition and stringify * Use a enum to define RDPDR_DTYP_* constants * Add public API freerdp_device_type_string for stringify * Add WINPR_ATTR_NODISCARD in rdpdr_utils.h --- channels/rdpdr/client/rdpdr_main.c | 19 -------------- include/freerdp/settings_types.h | 15 ++++++----- include/freerdp/utils/rdpdr_utils.h | 39 +++++++++++++++++++---------- libfreerdp/utils/rdpdr_utils.c | 19 ++++++++++++++ 4 files changed, 54 insertions(+), 38 deletions(-) diff --git a/channels/rdpdr/client/rdpdr_main.c b/channels/rdpdr/client/rdpdr_main.c index caf2d6371..09aa83641 100644 --- a/channels/rdpdr/client/rdpdr_main.c +++ b/channels/rdpdr/client/rdpdr_main.c @@ -106,25 +106,6 @@ static const char* rdpdr_state_str(enum RDPDR_CHANNEL_STATE state) } } -static const char* rdpdr_device_type_string(UINT32 type) -{ - switch (type) - { - case RDPDR_DTYP_SERIAL: - return "serial"; - case RDPDR_DTYP_PRINT: - return "printer"; - case RDPDR_DTYP_FILESYSTEM: - return "drive"; - case RDPDR_DTYP_SMARTCARD: - return "smartcard"; - case RDPDR_DTYP_PARALLEL: - return "parallel"; - default: - return "UNKNOWN"; - } -} - static const char* support_str(BOOL val) { if (val) diff --git a/include/freerdp/settings_types.h b/include/freerdp/settings_types.h index 3e5984546..3e90c1306 100644 --- a/include/freerdp/settings_types.h +++ b/include/freerdp/settings_types.h @@ -439,12 +439,15 @@ enum FreeRDP_DesktopRotationFlags MONITOR_ATTRIBUTES attributes; } rdpMonitor; -/* Device Redirection */ -#define RDPDR_DTYP_SERIAL 0x00000001 -#define RDPDR_DTYP_PARALLEL 0x00000002 -#define RDPDR_DTYP_PRINT 0x00000004 -#define RDPDR_DTYP_FILESYSTEM 0x00000008 -#define RDPDR_DTYP_SMARTCARD 0x00000020 + /* Device Redirection */ + typedef enum + { + RDPDR_DTYP_SERIAL = 0x00000001, + RDPDR_DTYP_PARALLEL = 0x00000002, + RDPDR_DTYP_PRINT = 0x00000004, + RDPDR_DTYP_FILESYSTEM = 0x00000008, + RDPDR_DTYP_SMARTCARD = 0x00000020 + } FreeRDP_RDPDR_DTYP; typedef struct { diff --git a/include/freerdp/utils/rdpdr_utils.h b/include/freerdp/utils/rdpdr_utils.h index 2321c8a3e..185a0a32f 100644 --- a/include/freerdp/utils/rdpdr_utils.h +++ b/include/freerdp/utils/rdpdr_utils.h @@ -45,10 +45,10 @@ extern "C" UINT32 Version; } RDPDR_CAPABILITY_HEADER; - FREERDP_API const char* rdpdr_component_string(UINT16 component); - FREERDP_API const char* rdpdr_packetid_string(UINT16 packetid); - FREERDP_API const char* rdpdr_irp_string(UINT32 major); - FREERDP_API const char* rdpdr_cap_type_string(UINT16 capability); + FREERDP_API WINPR_ATTR_NODISCARD const char* rdpdr_component_string(UINT16 component); + FREERDP_API WINPR_ATTR_NODISCARD const char* rdpdr_packetid_string(UINT16 packetid); + FREERDP_API WINPR_ATTR_NODISCARD const char* rdpdr_irp_string(UINT32 major); + FREERDP_API WINPR_ATTR_NODISCARD const char* rdpdr_cap_type_string(UINT16 capability); FREERDP_API LONG scard_log_status_error(const char* tag, const char* what, LONG status); @@ -62,19 +62,22 @@ extern "C" * @since version 3.16.0 */ FREERDP_API LONG scard_log_status_error_wlog(wLog* log, const char* what, LONG status); - FREERDP_API const char* scard_get_ioctl_string(UINT32 ioControlCode, BOOL funcName); + FREERDP_API WINPR_ATTR_NODISCARD const char* scard_get_ioctl_string(UINT32 ioControlCode, + BOOL funcName); - FREERDP_API BOOL rdpdr_write_iocompletion_header(wStream* out, UINT32 DeviceId, - UINT32 CompletionId, NTSTATUS ioStatus); + FREERDP_API WINPR_ATTR_NODISCARD BOOL rdpdr_write_iocompletion_header(wStream* out, + UINT32 DeviceId, + UINT32 CompletionId, + NTSTATUS ioStatus); FREERDP_API void rdpdr_dump_received_packet(wLog* log, DWORD lvl, wStream* out, const char* custom); FREERDP_API void rdpdr_dump_send_packet(wLog* log, DWORD lvl, wStream* out, const char* custom); - FREERDP_API UINT rdpdr_read_capset_header(wLog* log, wStream* s, - RDPDR_CAPABILITY_HEADER* header); - FREERDP_API UINT rdpdr_write_capset_header(wLog* log, wStream* s, - const RDPDR_CAPABILITY_HEADER* header); + FREERDP_API WINPR_ATTR_NODISCARD UINT rdpdr_read_capset_header(wLog* log, wStream* s, + RDPDR_CAPABILITY_HEADER* header); + FREERDP_API WINPR_ATTR_NODISCARD UINT + rdpdr_write_capset_header(wLog* log, wStream* s, const RDPDR_CAPABILITY_HEADER* header); /** @brief convert a constant of type \ref RDPDR_CAPS_IRP_MJ to string * @@ -84,7 +87,7 @@ extern "C" * * @since version 3.21.0 */ - FREERDP_API const char* rdpdr_irp_val2str(UINT32 ioCode1); + FREERDP_API WINPR_ATTR_NODISCARD const char* rdpdr_irp_val2str(UINT32 ioCode1); /** @brief convert a mask of \ref RDPDR_CAPS_IRP_MJ type values to string * @@ -96,7 +99,17 @@ extern "C" * * @since version 3.21.0 */ - FREERDP_API const char* rdpdr_irp_mask2str(UINT32 ioCode1Mask, char* buffer, size_t len); + FREERDP_API WINPR_ATTR_NODISCARD const char* rdpdr_irp_mask2str(UINT32 ioCode1Mask, + char* buffer, size_t len); + + /** @brief Convert a single \ref FreeRDP_RDPDR_DTYP to string + * + * @param type The value to convert + * @return A constant string representation of \ref type or the string \b + * UNKNOWN for an invalid value + * @since verstion 3.22.0 + */ + FREERDP_API WINPR_ATTR_NODISCARD const char* rdpdr_device_type_string(UINT32 type); #ifdef __cplusplus } diff --git a/libfreerdp/utils/rdpdr_utils.c b/libfreerdp/utils/rdpdr_utils.c index 19694691b..f0532300e 100644 --- a/libfreerdp/utils/rdpdr_utils.c +++ b/libfreerdp/utils/rdpdr_utils.c @@ -667,3 +667,22 @@ const char* rdpdr_irp_mask2str(UINT32 ioCode1Mask, char* buffer, size_t len) return NULL; return buffer; } + +const char* rdpdr_device_type_string(UINT32 type) +{ + switch (type) + { + case RDPDR_DTYP_SERIAL: + return "serial"; + case RDPDR_DTYP_PRINT: + return "printer"; + case RDPDR_DTYP_FILESYSTEM: + return "drive"; + case RDPDR_DTYP_SMARTCARD: + return "smartcard"; + case RDPDR_DTYP_PARALLEL: + return "parallel"; + default: + return "UNKNOWN"; + } +} From 7d943a9c214189797604f7042e65ed4f79ea0e5c Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 25 Jan 2026 09:38:33 +0100 Subject: [PATCH 7/7] [documentation] fix a few doxygen warnings --- include/freerdp/client/rdpdr.h | 6 ++++-- include/freerdp/settings.h | 9 ++++++--- include/freerdp/utils/aad.h | 3 ++- winpr/include/winpr/collections.h | 17 +++++++---------- winpr/include/winpr/json.h | 5 +++-- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/include/freerdp/client/rdpdr.h b/include/freerdp/client/rdpdr.h index c2262f731..391c351f1 100644 --- a/include/freerdp/client/rdpdr.h +++ b/include/freerdp/client/rdpdr.h @@ -28,7 +28,8 @@ extern "C" { #endif - /** @enum Hotplug event types. + /** @enum RdpdrHotplugEventType + * @brief Hotplug event types. * * @since version 3.16.0 */ @@ -75,7 +76,8 @@ extern "C" */ typedef UINT (*pcRdpdrHotplugDevice)(RdpdrClientContext* context, RdpdrHotplugEventType type); - /** @struct rdpdr channel client context + /** @struct s_rdpdr_client_context + * @brief rdpdr channel client context * * @since version 3.16.0 */ diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index ed694e300..2c0ce8c7a 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -738,9 +738,12 @@ extern "C" FREERDP_API const char* freerdp_encryption_methods_string(UINT32 EncryptionLevel, char* buffer, size_t size); - /** \brief returns a string representation of \b RNS_UD_XXBPP_SUPPORT values + /** @brief returns a string representation of \b RNS_UD_XXBPP_SUPPORT values + * @param mask A bitmask of supported color dephts \b RNS_UD_* + * @param buffer A pointer to a buffer of \b size bytes + * @param size The size of the buffer in bytes * - * return A string reprenentation of the bitmask. + * @return A string reprenentation of the bitmask. */ FREERDP_API const char* freerdp_supported_color_depths_string(UINT16 mask, char* buffer, size_t size); @@ -748,7 +751,7 @@ extern "C" /** \brief return the configuration directory for the library * @return The current configuration path or \b NULL * @since version 3.6.0 - * @note Since 3.17.1 this is a wrapper for \ref freerdp_GetConfigFilePath(FALSE, "") + * @note Since 3.17.1 this is a wrapper for \b freerdp_GetConfigFilePath(FALSE, "") */ WINPR_ATTR_MALLOC(free, 1) FREERDP_API char* freerdp_settings_get_config_path(void); diff --git a/include/freerdp/utils/aad.h b/include/freerdp/utils/aad.h index a1a6978a8..c6d53e600 100644 --- a/include/freerdp/utils/aad.h +++ b/include/freerdp/utils/aad.h @@ -36,7 +36,8 @@ extern "C" { #endif - /** @enum Expected wellknown fields to be supported + /** @enum AAD_WELLKNOWN_VALUES + * @brief Expected wellknown fields to be supported * @since version 3.10.0 */ typedef enum diff --git a/winpr/include/winpr/collections.h b/winpr/include/winpr/collections.h index 19b73884e..23f932287 100644 --- a/winpr/include/winpr/collections.h +++ b/winpr/include/winpr/collections.h @@ -47,19 +47,16 @@ extern "C" /** @struct wObject * @brief This struct contains function pointer to initialize/free objects * - * @var fnObjectNew A new function that creates a clone of the input - * @var fnObjectInit A function initializing an object, but not allocating it - * @var fnObjectUninit A function to deinitialize an object, but not free it - * @var fnObjectFree A function freeing an object - * @var fnObjectEquals A function to compare two objects */ typedef struct { - OBJECT_NEW_FN fnObjectNew; - OBJECT_INIT_FN fnObjectInit; - OBJECT_UNINIT_FN fnObjectUninit; - OBJECT_FREE_FN fnObjectFree; - OBJECT_EQUALS_FN fnObjectEquals; + OBJECT_NEW_FN fnObjectNew; /**< A new function that creates a clone of the input */ + OBJECT_INIT_FN + fnObjectInit; /**< A function initializing an object, but not allocating it */ + OBJECT_UNINIT_FN + fnObjectUninit; /**< A function to deinitialize an object, but not free it */ + OBJECT_FREE_FN fnObjectFree; /**< A function freeing an object */ + OBJECT_EQUALS_FN fnObjectEquals; /**< A function to compare two objects */ } wObject; /* utility function with compatible arguments for string data */ diff --git a/winpr/include/winpr/json.h b/winpr/include/winpr/json.h index de48124fc..eef4c7a66 100644 --- a/winpr/include/winpr/json.h +++ b/winpr/include/winpr/json.h @@ -120,7 +120,8 @@ extern "C" * @brief Return a pointer to an JSON object item * @param object the JSON object * @param string the name of the object (case is ignored) - * @return A pointer to the object identified by @ref string or \b NULL + * + * @return A pointer to the object identified by \b string or \b NULL * @since version 3.6.0 */ WINPR_API WINPR_JSON* WINPR_JSON_GetObjectItem(const WINPR_JSON* object, const char* string); @@ -130,7 +131,7 @@ extern "C" * * @param object the JSON instance to query * @param string the name of the object - * @return A pointer to the object identified by @ref string or \b NULL + * @return A pointer to the object identified by \b string or \b NULL * @since version 3.6.0 */ WINPR_API WINPR_JSON* WINPR_JSON_GetObjectItemCaseSensitive(const WINPR_JSON* object,