VirtualBox

Changeset 100644 in vbox for trunk


Ignore:
Timestamp:
Jul 19, 2023 8:42:42 AM (15 months ago)
Author:
vboxsync
Message:

Shared Clipboard: More code for transfer cancellation and error handling on the host side. bugref:9437

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp

    r100643 r100644  
    984984                        rc = HGCMSvcGetU32(&aParms[idxParm], &pReply->u.TransferStatus.uStatus);
    985985
    986                     LogFlowFunc(("uTransferStatus=%RU32\n", pReply->u.TransferStatus.uStatus));
     986                    LogFlowFunc(("uTransferStatus=%RU32 (%s)\n",
     987                                 pReply->u.TransferStatus.uStatus, ShClTransferStatusToStr(pReply->u.TransferStatus.uStatus)));
    987988                    break;
    988989                }
     
    13861387 * @returns VBox status code.
    13871388 * @param   pClient             Pointer to associated client.
    1388  * @param   idTransfer          Transfer ID supplied from the guest.
     1389 * @param   pTransfer           Transfer to handle reply for.
    13891390 * @param   cParms              Number of function parameters supplied.
    13901391 * @param   aParms              Array function parameters supplied.
    13911392 */
    1392 static int shClSvcTransferHandleReply(PSHCLCLIENT pClient, SHCLTRANSFERID idTransfer, uint32_t cParms, VBOXHGCMSVCPARM aParms[])
    1393 {
     1393static int shClSvcTransferHandleReply(PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer, uint32_t cParms, VBOXHGCMSVCPARM aParms[])
     1394{
     1395    LogFlowFunc(("pTransfer=%p\n", pTransfer));
     1396
    13941397    int rc;
    1395 
    1396     PSHCLTRANSFER pTransfer = NULL;
    13971398
    13981399    uint32_t   cbReply = sizeof(SHCLREPLY);
     
    14061407                && pReply->u.TransferStatus.uStatus == SHCLTRANSFERSTATUS_REQUESTED)
    14071408            {
    1408                 /* SHCLTRANSFERSTATUS_REQUESTED is special, as it doesn't provide a transfer ID. */
     1409                /* SHCLTRANSFERSTATUS_REQUESTED is special, as it doesn't provide a transfer. */
    14091410            }
    14101411            else /* Everything else needs a valid transfer ID. */
    14111412            {
    1412                 pTransfer = ShClTransferCtxGetTransferById(&pClient->Transfers.Ctx, idTransfer);
    14131413                if (!pTransfer)
    14141414                {
    1415                     LogRel2(("Shared Clipboard: Transfer with ID %RU16 not found\n", idTransfer));
     1415                    LogRel2(("Shared Clipboard: Guest didn't specify a (valid) transfer\n"));
    14161416                    rc = VERR_SHCLPB_TRANSFER_ID_NOT_FOUND;
    14171417                }
     
    14321432                pPayload->pvData = pReply;
    14331433                pPayload->cbData = cbReply;
     1434
     1435                SHCLTRANSFERID const idTransfer = ShClTransferGetID(pTransfer);
    14341436
    14351437                switch (pReply->uType)
     
    14371439                    case VBOX_SHCL_TX_REPLYMSGTYPE_TRANSFER_STATUS:
    14381440                    {
     1441                        LogRel2(("Shared Clipboard: Guest reported status %s for transfer %RU16\n",
     1442                                 ShClTransferStatusToStr(pReply->u.TransferStatus.uStatus), idTransfer));
     1443
    14391444                        /* SHCLTRANSFERSTATUS_REQUESTED is special, as it doesn't provide a transfer ID. */
    14401445                        if (SHCLTRANSFERSTATUS_REQUESTED == pReply->u.TransferStatus.uStatus)
     
    14421447                            LogRel2(("Shared Clipboard: Guest requested a new host -> guest transfer\n"));
    14431448                        }
    1444                         else
    1445                             LogRel2(("Shared Clipboard: Guest reported status %s for transfer %RU32\n",
    1446                                      ShClTransferStatusToStr(pReply->u.TransferStatus.uStatus), idTransfer));
    14471449
    14481450                        switch (pReply->u.TransferStatus.uStatus)
     
    15181520                            case SHCLTRANSFERSTATUS_KILLED:
    15191521                            {
    1520                                 LogRel(("Shared Clipboard: Guest has %s transfer %RU32\n",
    1521                                         pReply->u.TransferStatus.uStatus == SHCLTRANSFERSTATUS_CANCELED ? "canceled" : "killed", pTransfer->State.uID));
    1522 
    1523                                 rc = ShClSvcTransferStop(pClient, pTransfer, false /* fWaitForGuest */);
    1524 
    1525                                 /* Regardless of whether the guest was able to report back and/or stop the transfer, remove the transfer on the host
    1526                                  * so that we don't risk of having stale transfers here. */
    1527                                 ShClSvcTransferDestroy(pClient, pTransfer);
    1528                                 pTransfer = NULL;
     1522                                LogRel(("Shared Clipboard: Guest has %s transfer %RU16\n",
     1523                                        pReply->u.TransferStatus.uStatus == SHCLTRANSFERSTATUS_CANCELED ? "canceled" : "killed", idTransfer));
     1524
     1525                                switch (pReply->u.TransferStatus.uStatus)
     1526                                {
     1527                                    case SHCLTRANSFERSTATUS_CANCELED:
     1528                                        rc = ShClTransferCancel(pTransfer);
     1529                                        break;
     1530
     1531                                    case SHCLTRANSFERSTATUS_KILLED:
     1532                                        rc = ShClTransferKill(pTransfer);
     1533                                        break;
     1534
     1535                                    default:
     1536                                        AssertFailed();
     1537                                        break;
     1538                                }
     1539
    15291540                                break;
    15301541                            }
     
    15321543                            case SHCLTRANSFERSTATUS_COMPLETED:
    15331544                            {
    1534                                 LogRel(("Shared Clipboard: Guest has stopped transfer %RU32\n", pTransfer->State.uID));
    1535 
    1536                                 rc = ShClSvcTransferStop(pClient, pTransfer, false /* fWaitForGuest */);
     1545                                LogRel(("Shared Clipboard: Guest has completed transfer %RU16\n", idTransfer));
     1546
     1547                                rc = ShClTransferComplete(pTransfer);
    15371548                                break;
    15381549                            }
     
    15401551                            case SHCLTRANSFERSTATUS_ERROR:
    15411552                            {
    1542                                 LogRel(("Shared Clipboard: Guest reported error %Rrc for transfer %RU32\n",
     1553                                LogRel(("Shared Clipboard: Guest reported error %Rrc for transfer %RU16\n",
    15431554                                        pReply->rc, pTransfer->State.uID));
    15441555
     
    15491560
    15501561                                    parms.u.Error.rc     = pReply->rc;
    1551                                     parms.u.Error.pszMsg = RTStrAPrintf2("Guest reported error %Rrc for transfer %RU32", /** @todo Make the error messages more fine-grained based on rc. */
     1562                                    parms.u.Error.pszMsg = RTStrAPrintf2("Guest reported error %Rrc for transfer %RU16", /** @todo Make the error messages more fine-grained based on rc. */
    15521563                                                                         pReply->rc, pTransfer->State.uID);
    15531564                                    AssertPtrBreakStmt(parms.u.Error.pszMsg, rc = VERR_NO_MEMORY);
     
    15591570                                }
    15601571
    1561                                 RT_FALL_THROUGH();
     1572                                rc = ShClTransferError(pTransfer, pReply->rc);
     1573                                break;
    15621574                            }
    15631575
    15641576                            default:
    15651577                            {
    1566                                 /* Regardless of whether the guest was able to report back and/or stop the transfer, remove the transfer on the host
    1567                                  * so that we don't risk of having stale transfers here. */
    1568                                 ShClSvcTransferDestroy(pClient, pTransfer);
    1569                                 pTransfer = NULL;
     1578                                LogRel(("Shared Clipboard: Unknown transfer status %#x from guest received\n",
     1579                                        pReply->u.TransferStatus.uStatus));
     1580                                rc = VERR_INVALID_PARAMETER;
    15701581                                break;
    15711582                            }
     
    15741585                        /* Tell the backend. */
    15751586                        int rc2 = ShClBackendTransferHandleStatusReply(pClient->pBackend, pClient, pTransfer,
    1576                                                                        SHCLSOURCE_REMOTE, pReply->u.TransferStatus.uStatus,
    1577                                                                        pReply->rc);
     1587                                                                       SHCLSOURCE_REMOTE,
     1588                                                                       pReply->u.TransferStatus.uStatus, pReply->rc);
    15781589                        if (RT_SUCCESS(rc))
    15791590                            rc = rc2;
    15801591
    1581                         RT_FALL_THROUGH();
     1592                        RT_FALL_THROUGH(); /* Make sure to also signal any waiters by using the block down below. */
    15821593                    }
    15831594                    case VBOX_SHCL_TX_REPLYMSGTYPE_LIST_OPEN:
     
    15941605                        {
    15951606                            const PSHCLEVENT pEvent
    1596                                 = ShClEventSourceGetFromId(&pClient->EventSrc, VBOX_SHCL_CONTEXTID_GET_EVENT(uCID));
     1607                                = ShClEventSourceGetFromId(&pTransfer->Events, VBOX_SHCL_CONTEXTID_GET_EVENT(uCID));
    15971608                            if (pEvent)
    15981609                            {
    1599                                 LogFlowFunc(("uCID=%RU64 -> idEvent=%RU32\n", uCID, pEvent->idEvent));
    1600 
    1601                                 rc = ShClEventSignal(pEvent, pPayload);
     1610                                LogFlowFunc(("uCID=%RU64 -> idEvent=%RU32, rcReply=%Rrc\n", uCID, pEvent->idEvent, pReply->rc));
     1611
     1612                                rc = ShClEventSignalEx(pEvent, pReply->rc, pPayload);
    16021613                            }
    1603                             /** @todo Silently skip? */
    16041614                        }
    16051615                        break;
     
    16071617
    16081618                    default:
    1609                         rc = VERR_NOT_FOUND;
     1619                        LogRel(("Shared Clipboard: Unknown reply type %#x from guest received\n", pReply->uType));
     1620                        ShClTransferCancel(pTransfer); /* Avoid clogging up the transfer list. */
     1621                        rc = VERR_INVALID_PARAMETER;
    16101622                        break;
     1623                }
     1624
     1625                if (   ShClTransferIsAborted(pTransfer)
     1626                    || ShClTransferIsComplete(pTransfer))
     1627                {
     1628                    ShClSvcTransferDestroy(pClient, pTransfer);
     1629                    pTransfer = NULL;
    16111630                }
    16121631
     
    16751694        return rc;
    16761695
    1677     const SHCLTRANSFERID idTransfer = VBOX_SHCL_CONTEXTID_GET_TRANSFER(uCID);
    1678 
    16791696    /*
    16801697     * Pre-check: For certain messages we need to make sure that a (right) transfer is present.
    16811698     */
    1682     PSHCLTRANSFER pTransfer = NULL;
     1699    const SHCLTRANSFERID idTransfer = VBOX_SHCL_CONTEXTID_GET_TRANSFER(uCID);
     1700    PSHCLTRANSFER        pTransfer  = ShClTransferCtxGetTransferById(&pClient->Transfers.Ctx, idTransfer);
     1701
     1702    rc = VERR_INVALID_PARAMETER; /* Play safe. */
     1703
    16831704    switch (u32Function)
    16841705    {
    16851706        case VBOX_SHCL_GUEST_FN_REPLY:
    1686             /* Function does its own lookup. */
    1687             break;
    1688 
    1689         default:
    1690         {
    1691             pTransfer = ShClTransferCtxGetTransferById(&pClient->Transfers.Ctx, idTransfer);
    1692             if (!pTransfer)
    1693             {
    1694                 LogRel(("Shared Clipboard: Transfer with ID %RU16 not found\n", idTransfer));
    1695                 rc = VERR_SHCLPB_TRANSFER_ID_NOT_FOUND;
    1696             }
    1697             break;
    1698         }
    1699     }
    1700 
    1701     if (RT_FAILURE(rc))
    1702         return rc;
    1703 
    1704     rc = VERR_INVALID_PARAMETER; /* Play safe. */
    1705 
    1706     switch (u32Function)
    1707     {
    1708         case VBOX_SHCL_GUEST_FN_REPLY:
    1709         {
    1710             rc = shClSvcTransferHandleReply(pClient, idTransfer, cParms, aParms);
     1707        {
     1708            rc = shClSvcTransferHandleReply(pClient, pTransfer, cParms, aParms);
    17111709            break;
    17121710        }
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