Changeset 81260 in vbox
- Timestamp:
- Oct 14, 2019 2:14:33 PM (5 years ago)
- Location:
- trunk/src/VBox
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp
r81259 r81260 395 395 if (pThis->m_lstEntries.size()) 396 396 { 397 LogRel2(("Shared Clipboard: Starting transfer...\n"));397 LogRel2(("Shared Clipboard: Waiting for transfer to complete ...\n")); 398 398 399 399 LogFlowFunc(("Waiting for transfer to complete ...\n")); … … 402 402 rc2 = RTSemEventWait(pThis->m_EventTransferComplete, RT_INDEFINITE_WAIT); 403 403 AssertRC(rc2); 404 405 LogRel2(("Shared Clipboard: Transfer complete\n")); 404 406 } 405 407 else -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp
r81259 r81260 2761 2761 AssertMsgStmt(ASMBitTestAndClear(&pTransferCtx->bmTransferIds, idTransfer), ("idTransfer=%#x\n", idTransfer), rc = VERR_NOT_FOUND); 2762 2762 2763 LogFlowFunc(("idTransfer=%RU32\n", idTransfer)); 2764 2763 2765 PSHCLTRANSFER pTransfer = sharedClipboardTransferCtxGetTransferInternal(pTransferCtx, idTransfer); 2764 2766 if (pTransfer) … … 2768 2770 Assert(pTransferCtx->cTransfers); 2769 2771 pTransferCtx->cTransfers--; 2772 2773 Assert(pTransferCtx->cTransfers >= pTransferCtx->cRunning); 2774 2775 LogFlowFunc(("Now %RU32 transfers left\n", pTransferCtx->cTransfers)); 2770 2776 } 2771 2777 else 2772 2778 rc = VERR_NOT_FOUND; 2773 2779 2774 LogFlowFunc (("idTransfer=%RU32, rc=%Rrc\n", idTransfer, rc));2780 LogFlowFuncLeaveRC(rc); 2775 2781 return rc; 2776 2782 } -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp
r81259 r81260 88 88 DECLCALLBACK(int) shclSvcTransferIfaceOpen(PSHCLPROVIDERCTX pCtx) 89 89 { 90 LogFlowFuncEnter(); 91 90 92 RT_NOREF(pCtx); 91 93 … … 96 98 DECLCALLBACK(int) shclSvcTransferIfaceClose(PSHCLPROVIDERCTX pCtx) 97 99 { 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; 102 109 } 103 110 … … 1703 1710 } 1704 1711 1705 #if 01706 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 else1734 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 else1760 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 else1818 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 else1870 LogRel(("Clipboard: Error writing guest file data for '%s', rc=%Rrc\n", pObj->GetDestPathAbs().c_str(), rc));1871 }1872 break;1873 }1874 #endif1875 1712 default: 1876 1713 LogFunc(("Not implemented\n")); … … 2311 2148 2312 2149 /** 2313 * Stops a transfer, communicating the status to the guest side.2150 * Stops (and destroys) a transfer, communicating the status to the guest side. 2314 2151 * 2315 2152 * @returns VBox status code. … … 2319 2156 int shclSvcTransferStop(PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer) 2320 2157 { 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, 2326 2160 SHCLTRANSFERSTATUS_STOPPED, VINF_SUCCESS, 2327 2161 &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.