VirtualBox

Ignore:
Timestamp:
Sep 17, 2019 9:05:21 AM (5 years ago)
Author:
vboxsync
Message:

Shared Clipboard/URI: More code for transfer channel handling.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp

    r80667 r80845  
    5555{
    5656    /** Pointer to the VBoxClient service environment. */
    57     const VBOXSERVICEENV    *pEnv;
     57    const VBOXSERVICEENV *pEnv;
    5858    /** Command context. */
    59     VBGLR3SHCLCMDCTX         CmdCtx;
     59    VBGLR3SHCLCMDCTX      CmdCtx;
    6060    /** Windows-specific context data. */
    61     SHCLWINCTX      Win;
    62 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
    63     /** URI transfer data. */
    64     SHCLURICTX    URI;
     61    SHCLWINCTX            Win;
     62#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     63    /** Associated transfer data. */
     64    SHCLURICTX            URI;
    6565#endif
    6666} SHCLCONTEXT, *PSHCLCONTEXT;
     
    6969typedef struct _SHCLURIREADTHREADCTX
    7070{
    71     PSHCLCONTEXT       pClipboardCtx;
     71    PSHCLCONTEXT     pClipboardCtx;
    7272    PSHCLURITRANSFER pTransfer;
    7373} SHCLURIREADTHREADCTX, *PSHCLURIREADTHREADCTX;
     
    7575typedef struct _SHCLURIWRITETHREADCTX
    7676{
    77     PSHCLCONTEXT       pClipboardCtx;
     77    PSHCLCONTEXT     pClipboardCtx;
    7878    PSHCLURITRANSFER pTransfer;
    7979} SHCLURIWRITETHREADCTX, *PSHCLURIWRITETHREADCTX;
     
    100100
    101101#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     102#if 0
    102103static DECLCALLBACK(int) vboxClipboardURIWriteThread(RTTHREAD ThreadSelf, void *pvUser)
    103104{
     
    157158    return rc;
    158159}
    159 
    160 static DECLCALLBACK(void) vboxClipboardURITransferCompleteCallback(PSHCLURITRANSFERCALLBACKDATA pData, int rc)
    161 {
    162     RT_NOREF(rc);
    163 
    164     LogFlowFunc(("pData=%p, rc=%Rrc\n", pData, rc));
    165 
    166     LogRel2(("Shared Clipboard: Transfer to destination complete\n"));
    167 
     160#endif
     161
     162static void vboxClipboardURITransferCallbackCleanup(PSHCLURITRANSFERCALLBACKDATA pData)
     163{
    168164    PSHCLURICTX pCtx = (PSHCLURICTX)pData->pvUser;
    169165    AssertPtr(pCtx);
     
    178174    }
    179175
    180     int rc2 = SharedClipboardURICtxTransferRemove(pCtx, pTransfer);
     176    int rc2 = SharedClipboardURICtxTransferUnregister(pCtx, pTransfer->State.uID);
    181177    AssertRC(rc2);
     178
     179    SharedClipboardURITransferDestroy(pTransfer);
     180
     181    RTMemFree(pTransfer);
     182    pTransfer = NULL;
     183}
     184
     185static DECLCALLBACK(void) vboxClipboardURITransferCompleteCallback(PSHCLURITRANSFERCALLBACKDATA pData, int rc)
     186{
     187    RT_NOREF(rc);
     188
     189    LogFlowFunc(("pData=%p, rc=%Rrc\n", pData, rc));
     190
     191    LogRel2(("Shared Clipboard: Transfer to destination complete\n"));
     192
     193    vboxClipboardURITransferCallbackCleanup(pData);
    182194}
    183195
     
    190202    LogRel(("Shared Clipboard: Transfer to destination failed with %Rrc\n", rc));
    191203
    192     PSHCLURICTX pCtx = (PSHCLURICTX)pData->pvUser;
    193     AssertPtr(pCtx);
    194 
    195     PSHCLURITRANSFER pTransfer = pData->pTransfer;
    196     AssertPtr(pTransfer);
    197 
    198     if (pTransfer->pvUser) /* SharedClipboardWinURITransferCtx */
    199     {
    200         delete pTransfer->pvUser;
    201         pTransfer->pvUser = NULL;
    202     }
    203 
    204     int rc2 = SharedClipboardURICtxTransferRemove(pCtx, pTransfer);
    205     AssertRC(rc2);
     204    vboxClipboardURITransferCallbackCleanup(pData);
    206205}
    207206
     
    640639       case SHCL_WIN_WM_REPORT_FORMATS:
    641640       {
    642            LogFunc(("VBOX_CLIPBOARD_WM_REPORT_FORMATS\n"));
     641           LogFunc(("SHCL_WIN_WM_REPORT_FORMATS\n"));
    643642
    644643           /* Announce available formats. Do not insert data -- will be inserted in WM_RENDERFORMAT. */
     
    647646           Assert(pEvent->enmType == VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS);
    648647
    649            const SHCLFORMATS fFormats =  pEvent->u.ReportFormats.uFormats;
     648           const SHCLFORMATS fFormats =  pEvent->u.ReportedFormats.uFormats;
    650649
    651650           if (fFormats != VBOX_SHARED_CLIPBOARD_FMT_NONE) /* Could arrive with some older GA versions. */
     
    661660                        LogFunc(("VBOX_SHARED_CLIPBOARD_FMT_URI_LIST\n"));
    662661
    663                         PSHCLURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pCtx->URI,
    664                                                                                                  0 /* uIdx */);
     662                        PSHCLURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pCtx->URI, 0); /** @todo FIX !!! */
    665663                        if (pTransfer)
    666664                        {
     
    687685           }
    688686
    689            LogFunc(("VBOX_CLIPBOARD_WM_SET_FORMATS: fFormats=0x%x, lastErr=%ld\n", fFormats, GetLastError()));
     687           LogFunc(("SHCL_WIN_WM_REPORT_FORMATS: fFormats=0x%x, lastErr=%ld\n", fFormats, GetLastError()));
    690688           break;
    691689       }
     
    702700           HANDLE hClip = NULL;
    703701
    704            LogFlowFunc(("VBOX_CLIPBOARD_WM_READ_DATA: uFormat=0x%x\n", uFormat));
     702           LogFlowFunc(("SHCL_WIN_WM_READ_DATA: uFormat=0x%x\n", uFormat));
    705703
    706704           int rc = SharedClipboardWinOpen(hwnd);
     
    781779                   {
    782780                       PSHCLURITRANSFER pTransfer;
    783                        rc = SharedClipboardURITransferCreate(SHCLURITRANSFERDIR_WRITE,
    784                                                              SHCLSOURCE_LOCAL,
    785                                                              &pTransfer);
     781                       rc = SharedClipboardURITransferCreate(&pTransfer);
     782                       if (RT_SUCCESS(rc))
     783                           rc = SharedClipboardURITransferInit(pTransfer, 0 /* uID */,
     784                                                               SHCLURITRANSFERDIR_WRITE, SHCLSOURCE_LOCAL);
    786785                       if (RT_SUCCESS(rc))
    787786                       {
    788                            rc = SharedClipboardURICtxTransferAdd(&pCtx->URI, pTransfer);
    789                            if (RT_SUCCESS(rc))
     787                           /* The data data in CF_HDROP format, as the files are locally present and don't need to be
     788                            * presented as a IDataObject or IStream. */
     789                           HANDLE hClip = hClip = GetClipboardData(CF_HDROP);
     790                           if (hClip)
    790791                           {
    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)
     792                               HDROP hDrop = (HDROP)GlobalLock(hClip);
     793                               if (hDrop)
    795794                               {
    796                                    HDROP hDrop = (HDROP)GlobalLock(hClip);
    797                                    if (hDrop)
     795                                   char    *papszList;
     796                                   uint32_t cbList;
     797                                   rc = SharedClipboardWinDropFilesToStringList((DROPFILES *)hDrop, &papszList, &cbList);
     798
     799                                   GlobalUnlock(hClip);
     800
     801                                   if (RT_SUCCESS(rc))
    798802                                   {
    799                                        char    *papszList;
    800                                        uint32_t cbList;
    801                                        rc = SharedClipboardWinDropFilesToStringList((DROPFILES *)hDrop, &papszList, &cbList);
    802 
    803                                        GlobalUnlock(hClip);
    804 
     803                                       rc = SharedClipboardURILTransferSetRoots(pTransfer,
     804                                                                                papszList, cbList + 1 /* Include termination */);
    805805                                       if (RT_SUCCESS(rc))
    806806                                       {
    807                                            rc = SharedClipboardURILTransferSetRoots(pTransfer,
    808                                                                                     papszList, cbList + 1 /* Include termination */);
    809                                            if (RT_SUCCESS(rc))
     807                                           PSHCLURIWRITETHREADCTX pThreadCtx
     808                                               = (PSHCLURIWRITETHREADCTX)RTMemAllocZ(sizeof(SHCLURIWRITETHREADCTX));
     809                                           if (pThreadCtx)
    810810                                           {
    811                                                PSHCLURIWRITETHREADCTX pThreadCtx
    812                                                    = (PSHCLURIWRITETHREADCTX)RTMemAllocZ(sizeof(SHCLURIWRITETHREADCTX));
    813                                                if (pThreadCtx)
     811                                               pThreadCtx->pClipboardCtx = pCtx;
     812                                               pThreadCtx->pTransfer     = pTransfer;
     813
     814                                               rc = SharedClipboardURITransferPrepare(pTransfer);
     815                                               if (RT_SUCCESS(rc))
    814816                                               {
    815                                                    pThreadCtx->pClipboardCtx = pCtx;
    816                                                    pThreadCtx->pTransfer     = pTransfer;
    817 
    818                                                    rc = SharedClipboardURITransferPrepare(pTransfer);
     817                                                   rc = SharedClipboardURICtxTransferRegister(&pCtx->URI, pTransfer,
     818                                                                                              NULL /* puTransferID */);
     819                                            #if 0
    819820                                                   if (RT_SUCCESS(rc))
    820821                                                   {
     
    823824                                                       /* pThreadCtx now is owned by vboxClipboardURIWriteThread(). */
    824825                                                   }
     826                                            #endif
    825827                                               }
    826                                                else
    827                                                    rc = VERR_NO_MEMORY;
    828828                                           }
    829 
    830                                            if (papszList)
    831                                                RTStrFree(papszList);
     829                                           else
     830                                               rc = VERR_NO_MEMORY;
    832831                                       }
     832
     833                                       if (papszList)
     834                                           RTStrFree(papszList);
    833835                                   }
    834                                    else
    835                                    {
    836                                        hClip = NULL;
    837                                    }
     836                               }
     837                               else
     838                               {
     839                                   hClip = NULL;
    838840                               }
    839841                           }
     
    844846
    845847                   if (RT_FAILURE(rc))
    846                        LogFunc(("VBOX_CLIPBOARD_WM_READ_DATA: Failed with rc=%Rrc\n", rc));
    847                }
    848 #endif
     848                       LogFunc(("SHCL_WIN_WM_READ_DATA: Failed with rc=%Rrc\n", rc));
     849               }
     850#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
    849851
    850852               if (hClip == NULL)
    851853               {
    852                    LogFunc(("VBOX_CLIPBOARD_WM_READ_DATA: hClip=NULL, lastError=%ld\n", GetLastError()));
     854                   LogFunc(("SHCL_WIN_WM_READ_DATA: hClip=NULL, lastError=%ld\n", GetLastError()));
    853855
    854856                   /* Requested clipboard format is not available, send empty data. */
     
    863865           break;
    864866       }
     867
     868#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     869       case SHCL_WIN_WM_URI_TRANSFER_STATUS:
     870       {
     871           LogFunc(("SHCL_WIN_WM_URI_TRANSFER_STATUS\n"));
     872
     873           break;
     874       }
     875#endif
    865876
    866877#if 0
     
    942953       }
    943954
    944 #if 1
    945955       /* The host wants to write URI data. */
    946956       case VBOX_CLIPBOARD_WM_URI_START_WRITE:
     
    9971007           break;
    9981008       }
    999 #endif
    1000 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
     1009#endif /* 0 */
    10011010
    10021011       case WM_DESTROY:
     
    10971106
    10981107    UnregisterClass(s_szClipWndClassName, pCtx->pEnv->hInstance);
     1108
     1109    SharedClipboardWinCtxDestroy(&pCtx->Win);
    10991110}
    11001111
     
    11241135    {
    11251136        /* Do not use clipboard for remote sessions. */
    1126         LogRel(("Clipboard: Clipboard has been disabled for a remote session\n"));
     1137        LogRel(("Shared Clipboard: Clipboard has been disabled for a remote session\n"));
    11271138        return VERR_NOT_SUPPORTED;
    11281139    }
     
    11361147    if (FAILED(hr))
    11371148    {
    1138         LogRel(("Clipboard: Initializing OLE failed (%Rhrc) -- file transfers unavailable\n"));
     1149        LogRel(("Shared Clipboard: Initializing OLE failed (%Rhrc) -- file transfers unavailable\n"));
    11391150        /* Not critical, the rest of the clipboard might work. */
    11401151    }
    11411152    else
    1142         LogRel(("Clipboard: Initialized OLE\n"));
     1153        LogRel(("Shared Clipboard: Initialized OLE\n"));
    11431154#endif
    11441155
     
    11461157    {
    11471158        /* Check if new Clipboard API is available. */
    1148         /* ignore rc */ SharedClipboardWinCheckAndInitNewAPI(&pCtx->Win.newAPI);
    1149 
    1150         rc = VbglR3ClipboardConnectEx(&pCtx->CmdCtx);
     1159        rc = SharedClipboardWinCtxInit(&pCtx->Win);
     1160        if (RT_SUCCESS(rc))
     1161            rc = VbglR3ClipboardConnectEx(&pCtx->CmdCtx);
    11511162        if (RT_SUCCESS(rc))
    11521163        {
     
    12141225            {
    12151226                pEvent = (PVBGLR3CLIPBOARDEVENT)RTMemAllocZ(sizeof(VBGLR3CLIPBOARDEVENT));
    1216                 if (!pEvent)
    1217                 {
    1218                     rc = VERR_NO_MEMORY;
    1219                     break;
    1220                 }
     1227                AssertPtrBreakStmt(pEvent, rc = VERR_NO_MEMORY);
    12211228
    12221229                switch (uMsg)
     
    12251232                    {
    12261233                        pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS;
    1227                         pEvent->u.ReportFormats.uFormats = uFormats;
     1234                        pEvent->u.ReportedFormats.uFormats = uFormats;
    12281235                        break;
    12291236                    }
     
    12441251        else /* Protocol >= v1. */
    12451252        {
    1246             rc = VbglR3ClipboardEventGetNext(&pCtx->CmdCtx, &pEvent);
     1253            pEvent = (PVBGLR3CLIPBOARDEVENT)RTMemAllocZ(sizeof(VBGLR3CLIPBOARDEVENT));
     1254            AssertPtrBreakStmt(pEvent, rc = VERR_NO_MEMORY);
     1255
     1256            uint32_t uMsg   = 0;
     1257            uint32_t cParms = 0;
     1258            rc = VbglR3ClipboardMsgPeekWait(&pCtx->CmdCtx, &uMsg, &cParms, NULL /* pidRestoreCheck */);
     1259            if (RT_SUCCESS(rc))
     1260            {
     1261#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     1262                rc = VbglR3ClipboardEventGetNextEx(uMsg, cParms, &pCtx->CmdCtx, &pCtx->URI, pEvent);
     1263#else
     1264                rc = VbglR3ClipboardEventGetNext(uMsg, cParms, &pCtx->CmdCtx, pEvent);
     1265#endif
     1266            }
    12471267        }
    12481268
    12491269        if (RT_FAILURE(rc))
    12501270        {
     1271            VbglR3ClipboardEventFree(pEvent);
     1272            pEvent = NULL;
     1273
    12511274            if (*pfShutdown)
    12521275                break;
     
    12801303                   break;
    12811304               }
    1282 #if 0
    1283                case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START:
    1284                {
    1285                    const UINT uMsg = u32Formats == 0 ?
    1286                                      VBOX_CLIPBOARD_WM_URI_START_READ : VBOX_CLIPBOARD_WM_URI_START_WRITE;
    1287 
    1288                    ::PostMessage(pWinCtx->hWnd, uMsg, 0 /* wParm */, 0 /* lParm */);
     1305
     1306#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     1307               case VBGLR3CLIPBOARDEVENTTYPE_URI_TRANSFER_STATUS:
     1308               {
     1309                   ::PostMessage(pWinCtx->hWnd, SHCL_WIN_WM_URI_TRANSFER_STATUS,
     1310                                 0 /* wParm */, (LPARAM)pEvent /* lParm */);
    12891311                   break;
    12901312               }
     
    12931315               {
    12941316                   /* The host is terminating. */
    1295                    LogRel(("Clipboard: Terminating ...\n"));
     1317                   LogRel(("Shared Clipboard: Terminating ...\n"));
    12961318                   ASMAtomicXchgBool(pfShutdown, true);
    12971319                   break;
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