VirtualBox

Ignore:
Timestamp:
Oct 11, 2019 2:33:25 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
133917
Message:

Shared Clipboard/Transfers: Update.

Location:
trunk/src/VBox/HostServices/SharedClipboard
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-internal.h

    r81212 r81229  
    200200int shclSvcTransferStop(PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer);
    201201bool shclSvcTransferMsgIsAllowed(uint32_t uMode, uint32_t uMsg);
     202void shclSvcClientTransfersReset(PSHCLCLIENT pClient);
    202203#endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
    203204
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp

    r81223 r81229  
    5858*********************************************************************************************************************************/
    5959
     60/**
     61 * Resets all transfers of a Shared Clipboard client.
     62 *
     63 * @param   pClient             Client to reset transfers for.
     64 */
     65void shclSvcClientTransfersReset(PSHCLCLIENT pClient)
     66{
     67    if (!pClient)
     68        return;
     69
     70    LogFlowFuncEnter();
     71
     72    const uint32_t cTransfers = ShClTransferCtxGetTotalTransfers(&pClient->TransferCtx);
     73    for (uint32_t i = 0; i < cTransfers; i++)
     74    {
     75        PSHCLTRANSFER pTransfer = ShClTransferCtxGetTransfer(&pClient->TransferCtx, i);
     76        if (pTransfer)
     77            shclSvcTransferAreaDetach(&pClient->State, pTransfer);
     78    }
     79
     80    ShClTransferCtxDestroy(&pClient->TransferCtx);
     81}
     82
     83
     84/*********************************************************************************************************************************
     85*   Provider implementation                                                                                                      *
     86*********************************************************************************************************************************/
     87
    6088DECLCALLBACK(int) shclSvcTransferIfaceOpen(PSHCLPROVIDERCTX pCtx)
    6189{
     
    208236        const SHCLEVENTID uEvent = ShClEventIDGenerate(&pCtx->pTransfer->Events);
    209237
    210         pMsg->Ctx.uContextID = VBOX_SHCL_CONTEXTID_MAKE(pClient->State.uSessionID,  pCtx->pTransfer->State.uID,
     238        pMsg->Ctx.uContextID = VBOX_SHCL_CONTEXTID_MAKE(pClient->State.uSessionID, pCtx->pTransfer->State.uID,
    211239                                                        uEvent);
    212240
     
    233261
    234262                        Assert(pReply->uType == VBOX_SHCL_REPLYMSGTYPE_LIST_OPEN);
     263
     264                        LogFlowFunc(("hList=%RU64\n", pReply->u.ListOpen.uHandle));
    235265
    236266                        *phList = pReply->u.ListOpen.uHandle;
     
    466496                    Assert(pReply->uType == VBOX_SHCL_REPLYMSGTYPE_OBJ_OPEN);
    467497
     498                    LogFlowFunc(("hObj=%RU64\n", pReply->u.ObjOpen.uHandle));
     499
    468500                    *phObj = pReply->u.ObjOpen.uHandle;
    469501
     
    519551
    520552                    Assert(pReply->uType == VBOX_SHCL_REPLYMSGTYPE_OBJ_CLOSE);
     553
     554                    LogFlowFunc(("hObj=%RU64\n", pReply->u.ObjClose.uHandle));
    521555#endif
    522556
     
    765799                    if (cParms >= 6)
    766800                        rc = HGCMSvcGetU32(&paParms[5], &pReply->u.TransferStatus.uStatus);
     801
     802                    LogFlowFunc(("uTransferStatus=%RU32\n", pReply->u.TransferStatus.uStatus));
    767803                    break;
    768804                }
     
    772808                    if (cParms >= 6)
    773809                        rc = HGCMSvcGetU64(&paParms[5], &pReply->u.ListOpen.uHandle);
     810
     811                    LogFlowFunc(("hListOpen=%RU64\n", pReply->u.ListOpen.uHandle));
     812                    break;
     813                }
     814
     815                case VBOX_SHCL_REPLYMSGTYPE_LIST_CLOSE:
     816                {
     817                    if (cParms >= 6)
     818                        rc = HGCMSvcGetU64(&paParms[5], &pReply->u.ListClose.uHandle);
     819
     820                    LogFlowFunc(("hListClose=%RU64\n", pReply->u.ListClose.uHandle));
    774821                    break;
    775822                }
     
    779826                    if (cParms >= 6)
    780827                        rc = HGCMSvcGetU64(&paParms[5], &pReply->u.ObjOpen.uHandle);
     828
     829                    LogFlowFunc(("hObjOpen=%RU64\n", pReply->u.ObjOpen.uHandle));
    781830                    break;
    782831                }
     
    786835                    if (cParms >= 6)
    787836                        rc = HGCMSvcGetU64(&paParms[5], &pReply->u.ObjClose.uHandle);
     837
     838                    LogFlowFunc(("hObjClose=%RU64\n", pReply->u.ObjClose.uHandle));
    788839                    break;
    789840                }
     
    11521203            }
    11531204        }
    1154     }
    1155     else
    1156         rc = VERR_INVALID_PARAMETER;
    1157 
    1158     LogFlowFuncLeaveRC(rc);
    1159     return rc;
    1160 }
    1161 
    1162 /**
    1163  * Gets a transfer error from HGCM service parameters.
    1164  *
    1165  * @returns VBox status code.
    1166  * @param   cParms              Number of HGCM parameters supplied in \a paParms.
    1167  * @param   paParms             Array of HGCM parameters.
    1168  * @param   pRc                 Where to store the received error code.
    1169  */
    1170 static int shclSvcTransferGetError(uint32_t cParms, VBOXHGCMSVCPARM paParms[], int *pRc)
    1171 {
    1172     AssertPtrReturn(paParms, VERR_INVALID_PARAMETER);
    1173     AssertPtrReturn(pRc,     VERR_INVALID_PARAMETER);
    1174 
    1175     int rc;
    1176 
    1177     if (cParms == VBOX_SHCL_CPARMS_ERROR)
    1178     {
    1179         rc = HGCMSvcGetU32(&paParms[1], (uint32_t *)pRc); /** @todo int vs. uint32_t !!! */
    11801205    }
    11811206    else
     
    18481873        }
    18491874#endif
    1850         case VBOX_SHCL_GUEST_FN_CANCEL:
    1851         {
    1852             LogRel2(("Shared Clipboard: Transfer canceled\n"));
    1853             break;
    1854         }
    1855 
    1856         case VBOX_SHCL_GUEST_FN_ERROR:
    1857         {
    1858             int rcGuest;
    1859             rc = shclSvcTransferGetError(cParms,paParms, &rcGuest);
    1860             if (RT_SUCCESS(rc))
    1861                 LogRel(("Shared Clipboard: Transfer error from guest: %Rrc\n", rcGuest));
    1862             break;
    1863         }
    1864 
    18651875        default:
    18661876            LogFunc(("Not implemented\n"));
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp

    r81223 r81229  
    10601060}
    10611061
     1062/**
     1063 * Gets an error from HGCM service parameters.
     1064 *
     1065 * @returns VBox status code.
     1066 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
     1067 * @param   paParms             Array of HGCM parameters.
     1068 * @param   pRc                 Where to store the received error code.
     1069 */
     1070static int shclSvcGetError(uint32_t cParms, VBOXHGCMSVCPARM paParms[], int *pRc)
     1071{
     1072    AssertPtrReturn(paParms, VERR_INVALID_PARAMETER);
     1073    AssertPtrReturn(pRc,     VERR_INVALID_PARAMETER);
     1074
     1075    int rc;
     1076
     1077    if (cParms == VBOX_SHCL_CPARMS_ERROR)
     1078    {
     1079        rc = HGCMSvcGetU32(&paParms[1], (uint32_t *)pRc); /** @todo int vs. uint32_t !!! */
     1080    }
     1081    else
     1082        rc = VERR_INVALID_PARAMETER;
     1083
     1084    LogFlowFuncLeaveRC(rc);
     1085    return rc;
     1086}
     1087
    10621088int shclSvcSetSource(PSHCLCLIENT pClient, SHCLSOURCE enmSource)
    10631089{
     
    11211147
    11221148#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
    1123     PSHCLTRANSFER pTransfer = ShClTransferCtxGetTransfer(&pClient->TransferCtx, 0 /* Index*/);
    1124     if (pTransfer)
    1125         shclSvcTransferAreaDetach(&pClient->State, pTransfer);
    1126 
    1127     ShClTransferCtxDestroy(&pClient->TransferCtx);
     1149    shclSvcClientTransfersReset(pClient);
    11281150#endif
    11291151
     
    14871509        }
    14881510
     1511        case VBOX_SHCL_GUEST_FN_CANCEL:
     1512        {
     1513            LogRel2(("Shared Clipboard: Operation canceled by guest side\n"));
     1514
     1515            /** @todo Do we need to do anything here? */
     1516            break;
     1517        }
     1518
     1519        case VBOX_SHCL_GUEST_FN_ERROR:
     1520        {
     1521            int rcGuest;
     1522            rc = shclSvcGetError(cParms,paParms, &rcGuest);
     1523            if (RT_SUCCESS(rc))
     1524            {
     1525                LogRel(("Shared Clipboard: Error from guest side: %Rrc\n", rcGuest));
     1526
     1527                /* Reset client state and start over. */
     1528                shclSvcClientStateReset(&pClient->State);
     1529#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
     1530                shclSvcClientTransfersReset(pClient);
     1531#endif
     1532            }
     1533            break;
     1534        }
     1535
    14891536        default:
    14901537        {
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