VirtualBox

Ignore:
Timestamp:
Oct 10, 2019 12:22:34 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
133874
Message:

Shared Clipboard/Transfers: Update.

Location:
trunk/src/VBox/GuestHost/SharedClipboard
Files:
2 edited

Legend:

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

    r81025 r81212  
    131131 *
    132132 * @returns VBox status code.
    133  * @param   pListEntry          Clipboard root list entry to copy.
     133 * @param   pDst                Where to copy the source root list entry to.
     134 * @param   pSrc                Source root list entry to copy.
    134135 */
    135136int SharedClipboardTransferRootListEntryCopy(PSHCLROOTLISTENTRY pDst, PSHCLROOTLISTENTRY pSrc)
     
    139140
    140141/**
     142 * Initializes a clipboard root list entry structure.
     143 *
     144 * @param   pRootListEntry      Clipboard root list entry structure to destroy.
     145 */
     146int SharedClipboardTransferRootListEntryInit(PSHCLROOTLISTENTRY pRootListEntry)
     147{
     148    return SharedClipboardTransferListEntryInit(pRootListEntry);
     149}
     150
     151/**
     152 * Destroys a clipboard root list entry structure.
     153 *
     154 * @param   pRootListEntry      Clipboard root list entry structure to destroy.
     155 */
     156void SharedClipboardTransferRootListEntryDestroy(PSHCLROOTLISTENTRY pRootListEntry)
     157{
     158    return SharedClipboardTransferListEntryDestroy(pRootListEntry);
     159}
     160
     161/**
    141162 * Duplicates (allocates) a clipboard root list entry structure.
    142163 *
    143164 * @returns Duplicated clipboard root list entry structure on success.
    144  * @param   pListEntry          Clipboard root list entry to duplicate.
     165 * @param   pRootListEntry      Clipboard root list entry to duplicate.
    145166 */
    146167PSHCLROOTLISTENTRY SharedClipboardTransferRootListEntryDup(PSHCLROOTLISTENTRY pRootListEntry)
    147168{
    148169    return SharedClipboardTransferListEntryDup(pRootListEntry);
    149 }
    150 
    151 /**
    152  * Destroys a clipboard root list entry structure.
    153  *
    154  * @param   pListEntry          Clipboard root list entry structure to destroy.
    155  */
    156 void SharedClipboardTransferRootListEntryDestroy(PSHCLROOTLISTENTRY pRootListEntry)
    157 {
    158     return SharedClipboardTransferListEntryDestroy(pRootListEntry);
    159170}
    160171
     
    517528
    518529    pListEntry->cbName = SHCLLISTENTRY_MAX_NAME;
    519     pListEntry->pvInfo = NULL;
    520     pListEntry->cbInfo = 0;
    521     pListEntry->fInfo  = 0;
    522 
    523     return VINF_SUCCESS;
     530
     531    pListEntry->pvInfo = (PSHCLFSOBJINFO)RTMemAlloc(sizeof(SHCLFSOBJINFO));
     532    if (pListEntry->pvInfo)
     533    {
     534        pListEntry->cbInfo = sizeof(SHCLFSOBJINFO);
     535        pListEntry->fInfo  = VBOX_SHCL_INFO_FLAG_FSOBJINFO;
     536
     537        return VINF_SUCCESS;
     538    }
     539
     540    return VERR_NO_MEMORY;
    524541}
    525542
     
    607624
    608625/**
     626 * Initializes an object handle info structure.
     627 *
     628 * @returns VBox status code.
     629 * @param   pInfo               Object handle info structure to initialize.
     630 */
     631int SharedClipboardTransferObjectHandleInfoInit(PSHCLOBJHANDLEINFO pInfo)
     632{
     633    AssertPtrReturn(pInfo, VERR_INVALID_POINTER);
     634
     635    pInfo->hObj    = SHCLOBJHANDLE_INVALID;
     636    pInfo->enmType = SHCLOBJTYPE_INVALID;
     637
     638    pInfo->pszPathLocalAbs = NULL;
     639
     640    RT_ZERO(pInfo->u);
     641
     642    return VINF_SUCCESS;
     643}
     644
     645/**
    609646 * Destroys an object handle info structure.
    610647 *
     
    743780        if (pInfo)
    744781        {
    745             const bool fWritable = true; /** @todo Fix this. */
    746 
    747             uint64_t fOpen;
    748             rc = sharedClipboardConvertFileCreateFlags(fWritable,
    749                                                        pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode,
    750                                                        SHCLOBJHANDLE_INVALID, &fOpen);
     782            rc = SharedClipboardTransferObjectHandleInfoInit(pInfo);
    751783            if (RT_SUCCESS(rc))
    752784            {
    753                 char *pszPathAbs = RTStrAPrintf2("%s/%s", pTransfer->pszPathRootAbs, pOpenCreateParms->pszPath);
    754                 if (pszPathAbs)
     785                const bool fWritable = true; /** @todo Fix this. */
     786
     787                uint64_t fOpen;
     788                rc = sharedClipboardConvertFileCreateFlags(fWritable,
     789                                                           pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode,
     790                                                           SHCLOBJHANDLE_INVALID, &fOpen);
     791                if (RT_SUCCESS(rc))
    755792                {
    756                     LogFlowFunc(("%s\n", pszPathAbs));
    757 
    758                     rc = RTFileOpen(&pInfo->u.Local.hFile, pszPathAbs, fOpen);
    759                     RTStrFree(pszPathAbs);
     793                    char *pszPathAbs = RTStrAPrintf2("%s/%s", pTransfer->pszPathRootAbs, pOpenCreateParms->pszPath);
     794                    if (pszPathAbs)
     795                    {
     796                        LogFlowFunc(("%s\n", pszPathAbs));
     797
     798                        rc = RTFileOpen(&pInfo->u.Local.hFile, pszPathAbs, fOpen);
     799                        RTStrFree(pszPathAbs);
     800                    }
     801                    else
     802                        rc = VERR_NO_MEMORY;
    760803                }
    761                 else
    762                     rc = VERR_NO_MEMORY;
    763804            }
    764805
     
    772813                *phObj = pInfo->hObj;
    773814            }
    774 
    775             if (RT_FAILURE(rc))
     815            else
     816            {
     817                SharedClipboardTransferObjectHandleInfoDestroy(pInfo);
    776818                RTMemFree(pInfo);
     819            }
    777820        }
    778821        else
     
    17461789                                && !fSkipEntry)
    17471790                            {
    1748                                 pEntry->pvInfo = (PSHCLFSOBJINFO)RTMemAlloc(sizeof(SHCLFSOBJINFO));
    1749                                 if (pEntry->pvInfo)
     1791                                rc = RTStrCopy(pEntry->pszName, pEntry->cbName, pDirEntry->szName);
     1792                                if (RT_SUCCESS(rc))
    17501793                                {
    1751                                     rc = RTStrCopy(pEntry->pszName, pEntry->cbName, pDirEntry->szName);
    1752                                     if (RT_SUCCESS(rc))
    1753                                     {
    1754                                         SharedClipboardFsObjFromIPRT(PSHCLFSOBJINFO(pEntry->pvInfo), &pDirEntry->Info);
    1755 
    1756                                         pEntry->cbInfo = sizeof(SHCLFSOBJINFO);
    1757                                         pEntry->fInfo  = VBOX_SHCL_INFO_FLAG_FSOBJINFO;
    1758                                     }
     1794                                    AssertPtr(pEntry->pvInfo);
     1795                                    Assert   (pEntry->cbInfo == sizeof(SHCLFSOBJINFO));
     1796
     1797                                    SharedClipboardFsObjFromIPRT(PSHCLFSOBJINFO(pEntry->pvInfo), &pDirEntry->Info);
    17591798                                }
    1760                                 else
    1761                                     rc = VERR_NO_MEMORY;
    17621799                            }
    17631800
     
    20332070                {
    20342071                    RTFSOBJINFO fsObjInfo;
    2035                     rc = RTPathQueryInfo(pcszSrcPath, & fsObjInfo, RTFSOBJATTRADD_NOTHING);
     2072                    rc = RTPathQueryInfo(pcszSrcPath, &fsObjInfo, RTFSOBJATTRADD_NOTHING);
    20362073                    if (RT_SUCCESS(rc))
    20372074                    {
    20382075                        SharedClipboardFsObjFromIPRT(PSHCLFSOBJINFO(pEntry->pvInfo), &fsObjInfo);
    20392076
    2040                         pEntry->fInfo  = VBOX_SHCL_INFO_FLAG_FSOBJINFO;
     2077                        pEntry->fInfo = VBOX_SHCL_INFO_FLAG_FSOBJINFO;
    20412078                    }
    20422079                }
     
    22472284
    22482285/**
    2249  * Starts (runs) a Shared Clipboard transfer in a dedicated thread.
     2286 * Runs a started Shared Clipboard transfer in a dedicated thread.
    22502287 *
    22512288 * @returns VBox status code.
    22522289 * @param   pTransfer           Clipboard transfer to run.
    22532290 * @param   pfnThreadFunc       Pointer to thread function to use.
    2254  * @param   pvUser              Pointer to user-provided data.
     2291 * @param   pvUser              Pointer to user-provided data. Optional.
    22552292 */
    22562293int SharedClipboardTransferRun(PSHCLTRANSFER pTransfer, PFNRTTHREAD pfnThreadFunc, void *pvUser)
    22572294{
    2258     AssertPtrReturn(pTransfer, VERR_INVALID_POINTER);
    2259 
    2260     int rc = SharedClipboardTransferStart(pTransfer);
    2261     if (RT_SUCCESS(rc))
    2262         rc = sharedClipboardTransferThreadCreate(pTransfer, pfnThreadFunc, pvUser);
     2295    AssertPtrReturn(pTransfer,     VERR_INVALID_POINTER);
     2296    AssertPtrReturn(pfnThreadFunc, VERR_INVALID_POINTER);
     2297    /* pvUser is optional. */
     2298
     2299    AssertMsgReturn(pTransfer->State.enmStatus == SHCLTRANSFERSTATUS_STARTED,
     2300                    ("Wrong status (currently is %s)\n", VBoxShClTransferStatusToStr(pTransfer->State.enmStatus)),
     2301                    VERR_WRONG_ORDER);
     2302
     2303    int rc = sharedClipboardTransferThreadCreate(pTransfer, pfnThreadFunc, pvUser);
    22632304
    22642305    LogFlowFuncLeaveRC(rc);
     
    22752316{
    22762317    AssertPtrReturn(pTransfer, VERR_INVALID_POINTER);
     2318
     2319    LogFlowFuncEnter();
    22772320
    22782321    /* Ready to start? */
     
    22912334        rc = VINF_SUCCESS;
    22922335
    2293     /* Nothing else to do here right now. */
     2336    if (RT_SUCCESS(rc))
     2337    {
     2338        pTransfer->State.enmStatus = SHCLTRANSFERSTATUS_STARTED;
     2339    }
    22942340
    22952341    LogFlowFuncLeaveRC(rc);
     
    23422388    AssertPtrReturn(pTransfer, VERR_INVALID_POINTER);
    23432389
     2390    /* Already marked for stopping? */
     2391    AssertMsgReturn(pTransfer->Thread.fStop == false,
     2392                    ("Thransfer thread already marked for stopping"), VERR_WRONG_ORDER);
     2393    /* Already started? */
     2394    AssertMsgReturn(pTransfer->Thread.fStarted == false,
     2395                    ("Thransfer thread already started"), VERR_WRONG_ORDER);
     2396
    23442397    /* Spawn a worker thread, so that we don't block the window thread for too long. */
    23452398    int rc = RTThreadCreate(&pTransfer->Thread.hThread, pfnThreadFunc,
     
    23532406        if (pTransfer->Thread.fStarted) /* Did the thread indicate that it started correctly? */
    23542407        {
    2355             pTransfer->State.enmStatus = SHCLTRANSFERSTATUS_STARTED;
     2408            /* Nothing to do in here. */
    23562409        }
    23572410        else
     
    23912444
    23922445/**
    2393  * Initializes a Shared Clipboard transfer.
     2446 * Initializes a Shared Clipboard transfer context.
    23942447 *
    23952448 * @returns VBox status code.
     
    24072460        RTListInit(&pTransferCtx->List);
    24082461
     2462        pTransferCtx->cTransfers  = 0;
    24092463        pTransferCtx->cRunning    = 0;
    2410         pTransferCtx->cMaxRunning = UINT16_MAX;
     2464        pTransferCtx->cMaxRunning = UINT16_MAX; /** @todo Make this configurable? */
    24112465
    24122466        RT_ZERO(pTransferCtx->bmTransferIds);
     
    24192473
    24202474/**
    2421  * Destroys a shared Clipboard transfer context context struct.
     2475 * Destroys a shared Clipboard transfer context struct.
    24222476 *
    24232477 * @param   pTransferCtx                Transfer context to destroy.
     
    26422696                 pTransferCtx, pTransferCtx->cTransfers, pTransferCtx->cRunning));
    26432697
    2644     if (!RTListIsEmpty(&pTransferCtx->List))
    2645     {
    2646         /* Remove all transfers which are not in a running state (e.g. only announced). */
    2647         PSHCLTRANSFER pTransfer, pTransferNext;
    2648         RTListForEachSafe(&pTransferCtx->List, pTransfer, pTransferNext, SHCLTRANSFER, Node)
    2649         {
    2650             if (SharedClipboardTransferGetStatus(pTransfer) != SHCLTRANSFERSTATUS_STARTED)
    2651             {
    2652                 SharedClipboardTransferDestroy(pTransfer);
    2653                 RTListNodeRemove(&pTransfer->Node);
    2654 
    2655                 RTMemFree(pTransfer);
    2656                 pTransfer = NULL;
    2657 
    2658                 Assert(pTransferCtx->cTransfers);
    2659                 pTransferCtx->cTransfers--;
    2660             }
     2698    if (pTransferCtx->cTransfers == 0)
     2699        return;
     2700
     2701    /* Remove all transfers which are not in a running state (e.g. only announced). */
     2702    PSHCLTRANSFER pTransfer, pTransferNext;
     2703    RTListForEachSafe(&pTransferCtx->List, pTransfer, pTransferNext, SHCLTRANSFER, Node)
     2704    {
     2705        if (SharedClipboardTransferGetStatus(pTransfer) != SHCLTRANSFERSTATUS_STARTED)
     2706        {
     2707            SharedClipboardTransferDestroy(pTransfer);
     2708            RTListNodeRemove(&pTransfer->Node);
     2709
     2710            RTMemFree(pTransfer);
     2711            pTransfer = NULL;
     2712
     2713            Assert(pTransferCtx->cTransfers);
     2714            pTransferCtx->cTransfers--;
    26612715        }
    26622716    }
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-win.cpp

    r81025 r81212  
    459459        LogFlowFunc(("fFormats=0x%08X\n", fFormats));
    460460
    461         pFormats->uFormats   = fFormats;
    462         pFormats->fFlags = 0; /** @todo Handle flags. */
     461        pFormats->uFormats = fFormats;
     462        pFormats->fFlags   = 0; /** @todo Handle flags. */
    463463    }
    464464
     
    889889 * @returns VBox status code.
    890890 * @param   pWinCtx             Windows context to use.
    891  * @param   pTransferCtxCtx             transfer contextto use.
     891 * @param   pTransferCtxCtx     Transfer contextto use.
    892892 * @param   pTransfer           Shared Clipboard transfer to use.
    893893 */
     
    10031003
    10041004/**
     1005 * Retrieves the roots for a transfer by opening the clipboard and getting the clipboard data
     1006 * as string list (CF_HDROP), assigning it to the transfer as roots then.
     1007 *
     1008 * @returns VBox status code.
     1009 * @param   pWinCtx             Windows context to use.
     1010 * @param   pTransfer           Transfer to get roots for.
     1011 */
     1012int SharedClipboardWinGetRoots(PSHCLWINCTX pWinCtx, PSHCLTRANSFER pTransfer)
     1013{
     1014    AssertPtrReturn(pWinCtx,   VERR_INVALID_POINTER);
     1015    AssertPtrReturn(pTransfer, VERR_INVALID_POINTER);
     1016
     1017    Assert(SharedClipboardTransferGetSource(pTransfer) == SHCLSOURCE_LOCAL); /* Sanity. */
     1018
     1019    int rc = SharedClipboardWinOpen(pWinCtx->hWnd);
     1020    if (RT_SUCCESS(rc))
     1021    {
     1022        /* The data data in CF_HDROP format, as the files are locally present and don't need to be
     1023         * presented as a IDataObject or IStream. */
     1024        HANDLE hClip = hClip = GetClipboardData(CF_HDROP);
     1025        if (hClip)
     1026        {
     1027            HDROP hDrop = (HDROP)GlobalLock(hClip);
     1028            if (hDrop)
     1029            {
     1030                char    *papszList = NULL;
     1031                uint32_t cbList;
     1032                rc = SharedClipboardWinDropFilesToStringList((DROPFILES *)hDrop, &papszList, &cbList);
     1033
     1034                GlobalUnlock(hClip);
     1035
     1036                if (RT_SUCCESS(rc))
     1037                {
     1038                    rc = SharedClipboardTransferRootsSet(pTransfer,
     1039                                                         papszList, cbList + 1 /* Include termination */);
     1040                    RTStrFree(papszList);
     1041                }
     1042            }
     1043            else
     1044                LogRel(("Shared Clipboard: Unable to lock clipboard data, last error: %ld\n", GetLastError()));
     1045        }
     1046        else
     1047            LogRel(("Shared Clipboard: Unable to retrieve clipboard data from clipboard (CF_HDROP), last error: %ld\n",
     1048                    GetLastError()));
     1049
     1050        SharedClipboardWinClose();
     1051    }
     1052
     1053    LogFlowFuncLeaveRC(rc);
     1054    return rc;
     1055}
     1056
     1057/**
    10051058 * Converts a DROPFILES (HDROP) structure to a string list, separated by \r\n.
    10061059 * Does not do any locking on the input data.
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