VirtualBox

Changeset 80990 in vbox for trunk/src/VBox/Additions/common


Ignore:
Timestamp:
Sep 25, 2019 6:20:09 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
133584
Message:

Shared Clipboard/Transfers: Update.

Location:
trunk/src/VBox/Additions/common
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibClipboard.cpp

    r80968 r80990  
    4848
    4949
     50/**
     51 * Function naming convention:
     52 *
     53 * FunctionNameRecv  = Receives a host message (request).
     54 * FunctionNameReply = Replies to a host message (request).
     55 * FunctionNameSend  = Sends a guest message to the host.
     56 */
     57
     58
    5059/*********************************************************************************************************************************
    5160*   Prototypes                                                                                                                   *
     
    11771186}
    11781187
    1179 VBGLR3DECL(int) VbglR3ClipboardObjRead(PVBGLR3SHCLCMDCTX pCtx, SHCLOBJHANDLE hObj,
    1180                                        void *pvData, uint32_t cbData, uint32_t *pcbRead)
     1188VBGLR3DECL(int) VbglR3ClipboardObjReadSend(PVBGLR3SHCLCMDCTX pCtx, SHCLOBJHANDLE hObj,
     1189                                           void *pvData, uint32_t cbData, uint32_t *pcbRead)
    11811190{
    11821191    AssertPtrReturn(pCtx,   VERR_INVALID_POINTER);
     
    12141223}
    12151224
    1216 VBGLR3DECL(int) VbglR3ClipboardObjWrite(PVBGLR3SHCLCMDCTX pCtx, SHCLOBJHANDLE hObj,
    1217                                         void *pvData, uint32_t cbData, uint32_t *pcbWritten)
     1225VBGLR3DECL(int) VbglR3ClipboardObjWriteSend(PVBGLR3SHCLCMDCTX pCtx, SHCLOBJHANDLE hObj,
     1226                                            void *pvData, uint32_t cbData, uint32_t *pcbWritten)
    12181227{
    12191228    AssertPtrReturn(pCtx,   VERR_INVALID_POINTER);
     
    12431252            *pcbWritten = cbData; /** @todo For now return all as being written. */
    12441253    }
     1254
     1255    LogFlowFuncLeaveRC(rc);
     1256    return rc;
     1257}
     1258
     1259/*********************************************************************************************************************************
     1260*   Transfer interface implementations                                                                                           *
     1261*********************************************************************************************************************************/
     1262
     1263static int vbglR3ClipboardTransferIfaceGetRoots(PSHCLPROVIDERCTX pCtx, PSHCLROOTLIST *ppRootList)
     1264{
     1265    LogFlowFuncEnter();
     1266
     1267    PVBGLR3SHCLCMDCTX pCmdCtx = (PVBGLR3SHCLCMDCTX)pCtx->pvUser;
     1268    AssertPtr(pCmdCtx);
     1269
     1270    int rc = VbglR3ClipboardRootListRead(pCmdCtx, ppRootList);
     1271
     1272    LogFlowFuncLeaveRC(rc);
     1273    return rc;
     1274}
     1275
     1276static int vbglR3ClipboardTransferIfaceListOpen(PSHCLPROVIDERCTX pCtx, PSHCLLISTOPENPARMS pOpenParms,
     1277                                                PSHCLLISTHANDLE phList)
     1278{
     1279    LogFlowFuncEnter();
     1280
     1281    PVBGLR3SHCLCMDCTX pCmdCtx = (PVBGLR3SHCLCMDCTX)pCtx->pvUser;
     1282    AssertPtr(pCmdCtx);
     1283
     1284    int rc = VbglR3ClipboardListOpenSend(pCmdCtx, pOpenParms, phList);
     1285
     1286    LogFlowFuncLeaveRC(rc);
     1287    return rc;
     1288}
     1289
     1290static int vbglR3ClipboardTransferIfaceListClose(PSHCLPROVIDERCTX pCtx, SHCLLISTHANDLE hList)
     1291{
     1292    LogFlowFuncEnter();
     1293
     1294    PVBGLR3SHCLCMDCTX pCmdCtx = (PVBGLR3SHCLCMDCTX)pCtx->pvUser;
     1295    AssertPtr(pCmdCtx);
     1296
     1297    int rc = VbglR3ClipboardListCloseSend(pCmdCtx, hList);
     1298
     1299    LogFlowFuncLeaveRC(rc);
     1300    return rc;
     1301}
     1302
     1303static int vbglR3ClipboardTransferIfaceListHdrRead(PSHCLPROVIDERCTX pCtx,
     1304                                                   SHCLLISTHANDLE hList, PSHCLLISTHDR pListHdr)
     1305{
     1306    LogFlowFuncEnter();
     1307
     1308    PVBGLR3SHCLCMDCTX pCmdCtx = (PVBGLR3SHCLCMDCTX)pCtx->pvUser;
     1309    AssertPtr(pCmdCtx);
     1310
     1311    int rc = SharedClipboardTransferListHdrInit(pListHdr);
     1312    if (RT_SUCCESS(rc))
     1313    {
     1314        if (RT_SUCCESS(rc))
     1315        {
     1316            rc = VbglR3ClipboardListHdrRead(pCmdCtx, hList, 0 /* fFlags */, pListHdr);
     1317        }
     1318        else
     1319            SharedClipboardTransferListHdrDestroy(pListHdr);
     1320    }
     1321
     1322    LogFlowFuncLeaveRC(rc);
     1323    return rc;
     1324}
     1325
     1326static int vbglR3ClipboardTransferIfaceListEntryRead(PSHCLPROVIDERCTX pCtx,
     1327                                                     SHCLLISTHANDLE hList, PSHCLLISTENTRY pEntry)
     1328{
     1329    LogFlowFuncEnter();
     1330
     1331    PVBGLR3SHCLCMDCTX pCmdCtx = (PVBGLR3SHCLCMDCTX)pCtx->pvUser;
     1332    AssertPtr(pCmdCtx);
     1333
     1334    int rc = VbglR3ClipboardListEntryRead(pCmdCtx, hList, pEntry);
     1335
     1336    LogFlowFuncLeaveRC(rc);
     1337    return rc;
     1338}
     1339
     1340static int vbglR3ClipboardTransferIfaceObjOpen(PSHCLPROVIDERCTX pCtx,
     1341                                               PSHCLOBJOPENCREATEPARMS pCreateParms, PSHCLOBJHANDLE phObj)
     1342{
     1343    LogFlowFuncEnter();
     1344
     1345    PVBGLR3SHCLCMDCTX pCmdCtx = (PVBGLR3SHCLCMDCTX)pCtx->pvUser;
     1346    AssertPtr(pCmdCtx);
     1347
     1348    int rc = VbglR3ClipboardObjOpenSend(pCmdCtx, pCreateParms, phObj);
     1349
     1350    LogFlowFuncLeaveRC(rc);
     1351    return rc;
     1352}
     1353
     1354static int vbglR3ClipboardTransferIfaceObjClose(PSHCLPROVIDERCTX pCtx, SHCLOBJHANDLE hObj)
     1355{
     1356    LogFlowFuncEnter();
     1357
     1358    PVBGLR3SHCLCMDCTX pCmdCtx = (PVBGLR3SHCLCMDCTX)pCtx->pvUser;
     1359    AssertPtr(pCmdCtx);
     1360
     1361    int rc = VbglR3ClipboardObjCloseSend(pCmdCtx, hObj);
     1362
     1363    LogFlowFuncLeaveRC(rc);
     1364    return rc;
     1365}
     1366
     1367static int vbglR3ClipboardTransferIfaceObjRead(PSHCLPROVIDERCTX pCtx,
     1368                                               SHCLOBJHANDLE hObj, void *pvData, uint32_t cbData,
     1369                                               uint32_t fFlags, uint32_t *pcbRead)
     1370{
     1371    LogFlowFuncEnter();
     1372
     1373    PVBGLR3SHCLCMDCTX pCmdCtx = (PVBGLR3SHCLCMDCTX)pCtx->pvUser;
     1374    AssertPtr(pCmdCtx);
     1375
     1376    RT_NOREF(fFlags); /* Not used yet. */
     1377
     1378    int rc = VbglR3ClipboardObjReadSend(pCmdCtx, hObj, pvData, cbData, pcbRead);
    12451379
    12461380    LogFlowFuncLeaveRC(rc);
     
    12751409            if (RT_SUCCESS(rc))
    12761410            {
    1277                 rc = SharedClipboardTransferStart(pTransfer);
     1411                /* If this is a read transfer (reading data from host), set the interface to use
     1412                 * our VbglR3 routines here. */
     1413                if (enmDir == SHCLTRANSFERDIR_READ)
     1414                {
     1415                    SHCLPROVIDERCREATIONCTX creationCtx;
     1416                    RT_ZERO(creationCtx);
     1417
     1418                    creationCtx.Interface.pfnRootsGet      = vbglR3ClipboardTransferIfaceGetRoots;
     1419
     1420                    creationCtx.Interface.pfnListOpen      = vbglR3ClipboardTransferIfaceListOpen;
     1421                    creationCtx.Interface.pfnListClose     = vbglR3ClipboardTransferIfaceListClose;
     1422                    creationCtx.Interface.pfnListHdrRead   = vbglR3ClipboardTransferIfaceListHdrRead;
     1423                    creationCtx.Interface.pfnListEntryRead = vbglR3ClipboardTransferIfaceListEntryRead;
     1424
     1425                    creationCtx.Interface.pfnObjOpen       = vbglR3ClipboardTransferIfaceObjOpen;
     1426                    creationCtx.Interface.pfnObjClose      = vbglR3ClipboardTransferIfaceObjClose;
     1427                    creationCtx.Interface.pfnObjRead       = vbglR3ClipboardTransferIfaceObjRead;
     1428
     1429                    rc = SharedClipboardTransferSetInterface(pTransfer, &creationCtx);
     1430                }
     1431
     1432                if (RT_SUCCESS(rc))
     1433                    rc = SharedClipboardTransferStart(pTransfer);
    12781434            }
    1279             else
     1435
     1436            if (RT_FAILURE(rc))
    12801437                SharedClipboardTransferCtxTransferUnregister(pTransferCtx, uTransferID);
    12811438        }
     
    13001457                                                 ? SHCLTRANSFERSTATUS_STARTED : SHCLTRANSFERSTATUS_ERROR, rc);
    13011458    AssertRC(rc2);
     1459
     1460    if (RT_FAILURE(rc))
     1461    {
     1462        SharedClipboardTransferDestroy(pTransfer);
     1463        pTransfer = NULL;
     1464    }
    13021465
    13031466    LogFlowFuncLeaveRC(rc);
     
    14241587                    pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_TRANSFER_STATUS;
    14251588
    1426                     LogRel2(("Shared Clipboard: Received status %RU32 (%Rrc) for transfer ID=%RU16\n",
    1427                              pEvent->u.TransferStatus.Report.uStatus, pEvent->u.TransferStatus.Report.rc,
     1589                    LogRel2(("Shared Clipboard: Received status %s (rc=%Rrc) for transfer ID=%RU16\n",
     1590                             VBoxShClTransferStatusToStr(pEvent->u.TransferStatus.Report.uStatus), pEvent->u.TransferStatus.Report.rc,
    14281591                             pEvent->u.TransferStatus.uID));
    14291592                }
     
    15501713            break;
    15511714        }
    1552 
    1553     #if 0
    1554         case VBOX_SHCL_HOST_MSG_TRANSFER_LIST_HDR_WRITE:
    1555         {
    1556             LogFlowFunc(("VBOX_SHCL_HOST_MSG_TRANSFER_LIST_HDR_WRITE\n"));
    1557 
    1558             SHCLLISTHDR hdrList;
    1559             rc = SharedClipboardTransferListHdrInit(&hdrList);
    1560             if (RT_SUCCESS(rc))
    1561             {
    1562                 rc = VBglR3ClipboardListHdrRecv(pCtx, )
    1563             }
    1564             break;
    1565         }
    1566     #endif
    15671715
    15681716        case VBOX_SHCL_HOST_MSG_TRANSFER_LIST_ENTRY_READ:
     
    16031751        }
    16041752
    1605     #if 0
    1606         case VBOX_SHCL_HOST_MSG_TRANSFER_LIST_ENTRY_WRITE:
    1607         {
    1608             LogFlowFunc(("VBOX_SHCL_HOST_MSG_TRANSFER_LIST_ENTRY_WRITE\n"));
    1609             pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_LIST_ENTRY_WRITE;
    1610             break;
    1611         }
    1612     #endif
    1613 
    16141753        case VBOX_SHCL_HOST_MSG_TRANSFER_OBJ_OPEN:
    16151754        {
     
    16841823                    rc = SharedClipboardTransferObjectRead(pTransfer, hObj, pvBuf, cbToRead, &cbRead, fFlags);
    16851824                    if (RT_SUCCESS(rc))
    1686                         rc = VbglR3ClipboardObjWrite(pCmdCtx, hObj, pvBuf, cbRead, NULL /* pcbWritten */);
     1825                        rc = VbglR3ClipboardObjWriteSend(pCmdCtx, hObj, pvBuf, cbRead, NULL /* pcbWritten */);
    16871826
    16881827                    RTMemFree(pvBuf);
     
    16951834        }
    16961835
    1697     #if 0
    1698         case VBOX_SHCL_HOST_MSG_TRANSFER_OBJ_WRITE:
    1699         {
    1700             LogFlowFunc(("VBOX_SHCL_HOST_MSG_TRANSFER_OBJ_WRITE\n"));
    1701             break;
    1702         }
    1703     #endif
    1704 
    17051836        default:
    17061837        {
     
    17921923}
    17931924
    1794 #if 0
    1795 VBGLR3DECL(int) VbglR3ClipboardListHdrReadRecv(HGCMCLIENTID idClient, PSHCLLISTHANDLE phList)
    1796 {
    1797     AssertPtrReturn(phList, VERR_INVALID_POINTER);
    1798 
    1799     VBoxShClListHdrReadMsg Msg;
    1800     RT_ZERO(Msg);
    1801 
    1802     VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,
    1803                        VBOX_SHCL_GUEST_FN_LIST_HDR_READ, VBOX_SHCL_CPARMS_LIST_HDR_READ);
    1804 
    1805     Msg.uContext.SetUInt32(0); /** @todo Not used yet. */
    1806     Msg.uHandle.SetUInt64(0);
    1807 
    1808     int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));
    1809     if (RT_SUCCESS(rc))
    1810     {
    1811         Msg.uHandle.GetUInt32(phList);
    1812     }
    1813 
    1814     LogFlowFuncLeaveRC(rc);
    1815     return rc;
    1816 }
    1817 
    18181925/**
    1819  * Sends a list header to the host.
     1926 * Reports (advertises) guest clipboard formats to the host.
    18201927 *
    18211928 * @returns VBox status code.
    1822  * @param   idClient        The client id returned by VbglR3ClipboardConnect().
    1823  * @param   hList           List handle to send header for.
    1824  * @param   pListHdr        List header to send.
     1929 * @param   pCtx                The command context returned by VbglR3ClipboardConnectEx().
     1930 * @param   pFormats            The formats to report.
    18251931 */
    1826 VBGLR3DECL(int) VbglR3ClipboardListHdrSend(HGCMCLIENTID idClient,
    1827                                            SHCLLISTHANDLE hList, PSHCLLISTHDR pListHdr)
    1828 {
    1829     AssertPtrReturn(pListHdr, VERR_INVALID_POINTER);
    1830 
    1831     VBoxShClListHdrMsg Msg;
    1832     RT_ZERO(Msg);
    1833 
    1834     VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,
    1835                        VBOX_SHCL_GUEST_FN_LIST_HDR_WRITE, VBOX_SHCL_CPARMS_LIST_HDR);
    1836 
    1837     Msg.uContext.SetUInt32(0); /** @todo Not used yet. */
    1838     Msg.fFeatures.SetUInt32(pListHdr->fFeatures);
    1839     Msg.cTotalObjects.SetUInt64(pListHdr->cTotalObjects);
    1840     Msg.cbTotalSize.SetUInt64(pListHdr->cbTotalSize);
    1841     Msg.enmCompression.SetUInt32(pListHdr->enmCompression);
    1842     Msg.enmChecksumType.SetUInt32(RTDIGESTTYPE_INVALID);
    1843 
    1844     int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));
    1845 
    1846     LogFlowFuncLeaveRC(rc);
    1847     return rc;
    1848 }
    1849 
    1850 /**
    1851  * Sends a list entry to the host.
    1852  *
    1853  * @returns IPRT status code.
    1854  * @param   idClient            The client id returned by VbglR3ClipboardConnect()
    1855  * @param   hList               List handle to send entry for.
    1856  * @param   pListEntry          List entry to send.
    1857  */
    1858 VBGLR3DECL(int) VbglR3ClipboardSendListEntryWrite(HGCMCLIENTID idClient,
    1859                                                   SHCLLISTHANDLE hList, PSHCLLISTENTRY pListEntry)
    1860 {
    1861     AssertPtrReturn(pListEntry, VERR_INVALID_POINTER);
    1862 
    1863     VBoxShClListEntryWriteMsg Msg;
    1864     RT_ZERO(Msg);
    1865 
    1866     VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,
    1867                        VBOX_SHCL_GUEST_FN_LIST_ENTRY_WRITE, VBOX_SHCL_CPARMS_LIST_ENTRY_WRITE);
    1868 
    1869     Msg.uContext.SetUInt32(0); /** @todo Not used yet. */
    1870     Msg.uHandle.SetUInt64(hList);
    1871     Msg.fInfo.SetUInt32(pListEntry->fInfo);
    1872     Msg.cbInfo.SetUInt32(pListEntry->cbInfo);
    1873     Msg.pvInfo.SetPtr(pListEntry->pvInfo, pListEntry->cbInfo);
    1874 
    1875     int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));
    1876 
    1877     LogFlowFuncLeaveRC(rc);
    1878     return rc;
    1879 }
    1880 #endif
    1881 
    1882 /**
    1883  * Sends (reports) guest clipboard formats to the host.
    1884  *
    1885  * @returns VBox status code.
    1886  * @param   pCtx                The command context returned by VbglR3ClipboardConnect().
    1887  * @param   pFormats            The formats to send (report).
    1888  */
    1889 VBGLR3DECL(int) VbglR3ClipboardFormatsSend(PVBGLR3SHCLCMDCTX pCtx, PSHCLFORMATDATA pFormats)
    1890 {
     1932VBGLR3DECL(int) VbglR3ClipboardFormatsReportEx(PVBGLR3SHCLCMDCTX pCtx, PSHCLFORMATDATA pFormats)
     1933{
     1934    AssertPtrReturn(pCtx,     VERR_INVALID_POINTER);
     1935    AssertPtrReturn(pFormats, VERR_INVALID_POINTER);
     1936
    18911937    VBoxShClFormatsMsg Msg;
    18921938
    18931939    int rc;
     1940
     1941    LogFlowFunc(("uFormats=0x%x\n", pFormats->uFormats));
    18941942
    18951943    if (pCtx->uProtocolVer == 0)
     
    19221970 * @returns VBox status code.
    19231971 * @param   idClient        The client id returned by VbglR3ClipboardConnect().
    1924  * @param   fFormats        The formats to advertise.
     1972 * @param   fFormats        The formats to report.
    19251973 */
    1926 VBGLR3DECL(int) VbglR3ClipboardReportFormats(HGCMCLIENTID idClient, uint32_t fFormats)
    1927 {
     1974VBGLR3DECL(int) VbglR3ClipboardFormatsReport(HGCMCLIENTID idClient, uint32_t fFormats)
     1975{
     1976    AssertReturn(idClient, VERR_INVALID_PARAMETER);
     1977    AssertReturn(fFormats, VERR_INVALID_PARAMETER);
     1978
    19281979    VBoxShClFormatsMsg Msg;
    19291980
     
    19481999VBGLR3DECL(int) VbglR3ClipboardWriteData(HGCMCLIENTID idClient, uint32_t fFormat, void *pv, uint32_t cb)
    19492000{
     2001    AssertReturn   (idClient, VERR_INVALID_PARAMETER);
     2002    AssertPtrReturn(pv,       VERR_INVALID_POINTER);
     2003    AssertReturn   (cb,       VERR_INVALID_PARAMETER);
     2004
    19502005    VBoxShClWriteDataMsg Msg;
    19512006    RT_ZERO(Msg);
     
    19702025 *
    19712026 * @returns VBox status code.
    1972  * @param   pCtx                The command context returned by VbglR3ClipboardConnect().
     2027 * @param   pCtx                The command context returned by VbglR3ClipboardConnectEx().
    19732028 * @param   pData               Clipboard data to send.
    19742029 */
    19752030VBGLR3DECL(int) VbglR3ClipboardWriteDataEx(PVBGLR3SHCLCMDCTX pCtx, PSHCLDATABLOCK pData)
    19762031{
     2032    AssertPtrReturn(pCtx,  VERR_INVALID_POINTER);
     2033    AssertPtrReturn(pData, VERR_INVALID_POINTER);
     2034
    19772035    int rc;
    19782036
     
    20122070VBGLR3DECL(int) VbglR3ClipboardWriteError(HGCMCLIENTID idClient, int rcErr)
    20132071{
     2072    AssertReturn(idClient, VERR_INVALID_PARAMETER);
     2073
    20142074    VBoxShClWriteErrorMsg Msg;
    20152075    RT_ZERO(Msg);
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceClipboard-os2.cpp

    r80847 r80990  
    611611    }
    612612    VGSvcVerbose(4, "clipboard: reporting fFormats=%#x\n", fFormats);
    613     VbglR3ClipboardReportFormats(g_u32ClientId, fFormats);
     613    VbglR3ClipboardFormatsReport(g_u32ClientId, fFormats);
    614614}
    615615
     
    658658                g_fEmptyClipboard = true;
    659659                VGSvcVerbose(3, "Reporting empty clipboard\n");
    660                 VbglR3ClipboardReportFormats(g_u32ClientId, 0);
     660                VbglR3ClipboardFormatsReport(g_u32ClientId, 0);
    661661            }
    662662        }
     
    681681    g_fEmptyClipboard = true;
    682682    VGSvcVerbose(3, "Reporting empty clipboard\n");
    683     VbglR3ClipboardReportFormats(g_u32ClientId, 0);
     683    VbglR3ClipboardFormatsReport(g_u32ClientId, 0);
    684684
    685685    vgsvcClipboardOs2PollViewer();
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