VirtualBox

Ignore:
Timestamp:
Aug 27, 2019 5:47:44 PM (5 years ago)
Author:
vboxsync
Message:

Shared Clipboard/URI: Added protocol versioning support plus enhanced versions of existing commands (to also provide context IDs, among other stuff). So far only the host service(s) and the Windows guest is using the new(er) protocol.

Location:
trunk/src/VBox/Additions/WINNT/VBoxTray
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxTray/Makefile.kmk

    r80324 r80444  
    5151 VBoxTray_SOURCES  += \
    5252        VBoxClipboard.cpp \
    53         $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-win.cpp
     53        $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-win.cpp \
     54        $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-common.cpp
    5455 ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
    5556  VBoxTray_DEFS     += VBOX_WITH_SHARED_CLIPBOARD_GUEST
     
    6061        $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardPath.cpp \
    6162        $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardStreamImpl-win.cpp \
    62         $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-common.cpp \
    6363        $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-uri.cpp
    6464 endif
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp

    r80374 r80444  
    2727
    2828#include <iprt/asm.h>
     29#include <iprt/errcore.h>
     30#include <iprt/mem.h>
    2931#include <iprt/ldr.h>
    3032
    31 #include <iprt/errcore.h>
    3233
    3334#include <VBox/GuestHost/SharedClipboard.h>
     35#include <VBox/GuestHost/SharedClipboard-win.h>
     36#include <VBox/GuestHost/clipboard-helper.h>
    3437#include <VBox/HostServices/VBoxClipboardSvc.h> /* Temp, remove. */
    35 #include <VBox/GuestHost/SharedClipboard-win.h>
    3638#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
    3739# include <VBox/GuestHost/SharedClipboard-uri.h>
     
    118120    if (RT_SUCCESS(rc))
    119121    {
    120         rc = VbglR3ClipboardTransferSendStatus(&cmdCtx, SHAREDCLIPBOARDURITRANSFERSTATUS_RUNNING);
     122        rc = VbglR3ClipboardTransferSendStatus(&cmdCtx, pTransfer, SHAREDCLIPBOARDURITRANSFERSTATUS_RUNNING);
    121123        if (RT_SUCCESS(rc))
    122124        {
     
    127129            {
    128130                PVBGLR3CLIPBOARDEVENT pEvent = NULL;
    129                 rc = VbglR3ClipboardEventGetNext(&cmdCtx, pTransfer, &pEvent);
     131                rc = VbglR3ClipboardEventGetNext(&cmdCtx, &pEvent);
    130132                if (RT_SUCCESS(rc))
    131133                {
     
    425427               /* Clipboard was updated by another application.
    426428                * Report available formats to the host. */
    427                VBOXCLIPBOARDFORMATS fFormats;
    428                int rc = VBoxClipboardWinGetFormats(&pCtx->Win, &fFormats);
     429               SHAREDCLIPBOARDFORMATDATA Formats;
     430               int rc = VBoxClipboardWinGetFormats(&pCtx->Win, &Formats);
    429431               if (RT_SUCCESS(rc))
    430432               {
    431                    LogFunc(("WM_CLIPBOARDUPDATE: Reporting formats 0x%x\n", fFormats));
    432                    rc = VbglR3ClipboardReportFormats(pCtx->CmdCtx.uClientID, fFormats);
     433                   LogFunc(("WM_CLIPBOARDUPDATE: Reporting formats 0x%x\n", Formats.uFormats));
     434                   rc = VbglR3ClipboardFormatsSend(&pCtx->CmdCtx, &Formats);
    433435               }
    434436           }
     
    452454               /* Clipboard was updated by another application. */
    453455               /* WM_DRAWCLIPBOARD always expects a return code of 0, so don't change "rc" here. */
    454                VBOXCLIPBOARDFORMATS fFormats;
    455                int rc = VBoxClipboardWinGetFormats(pWinCtx, &fFormats);
     456               SHAREDCLIPBOARDFORMATDATA Formats;
     457               int rc = VBoxClipboardWinGetFormats(pWinCtx, &Formats);
    456458               if (RT_SUCCESS(rc))
    457                    rc = VbglR3ClipboardReportFormats(pCtx->CmdCtx.uClientID, fFormats);
     459                   rc = VbglR3ClipboardFormatsSend(&pCtx->CmdCtx, &Formats);
    458460           }
    459461
     
    641643
    642644           /* Announce available formats. Do not insert data -- will be inserted in WM_RENDERFORMAT. */
    643            VBOXCLIPBOARDFORMATS fFormats = (uint32_t)lParam;
     645           PVBGLR3CLIPBOARDEVENT pEvent = (PVBGLR3CLIPBOARDEVENT)lParam;
     646           AssertPtr(pEvent);
     647           Assert(pEvent->enmType == VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS);
     648
     649           const VBOXCLIPBOARDFORMATS fFormats =  pEvent->u.ReportFormats.uFormats;
     650
    644651           if (fFormats != VBOX_SHARED_CLIPBOARD_FMT_NONE) /* Could arrive with some older GA versions. */
    645652           {
     
    687694       {
    688695           /* Send data in the specified format to the host. */
    689            VBOXCLIPBOARDFORMAT uFormat = (uint32_t)lParam;
     696           PVBGLR3CLIPBOARDEVENT pEvent = (PVBGLR3CLIPBOARDEVENT)lParam;
     697           AssertPtr(pEvent);
     698           Assert(pEvent->enmType == VBGLR3CLIPBOARDEVENTTYPE_READ_DATA);
     699
     700           const VBOXCLIPBOARDFORMAT uFormat = (uint32_t)pEvent->u.ReadData.uFmt;
     701
    690702           HANDLE hClip = NULL;
    691703
     
    703715                       if (lp != NULL)
    704716                       {
    705                            rc = VbglR3ClipboardWriteData(pCtx->CmdCtx.uClientID, VBOX_SHARED_CLIPBOARD_FMT_BITMAP,
    706                                                          lp, GlobalSize(hClip));
     717                           SHAREDCLIPBOARDDATABLOCK dataBlock = { uFormat, lp, (uint32_t)GlobalSize(hClip) };
     718
     719                           rc = VbglR3ClipboardWriteDataEx(&pEvent->cmdCtx, &dataBlock);
     720
    707721                           GlobalUnlock(hClip);
    708722                       }
     
    721735                       if (uniString != NULL)
    722736                       {
    723                            rc = VbglR3ClipboardWriteData(pCtx->CmdCtx.uClientID, VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT,
    724                                                          uniString, (lstrlenW(uniString) + 1) * 2);
     737                           SHAREDCLIPBOARDDATABLOCK dataBlock = { uFormat, uniString, ((uint32_t)lstrlenW(uniString) + 1) * 2 };
     738
     739                           rc = VbglR3ClipboardWriteDataEx(&pEvent->cmdCtx, &dataBlock);
     740
    725741                           GlobalUnlock(hClip);
    726742                       }
     
    743759                           if (lp != NULL)
    744760                           {
    745                                rc = VbglR3ClipboardWriteData(pCtx->CmdCtx.uClientID, VBOX_SHARED_CLIPBOARD_FMT_HTML,
    746                                                              lp, GlobalSize(hClip));
     761                               SHAREDCLIPBOARDDATABLOCK dataBlock = { uFormat, lp, (uint32_t)GlobalSize(hClip) };
     762
     763                               rc = VbglR3ClipboardWriteDataEx(&pEvent->cmdCtx, &dataBlock);
     764
    747765                               GlobalUnlock(hClip);
    748766                           }
     
    754772                   }
    755773               }
     774#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     775               else if (uFormat == VBOX_SHARED_CLIPBOARD_FMT_URI_LIST)
     776               {
     777                   LogFunc(("cTransfersRunning=%RU32\n", SharedClipboardURICtxGetRunningTransfers(&pCtx->URI)));
     778
     779                   int rc = VBoxClipboardWinOpen(hwnd);
     780                   if (RT_SUCCESS(rc))
     781                   {
     782                       PSHAREDCLIPBOARDURITRANSFER pTransfer;
     783                       rc = SharedClipboardURITransferCreate(SHAREDCLIPBOARDURITRANSFERDIR_WRITE,
     784                                                             SHAREDCLIPBOARDSOURCE_LOCAL,
     785                                                             &pTransfer);
     786                       if (RT_SUCCESS(rc))
     787                       {
     788                           rc = SharedClipboardURICtxTransferAdd(&pCtx->URI, pTransfer);
     789                           if (RT_SUCCESS(rc))
     790                           {
     791                               /* The data data in CF_HDROP format, as the files are locally present and don't need to be
     792                                * presented as a IDataObject or IStream. */
     793                               HANDLE hClip = hClip = GetClipboardData(CF_HDROP);
     794                               if (hClip)
     795                               {
     796                                   HDROP hDrop = (HDROP)GlobalLock(hClip);
     797                                   if (hDrop)
     798                                   {
     799                                       char    *papszList;
     800                                       uint32_t cbList;
     801                                       rc = VBoxClipboardWinDropFilesToStringList((DROPFILES *)hDrop, &papszList, &cbList);
     802
     803                                       GlobalUnlock(hClip);
     804
     805                                       if (RT_SUCCESS(rc))
     806                                       {
     807                                           rc = SharedClipboardURILTransferSetRoots(pTransfer,
     808                                                                                    papszList, cbList + 1 /* Include termination */);
     809                                           if (RT_SUCCESS(rc))
     810                                           {
     811                                               PVBOXCLIPBOARDURIWRITETHREADCTX pThreadCtx
     812                                                   = (PVBOXCLIPBOARDURIWRITETHREADCTX)RTMemAllocZ(sizeof(VBOXCLIPBOARDURIWRITETHREADCTX));
     813                                               if (pThreadCtx)
     814                                               {
     815                                                   pThreadCtx->pClipboardCtx = pCtx;
     816                                                   pThreadCtx->pTransfer     = pTransfer;
     817
     818                                                   rc = SharedClipboardURITransferPrepare(pTransfer);
     819                                                   if (RT_SUCCESS(rc))
     820                                                   {
     821                                                       rc = SharedClipboardURITransferRun(pTransfer, vboxClipboardURIWriteThread,
     822                                                                                          pThreadCtx /* pvUser */);
     823                                                       /* pThreadCtx now is owned by vboxClipboardURIWriteThread(). */
     824                                                   }
     825                                               }
     826                                               else
     827                                                   rc = VERR_NO_MEMORY;
     828                                           }
     829
     830                                           if (papszList)
     831                                               RTStrFree(papszList);
     832                                       }
     833                                   }
     834                                   else
     835                                   {
     836                                       hClip = NULL;
     837                                   }
     838                               }
     839                           }
     840                       }
     841
     842                       VBoxClipboardWinClose();
     843                   }
     844
     845                   if (RT_FAILURE(rc))
     846                       LogFunc(("Failed with rc=%Rrc\n", rc));
     847               }
     848#endif
    756849
    757850               if (hClip == NULL)
     
    771864       }
    772865
    773 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     866#if 0
    774867       /* The host wants to read URI data. */
    775868       case VBOX_CLIPBOARD_WM_URI_START_READ:
     
    10551148        /* ignore rc */ VBoxClipboardWinCheckAndInitNewAPI(&pCtx->Win.newAPI);
    10561149
    1057         rc = VbglR3ClipboardConnect(&pCtx->CmdCtx.uClientID);
     1150        rc = VbglR3ClipboardConnectEx(&pCtx->CmdCtx);
    10581151        if (RT_SUCCESS(rc))
    10591152        {
    1060             pCtx->CmdCtx.uProtocol = 0;
    1061 
    10621153            rc = vboxClipboardCreateWindow(pCtx);
    10631154            if (RT_SUCCESS(rc))
     
    10711162            else
    10721163            {
    1073                 VbglR3ClipboardDisconnect(pCtx->CmdCtx.uClientID);
     1164                VbglR3ClipboardDisconnectEx(&pCtx->CmdCtx);
    10741165            }
    10751166        }
     
    10981189    int rc;
    10991190
     1191    LogFlowFunc(("Using protocol %RU32\n", pCtx->CmdCtx.uProtocolVer));
     1192
     1193    uint32_t uMsg;
     1194    uint32_t uFormats;
     1195
    11001196    /* The thread waits for incoming messages from the host. */
    11011197    for (;;)
    11021198    {
    1103         LogFlowFunc(("Waiting for host message ...\n"));
    1104 
    1105         uint32_t u32Msg;
    1106         uint32_t u32Formats;
    1107         rc = VbglR3ClipboardGetHostMsgOld(pCtx->CmdCtx.uClientID, &u32Msg, &u32Formats);
     1199        PVBGLR3CLIPBOARDEVENT pEvent = NULL;
     1200
     1201        LogFlowFunc(("Waiting for host message (protocol v%RU32) ...\n", pCtx->CmdCtx.uProtocolVer));
     1202
     1203        if (pCtx->CmdCtx.uProtocolVer == 0) /* Legacy protocol */
     1204        {
     1205            rc = VbglR3ClipboardGetHostMsgOld(pCtx->CmdCtx.uClientID, &uMsg, &uFormats);
     1206            if (RT_FAILURE(rc))
     1207            {
     1208                if (rc == VERR_INTERRUPTED)
     1209                    break;
     1210
     1211                LogFunc(("Error getting host message, rc=%Rrc\n", rc));
     1212            }
     1213            else
     1214            {
     1215                PVBGLR3CLIPBOARDEVENT pEvent = (PVBGLR3CLIPBOARDEVENT)RTMemAllocZ(sizeof(VBGLR3CLIPBOARDEVENT));
     1216                if (!pEvent)
     1217                {
     1218                    rc = VERR_NO_MEMORY;
     1219                    break;
     1220                }
     1221
     1222                switch (uMsg)
     1223                {
     1224                    case VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE:
     1225                    {
     1226                        pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS;
     1227                        pEvent->u.ReportFormats.uFormats = uFormats;
     1228                        break;
     1229                    }
     1230
     1231                    case VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA:
     1232                    {
     1233                        pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_READ_DATA;
     1234                        pEvent->u.ReadData.uFmt = uFormats;
     1235                        break;
     1236                    }
     1237
     1238                    default:
     1239                        rc = VERR_NOT_SUPPORTED;
     1240                        break;
     1241                }
     1242            }
     1243        }
     1244        else /* Protocol >= v1. */
     1245        {
     1246            rc = VbglR3ClipboardEventGetNext(&pCtx->CmdCtx, &pEvent);
     1247        }
     1248
    11081249        if (RT_FAILURE(rc))
    11091250        {
    1110             if (rc == VERR_INTERRUPTED)
    1111                 break;
    1112 
    1113             LogFunc(("Error getting host message, rc=%Rrc\n", rc));
    1114 
    11151251            if (*pfShutdown)
    11161252                break;
     
    11221258        else
    11231259        {
    1124             LogFlowFunc(("u32Msg=%RU32, u32Formats=0x%x\n", u32Msg, u32Formats));
    1125             switch (u32Msg)
     1260            AssertPtr(pEvent);
     1261            LogFlowFunc(("Event uType=%RU32\n", pEvent->enmType));
     1262
     1263            switch (pEvent->enmType)
    11261264            {
    1127                case VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS:
    1128                {
    1129                    LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS\n"));
    1130 
     1265               case VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS:
     1266               {
    11311267                   /* The host has announced available clipboard formats.
    11321268                    * Forward the information to the window, so it can later
    11331269                    * respond to WM_RENDERFORMAT message. */
    1134                    ::PostMessage(pWinCtx->hWnd, VBOX_CLIPBOARD_WM_REPORT_FORMATS, 0, u32Formats);
     1270                   ::PostMessage(pWinCtx->hWnd, VBOX_CLIPBOARD_WM_REPORT_FORMATS,
     1271                                 0 /* wParam */, (LPARAM)pEvent /* lParam */);
    11351272                   break;
    11361273               }
    11371274
    1138                case VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA:
    1139                {
    1140                    LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA\n"));
    1141 
     1275               case VBGLR3CLIPBOARDEVENTTYPE_READ_DATA:
     1276               {
    11421277                   /* The host needs data in the specified format. */
    1143                    ::PostMessage(pWinCtx->hWnd, VBOX_CLIPBOARD_WM_READ_DATA, 0, u32Formats);
     1278                   ::PostMessage(pWinCtx->hWnd, VBOX_CLIPBOARD_WM_READ_DATA,
     1279                                 0 /* wParam */, (LPARAM)pEvent /* lParam */);
    11441280                   break;
    11451281               }
    1146 
    1147 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     1282#if 0
    11481283               case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START:
    11491284               {
    1150                    LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START\n"));
    1151 
    11521285                   const UINT uMsg = u32Formats == 0 ?
    11531286                                     VBOX_CLIPBOARD_WM_URI_START_READ : VBOX_CLIPBOARD_WM_URI_START_WRITE;
     
    11571290               }
    11581291#endif
    1159                case VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT:
    1160                {
    1161                    LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT\n"));
    1162 
     1292               case VBGLR3CLIPBOARDEVENTTYPE_QUIT:
     1293               {
    11631294                   /* The host is terminating. */
    11641295                   LogRel(("Clipboard: Terminating ...\n"));
     
    11691300               default:
    11701301               {
    1171                    LogFlowFunc(("Unsupported message from host, message=%RU32\n", u32Msg));
    1172 
    11731302                   /* Wait a bit before retrying. */
    11741303                   RTThreadSleep(1000);
     
    11761305               }
    11771306            }
     1307
     1308            if (RT_FAILURE(rc))
     1309                VbglR3ClipboardEventFree(pEvent);
    11781310        }
    11791311
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