23#include <freerdp/config.h>
26#include <winpr/print.h>
27#include <winpr/clipboard.h>
29#include <freerdp/types.h>
30#include <freerdp/freerdp.h>
31#include <freerdp/settings.h>
32#include <freerdp/constants.h>
33#include <freerdp/client/cliprdr.h>
35#include "cliprdr_main.h"
36#include "cliprdr_format.h"
37#include "../cliprdr_common.h"
42 const UINT32 maskData =
43 checkMask & (CLIPRDR_FLAG_LOCAL_TO_REMOTE | CLIPRDR_FLAG_REMOTE_TO_LOCAL);
44 const UINT32 maskFiles =
45 checkMask & (CLIPRDR_FLAG_LOCAL_TO_REMOTE_FILES | CLIPRDR_FLAG_REMOTE_TO_LOCAL_FILES);
49 filtered.common.msgType = CB_FORMAT_LIST;
50 filtered.numFormats = list->numFormats;
51 if (filtered.numFormats > 0)
53 filtered.formats = calloc(filtered.numFormats,
sizeof(
CLIPRDR_FORMAT));
54 if (!filtered.formats)
62 if ((mask & checkMask) == checkMask)
64 for (
size_t x = 0; x < list->numFormats; x++)
68 cur->formatId = format->formatId;
69 if (format->formatName)
70 cur->formatName = _strdup(format->formatName);
74 else if ((mask & maskFiles) != 0)
76 for (
size_t x = 0; x < list->numFormats; x++)
81 if (!format->formatName)
83 if (strcmp(format->formatName, type_FileGroupDescriptorW) == 0 ||
84 strcmp(format->formatName, type_FileContents) == 0)
86 cur->formatId = format->formatId;
87 cur->formatName = _strdup(format->formatName);
92 else if ((mask & maskData) != 0)
94 for (
size_t x = 0; x < list->numFormats; x++)
99 if (!format->formatName ||
100 (strcmp(format->formatName, type_FileGroupDescriptorW) != 0 &&
101 strcmp(format->formatName, type_FileContents) != 0))
103 cur->formatId = format->formatId;
104 if (format->formatName)
105 cur->formatName = _strdup(format->formatName);
110 WINPR_ASSERT(wpos <= UINT32_MAX);
111 filtered.numFormats = (UINT32)wpos;
125 CliprdrClientContext* context = cliprdr_get_client_interface(cliprdr);
126 UINT error = CHANNEL_RC_OK;
128 formatList.common.msgType = CB_FORMAT_LIST;
129 formatList.common.msgFlags = msgFlags;
130 formatList.common.dataLen = dataLen;
133 cliprdr_read_format_list(cliprdr->log, s, &formatList, cliprdr->useLongFormatNames)))
138 FreeRDP_ClipboardFeatureMask);
139 filteredFormatList = cliprdr_filter_format_list(
140 &formatList, mask, CLIPRDR_FLAG_REMOTE_TO_LOCAL | CLIPRDR_FLAG_REMOTE_TO_LOCAL_FILES);
143 if (filteredFormatList.numFormats != 0)
145 const DWORD level = WLOG_DEBUG;
146 if (WLog_IsLevelActive(cliprdr->log, level))
148 WLog_Print(cliprdr->log, level,
"ServerFormatList: numFormats: %" PRIu32
"",
149 formatList.numFormats);
150 for (
size_t x = 0; x < formatList.numFormats; x++)
153 WLog_Print(cliprdr->log, level,
"[%" PRIuz
"]: id=0x%08" PRIx32
" [%s|%s]", x,
154 format->formatId, ClipboardGetFormatIdString(format->formatId),
158 WLog_Print(cliprdr->log, level,
"ServerFormatList [filtered]: numFormats: %" PRIu32
"",
159 filteredFormatList.numFormats);
160 for (
size_t x = 0; x < filteredFormatList.numFormats; x++)
163 WLog_Print(cliprdr->log, level,
"[%" PRIuz
"]: id=0x%08" PRIx32
" [%s|%s]", x,
164 format->formatId, ClipboardGetFormatIdString(format->formatId),
170 if (context->ServerFormatList)
172 if ((error = context->ServerFormatList(context, &filteredFormatList)))
173 WLog_Print(cliprdr->log, WLOG_ERROR,
"ServerFormatList failed with error %" PRIu32
"",
178 cliprdr_free_format_list(&filteredFormatList);
179 cliprdr_free_format_list(&formatList);
189 UINT32 dataLen, UINT16 msgFlags)
192 CliprdrClientContext* context = cliprdr_get_client_interface(cliprdr);
193 UINT error = CHANNEL_RC_OK;
195 WLog_Print(cliprdr->log, WLOG_DEBUG,
"ServerFormatListResponse");
197 formatListResponse.common.msgType = CB_FORMAT_LIST_RESPONSE;
198 formatListResponse.common.msgFlags = msgFlags;
199 formatListResponse.common.dataLen = dataLen;
201 IFCALLRET(context->ServerFormatListResponse, error, context, &formatListResponse);
203 WLog_Print(cliprdr->log, WLOG_ERROR,
204 "ServerFormatListResponse failed with error %" PRIu32
"!", error);
218 CliprdrClientContext* context = cliprdr_get_client_interface(cliprdr);
219 UINT error = CHANNEL_RC_OK;
221 formatDataRequest.common.msgType = CB_FORMAT_DATA_REQUEST;
222 formatDataRequest.common.msgFlags = msgFlags;
223 formatDataRequest.common.dataLen = dataLen;
225 if ((error = cliprdr_read_format_data_request(s, &formatDataRequest)))
228 WLog_Print(cliprdr->log, WLOG_DEBUG,
"ServerFormatDataRequest (0x%08" PRIx32
" [%s])",
229 formatDataRequest.requestedFormatId,
230 ClipboardGetFormatIdString(formatDataRequest.requestedFormatId));
234 if ((mask & (CLIPRDR_FLAG_LOCAL_TO_REMOTE | CLIPRDR_FLAG_LOCAL_TO_REMOTE_FILES)) == 0)
236 return cliprdr_send_error_response(cliprdr, CB_FORMAT_DATA_RESPONSE);
239 context->lastRequestedFormatId = formatDataRequest.requestedFormatId;
240 IFCALLRET(context->ServerFormatDataRequest, error, context, &formatDataRequest);
242 WLog_Print(cliprdr->log, WLOG_ERROR,
243 "ServerFormatDataRequest failed with error %" PRIu32
"!", error);
257 CliprdrClientContext* context = cliprdr_get_client_interface(cliprdr);
258 UINT error = CHANNEL_RC_OK;
260 WLog_Print(cliprdr->log, WLOG_DEBUG,
261 "ServerFormatDataResponse: msgFlags=0x%08" PRIx32
", dataLen=%" PRIu32, msgFlags,
264 formatDataResponse.common.msgType = CB_FORMAT_DATA_RESPONSE;
265 formatDataResponse.common.msgFlags = msgFlags;
266 formatDataResponse.common.dataLen = dataLen;
268 if ((error = cliprdr_read_format_data_response(s, &formatDataResponse)))
273 if ((mask & (CLIPRDR_FLAG_REMOTE_TO_LOCAL | CLIPRDR_FLAG_REMOTE_TO_LOCAL_FILES)) == 0)
275 WLog_Print(cliprdr->log, WLOG_WARN,
276 "Received ServerFormatDataResponse but remote -> local clipboard is disabled");
277 return CHANNEL_RC_OK;
280 IFCALLRET(context->ServerFormatDataResponse, error, context, &formatDataResponse);
282 WLog_Print(cliprdr->log, WLOG_ERROR,
283 "ServerFormatDataResponse failed with error %" PRIu32
"!", error);
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.