FreeRDP
Loading...
Searching...
No Matches
libfreerdp/utils/string.c
1
22#include <errno.h>
23
24#include <freerdp/utils/string.h>
25#include <freerdp/settings.h>
26
27#if defined(CHANNEL_RDPEI)
28#include <freerdp/channels/rdpei.h>
29#endif
30
31const char* rdp_redirection_flags_to_string(UINT32 flags, char* buffer, size_t size)
32{
33 struct map_t
34 {
35 UINT32 flag;
36 const char* name;
37 };
38 const struct map_t map[] = {
39 { LB_TARGET_NET_ADDRESS, "LB_TARGET_NET_ADDRESS" },
40 { LB_LOAD_BALANCE_INFO, "LB_LOAD_BALANCE_INFO" },
41 { LB_USERNAME, "LB_USERNAME" },
42 { LB_DOMAIN, "LB_DOMAIN" },
43 { LB_PASSWORD, "LB_PASSWORD" },
44 { LB_DONTSTOREUSERNAME, "LB_DONTSTOREUSERNAME" },
45 { LB_SMARTCARD_LOGON, "LB_SMARTCARD_LOGON" },
46 { LB_NOREDIRECT, "LB_NOREDIRECT" },
47 { LB_TARGET_FQDN, "LB_TARGET_FQDN" },
48 { LB_TARGET_NETBIOS_NAME, "LB_TARGET_NETBIOS_NAME" },
49 { LB_TARGET_NET_ADDRESSES, "LB_TARGET_NET_ADDRESSES" },
50 { LB_CLIENT_TSV_URL, "LB_CLIENT_TSV_URL" },
51 { LB_SERVER_TSV_CAPABLE, "LB_SERVER_TSV_CAPABLE" },
52 { LB_PASSWORD_IS_PK_ENCRYPTED, "LB_PASSWORD_IS_PK_ENCRYPTED" },
53 { LB_REDIRECTION_GUID, "LB_REDIRECTION_GUID" },
54 { LB_TARGET_CERTIFICATE, "LB_TARGET_CERTIFICATE" },
55 };
56
57 for (size_t x = 0; x < ARRAYSIZE(map); x++)
58 {
59 const struct map_t* cur = &map[x];
60 if (flags & cur->flag)
61 {
62 if (!winpr_str_append(cur->name, buffer, size, "|"))
63 return NULL;
64 }
65 }
66 return buffer;
67}
68
69const char* rdp_cluster_info_flags_to_string(UINT32 flags, char* buffer, size_t size)
70{
71 const UINT32 version = (flags & ServerSessionRedirectionVersionMask) >> 2;
72 if (flags & REDIRECTION_SUPPORTED)
73 winpr_str_append("REDIRECTION_SUPPORTED", buffer, size, "|");
74 if (flags & REDIRECTED_SESSIONID_FIELD_VALID)
75 winpr_str_append("REDIRECTED_SESSIONID_FIELD_VALID", buffer, size, "|");
76 if (flags & REDIRECTED_SMARTCARD)
77 winpr_str_append("REDIRECTED_SMARTCARD", buffer, size, "|");
78
79 const char* str = NULL;
80 switch (version)
81 {
82 case REDIRECTION_VERSION1:
83 str = "REDIRECTION_VERSION1";
84 break;
85 case REDIRECTION_VERSION2:
86 str = "REDIRECTION_VERSION2";
87 break;
88 case REDIRECTION_VERSION3:
89 str = "REDIRECTION_VERSION3";
90 break;
91 case REDIRECTION_VERSION4:
92 str = "REDIRECTION_VERSION4";
93 break;
94 case REDIRECTION_VERSION5:
95 str = "REDIRECTION_VERSION5";
96 break;
97 case REDIRECTION_VERSION6:
98 str = "REDIRECTION_VERSION6";
99 break;
100 default:
101 str = "REDIRECTION_VERSION_UNKNOWN";
102 break;
103 }
104 winpr_str_append(str, buffer, size, "|");
105 {
106 char msg[32] = { 0 };
107 (void)_snprintf(msg, sizeof(msg), "[0x%08" PRIx32 "]", flags);
108 winpr_str_append(msg, buffer, size, "");
109 }
110 return buffer;
111}
112
113BOOL freerdp_extract_key_value(const char* str, UINT32* pkey, UINT32* pvalue)
114{
115 if (!str || !pkey || !pvalue)
116 return FALSE;
117
118 char* end1 = NULL;
119 errno = 0;
120 unsigned long key = strtoul(str, &end1, 0);
121 if ((errno != 0) || !end1 || (*end1 != '=') || (key > UINT32_MAX))
122 return FALSE;
123
124 errno = 0;
125 unsigned long val = strtoul(&end1[1], NULL, 0);
126 if ((errno != 0) || (val > UINT32_MAX))
127 return FALSE;
128
129 *pkey = (UINT32)key;
130 *pvalue = (UINT32)val;
131 return TRUE;
132}
133
134const char* freerdp_desktop_rotation_flags_to_string(UINT32 flags)
135{
136#define ENTRY(x) \
137 case x: \
138 return #x
139
140 switch (flags)
141 {
142 ENTRY(ORIENTATION_LANDSCAPE);
143 ENTRY(ORIENTATION_PORTRAIT);
144 ENTRY(ORIENTATION_LANDSCAPE_FLIPPED);
145 ENTRY(ORIENTATION_PORTRAIT_FLIPPED);
146 default:
147 return "ORIENTATION_UNKNOWN";
148 }
149#undef ENTRY
150}
151
152const char* freerdp_input_touch_state_string(DWORD flags)
153{
154#if defined(CHANNEL_RDPEI)
155 if (flags & RDPINPUT_CONTACT_FLAG_DOWN)
156 return "RDPINPUT_CONTACT_FLAG_DOWN";
157 else if (flags & RDPINPUT_CONTACT_FLAG_UPDATE)
158 return "RDPINPUT_CONTACT_FLAG_UPDATE";
159 else if (flags & RDPINPUT_CONTACT_FLAG_UP)
160 return "RDPINPUT_CONTACT_FLAG_UP";
161 else if (flags & RDPINPUT_CONTACT_FLAG_INRANGE)
162 return "RDPINPUT_CONTACT_FLAG_INRANGE";
163 else if (flags & RDPINPUT_CONTACT_FLAG_INCONTACT)
164 return "RDPINPUT_CONTACT_FLAG_INCONTACT";
165 else if (flags & RDPINPUT_CONTACT_FLAG_CANCELED)
166 return "RDPINPUT_CONTACT_FLAG_CANCELED";
167 else
168 return "RDPINPUT_CONTACT_FLAG_UNKNOWN";
169#else
170 return "CHANNEL_RDPEI not supported";
171#endif
172}
173
174const char* freerdp_order_support_flags_string(UINT8 type)
175{
176#define ENTRY(x) \
177 case x: \
178 return #x
179
180 switch (type)
181 {
182 ENTRY(NEG_DSTBLT_INDEX);
183 ENTRY(NEG_PATBLT_INDEX);
184 ENTRY(NEG_SCRBLT_INDEX);
185 ENTRY(NEG_MEMBLT_INDEX);
186 ENTRY(NEG_MEM3BLT_INDEX);
187 ENTRY(NEG_ATEXTOUT_INDEX);
188 ENTRY(NEG_AEXTTEXTOUT_INDEX);
189 ENTRY(NEG_DRAWNINEGRID_INDEX);
190 ENTRY(NEG_LINETO_INDEX);
191 ENTRY(NEG_MULTI_DRAWNINEGRID_INDEX);
192 ENTRY(NEG_OPAQUE_RECT_INDEX);
193 ENTRY(NEG_SAVEBITMAP_INDEX);
194 ENTRY(NEG_WTEXTOUT_INDEX);
195 ENTRY(NEG_MEMBLT_V2_INDEX);
196 ENTRY(NEG_MEM3BLT_V2_INDEX);
197 ENTRY(NEG_MULTIDSTBLT_INDEX);
198 ENTRY(NEG_MULTIPATBLT_INDEX);
199 ENTRY(NEG_MULTISCRBLT_INDEX);
200 ENTRY(NEG_MULTIOPAQUERECT_INDEX);
201 ENTRY(NEG_FAST_INDEX_INDEX);
202 ENTRY(NEG_POLYGON_SC_INDEX);
203 ENTRY(NEG_POLYGON_CB_INDEX);
204 ENTRY(NEG_POLYLINE_INDEX);
205 ENTRY(NEG_UNUSED23_INDEX);
206 ENTRY(NEG_FAST_GLYPH_INDEX);
207 ENTRY(NEG_ELLIPSE_SC_INDEX);
208 ENTRY(NEG_ELLIPSE_CB_INDEX);
209 ENTRY(NEG_GLYPH_INDEX_INDEX);
210 ENTRY(NEG_GLYPH_WEXTTEXTOUT_INDEX);
211 ENTRY(NEG_GLYPH_WLONGTEXTOUT_INDEX);
212 ENTRY(NEG_GLYPH_WLONGEXTTEXTOUT_INDEX);
213 ENTRY(NEG_UNUSED31_INDEX);
214 default:
215 return "UNKNOWN";
216 }
217#undef ENTRY
218}