VirtualBox

Changeset 85845 in vbox for trunk/src/VBox/Additions/darwin


Ignore:
Timestamp:
Aug 20, 2020 2:28:33 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
140013
Message:

Shared Clipboard/X11: Fixes for empty strings (was too strict before), don't include the terminating zeros when return string lengths to match IPRT. Also should fix the testcases.

Location:
trunk/src/VBox/Additions/darwin/VBoxClient
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/darwin/VBoxClient/VBoxClientClipboardGuestToHost.cpp

    r85828 r85845  
    221221    AssertPtrReturn(pwszData, VERR_INVALID_POINTER);
    222222
    223     size_t cwcActual; /* (includes a schwarzenegger character) */
    224     int rc = ShClUtf16LFLenUtf8(pwszData, cbData / sizeof(RTUTF16), &cwcActual);
    225     AssertReturn(RT_SUCCESS(rc), rc);
    226 
    227     PRTUTF16 pwszWinTmp = (PRTUTF16)RTMemAlloc(cwcActual * sizeof(RTUTF16));
    228     AssertReturn(pwszWinTmp, VERR_NO_MEMORY);
    229 
    230     rc = ShClConvUtf16LFToCRLF(pwszData, cbData / sizeof(RTUTF16), pwszWinTmp, cwcActual);
     223    size_t cwcTmp; /* (includes a schwarzenegger character) */
     224    int rc = ShClUtf16LFLenUtf8(pwszData, cbData / sizeof(RTUTF16), &cwcTmp);
     225    AssertRCReturn(rc, rc);
     226
     227    cwcTmp++; /* Add space for terminator. */
     228
     229    PRTUTF16 pwszTmp = (PRTUTF16)RTMemAlloc(cwcTmp * sizeof(RTUTF16));
     230    AssertReturn(pwszTmp, VERR_NO_MEMORY);
     231
     232    rc = ShClConvUtf16LFToCRLF(pwszData, cbData / sizeof(RTUTF16), pwszTmp, cwcTmp);
    231233    if (RT_SUCCESS(rc))
    232234        rc = vbclClipboardHostPasteData(u32ClientId, VBOX_SHCL_FMT_UNICODETEXT,
    233                                         pwszWinTmp, cwcActual * sizeof(RTUTF16));
    234 
    235     RTMemFree(pwszWinTmp);
     235                                        pwszTmp, cwcTmp * sizeof(RTUTF16));
     236
     237    RTMemFree(pwszTmp);
    236238
    237239    return rc;
  • trunk/src/VBox/Additions/darwin/VBoxClient/VBoxClientClipboardHostToGuest.cpp

    r85828 r85845  
    155155static int vbclClipboardGuestPasteText(PasteboardRef pPasteboard, void *pData, uint32_t cbDataSize)
    156156{
    157     size_t   cbActualLen;
    158     int      rc;
    159     char    *pszUtf8Buf;
    160     RTUTF16 *pDataInternal;
    161 
    162157    AssertReturn(pData, VERR_INVALID_PARAMETER);
    163158
     
    169164
    170165    /* Convert END-OF-LINE */
    171     rc = ShClUtf16CRLFLenUtf8((RTUTF16 *)pData, cbDataSize / sizeof(RTUTF16), &cbActualLen);
    172     AssertReturn(RT_SUCCESS(rc), rc);
    173     pDataInternal = (RTUTF16 *)RTMemAlloc(cbActualLen * sizeof(RTUTF16));
    174     AssertReturn(pDataInternal, VERR_NO_MEMORY);
    175     rc = ShClConvUtf16CRLFToLF((RTUTF16 *)pData, cbDataSize / sizeof(RTUTF16), pDataInternal, cbActualLen);
    176 
    177     /* Do actual paste */
     166    size_t cwcDst;
     167    int rc = ShClUtf16CRLFLenUtf8((RTUTF16 *)pData, cbDataSize / sizeof(RTUTF16), &cwcDst);
     168    AssertRCReturn(rc, rc);
     169
     170    cwcDst++; /* Add space for terminator. */
     171
     172    PRTUTF16 pwszDst = (RTUTF16 *)RTMemAlloc(cwcDst * sizeof(RTUTF16));
     173    AssertPtrReturn(pwszDst, VERR_NO_MEMORY);
     174
     175    rc = ShClConvUtf16CRLFToLF((RTUTF16 *)pData, cbDataSize / sizeof(RTUTF16), pwszDst, cwcDst);
    178176    if (RT_SUCCESS(rc))
    179177    {
    180178        /* Paste UTF16 */
    181         rc = vbclClipboardGuestPasteData(pPasteboard, (UInt8 *)pDataInternal, cbActualLen * 2, kUTTypeUTF16PlainText, true);
     179        rc = vbclClipboardGuestPasteData(pPasteboard, (UInt8 *)pwszDst, cwcDst * sizeof(RTUTF16), kUTTypeUTF16PlainText, true);
    182180        if (RT_SUCCESS(rc))
    183181        {
    184182            /* Paste UTF8 */
    185             rc = RTUtf16ToUtf8((RTUTF16 *)pDataInternal, &pszUtf8Buf);
     183            char *pszDst;
     184            rc = RTUtf16ToUtf8((PRTUTF16)pwszDst, &pszDst);
    186185            if (RT_SUCCESS(rc))
    187186            {
    188                 rc = vbclClipboardGuestPasteData(pPasteboard, (UInt8 *)pszUtf8Buf, strlen(pszUtf8Buf), kUTTypeUTF8PlainText, false);
    189                 RTStrFree(pszUtf8Buf);
     187                rc = vbclClipboardGuestPasteData(pPasteboard, (UInt8 *)pszDst, strlen(pszDst), kUTTypeUTF8PlainText, false);
     188                RTStrFree(pszDst);
    190189            }
    191190        }
     
    193192    }
    194193
    195     RTMemFree(pDataInternal);
     194    RTMemFree(pwszDst);
    196195
    197196    return rc;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette