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" 
   40                                               const UINT32 checkMask)
 
   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  filtered.formats = calloc(filtered.numFormats, 
sizeof(
CLIPRDR_FORMAT));
 
   54  if ((mask & checkMask) == checkMask)
 
   56    for (
size_t x = 0; x < list->numFormats; x++)
 
   60      cur->formatId = format->formatId;
 
   61      if (format->formatName)
 
   62        cur->formatName = _strdup(format->formatName);
 
   66  else if ((mask & maskFiles) != 0)
 
   68    for (
size_t x = 0; x < list->numFormats; x++)
 
   73      if (!format->formatName)
 
   75      if (strcmp(format->formatName, type_FileGroupDescriptorW) == 0 ||
 
   76          strcmp(format->formatName, type_FileContents) == 0)
 
   78        cur->formatId = format->formatId;
 
   79        cur->formatName = _strdup(format->formatName);
 
   84  else if ((mask & maskData) != 0)
 
   86    for (
size_t x = 0; x < list->numFormats; x++)
 
   91      if (!format->formatName ||
 
   92          (strcmp(format->formatName, type_FileGroupDescriptorW) != 0 &&
 
   93           strcmp(format->formatName, type_FileContents) != 0))
 
   95        cur->formatId = format->formatId;
 
   96        if (format->formatName)
 
   97          cur->formatName = _strdup(format->formatName);
 
  102  WINPR_ASSERT(wpos <= UINT32_MAX);
 
  103  filtered.numFormats = (UINT32)wpos;
 
  117  CliprdrClientContext* context = cliprdr_get_client_interface(cliprdr);
 
  118  UINT error = CHANNEL_RC_OK;
 
  120  formatList.common.msgType = CB_FORMAT_LIST;
 
  121  formatList.common.msgFlags = msgFlags;
 
  122  formatList.common.dataLen = dataLen;
 
  125           cliprdr_read_format_list(cliprdr->log, s, &formatList, cliprdr->useLongFormatNames)))
 
  130  filteredFormatList = cliprdr_filter_format_list(
 
  131      &formatList, mask, CLIPRDR_FLAG_REMOTE_TO_LOCAL | CLIPRDR_FLAG_REMOTE_TO_LOCAL_FILES);
 
  132  if (filteredFormatList.numFormats == 0)
 
  135  const DWORD level = WLOG_DEBUG;
 
  136  if (WLog_IsLevelActive(cliprdr->log, level))
 
  138    WLog_Print(cliprdr->log, level, 
"ServerFormatList: numFormats: %" PRIu32 
"",
 
  139               formatList.numFormats);
 
  140    for (
size_t x = 0; x < formatList.numFormats; x++)
 
  143      WLog_Print(cliprdr->log, level, 
"[%" PRIuz 
"]: id=0x%08" PRIx32 
" [%s|%s]", x,
 
  144                 format->formatId, ClipboardGetFormatIdString(format->formatId),
 
  148    WLog_Print(cliprdr->log, level, 
"ServerFormatList [filtered]: numFormats: %" PRIu32 
"",
 
  149               filteredFormatList.numFormats);
 
  150    for (
size_t x = 0; x < filteredFormatList.numFormats; x++)
 
  153      WLog_Print(cliprdr->log, level, 
"[%" PRIuz 
"]: id=0x%08" PRIx32 
" [%s|%s]", x,
 
  154                 format->formatId, ClipboardGetFormatIdString(format->formatId),
 
  159  if (context->ServerFormatList)
 
  161    if ((error = context->ServerFormatList(context, &filteredFormatList)))
 
  162      WLog_Print(cliprdr->log, WLOG_ERROR, 
"ServerFormatList failed with error %" PRIu32 
"",
 
  167  cliprdr_free_format_list(&filteredFormatList);
 
  168  cliprdr_free_format_list(&formatList);
 
  178                                          UINT32 dataLen, UINT16 msgFlags)
 
  181  CliprdrClientContext* context = cliprdr_get_client_interface(cliprdr);
 
  182  UINT error = CHANNEL_RC_OK;
 
  184  WLog_Print(cliprdr->log, WLOG_DEBUG, 
"ServerFormatListResponse");
 
  186  formatListResponse.common.msgType = CB_FORMAT_LIST_RESPONSE;
 
  187  formatListResponse.common.msgFlags = msgFlags;
 
  188  formatListResponse.common.dataLen = dataLen;
 
  190  IFCALLRET(context->ServerFormatListResponse, error, context, &formatListResponse);
 
  192    WLog_Print(cliprdr->log, WLOG_ERROR,
 
  193               "ServerFormatListResponse failed with error %" PRIu32 
"!", error);
 
  207  CliprdrClientContext* context = cliprdr_get_client_interface(cliprdr);
 
  208  UINT error = CHANNEL_RC_OK;
 
  210  formatDataRequest.common.msgType = CB_FORMAT_DATA_REQUEST;
 
  211  formatDataRequest.common.msgFlags = msgFlags;
 
  212  formatDataRequest.common.dataLen = dataLen;
 
  214  if ((error = cliprdr_read_format_data_request(s, &formatDataRequest)))
 
  217  WLog_Print(cliprdr->log, WLOG_DEBUG, 
"ServerFormatDataRequest (0x%08" PRIx32 
" [%s])",
 
  218             formatDataRequest.requestedFormatId,
 
  219             ClipboardGetFormatIdString(formatDataRequest.requestedFormatId));
 
  223  if ((mask & (CLIPRDR_FLAG_LOCAL_TO_REMOTE | CLIPRDR_FLAG_LOCAL_TO_REMOTE_FILES)) == 0)
 
  225    return cliprdr_send_error_response(cliprdr, CB_FORMAT_DATA_RESPONSE);
 
  228  context->lastRequestedFormatId = formatDataRequest.requestedFormatId;
 
  229  IFCALLRET(context->ServerFormatDataRequest, error, context, &formatDataRequest);
 
  231    WLog_Print(cliprdr->log, WLOG_ERROR,
 
  232               "ServerFormatDataRequest failed with error %" PRIu32 
"!", error);
 
  246  CliprdrClientContext* context = cliprdr_get_client_interface(cliprdr);
 
  247  UINT error = CHANNEL_RC_OK;
 
  249  WLog_Print(cliprdr->log, WLOG_DEBUG,
 
  250             "ServerFormatDataResponse: msgFlags=0x%08" PRIx32 
", dataLen=%" PRIu32, msgFlags,
 
  253  formatDataResponse.common.msgType = CB_FORMAT_DATA_RESPONSE;
 
  254  formatDataResponse.common.msgFlags = msgFlags;
 
  255  formatDataResponse.common.dataLen = dataLen;
 
  257  if ((error = cliprdr_read_format_data_response(s, &formatDataResponse)))
 
  262  if ((mask & (CLIPRDR_FLAG_REMOTE_TO_LOCAL | CLIPRDR_FLAG_REMOTE_TO_LOCAL_FILES)) == 0)
 
  264    WLog_Print(cliprdr->log, WLOG_WARN,
 
  265               "Received ServerFormatDataResponse but remote -> local clipboard is disabled");
 
  266    return CHANNEL_RC_OK;
 
  269  IFCALLRET(context->ServerFormatDataResponse, error, context, &formatDataResponse);
 
  271    WLog_Print(cliprdr->log, WLOG_ERROR,
 
  272               "ServerFormatDataResponse failed with error %" PRIu32 
"!", error);
 
FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.