/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_server_file_contents_request(CliprdrServerContext* context, CLIPRDR_FILE_CONTENTS_REQUEST* fileContentsRequest) { wStream* s; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; s = cliprdr_server_packet_new(CB_FILECONTENTS_REQUEST, 0, 28); if (!s) { WLog_ERR(TAG, "cliprdr_server_packet_new failed!"); return ERROR_INTERNAL_ERROR; } Stream_Write_UINT32(s, fileContentsRequest->streamId); /* streamId (4 bytes) */ Stream_Write_UINT32(s, fileContentsRequest->listIndex); /* listIndex (4 bytes) */ Stream_Write_UINT32(s, fileContentsRequest->dwFlags); /* dwFlags (4 bytes) */ Stream_Write_UINT32(s, fileContentsRequest->nPositionLow); /* nPositionLow (4 bytes) */ Stream_Write_UINT32(s, fileContentsRequest->nPositionHigh); /* nPositionHigh (4 bytes) */ Stream_Write_UINT32(s, fileContentsRequest->cbRequested); /* cbRequested (4 bytes) */ Stream_Write_UINT32(s, fileContentsRequest->clipDataId); /* clipDataId (4 bytes) */ WLog_DBG(TAG, "ServerFileContentsRequest: streamId: 0x%04X", fileContentsRequest->streamId); return cliprdr_server_packet_send(cliprdr, s); }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_server_file_contents_response(CliprdrServerContext* context, CLIPRDR_FILE_CONTENTS_RESPONSE* fileContentsResponse) { wStream* s; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; if (fileContentsResponse->dwFlags & FILECONTENTS_SIZE) fileContentsResponse->cbRequested = sizeof(UINT64); s = cliprdr_server_packet_new(CB_FILECONTENTS_REQUEST, 0, 4 + fileContentsResponse->cbRequested); if (!s) { WLog_ERR(TAG, "cliprdr_server_packet_new failed!"); return ERROR_INTERNAL_ERROR; } Stream_Write_UINT32(s, fileContentsResponse->streamId); /* streamId (4 bytes) */ /** * requestedFileContentsData: * FILECONTENTS_SIZE: file size as UINT64 * FILECONTENTS_RANGE: file data from requested range */ Stream_Write(s, fileContentsResponse->requestedData, fileContentsResponse->cbRequested); WLog_DBG(TAG, "ServerFileContentsResponse: streamId: 0x%04X", fileContentsResponse->streamId); return cliprdr_server_packet_send(cliprdr, s); }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_server_capabilities(CliprdrServerContext* context, CLIPRDR_CAPABILITIES* capabilities) { wStream* s; CLIPRDR_GENERAL_CAPABILITY_SET* generalCapabilitySet; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; capabilities->msgType = CB_CLIP_CAPS; capabilities->msgFlags = 0; s = cliprdr_server_packet_new(CB_CLIP_CAPS, 0, 4 + CB_CAPSTYPE_GENERAL_LEN); if (!s) { WLog_ERR(TAG, "cliprdr_server_packet_new failed!"); return ERROR_INTERNAL_ERROR; } Stream_Write_UINT16(s, 1); /* cCapabilitiesSets (2 bytes) */ Stream_Write_UINT16(s, 0); /* pad1 (2 bytes) */ generalCapabilitySet = (CLIPRDR_GENERAL_CAPABILITY_SET*) capabilities->capabilitySets; Stream_Write_UINT16(s, generalCapabilitySet->capabilitySetType); /* capabilitySetType (2 bytes) */ Stream_Write_UINT16(s, generalCapabilitySet->capabilitySetLength); /* lengthCapability (2 bytes) */ Stream_Write_UINT32(s, generalCapabilitySet->version); /* version (4 bytes) */ Stream_Write_UINT32(s, generalCapabilitySet->generalFlags); /* generalFlags (4 bytes) */ WLog_DBG(TAG, "ServerCapabilities"); return cliprdr_server_packet_send(cliprdr, s); }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_server_unlock_clipboard_data(CliprdrServerContext* context, CLIPRDR_UNLOCK_CLIPBOARD_DATA* unlockClipboardData) { wStream* s; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; s = cliprdr_server_packet_new(CB_UNLOCK_CLIPDATA, 0, 4); if (!s) { WLog_ERR(TAG, "cliprdr_server_packet_new failed!"); return ERROR_INTERNAL_ERROR; } Stream_Write_UINT32(s, unlockClipboardData->clipDataId); /* clipDataId (4 bytes) */ WLog_DBG(TAG, "ServerUnlockClipboardData: clipDataId: 0x%04X", unlockClipboardData->clipDataId); return cliprdr_server_packet_send(cliprdr, s); }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_server_format_list_response(CliprdrServerContext* context, CLIPRDR_FORMAT_LIST_RESPONSE* formatListResponse) { wStream* s; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; formatListResponse->msgType = CB_FORMAT_LIST_RESPONSE; formatListResponse->dataLen = 0; s = cliprdr_server_packet_new(formatListResponse->msgType, formatListResponse->msgFlags, formatListResponse->dataLen); if (!s) { WLog_ERR(TAG, "cliprdr_server_packet_new failed!"); return ERROR_INTERNAL_ERROR; } WLog_DBG(TAG, "ServerFormatListResponse"); return cliprdr_server_packet_send(cliprdr, s); }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_server_format_data_response(CliprdrServerContext* context, CLIPRDR_FORMAT_DATA_RESPONSE* formatDataResponse) { wStream* s; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; formatDataResponse->msgType = CB_FORMAT_DATA_RESPONSE; s = cliprdr_server_packet_new(formatDataResponse->msgType, formatDataResponse->msgFlags, formatDataResponse->dataLen); if (!s) { WLog_ERR(TAG, "cliprdr_server_packet_new failed!"); return ERROR_INTERNAL_ERROR; } Stream_Write(s, formatDataResponse->requestedFormatData, formatDataResponse->dataLen); WLog_DBG(TAG, "ServerFormatDataResponse"); return cliprdr_server_packet_send(cliprdr, s); }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_server_monitor_ready(CliprdrServerContext* context, CLIPRDR_MONITOR_READY* monitorReady) { wStream* s; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; monitorReady->msgType = CB_MONITOR_READY; monitorReady->msgFlags = 0; monitorReady->dataLen = 0; s = cliprdr_server_packet_new(monitorReady->msgType, monitorReady->msgFlags, monitorReady->dataLen); if (!s) { WLog_ERR(TAG, "cliprdr_server_packet_new failed!"); return ERROR_INTERNAL_ERROR; } WLog_DBG(TAG, "ServerMonitorReady"); return cliprdr_server_packet_send(cliprdr, s); }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_server_format_data_request(CliprdrServerContext* context, CLIPRDR_FORMAT_DATA_REQUEST* formatDataRequest) { wStream* s; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; formatDataRequest->msgType = CB_FORMAT_DATA_REQUEST; formatDataRequest->msgFlags = 0; formatDataRequest->dataLen = 4; s = cliprdr_server_packet_new(formatDataRequest->msgType, formatDataRequest->msgFlags, formatDataRequest->dataLen); if (!s) { WLog_ERR(TAG, "cliprdr_server_packet_new failed!"); return ERROR_INTERNAL_ERROR; } Stream_Write_UINT32(s, formatDataRequest->requestedFormatId); /* requestedFormatId (4 bytes) */ WLog_DBG(TAG, "ClientFormatDataRequest"); return cliprdr_server_packet_send(cliprdr, s); }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_server_format_list(CliprdrServerContext* context, CLIPRDR_FORMAT_LIST* formatList) { wStream* s; UINT32 index; int length = 0; int cchWideChar; LPWSTR lpWideCharStr; int formatNameSize; int formatNameLength; char* szFormatName; WCHAR* wszFormatName; BOOL asciiNames = FALSE; CLIPRDR_FORMAT* format; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; if (!cliprdr->useLongFormatNames) { length = formatList->numFormats * 36; s = cliprdr_server_packet_new(CB_FORMAT_LIST, 0, length); if (!s) { WLog_ERR(TAG, "cliprdr_server_packet_new failed!"); return ERROR_INTERNAL_ERROR; } for (index = 0; index < formatList->numFormats; index++) { format = (CLIPRDR_FORMAT*) &(formatList->formats[index]); Stream_Write_UINT32(s, format->formatId); /* formatId (4 bytes) */ formatNameSize = 0; formatNameLength = 0; szFormatName = format->formatName; if (asciiNames) { if (szFormatName) formatNameLength = strlen(szFormatName); if (formatNameLength > 31) formatNameLength = 31; Stream_Write(s, szFormatName, formatNameLength); Stream_Zero(s, 32 - formatNameLength); } else { wszFormatName = NULL; if (szFormatName) formatNameSize = ConvertToUnicode(CP_UTF8, 0, szFormatName, -1, &wszFormatName, 0); if (formatNameSize > 15) formatNameSize = 15; if (wszFormatName) Stream_Write(s, wszFormatName, formatNameSize * 2); Stream_Zero(s, 32 - (formatNameSize * 2)); free(wszFormatName); } } } else { for (index = 0; index < formatList->numFormats; index++) { format = (CLIPRDR_FORMAT*) &(formatList->formats[index]); length += 4; formatNameSize = 2; if (format->formatName) formatNameSize = MultiByteToWideChar(CP_UTF8, 0, format->formatName, -1, NULL, 0) * 2; length += formatNameSize; } s = cliprdr_server_packet_new(CB_FORMAT_LIST, 0, length); if (!s) { WLog_ERR(TAG, "cliprdr_server_packet_new failed!"); return ERROR_INTERNAL_ERROR; } for (index = 0; index < formatList->numFormats; index++) { format = (CLIPRDR_FORMAT*) &(formatList->formats[index]); Stream_Write_UINT32(s, format->formatId); /* formatId (4 bytes) */ if (format->formatName) { lpWideCharStr = (LPWSTR) Stream_Pointer(s); cchWideChar = (Stream_Capacity(s) - Stream_GetPosition(s)) / 2; formatNameSize = MultiByteToWideChar(CP_UTF8, 0, format->formatName, -1, lpWideCharStr, cchWideChar) * 2; Stream_Seek(s, formatNameSize); } else { Stream_Write_UINT16(s, 0); } } } WLog_DBG(TAG, "ServerFormatList: numFormats: %d", formatList->numFormats); return cliprdr_server_packet_send(cliprdr, s); }