VirtualBox

Ignore:
Timestamp:
May 13, 2019 7:44:15 AM (6 years ago)
Author:
vboxsync
Message:

Shared Clipboard/URI: Update.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-win.cpp

    r78440 r78474  
    8787    int rc;
    8888
     89    LogFlowFuncEnter();
     90
    8991    const BOOL fRc = CloseClipboard();
    9092    if (RT_UNLIKELY(!fRc))
    9193    {
    9294        const DWORD dwLastErr = GetLastError();
    93         rc = RTErrConvertFromWin32(dwLastErr);
     95        if (dwLastErr == ERROR_CLIPBOARD_NOT_OPEN)
     96            rc = VERR_INVALID_STATE;
     97        else
     98            rc = RTErrConvertFromWin32(dwLastErr);
     99
    94100        LogFunc(("Failed with %Rrc (0x%x)\n", rc, dwLastErr));
    95101    }
     
    108114{
    109115    int rc;
     116
     117    LogFlowFuncEnter();
    110118
    111119    const BOOL fRc = EmptyClipboard();
     
    113121    {
    114122        const DWORD dwLastErr = GetLastError();
    115         rc = RTErrConvertFromWin32(dwLastErr);
     123        if (dwLastErr == ERROR_CLIPBOARD_NOT_OPEN)
     124            rc = VERR_INVALID_STATE;
     125        else
     126            rc = RTErrConvertFromWin32(dwLastErr);
     127
    116128        LogFunc(("Failed with %Rrc (0x%x)\n", rc, dwLastErr));
    117129    }
     
    265277}
    266278
     279VBOXCLIPBOARDFORMAT VBoxClipboardWinClipboardFormatToVBox(UINT uFormat)
     280{
     281    /* Insert the requested clipboard format data into the clipboard. */
     282    VBOXCLIPBOARDFORMAT vboxFormat = VBOX_SHARED_CLIPBOARD_FMT_NONE;
     283
     284    switch (uFormat)
     285    {
     286      case CF_UNICODETEXT:
     287          vboxFormat = VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT;
     288          break;
     289
     290      case CF_DIB:
     291          vboxFormat = VBOX_SHARED_CLIPBOARD_FMT_BITMAP;
     292          break;
     293
     294      default:
     295          if (uFormat >= 0xC000) /** Formats registered with RegisterClipboardFormat() start at this index. */
     296          {
     297              TCHAR szFormatName[256]; /** @todo r=andy Do we need Unicode support here as well? */
     298              int cActual = GetClipboardFormatName(uFormat, szFormatName, sizeof(szFormatName) / sizeof(TCHAR));
     299              if (cActual)
     300              {
     301                  LogFunc(("szFormatName=%s\n", szFormatName));
     302
     303                  if (RTStrCmp(szFormatName, VBOX_CLIPBOARD_WIN_REGFMT_HTML) == 0)
     304                      vboxFormat = VBOX_SHARED_CLIPBOARD_FMT_HTML;
     305#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     306                  else if (RTStrCmp(szFormatName, VBOX_CLIPBOARD_WIN_REGFMT_URI_LIST) == 0)
     307                      vboxFormat = VBOX_SHARED_CLIPBOARD_FMT_URI_LIST;
     308#endif
     309              }
     310          }
     311          break;
     312    }
     313
     314    return vboxFormat;
     315}
     316
    267317/**
    268318 * Retrieves all supported clipboard formats of a specific clipboard.
     
    270320 * @returns VBox status code.
    271321 * @param   pCtx                Windows clipboard context to retrieve formats for.
    272  * @param   puFormats           Where to store the retrieved formats of type VBOX_SHARED_CLIPBOARD_FMT_ (bitmask).
    273  */
    274 int VBoxClipboardWinGetFormats(PVBOXCLIPBOARDWINCTX pCtx, uint32_t *puFormats)
     322 * @param   pfFormats           Where to store the retrieved formats of type VBOX_SHARED_CLIPBOARD_FMT_ (bitmask).
     323 */
     324int VBoxClipboardWinGetFormats(PVBOXCLIPBOARDWINCTX pCtx, PVBOXCLIPBOARDFORMATS pfFormats)
    275325{
    276326    AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
    277     AssertPtrReturn(puFormats, VERR_INVALID_POINTER);
    278 
    279     uint32_t uFormats = VBOX_SHARED_CLIPBOARD_FMT_NONE;
     327    AssertPtrReturn(pfFormats, VERR_INVALID_POINTER);
     328
     329    VBOXCLIPBOARDFORMATS fFormats = VBOX_SHARED_CLIPBOARD_FMT_NONE;
    280330
    281331    /* Query list of available formats and report to host. */
     
    283333    if (RT_SUCCESS(rc))
    284334    {
    285         UINT uCurFormat = 0;
     335        UINT uCurFormat = 0; /* Must be set to zero for EnumClipboardFormats(). */
    286336        while ((uCurFormat = EnumClipboardFormats(uCurFormat)) != 0)
    287         {
    288             LogFlowFunc(("uFormat = 0x%08X\n", uCurFormat));
    289             switch (uCurFormat)
    290             {
    291                 case CF_UNICODETEXT:
    292                 case CF_TEXT:
    293                     uFormats |= VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT;
    294                     break;
    295 
    296                 case CF_DIB:
    297                 case CF_BITMAP:
    298                     uFormats |= VBOX_SHARED_CLIPBOARD_FMT_BITMAP;
    299                     break;
    300 
    301 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
    302                 case CF_HDROP:
    303                     uFormats |= VBOX_SHARED_CLIPBOARD_FMT_URI_LIST;
    304                     break;
    305 #endif
    306                 default:
    307                 {
    308                     if (uCurFormat >= 0xC000) /** @todo r=andy Find a define for this. */
    309                     {
    310                         TCHAR szFormatName[256]; /** @todo r=andy Is this enough? */
    311                         int cActual = GetClipboardFormatName(uCurFormat, szFormatName, sizeof(szFormatName)/sizeof (TCHAR));
    312                         if (cActual)
    313                         {
    314                             if (strcmp (szFormatName, "HTML Format") == 0)
    315                             {
    316                                 uFormats |= VBOX_SHARED_CLIPBOARD_FMT_HTML;
    317                             }
    318                         }
    319                     }
    320                     break;
    321                 }
    322             }
    323         }
     337            fFormats |= VBoxClipboardWinClipboardFormatToVBox(uCurFormat);
    324338
    325339        int rc2 = VBoxClipboardWinClose();
     
    333347    else
    334348    {
    335         LogFlowFunc(("uFormats = 0x%08X\n", uFormats));
    336         *puFormats = uFormats;
    337     }
    338 
    339     return rc;
    340 }
    341 
     349        LogFlowFunc(("pfFormats=0x%08X\n", pfFormats));
     350        *pfFormats = fFormats;
     351    }
     352
     353    return rc;
     354}
     355
Note: See TracChangeset for help on using the changeset viewer.

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