VirtualBox

Changeset 81260 in vbox


Ignore:
Timestamp:
Oct 14, 2019 2:14:33 PM (5 years ago)
Author:
vboxsync
Message:

Shared Clipboard/Transfers: Bugfixes.

Location:
trunk/src/VBox
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp

    r81259 r81260  
    395395                if (pThis->m_lstEntries.size())
    396396                {
    397                     LogRel2(("Shared Clipboard: Starting transfer ...\n"));
     397                    LogRel2(("Shared Clipboard: Waiting for transfer to complete ...\n"));
    398398
    399399                    LogFlowFunc(("Waiting for transfer to complete ...\n"));
     
    402402                    rc2 = RTSemEventWait(pThis->m_EventTransferComplete, RT_INDEFINITE_WAIT);
    403403                    AssertRC(rc2);
     404
     405                    LogRel2(("Shared Clipboard: Transfer complete\n"));
    404406                }
    405407                else
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp

    r81259 r81260  
    27612761    AssertMsgStmt(ASMBitTestAndClear(&pTransferCtx->bmTransferIds, idTransfer), ("idTransfer=%#x\n", idTransfer), rc = VERR_NOT_FOUND);
    27622762
     2763    LogFlowFunc(("idTransfer=%RU32\n", idTransfer));
     2764
    27632765    PSHCLTRANSFER pTransfer = sharedClipboardTransferCtxGetTransferInternal(pTransferCtx, idTransfer);
    27642766    if (pTransfer)
     
    27682770        Assert(pTransferCtx->cTransfers);
    27692771        pTransferCtx->cTransfers--;
     2772
     2773        Assert(pTransferCtx->cTransfers >= pTransferCtx->cRunning);
     2774
     2775        LogFlowFunc(("Now %RU32 transfers left\n", pTransferCtx->cTransfers));
    27702776    }
    27712777    else
    27722778        rc = VERR_NOT_FOUND;
    27732779
    2774     LogFlowFunc(("idTransfer=%RU32, rc=%Rrc\n", idTransfer, rc));
     2780    LogFlowFuncLeaveRC(rc);
    27752781    return rc;
    27762782}
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp

    r81259 r81260  
    8888DECLCALLBACK(int) shclSvcTransferIfaceOpen(PSHCLPROVIDERCTX pCtx)
    8989{
     90    LogFlowFuncEnter();
     91
    9092    RT_NOREF(pCtx);
    9193
     
    9698DECLCALLBACK(int) shclSvcTransferIfaceClose(PSHCLPROVIDERCTX pCtx)
    9799{
    98     RT_NOREF(pCtx);
    99 
    100     LogFlowFuncLeave();
    101     return VINF_SUCCESS;
     100    LogFlowFuncEnter();
     101
     102    PSHCLCLIENT pClient = (PSHCLCLIENT)pCtx->pvUser;
     103    AssertPtr(pClient);
     104
     105    int rc = shclSvcTransferStop(pClient, pCtx->pTransfer);
     106
     107    LogFlowFuncLeaveRC(rc);
     108    return rc;
    102109}
    103110
     
    17031710        }
    17041711
    1705     #if 0
    1706         case VBOX_SHCL_GUEST_FN_WRITE_DIR:
    1707         {
    1708             LogFlowFunc(("VBOX_SHCL_GUEST_FN_WRITE_DIR\n"));
    1709 
    1710             SHCLDIRDATA dirData;
    1711             rc = VBoxSvcClipboardGetDir(cParms, paParms, &dirData);
    1712             if (RT_SUCCESS(rc))
    1713             {
    1714                 SharedClipboardArea *pArea = SharedClipboardTransferGetArea(pTransfer);
    1715                 AssertPtrBreakStmt(pArea, rc = VERR_INVALID_POINTER);
    1716 
    1717                 const char *pszCacheDir = pArea->GetDirAbs();
    1718                 char *pszDir = RTPathJoinA(pszCacheDir, dirData.pszPath);
    1719                 if (pszDir)
    1720                 {
    1721                     LogFlowFunc(("pszDir=%s\n", pszDir));
    1722 
    1723                     rc = RTDirCreateFullPath(pszDir, dirData.fMode);
    1724                     if (RT_SUCCESS(rc))
    1725                     {
    1726                         SHCLAREAOBJ Obj = { SHCLAREAOBJTYPE_DIR, SHCLAREAOBJSTATE_COMPLETE };
    1727                         int rc2 = pArea->AddObject(pszDir, Obj);
    1728                         AssertRC(rc2);
    1729                     }
    1730 
    1731                     RTStrFree(pszDir);
    1732                 }
    1733                 else
    1734                     rc = VERR_NO_MEMORY;
    1735             }
    1736             break;
    1737         }
    1738 
    1739         case VBOX_SHCL_GUEST_FN_READ_FILE_HDR:
    1740         {
    1741             LogFlowFunc(("VBOX_SHCL_GUEST_FN_READ_FILE_HDR\n"));
    1742 
    1743             SHCLFILEHDR fileHdr;
    1744             rc = VBoxSvcClipboardSetFileHdr(cParms, paParms, &fileHdr);
    1745             break;
    1746         }
    1747 
    1748         case VBOX_SHCL_GUEST_FN_WRITE_FILE_HDR:
    1749         {
    1750             LogFlowFunc(("VBOX_SHCL_GUEST_FN_WRITE_FILE_HDR\n"));
    1751 
    1752             if (!SharedClipboardTransferObjCtxIsValid(SharedClipboardTransferGetCurrentObjCtx(pTransfer)))
    1753             {
    1754                 pTransfer->State.ObjCtx.pObj = new SharedClipboardTransferObject(SharedClipboardTransferObject::Type_File);
    1755                 if (pTransfer->State.ObjCtx.pObj) /** @todo Can this throw? */
    1756                 {
    1757                     rc = VINF_SUCCESS;
    1758                 }
    1759                 else
    1760                     rc = VERR_NO_MEMORY;
    1761             }
    1762             else /* There still is another object being processed? */
    1763                 rc = VERR_WRONG_ORDER;
    1764 
    1765             if (RT_FAILURE(rc))
    1766                 break;
    1767 
    1768             SHCLFILEHDR fileHdr;
    1769             rc = VBoxSvcClipboardGetFileHdr(cParms, paParms, &fileHdr);
    1770             if (RT_SUCCESS(rc))
    1771             {
    1772                 SharedClipboardArea *pArea = SharedClipboardTransferGetArea(pTransfer);
    1773                 AssertPtrBreakStmt(pArea, rc = VERR_WRONG_ORDER);
    1774 
    1775                 const char *pszCacheDir = pArea->GetDirAbs();
    1776 
    1777                 char pszPathAbs[RTPATH_MAX];
    1778                 rc = RTPathJoin(pszPathAbs, sizeof(pszPathAbs), pszCacheDir, fileHdr.pszFilePath);
    1779                 if (RT_SUCCESS(rc))
    1780                 {
    1781                     rc = SharedClipboardPathSanitize(pszPathAbs, sizeof(pszPathAbs));
    1782                     if (RT_SUCCESS(rc))
    1783                     {
    1784                         PSHCLCLIENTTRANSFEROBJCTX pObjCtx = SharedClipboardTransferGetCurrentObjCtx(pTransfer);
    1785                         AssertPtrBreakStmt(pObjCtx, VERR_INVALID_POINTER);
    1786 
    1787                         SharedClipboardTransferObject *pObj = pObjCtx->pObj;
    1788                         AssertPtrBreakStmt(pObj, VERR_INVALID_POINTER);
    1789 
    1790                         LogFlowFunc(("pszFile=%s\n", pszPathAbs));
    1791 
    1792                         /** @todo Add sparse file support based on fFlags? (Use Open(..., fFlags | SPARSE). */
    1793                         rc = pObj->OpenFileEx(pszPathAbs, SharedClipboardTransferObject::View_Target,
    1794                                               RTFILE_O_CREATE_REPLACE | RTFILE_O_WRITE | RTFILE_O_DENY_WRITE,
    1795                                               (fileHdr.fMode & RTFS_UNIX_MASK) | RTFS_UNIX_IRUSR | RTFS_UNIX_IWUSR);
    1796                         if (RT_SUCCESS(rc))
    1797                         {
    1798                             rc = pObj->SetSize(fileHdr.cbSize);
    1799 
    1800                             /** @todo Unescape path before printing. */
    1801                             LogRel2(("Clipboard: Transferring guest file '%s' to host (%RU64 bytes, mode 0x%x)\n",
    1802                                      pObj->GetDestPathAbs().c_str(), pObj->GetSize(), pObj->GetMode()));
    1803 
    1804                             if (pObj->IsComplete()) /* 0-byte file? We're done already. */
    1805                             {
    1806                                 /** @todo Sanitize path. */
    1807                                 LogRel2(("Clipboard: Transferring guest file '%s' (0 bytes) to host complete\n",
    1808                                          pObj->GetDestPathAbs().c_str()));
    1809 
    1810                                 SharedClipboardTransferObjCtxDestroy(&pTransfer->State.ObjCtx);
    1811                             }
    1812 
    1813                             SHCLAREAOBJ Obj = { SHCLAREAOBJTYPE_FILE, SHCLAREAOBJSTATE_NONE };
    1814                             int rc2 = pArea->AddObject(pszPathAbs, Obj);
    1815                             AssertRC(rc2);
    1816                         }
    1817                         else
    1818                             LogRel(("Clipboard: Error opening/creating guest file '%s' on host, rc=%Rrc\n", pszPathAbs, rc));
    1819                     }
    1820                 }
    1821             }
    1822             break;
    1823         }
    1824 
    1825         case VBOX_SHCL_GUEST_FN_READ_FILE_DATA:
    1826         {
    1827             LogFlowFunc(("VBOX_SHCL_FN_READ_FILE_DATA\n"));
    1828 
    1829             SHCLFILEDATA fileData;
    1830             rc = VBoxSvcClipboardSetFileData(cParms, paParms, &fileData);
    1831             break;
    1832         }
    1833 
    1834         case VBOX_SHCL_GUEST_FN_WRITE_FILE_DATA:
    1835         {
    1836             LogFlowFunc(("VBOX_SHCL_FN_WRITE_FILE_DATA\n"));
    1837 
    1838             if (!SharedClipboardTransferObjCtxIsValid(&pTransfer->State.ObjCtx))
    1839             {
    1840                 rc = VERR_WRONG_ORDER;
    1841                 break;
    1842             }
    1843 
    1844             SHCLFILEDATA fileData;
    1845             rc = VBoxSvcClipboardGetFileData(cParms, paParms, &fileData);
    1846             if (RT_SUCCESS(rc))
    1847             {
    1848                 PSHCLCLIENTTRANSFEROBJCTX pObjCtx = SharedClipboardTransferGetCurrentObjCtx(pTransfer);
    1849                 AssertPtrBreakStmt(pObjCtx, VERR_INVALID_POINTER);
    1850 
    1851                 SharedClipboardTransferObject *pObj = pObjCtx->pObj;
    1852                 AssertPtrBreakStmt(pObj, VERR_INVALID_POINTER);
    1853 
    1854                 uint32_t cbWritten;
    1855                 rc = pObj->Write(fileData.pvData, fileData.cbData, &cbWritten);
    1856                 if (RT_SUCCESS(rc))
    1857                 {
    1858                     Assert(cbWritten <= fileData.cbData);
    1859                     if (cbWritten < fileData.cbData)
    1860                     {
    1861                         /** @todo What to do when the host's disk is full? */
    1862                         rc = VERR_DISK_FULL;
    1863                     }
    1864 
    1865                     if (   pObj->IsComplete()
    1866                         || RT_FAILURE(rc))
    1867                         SharedClipboardTransferObjCtxDestroy(&pTransfer->State.ObjCtx);
    1868                 }
    1869                 else
    1870                     LogRel(("Clipboard: Error writing guest file data for '%s', rc=%Rrc\n", pObj->GetDestPathAbs().c_str(), rc));
    1871             }
    1872             break;
    1873         }
    1874 #endif
    18751712        default:
    18761713            LogFunc(("Not implemented\n"));
     
    23112148
    23122149/**
    2313  * Stops a transfer, communicating the status to the guest side.
     2150 * Stops (and destroys) a transfer, communicating the status to the guest side.
    23142151 *
    23152152 * @returns VBox status code.
     
    23192156int shclSvcTransferStop(PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer)
    23202157{
    2321     int rc = ShClTransferClose(pTransfer);
    2322     if (RT_SUCCESS(rc))
    2323     {
    2324         SHCLEVENTID uEvent;
    2325         rc = shclSvcTransferSendStatus(pClient, pTransfer,
     2158    SHCLEVENTID uEvent;
     2159    int rc = shclSvcTransferSendStatus(pClient, pTransfer,
    23262160                                       SHCLTRANSFERSTATUS_STOPPED, VINF_SUCCESS,
    23272161                                       &uEvent);
    2328         if (RT_SUCCESS(rc))
    2329         {
    2330             LogRel2(("Shared Clipboard: Waiting for stop of transfer %RU32 on guest ...\n", pTransfer->State.uID));
    2331 
    2332             rc = ShClEventWait(&pTransfer->Events, uEvent, pTransfer->uTimeoutMs, NULL);
    2333             if (RT_SUCCESS(rc))
    2334             {
    2335                 rc = ShClTransferCtxTransferUnregister(&pClient->TransferCtx, ShClTransferGetID(pTransfer));
    2336 
    2337                 LogRel2(("Shared Clipboard: Stopped transfer %RU32 on guest\n", pTransfer->State.uID));
    2338             }
    2339             else
    2340                LogRel(("Shared Clipboard: Unable to stop transfer %RU32 on guest, rc=%Rrc\n",
    2341                        pTransfer->State.uID, rc));
    2342         }
    2343     }
    2344 
    2345     LogFlowFuncLeaveRC(rc);
    2346     return rc;
    2347 }
    2348 
     2162    if (RT_SUCCESS(rc))
     2163    {
     2164        LogRel2(("Shared Clipboard: Waiting for stop of transfer %RU32 on guest ...\n", pTransfer->State.uID));
     2165
     2166        rc = ShClEventWait(&pTransfer->Events, uEvent, pTransfer->uTimeoutMs, NULL);
     2167        if (RT_SUCCESS(rc))
     2168            LogRel2(("Shared Clipboard: Stopped transfer %RU32 on guest\n", pTransfer->State.uID));
     2169    }
     2170
     2171    if (RT_FAILURE(rc))
     2172        LogRel(("Shared Clipboard: Unable to stop transfer %RU32 on guest, rc=%Rrc\n",
     2173                pTransfer->State.uID, rc));
     2174
     2175    /* Regardless of whether the guest was able to report back and/or stop the transfer, remove the transfer on the host
     2176     * so that we don't risk of having stale transfers here. */
     2177    int rc2 = ShClTransferCtxTransferUnregister(&pClient->TransferCtx, ShClTransferGetID(pTransfer));
     2178    if (RT_SUCCESS(rc2))
     2179    {
     2180        ShClTransferDestroy(pTransfer);
     2181        pTransfer = NULL;
     2182    }
     2183
     2184    LogFlowFuncLeaveRC(rc);
     2185    return rc;
     2186}
     2187
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