Changeset 81212 in vbox for trunk/src/VBox/GuestHost/SharedClipboard
- Timestamp:
- Oct 10, 2019 12:22:34 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 133874
- Location:
- trunk/src/VBox/GuestHost/SharedClipboard
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp
r81025 r81212 131 131 * 132 132 * @returns VBox status code. 133 * @param pListEntry Clipboard root list entry to copy. 133 * @param pDst Where to copy the source root list entry to. 134 * @param pSrc Source root list entry to copy. 134 135 */ 135 136 int SharedClipboardTransferRootListEntryCopy(PSHCLROOTLISTENTRY pDst, PSHCLROOTLISTENTRY pSrc) … … 139 140 140 141 /** 142 * Initializes a clipboard root list entry structure. 143 * 144 * @param pRootListEntry Clipboard root list entry structure to destroy. 145 */ 146 int SharedClipboardTransferRootListEntryInit(PSHCLROOTLISTENTRY pRootListEntry) 147 { 148 return SharedClipboardTransferListEntryInit(pRootListEntry); 149 } 150 151 /** 152 * Destroys a clipboard root list entry structure. 153 * 154 * @param pRootListEntry Clipboard root list entry structure to destroy. 155 */ 156 void SharedClipboardTransferRootListEntryDestroy(PSHCLROOTLISTENTRY pRootListEntry) 157 { 158 return SharedClipboardTransferListEntryDestroy(pRootListEntry); 159 } 160 161 /** 141 162 * Duplicates (allocates) a clipboard root list entry structure. 142 163 * 143 164 * @returns Duplicated clipboard root list entry structure on success. 144 * @param p ListEntryClipboard root list entry to duplicate.165 * @param pRootListEntry Clipboard root list entry to duplicate. 145 166 */ 146 167 PSHCLROOTLISTENTRY SharedClipboardTransferRootListEntryDup(PSHCLROOTLISTENTRY pRootListEntry) 147 168 { 148 169 return SharedClipboardTransferListEntryDup(pRootListEntry); 149 }150 151 /**152 * Destroys a clipboard root list entry structure.153 *154 * @param pListEntry Clipboard root list entry structure to destroy.155 */156 void SharedClipboardTransferRootListEntryDestroy(PSHCLROOTLISTENTRY pRootListEntry)157 {158 return SharedClipboardTransferListEntryDestroy(pRootListEntry);159 170 } 160 171 … … 517 528 518 529 pListEntry->cbName = SHCLLISTENTRY_MAX_NAME; 519 pListEntry->pvInfo = NULL; 520 pListEntry->cbInfo = 0; 521 pListEntry->fInfo = 0; 522 523 return VINF_SUCCESS; 530 531 pListEntry->pvInfo = (PSHCLFSOBJINFO)RTMemAlloc(sizeof(SHCLFSOBJINFO)); 532 if (pListEntry->pvInfo) 533 { 534 pListEntry->cbInfo = sizeof(SHCLFSOBJINFO); 535 pListEntry->fInfo = VBOX_SHCL_INFO_FLAG_FSOBJINFO; 536 537 return VINF_SUCCESS; 538 } 539 540 return VERR_NO_MEMORY; 524 541 } 525 542 … … 607 624 608 625 /** 626 * Initializes an object handle info structure. 627 * 628 * @returns VBox status code. 629 * @param pInfo Object handle info structure to initialize. 630 */ 631 int SharedClipboardTransferObjectHandleInfoInit(PSHCLOBJHANDLEINFO pInfo) 632 { 633 AssertPtrReturn(pInfo, VERR_INVALID_POINTER); 634 635 pInfo->hObj = SHCLOBJHANDLE_INVALID; 636 pInfo->enmType = SHCLOBJTYPE_INVALID; 637 638 pInfo->pszPathLocalAbs = NULL; 639 640 RT_ZERO(pInfo->u); 641 642 return VINF_SUCCESS; 643 } 644 645 /** 609 646 * Destroys an object handle info structure. 610 647 * … … 743 780 if (pInfo) 744 781 { 745 const bool fWritable = true; /** @todo Fix this. */ 746 747 uint64_t fOpen; 748 rc = sharedClipboardConvertFileCreateFlags(fWritable, 749 pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode, 750 SHCLOBJHANDLE_INVALID, &fOpen); 782 rc = SharedClipboardTransferObjectHandleInfoInit(pInfo); 751 783 if (RT_SUCCESS(rc)) 752 784 { 753 char *pszPathAbs = RTStrAPrintf2("%s/%s", pTransfer->pszPathRootAbs, pOpenCreateParms->pszPath); 754 if (pszPathAbs) 785 const bool fWritable = true; /** @todo Fix this. */ 786 787 uint64_t fOpen; 788 rc = sharedClipboardConvertFileCreateFlags(fWritable, 789 pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode, 790 SHCLOBJHANDLE_INVALID, &fOpen); 791 if (RT_SUCCESS(rc)) 755 792 { 756 LogFlowFunc(("%s\n", pszPathAbs)); 757 758 rc = RTFileOpen(&pInfo->u.Local.hFile, pszPathAbs, fOpen); 759 RTStrFree(pszPathAbs); 793 char *pszPathAbs = RTStrAPrintf2("%s/%s", pTransfer->pszPathRootAbs, pOpenCreateParms->pszPath); 794 if (pszPathAbs) 795 { 796 LogFlowFunc(("%s\n", pszPathAbs)); 797 798 rc = RTFileOpen(&pInfo->u.Local.hFile, pszPathAbs, fOpen); 799 RTStrFree(pszPathAbs); 800 } 801 else 802 rc = VERR_NO_MEMORY; 760 803 } 761 else762 rc = VERR_NO_MEMORY;763 804 } 764 805 … … 772 813 *phObj = pInfo->hObj; 773 814 } 774 775 if (RT_FAILURE(rc)) 815 else 816 { 817 SharedClipboardTransferObjectHandleInfoDestroy(pInfo); 776 818 RTMemFree(pInfo); 819 } 777 820 } 778 821 else … … 1746 1789 && !fSkipEntry) 1747 1790 { 1748 pEntry->pvInfo = (PSHCLFSOBJINFO)RTMemAlloc(sizeof(SHCLFSOBJINFO));1749 if ( pEntry->pvInfo)1791 rc = RTStrCopy(pEntry->pszName, pEntry->cbName, pDirEntry->szName); 1792 if (RT_SUCCESS(rc)) 1750 1793 { 1751 rc = RTStrCopy(pEntry->pszName, pEntry->cbName, pDirEntry->szName); 1752 if (RT_SUCCESS(rc)) 1753 { 1754 SharedClipboardFsObjFromIPRT(PSHCLFSOBJINFO(pEntry->pvInfo), &pDirEntry->Info); 1755 1756 pEntry->cbInfo = sizeof(SHCLFSOBJINFO); 1757 pEntry->fInfo = VBOX_SHCL_INFO_FLAG_FSOBJINFO; 1758 } 1794 AssertPtr(pEntry->pvInfo); 1795 Assert (pEntry->cbInfo == sizeof(SHCLFSOBJINFO)); 1796 1797 SharedClipboardFsObjFromIPRT(PSHCLFSOBJINFO(pEntry->pvInfo), &pDirEntry->Info); 1759 1798 } 1760 else1761 rc = VERR_NO_MEMORY;1762 1799 } 1763 1800 … … 2033 2070 { 2034 2071 RTFSOBJINFO fsObjInfo; 2035 rc = RTPathQueryInfo(pcszSrcPath, & 2072 rc = RTPathQueryInfo(pcszSrcPath, &fsObjInfo, RTFSOBJATTRADD_NOTHING); 2036 2073 if (RT_SUCCESS(rc)) 2037 2074 { 2038 2075 SharedClipboardFsObjFromIPRT(PSHCLFSOBJINFO(pEntry->pvInfo), &fsObjInfo); 2039 2076 2040 pEntry->fInfo 2077 pEntry->fInfo = VBOX_SHCL_INFO_FLAG_FSOBJINFO; 2041 2078 } 2042 2079 } … … 2247 2284 2248 2285 /** 2249 * Starts (runs) aShared Clipboard transfer in a dedicated thread.2286 * Runs a started Shared Clipboard transfer in a dedicated thread. 2250 2287 * 2251 2288 * @returns VBox status code. 2252 2289 * @param pTransfer Clipboard transfer to run. 2253 2290 * @param pfnThreadFunc Pointer to thread function to use. 2254 * @param pvUser Pointer to user-provided data. 2291 * @param pvUser Pointer to user-provided data. Optional. 2255 2292 */ 2256 2293 int SharedClipboardTransferRun(PSHCLTRANSFER pTransfer, PFNRTTHREAD pfnThreadFunc, void *pvUser) 2257 2294 { 2258 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 2259 2260 int rc = SharedClipboardTransferStart(pTransfer); 2261 if (RT_SUCCESS(rc)) 2262 rc = sharedClipboardTransferThreadCreate(pTransfer, pfnThreadFunc, pvUser); 2295 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 2296 AssertPtrReturn(pfnThreadFunc, VERR_INVALID_POINTER); 2297 /* pvUser is optional. */ 2298 2299 AssertMsgReturn(pTransfer->State.enmStatus == SHCLTRANSFERSTATUS_STARTED, 2300 ("Wrong status (currently is %s)\n", VBoxShClTransferStatusToStr(pTransfer->State.enmStatus)), 2301 VERR_WRONG_ORDER); 2302 2303 int rc = sharedClipboardTransferThreadCreate(pTransfer, pfnThreadFunc, pvUser); 2263 2304 2264 2305 LogFlowFuncLeaveRC(rc); … … 2275 2316 { 2276 2317 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 2318 2319 LogFlowFuncEnter(); 2277 2320 2278 2321 /* Ready to start? */ … … 2291 2334 rc = VINF_SUCCESS; 2292 2335 2293 /* Nothing else to do here right now. */ 2336 if (RT_SUCCESS(rc)) 2337 { 2338 pTransfer->State.enmStatus = SHCLTRANSFERSTATUS_STARTED; 2339 } 2294 2340 2295 2341 LogFlowFuncLeaveRC(rc); … … 2342 2388 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 2343 2389 2390 /* Already marked for stopping? */ 2391 AssertMsgReturn(pTransfer->Thread.fStop == false, 2392 ("Thransfer thread already marked for stopping"), VERR_WRONG_ORDER); 2393 /* Already started? */ 2394 AssertMsgReturn(pTransfer->Thread.fStarted == false, 2395 ("Thransfer thread already started"), VERR_WRONG_ORDER); 2396 2344 2397 /* Spawn a worker thread, so that we don't block the window thread for too long. */ 2345 2398 int rc = RTThreadCreate(&pTransfer->Thread.hThread, pfnThreadFunc, … … 2353 2406 if (pTransfer->Thread.fStarted) /* Did the thread indicate that it started correctly? */ 2354 2407 { 2355 pTransfer->State.enmStatus = SHCLTRANSFERSTATUS_STARTED;2408 /* Nothing to do in here. */ 2356 2409 } 2357 2410 else … … 2391 2444 2392 2445 /** 2393 * Initializes a Shared Clipboard transfer .2446 * Initializes a Shared Clipboard transfer context. 2394 2447 * 2395 2448 * @returns VBox status code. … … 2407 2460 RTListInit(&pTransferCtx->List); 2408 2461 2462 pTransferCtx->cTransfers = 0; 2409 2463 pTransferCtx->cRunning = 0; 2410 pTransferCtx->cMaxRunning = UINT16_MAX; 2464 pTransferCtx->cMaxRunning = UINT16_MAX; /** @todo Make this configurable? */ 2411 2465 2412 2466 RT_ZERO(pTransferCtx->bmTransferIds); … … 2419 2473 2420 2474 /** 2421 * Destroys a shared Clipboard transfer context contextstruct.2475 * Destroys a shared Clipboard transfer context struct. 2422 2476 * 2423 2477 * @param pTransferCtx Transfer context to destroy. … … 2642 2696 pTransferCtx, pTransferCtx->cTransfers, pTransferCtx->cRunning)); 2643 2697 2644 if ( !RTListIsEmpty(&pTransferCtx->List))2645 {2646 /* Remove all transfers which are not in a running state (e.g. only announced). */ 2647 PSHCLTRANSFER pTransfer, pTransferNext;2648 RTListForEachSafe(&pTransferCtx->List, pTransfer, pTransferNext, SHCLTRANSFER, Node)2649 {2650 if (SharedClipboardTransferGetStatus(pTransfer) != SHCLTRANSFERSTATUS_STARTED)2651 {2652 SharedClipboardTransferDestroy(pTransfer);2653 RTListNodeRemove(&pTransfer->Node);2654 2655 RTMemFree(pTransfer); 2656 pTransfer = NULL;2657 2658 Assert(pTransferCtx->cTransfers); 2659 pTransferCtx->cTransfers--;2660 }2698 if (pTransferCtx->cTransfers == 0) 2699 return; 2700 2701 /* Remove all transfers which are not in a running state (e.g. only announced). */ 2702 PSHCLTRANSFER pTransfer, pTransferNext; 2703 RTListForEachSafe(&pTransferCtx->List, pTransfer, pTransferNext, SHCLTRANSFER, Node) 2704 { 2705 if (SharedClipboardTransferGetStatus(pTransfer) != SHCLTRANSFERSTATUS_STARTED) 2706 { 2707 SharedClipboardTransferDestroy(pTransfer); 2708 RTListNodeRemove(&pTransfer->Node); 2709 2710 RTMemFree(pTransfer); 2711 pTransfer = NULL; 2712 2713 Assert(pTransferCtx->cTransfers); 2714 pTransferCtx->cTransfers--; 2661 2715 } 2662 2716 } -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-win.cpp
r81025 r81212 459 459 LogFlowFunc(("fFormats=0x%08X\n", fFormats)); 460 460 461 pFormats->uFormats 462 pFormats->fFlags = 0; /** @todo Handle flags. */461 pFormats->uFormats = fFormats; 462 pFormats->fFlags = 0; /** @todo Handle flags. */ 463 463 } 464 464 … … 889 889 * @returns VBox status code. 890 890 * @param pWinCtx Windows context to use. 891 * @param pTransferCtxCtx transfer contextto use.891 * @param pTransferCtxCtx Transfer contextto use. 892 892 * @param pTransfer Shared Clipboard transfer to use. 893 893 */ … … 1003 1003 1004 1004 /** 1005 * Retrieves the roots for a transfer by opening the clipboard and getting the clipboard data 1006 * as string list (CF_HDROP), assigning it to the transfer as roots then. 1007 * 1008 * @returns VBox status code. 1009 * @param pWinCtx Windows context to use. 1010 * @param pTransfer Transfer to get roots for. 1011 */ 1012 int SharedClipboardWinGetRoots(PSHCLWINCTX pWinCtx, PSHCLTRANSFER pTransfer) 1013 { 1014 AssertPtrReturn(pWinCtx, VERR_INVALID_POINTER); 1015 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 1016 1017 Assert(SharedClipboardTransferGetSource(pTransfer) == SHCLSOURCE_LOCAL); /* Sanity. */ 1018 1019 int rc = SharedClipboardWinOpen(pWinCtx->hWnd); 1020 if (RT_SUCCESS(rc)) 1021 { 1022 /* The data data in CF_HDROP format, as the files are locally present and don't need to be 1023 * presented as a IDataObject or IStream. */ 1024 HANDLE hClip = hClip = GetClipboardData(CF_HDROP); 1025 if (hClip) 1026 { 1027 HDROP hDrop = (HDROP)GlobalLock(hClip); 1028 if (hDrop) 1029 { 1030 char *papszList = NULL; 1031 uint32_t cbList; 1032 rc = SharedClipboardWinDropFilesToStringList((DROPFILES *)hDrop, &papszList, &cbList); 1033 1034 GlobalUnlock(hClip); 1035 1036 if (RT_SUCCESS(rc)) 1037 { 1038 rc = SharedClipboardTransferRootsSet(pTransfer, 1039 papszList, cbList + 1 /* Include termination */); 1040 RTStrFree(papszList); 1041 } 1042 } 1043 else 1044 LogRel(("Shared Clipboard: Unable to lock clipboard data, last error: %ld\n", GetLastError())); 1045 } 1046 else 1047 LogRel(("Shared Clipboard: Unable to retrieve clipboard data from clipboard (CF_HDROP), last error: %ld\n", 1048 GetLastError())); 1049 1050 SharedClipboardWinClose(); 1051 } 1052 1053 LogFlowFuncLeaveRC(rc); 1054 return rc; 1055 } 1056 1057 /** 1005 1058 * Converts a DROPFILES (HDROP) structure to a string list, separated by \r\n. 1006 1059 * Does not do any locking on the input data.
Note:
See TracChangeset
for help on using the changeset viewer.