/* $Id: clipboard-helper.h $ */ /** @file * Shared Clipboard - Some helper function for converting between the various EOLs. */ /* * Copyright (C) 2006-2019 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; * you can redistribute it and/or modify it under the terms of the GNU * General Public License (GPL) as published by the Free Software * Foundation, in version 2 as it comes in the "COPYING" file of the * VirtualBox OSE distribution. VirtualBox OSE is distributed in the * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. * * The contents of this file may alternatively be used under the terms * of the Common Development and Distribution License Version 1.0 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the * VirtualBox OSE distribution, in which case the provisions of the * CDDL are applicable instead of those of the GPL. * * You may elect to license modified versions of this file under the * terms and conditions of either the GPL or the CDDL or both. */ #ifndef VBOX_INCLUDED_GuestHost_clipboard_helper_h #define VBOX_INCLUDED_GuestHost_clipboard_helper_h #ifndef RT_WITHOUT_PRAGMA_ONCE # pragma once #endif #include /** Constants needed for string conversions done by the Linux/Mac clipboard code. */ enum { /** In Linux, lines end with a linefeed character. */ LINEFEED = 0xa, /** In Windows, lines end with a carriage return and a linefeed character. */ CARRIAGERETURN = 0xd, /** Little endian "real" UTF-16 strings start with this marker. */ UTF16LEMARKER = 0xfeff, /** Big endian "real" UTF-16 strings start with this marker. */ UTF16BEMARKER = 0xfffe }; /** * Get the size of the buffer needed to hold a UTF-16-LE zero terminated string * with Windows EOLs converted from a UTF-16 string with Linux EOLs. * * @returns VBox status code. * * @param pwszSrc The source UTF-16 string. * @param cwcSrc The length of the source string in RTUTF16 units. * @param pcwcDst The length of the destination string in RTUTF16 units. */ int vboxClipboardUtf16GetWinSize(PRTUTF16 pwszSrc, size_t cwcSrc, size_t *pcwcDst); /** * Convert a UTF-16 text with Linux EOLs to null-terminated UTF-16-LE with * Windows EOLs. * * Does no checking for validity. * * @returns VBox status code * * @param pwszSrc Source UTF-16 text to convert. * @param cwcSrc Size of the source text int RTUTF16 units * @param pwszDst Buffer to store the converted text to. * @param cwcDst Size of the buffer for the converted text in RTUTF16 units. */ int vboxClipboardUtf16LinToWin(PRTUTF16 pwszSrc, size_t cwcSrc, PRTUTF16 pwszDst, size_t cwcDst); /** * Get the size of the buffer needed to hold a zero-terminated UTF-16 string * with Linux EOLs converted from a UTF-16 string with Windows EOLs. * * @returns RT status code * * @param pwszSrc The source UTF-16 string * @param cwcSrc The length of the source string in RTUTF16 units. * @retval pcwcDst The length of the destination string in RTUTF16 units. */ int vboxClipboardUtf16GetLinSize(PRTUTF16 pwszSrc, size_t cwcSrc, size_t *pcwcDst); /** * Convert UTF-16-LE text with Windows EOLs to zero-terminated UTF-16 with Linux * EOLs. This function does not verify that the UTF-16 is valid. * * @returns VBox status code * * @param pwszSrc Text to convert * @param cwcSrc Size of the source text in RTUTF16 units. * @param pwszDst The buffer to store the converted text to * @param cwcDst The size of the buffer for the destination text in RTUTF16 * chars. */ int vboxClipboardUtf16WinToLin(PRTUTF16 pwszSrc, size_t cwcSrc, PRTUTF16 pwszDst, size_t cwcDst); #pragma pack(1) /** @todo r=bird: Why duplicate these structures here, we've got them in * DevVGA.cpp already! */ /** * Bitmap File Header. Official win32 name is BITMAPFILEHEADER * Always Little Endian. */ typedef struct BMFILEHEADER { /** @todo r=bird: this type centric prefixing is what give hungarian notation a bad name... */ uint16_t u16Type; uint32_t u32Size; uint16_t u16Reserved1; uint16_t u16Reserved2; uint32_t u32OffBits; } BMFILEHEADER; /** Pointer to a BMFILEHEADER structure. */ typedef BMFILEHEADER *PBMFILEHEADER; /** BMP file magic number */ #define BITMAPHEADERMAGIC (RT_H2LE_U16_C(0x4d42)) /** * Bitmap Info Header. Official win32 name is BITMAPINFOHEADER * Always Little Endian. */ typedef struct BMINFOHEADER { /** @todo r=bird: this type centric prefixing is what give hungarian notation a bad name... */ uint32_t u32Size; uint32_t u32Width; uint32_t u32Height; uint16_t u16Planes; uint16_t u16BitCount; uint32_t u32Compression; uint32_t u32SizeImage; uint32_t u32XBitsPerMeter; uint32_t u32YBitsPerMeter; uint32_t u32ClrUsed; uint32_t u32ClrImportant; } BMINFOHEADER; /** Pointer to a BMINFOHEADER structure. */ typedef BMINFOHEADER *PBMINFOHEADER; #pragma pack() /** @todo r=bird: Only BMFILEHEADER needs packing. The BMINFOHEADER is perfectly aligned. */ /** * Convert CF_DIB data to full BMP data by prepending the BM header. * Allocates with RTMemAlloc. * * @returns VBox status code * * @param pvSrc DIB data to convert * @param cbSrc Size of the DIB data to convert in bytes * @param ppvDst Where to store the pointer to the buffer for the * destination data * @param pcbDst Pointer to the size of the buffer for the destination * data in bytes. */ int vboxClipboardDibToBmp(const void *pvSrc, size_t cbSrc, void **ppvDst, size_t *pcbDst); /** * Get the address and size of CF_DIB data in a full BMP data in the input buffer. * Does not do any allocation. * * @returns VBox status code * * @param pvSrc BMP data to convert * @param cbSrc Size of the BMP data to convert in bytes * @param ppvDst Where to store the pointer to the destination data * @param pcbDst Pointer to the size of the destination data in bytes */ int vboxClipboardBmpGetDib(const void *pvSrc, size_t cbSrc, const void **ppvDst, size_t *pcbDst); #endif /* !VBOX_INCLUDED_GuestHost_clipboard_helper_h */