- Timestamp:
- Jul 19, 2023 8:42:42 AM (15 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp
r100643 r100644 984 984 rc = HGCMSvcGetU32(&aParms[idxParm], &pReply->u.TransferStatus.uStatus); 985 985 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))); 987 988 break; 988 989 } … … 1386 1387 * @returns VBox status code. 1387 1388 * @param pClient Pointer to associated client. 1388 * @param idTransfer Transfer ID supplied from the guest.1389 * @param pTransfer Transfer to handle reply for. 1389 1390 * @param cParms Number of function parameters supplied. 1390 1391 * @param aParms Array function parameters supplied. 1391 1392 */ 1392 static int shClSvcTransferHandleReply(PSHCLCLIENT pClient, SHCLTRANSFERID idTransfer, uint32_t cParms, VBOXHGCMSVCPARM aParms[]) 1393 { 1393 static int shClSvcTransferHandleReply(PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer, uint32_t cParms, VBOXHGCMSVCPARM aParms[]) 1394 { 1395 LogFlowFunc(("pTransfer=%p\n", pTransfer)); 1396 1394 1397 int rc; 1395 1396 PSHCLTRANSFER pTransfer = NULL;1397 1398 1398 1399 uint32_t cbReply = sizeof(SHCLREPLY); … … 1406 1407 && pReply->u.TransferStatus.uStatus == SHCLTRANSFERSTATUS_REQUESTED) 1407 1408 { 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. */ 1409 1410 } 1410 1411 else /* Everything else needs a valid transfer ID. */ 1411 1412 { 1412 pTransfer = ShClTransferCtxGetTransferById(&pClient->Transfers.Ctx, idTransfer);1413 1413 if (!pTransfer) 1414 1414 { 1415 LogRel2(("Shared Clipboard: Transfer with ID %RU16 not found\n", idTransfer));1415 LogRel2(("Shared Clipboard: Guest didn't specify a (valid) transfer\n")); 1416 1416 rc = VERR_SHCLPB_TRANSFER_ID_NOT_FOUND; 1417 1417 } … … 1432 1432 pPayload->pvData = pReply; 1433 1433 pPayload->cbData = cbReply; 1434 1435 SHCLTRANSFERID const idTransfer = ShClTransferGetID(pTransfer); 1434 1436 1435 1437 switch (pReply->uType) … … 1437 1439 case VBOX_SHCL_TX_REPLYMSGTYPE_TRANSFER_STATUS: 1438 1440 { 1441 LogRel2(("Shared Clipboard: Guest reported status %s for transfer %RU16\n", 1442 ShClTransferStatusToStr(pReply->u.TransferStatus.uStatus), idTransfer)); 1443 1439 1444 /* SHCLTRANSFERSTATUS_REQUESTED is special, as it doesn't provide a transfer ID. */ 1440 1445 if (SHCLTRANSFERSTATUS_REQUESTED == pReply->u.TransferStatus.uStatus) … … 1442 1447 LogRel2(("Shared Clipboard: Guest requested a new host -> guest transfer\n")); 1443 1448 } 1444 else1445 LogRel2(("Shared Clipboard: Guest reported status %s for transfer %RU32\n",1446 ShClTransferStatusToStr(pReply->u.TransferStatus.uStatus), idTransfer));1447 1449 1448 1450 switch (pReply->u.TransferStatus.uStatus) … … 1518 1520 case SHCLTRANSFERSTATUS_KILLED: 1519 1521 { 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 1529 1540 break; 1530 1541 } … … 1532 1543 case SHCLTRANSFERSTATUS_COMPLETED: 1533 1544 { 1534 LogRel(("Shared Clipboard: Guest has stopped transfer %RU32\n", pTransfer->State.uID));1535 1536 rc = ShCl SvcTransferStop(pClient, pTransfer, false /* fWaitForGuest */);1545 LogRel(("Shared Clipboard: Guest has completed transfer %RU16\n", idTransfer)); 1546 1547 rc = ShClTransferComplete(pTransfer); 1537 1548 break; 1538 1549 } … … 1540 1551 case SHCLTRANSFERSTATUS_ERROR: 1541 1552 { 1542 LogRel(("Shared Clipboard: Guest reported error %Rrc for transfer %RU 32\n",1553 LogRel(("Shared Clipboard: Guest reported error %Rrc for transfer %RU16\n", 1543 1554 pReply->rc, pTransfer->State.uID)); 1544 1555 … … 1549 1560 1550 1561 parms.u.Error.rc = pReply->rc; 1551 parms.u.Error.pszMsg = RTStrAPrintf2("Guest reported error %Rrc for transfer %RU 32", /** @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. */ 1552 1563 pReply->rc, pTransfer->State.uID); 1553 1564 AssertPtrBreakStmt(parms.u.Error.pszMsg, rc = VERR_NO_MEMORY); … … 1559 1570 } 1560 1571 1561 RT_FALL_THROUGH(); 1572 rc = ShClTransferError(pTransfer, pReply->rc); 1573 break; 1562 1574 } 1563 1575 1564 1576 default: 1565 1577 { 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; 1570 1581 break; 1571 1582 } … … 1574 1585 /* Tell the backend. */ 1575 1586 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); 1578 1589 if (RT_SUCCESS(rc)) 1579 1590 rc = rc2; 1580 1591 1581 RT_FALL_THROUGH(); 1592 RT_FALL_THROUGH(); /* Make sure to also signal any waiters by using the block down below. */ 1582 1593 } 1583 1594 case VBOX_SHCL_TX_REPLYMSGTYPE_LIST_OPEN: … … 1594 1605 { 1595 1606 const PSHCLEVENT pEvent 1596 = ShClEventSourceGetFromId(&p Client->EventSrc, VBOX_SHCL_CONTEXTID_GET_EVENT(uCID));1607 = ShClEventSourceGetFromId(&pTransfer->Events, VBOX_SHCL_CONTEXTID_GET_EVENT(uCID)); 1597 1608 if (pEvent) 1598 1609 { 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); 1602 1613 } 1603 /** @todo Silently skip? */1604 1614 } 1605 1615 break; … … 1607 1617 1608 1618 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; 1610 1622 break; 1623 } 1624 1625 if ( ShClTransferIsAborted(pTransfer) 1626 || ShClTransferIsComplete(pTransfer)) 1627 { 1628 ShClSvcTransferDestroy(pClient, pTransfer); 1629 pTransfer = NULL; 1611 1630 } 1612 1631 … … 1675 1694 return rc; 1676 1695 1677 const SHCLTRANSFERID idTransfer = VBOX_SHCL_CONTEXTID_GET_TRANSFER(uCID);1678 1679 1696 /* 1680 1697 * Pre-check: For certain messages we need to make sure that a (right) transfer is present. 1681 1698 */ 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 1683 1704 switch (u32Function) 1684 1705 { 1685 1706 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); 1711 1709 break; 1712 1710 }
Note:
See TracChangeset
for help on using the changeset viewer.

