Changeset 81025 in vbox
- Timestamp:
- Sep 26, 2019 4:13:25 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 133628
- Location:
- trunk
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/GuestHost/SharedClipboard-transfers.h
r80990 r81025 918 918 /** Saved user pointer. */ 919 919 void *pvUser; 920 /** Size (in bytes) of data at user pointer. */ 921 size_t cbUser; 920 922 } SHCLTRANSFERCALLBACKDATA, *PSHCLTRANSFERCALLBACKDATA; 921 923 … … 948 950 typedef struct _SHCLTRANSFERCALLBACKS 949 951 { 950 /** Saved user pointer. Optional and can be NULL. */ 951 void *pvUser; 952 /** User pointer to data. Optional and can be NULL. */ 953 void *pvUser; 954 /** Size (in bytes) of user data pointing at. Optional and can be 0. */ 955 size_t cbUser; 952 956 /** Function pointer, called after the transfer has been initialized. */ 953 957 SHCLTRANSFERCALLBACKMEMBER(TRANSFERINITIALIZE, pfnTransferInitialize) -
trunk/include/VBox/GuestHost/SharedClipboard-win.h
r80990 r81025 69 69 /** Starts a transfer on the guest. 70 70 * This creates the necessary IDataObject in the matching window thread. */ 71 # define SHCL_WIN_WM_ URI_TRANSFER_STARTWM_USER + 271 # define SHCL_WIN_WM_TRANSFER_START WM_USER + 2 72 72 #endif 73 73 -
trunk/include/VBox/HostServices/VBoxClipboardSvc.h
r80996 r81025 178 178 * New since protocol v1. */ 179 179 #define VBOX_SHCL_GUEST_FN_MSG_GET 8 180 /** Sends a transfer status to the host.181 * New since protocol v1. */182 #define VBOX_SHCL_GUEST_FN_STATUS 9183 180 /** Replies to a function from the host. 184 181 * New since protocol v1. */ … … 512 509 513 510 /** 514 * Requests to read the root list .511 * Requests to read the root list header. 515 512 */ 516 513 typedef struct _VBoxShClRootListReadReqMsg … … 521 518 } VBoxShClRootListReadReqMsg; 522 519 523 #define VBOX_SHCL_CPARMS_ROOT_LIST_HDR_READ 2520 #define VBOX_SHCL_CPARMS_ROOT_LIST_HDR_READ_REQ 2 524 521 525 522 /** … … 535 532 } VBoxShClRootListHdrMsg; 536 533 537 #define VBOX_SHCL_CPARMS_ROOT_LIST_HDR 3 534 #define VBOX_SHCL_CPARMS_ROOT_LIST_HDR_READ 3 535 #define VBOX_SHCL_CPARMS_ROOT_LIST_HDR_WRITE 3 538 536 539 537 /** … … 581 579 } VBoxShClRootListEntryMsg; 582 580 583 #define VBOX_SHCL_CPARMS_ROOT_LIST_ENTRY 6 581 #define VBOX_SHCL_CPARMS_ROOT_LIST_ENTRY_READ 6 582 #define VBOX_SHCL_CPARMS_ROOT_LIST_ENTRY_WRITE 6 584 583 585 584 /** -
trunk/include/VBox/VBoxGuestLib.h
r80990 r81025 623 623 typedef enum _VBGLR3CLIPBOARDEVENTTYPE 624 624 { 625 VBGLR3CLIPBOARDEVENTTYPE_INVALID = 0, 625 /** No event needed / defined. */ 626 VBGLR3CLIPBOARDEVENTTYPE_NONE = 0, 627 /** Host reports available clipboard formats to the guest. */ 626 628 VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS, 629 /** Host wants to read Shared Clipboard data from the guest. */ 627 630 VBGLR3CLIPBOARDEVENTTYPE_READ_DATA, 631 /** Terminates the Shared Clipboard service. */ 628 632 VBGLR3CLIPBOARDEVENTTYPE_QUIT, 629 633 # ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 630 634 /** Reports a transfer status to the guest. */ 631 VBGLR3CLIPBOARDEVENTTYPE_ URI_TRANSFER_STATUS,635 VBGLR3CLIPBOARDEVENTTYPE_TRANSFER_STATUS, 632 636 # endif 633 637 /** Blow the type up to 32-bit. */ -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp
r80993 r81025 60 60 /** Windows-specific context data. */ 61 61 SHCLWINCTX Win; 62 /** Thread handle for window thread. */ 63 RTTHREAD hThread; 64 /** Start indicator flag. */ 65 bool fStarted; 66 /** Shutdown indicator flag. */ 67 bool fShutdown; 62 68 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 63 69 /** Associated transfer data. */ … … 65 71 #endif 66 72 } SHCLCONTEXT, *PSHCLCONTEXT; 67 68 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS69 typedef struct _SHCLREADTHREADCTX70 {71 PSHCLCONTEXT pClipboardCtx;72 PSHCLTRANSFER pTransfer;73 } SHCLREADTHREADCTX, *PSHCLREADTHREADCTX;74 75 typedef struct _SHCLWRITETHREADCTX76 {77 PSHCLCONTEXT pClipboardCtx;78 PSHCLTRANSFER pTransfer;79 } SHCLWRITETHREADCTX, *PSHCLWRITETHREADCTX;80 #endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */81 73 82 74 … … 109 101 static void vboxClipboardTransferCallbackCleanup(PSHCLTRANSFERCALLBACKDATA pData) 110 102 { 103 LogFlowFuncEnter(); 104 111 105 PSHCLTRANSFERCTX pCtx = (PSHCLTRANSFERCTX)pData->pvUser; 112 106 AssertPtr(pCtx); … … 146 140 PSHCLCONTEXT pCtx = (PSHCLCONTEXT)pData->pvUser; 147 141 AssertPtr(pCtx); 148 149 LogFlowFunc(("pCtx=%p\n", pCtx)); 142 Assert(pData->cbUser == sizeof(SHCLCONTEXT)); 150 143 151 144 PSHCLTRANSFER pTransfer = pData->pTransfer; 152 145 AssertPtr(pTransfer); 153 146 147 const SHCLTRANSFERDIR enmDir = SharedClipboardTransferGetDir(pTransfer); 148 149 LogFlowFunc(("pCtx=%p, idTransfer=%RU16, enmDir=%RU32\n", pCtx, SharedClipboardTransferGetID(pTransfer), enmDir)); 150 154 151 int rc; 155 152 156 153 /* The guest wants to write local data to the host? */ 157 if ( SharedClipboardTransferGetDir(pTransfer)== SHCLTRANSFERDIR_WRITE)154 if (enmDir == SHCLTRANSFERDIR_WRITE) 158 155 { 159 156 Assert(SharedClipboardTransferGetSource(pTransfer) == SHCLSOURCE_LOCAL); /* Sanity. */ … … 194 191 } 195 192 /* The guest wants to read data from a remote source. */ 196 else if (SharedClipboardTransferGetDir(pTransfer) == SHCLTRANSFERDIR_READ) 197 { 198 /* The IDataObject must be created in our window thread, so post a message to it, which 199 * then in turn takes care of the creation. */ 200 ::PostMessage(pCtx->Win.hWnd, SHCL_WIN_WM_URI_TRANSFER_START, 201 0 /* wParm */, (LPARAM)pTransfer /* lParm */); 202 203 rc = VINF_SUCCESS; 193 else if (enmDir == SHCLTRANSFERDIR_READ) 194 { 195 Assert(SharedClipboardTransferGetSource(pTransfer) == SHCLSOURCE_REMOTE); /* Sanity. */ 196 197 rc = SharedClipboardWinTransferCreate(&pCtx->Win, pTransfer); 204 198 } 205 199 else 206 200 AssertFailedStmt(rc = VERR_NOT_SUPPORTED); 207 201 208 LogFlowFunc LeaveRC(rc);202 LogFlowFunc(("LEAVE: idTransfer=%RU16, rc=%Rrc\n", SharedClipboardTransferGetID(pTransfer), rc)); 209 203 return rc; 210 204 } … … 251 245 case WM_CLIPBOARDUPDATE: 252 246 { 253 LogFunc(("WM_CLIPBOARDUPDATE \n"));247 LogFunc(("WM_CLIPBOARDUPDATE: pWinCtx=%p\n", pWinCtx)); 254 248 255 249 int rc = RTCritSectEnter(&pWinCtx->CritSect); … … 269 263 * Report available formats to the host. */ 270 264 SHCLFORMATDATA Formats; 271 int rc = SharedClipboardWinGetFormats( &pCtx->Win, &Formats);265 int rc = SharedClipboardWinGetFormats(pWinCtx, &Formats); 272 266 if (RT_SUCCESS(rc)) 273 267 { … … 298 292 case WM_DRAWCLIPBOARD: 299 293 { 300 LogFlowFunc(("WM_DRAWCLIPBOARD \n"));294 LogFlowFunc(("WM_DRAWCLIPBOARD: pWinCtx=%p\n", pWinCtx)); 301 295 302 296 int rc = RTCritSectEnter(&pWinCtx->CritSect); … … 517 511 Assert(pEvent->enmType == VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS); 518 512 519 const SHCLFORMATS fFormats = 513 const SHCLFORMATS fFormats = pEvent->u.ReportedFormats.uFormats; 520 514 521 515 if (fFormats != VBOX_SHCL_FMT_NONE) /* Could arrive with some older GA versions. */ 522 516 { 523 int rc = SharedClipboardWinOpen(hwnd); 524 if (RT_SUCCESS(rc)) 525 { 526 SharedClipboardWinClear(); 527 528 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 529 if (fFormats & VBOX_SHCL_FMT_URI_LIST) 517 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 518 if (fFormats & VBOX_SHCL_FMT_URI_LIST) 519 { 520 LogFunc(("VBOX_SHCL_FMT_URI_LIST\n")); 521 522 /* 523 * Creating and starting the actual transfer will be done in vbglR3ClipboardTransferStart() as soon 524 * as the host announces the start of the transfer via a VBOX_SHCL_HOST_MSG_TRANSFER_STATUS message. 525 * Transfers always are controlled and initiated on the host side! 526 * 527 * So don't announce the transfer to the OS here yet. Don't touch the clipboard in any here; otherwise 528 * this will trigger a WM_DRAWCLIPBOARD or friends, which will result in fun bugs coming up. 529 */ 530 } 531 else 532 { 533 #endif 534 int rc = SharedClipboardWinOpen(hwnd); 535 if (RT_SUCCESS(rc)) 530 536 { 531 LogFunc(("VBOX_SHCL_FMT_URI_LIST\n")); 532 533 /* 534 * Creating and starting the actual transfer will be done in vbglR3ClipboardTransferStart() as soon 535 * as the host announces the start of the transfer via a VBOX_SHCL_HOST_MSG_TRANSFER_STATUS message. 536 * Transfers always are controlled and initiated on the host side! 537 * 538 * So don't announce the transfer to the OS here yet. 539 */ 537 SharedClipboardWinClear(); 538 539 rc = SharedClipboardWinAnnounceFormats(pWinCtx, fFormats); 540 540 } 541 else 542 { 543 #endif 544 rc = SharedClipboardWinAnnounceFormats(pWinCtx, fFormats); 545 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 546 } 547 #endif 541 548 542 SharedClipboardWinClose(); 549 } 543 544 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 545 } 546 #endif 550 547 } 551 548 … … 651 648 } 652 649 653 #if def VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS654 case SHCL_WIN_WM_ URI_TRANSFER_START:655 { 656 LogFunc(("SHCL_WIN_WM_ URI_TRANSFER_CREATE\n"));650 #if 0 651 case SHCL_WIN_WM_TRANSFER_START: 652 { 653 LogFunc(("SHCL_WIN_WM_TRANSFER_START\n")); 657 654 658 655 PSHCLTRANSFER pTransfer = (PSHCLTRANSFER)lParam; … … 661 658 Assert(SharedClipboardTransferGetSource(pTransfer) == SHCLSOURCE_REMOTE); /* Sanity. */ 662 659 663 int rc2 = SharedClipboardWinTransferCreate( &pCtx->Win, pTransfer);660 int rc2 = SharedClipboardWinTransferCreate(pWinCtx, pTransfer); 664 661 AssertRC(rc2); 665 662 break; … … 707 704 708 705 /* Register the Window Class. */ 709 WNDCLASSEX wc = { 0 }; 710 wc.cbSize = sizeof(WNDCLASSEX); 706 WNDCLASSEX wc; 707 RT_ZERO(wc); 708 709 wc.cbSize = sizeof(WNDCLASSEX); 711 710 712 711 if (!GetClassInfoEx(hInstance, s_szClipWndClassName, &wc)) … … 741 740 SWP_NOACTIVATE | SWP_HIDEWINDOW | SWP_NOCOPYBITS | SWP_NOREDRAW | SWP_NOSIZE); 742 741 743 SharedClipboardWinChainAdd(pWinCtx); 744 if (!SharedClipboardWinIsNewAPI(&pWinCtx->newAPI)) 745 pWinCtx->oldAPI.timerRefresh = SetTimer(pWinCtx->hWnd, 0, 10 * 1000 /* 10s */, NULL); 742 rc = SharedClipboardWinChainAdd(pWinCtx); 743 if (RT_SUCCESS(rc)) 744 { 745 if (!SharedClipboardWinIsNewAPI(&pWinCtx->newAPI)) 746 pWinCtx->oldAPI.timerRefresh = SetTimer(pWinCtx->hWnd, 0, 10 * 1000 /* 10s */, NULL); 747 } 746 748 } 747 749 } … … 751 753 } 752 754 755 static int vboxClipboardWindowThread(RTTHREAD hThread, void *pvUser) 756 { 757 PSHCLCONTEXT pCtx = (PSHCLCONTEXT)pvUser; 758 AssertPtr(pCtx); 759 760 HRESULT hr; 761 762 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 763 hr = OleInitialize(NULL); 764 if (FAILED(hr)) 765 { 766 LogRel(("Shared Clipboard: Initializing OLE in window thread failed (%Rhrc) -- file transfers unavailable\n", hr)); 767 /* Not critical, the rest of the clipboard might work. */ 768 } 769 else 770 LogRel(("Shared Clipboard: Initialized OLE in window thread\n")); 771 #endif 772 773 int rc = vboxClipboardCreateWindow(pCtx); 774 if (RT_FAILURE(rc)) 775 { 776 LogRel(("Shared Clipboard: Unable to create window, rc=%Rrc\n", rc)); 777 return rc; 778 } 779 780 pCtx->fStarted = true; /* Set started indicator. */ 781 782 int rc2 = RTThreadUserSignal(hThread); 783 bool fSignalled = RT_SUCCESS(rc2); 784 785 LogRel2(("Shared Clipboard: Window thread running\n")); 786 787 if (RT_SUCCESS(rc)) 788 { 789 for (;;) 790 { 791 MSG uMsg; 792 BOOL fRet; 793 while ((fRet = GetMessage(&uMsg, 0, 0, 0)) > 0) 794 { 795 TranslateMessage(&uMsg); 796 DispatchMessage(&uMsg); 797 } 798 Assert(fRet >= 0); 799 800 if (ASMAtomicReadBool(&pCtx->fShutdown)) 801 break; 802 803 /** @todo Immediately drop on failure? */ 804 } 805 } 806 807 if (!fSignalled) 808 { 809 rc2 = RTThreadUserSignal(hThread); 810 AssertRC(rc2); 811 } 812 813 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 814 OleSetClipboard(NULL); /* Make sure to flush the clipboard on destruction. */ 815 OleUninitialize(); 816 #endif 817 818 LogRel(("Shared Clipboard: Window thread ended\n")); 819 820 LogFlowFuncLeaveRC(rc); 821 return rc; 822 } 823 753 824 static void vboxClipboardDestroy(PSHCLCONTEXT pCtx) 754 825 { 755 826 AssertPtrReturnVoid(pCtx); 827 828 LogFlowFunc(("pCtx=%p\n", pCtx)); 829 830 LogRel2(("Shared Clipboard: Destroying ...\n")); 831 832 pCtx->fShutdown = true; 756 833 757 834 const PSHCLWINCTX pWinCtx = &pCtx->Win; … … 763 840 } 764 841 842 if (pCtx->hThread != NIL_RTTHREAD) 843 { 844 int rcThread = VERR_WRONG_ORDER; 845 int rc = RTThreadWait(pCtx->hThread, 60 * 1000 /* Timeout in ms */, &rcThread); 846 LogFlowFunc(("Waiting for thread resulted in %Rrc (thread exited with %Rrc)\n", 847 rc, rcThread)); 848 RT_NOREF(rc); 849 } 850 765 851 UnregisterClass(s_szClipWndClassName, pCtx->pEnv->hInstance); 766 852 767 853 SharedClipboardWinCtxDestroy(&pCtx->Win); 854 855 LogRel2(("Shared Clipboard: Destroyed\n")); 768 856 } 769 857 … … 797 885 } 798 886 799 pCtx->pEnv = pEnv; 887 pCtx->pEnv = pEnv; 888 pCtx->hThread = NIL_RTTHREAD; 889 pCtx->fStarted = false; 890 pCtx->fShutdown = false; 800 891 801 892 int rc = VINF_SUCCESS; 802 893 803 894 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 804 HRESULT hr = OleInitialize(NULL); 805 if (FAILED(hr)) 806 { 807 LogRel(("Shared Clipboard: Initializing OLE failed (%Rhrc) -- file transfers unavailable\n", hr)); 808 /* Not critical, the rest of the clipboard might work. */ 809 } 810 else 811 { 812 LogRel(("Shared Clipboard: Initialized OLE\n")); 813 814 /* Install callbacks. */ 815 RT_ZERO(pCtx->CmdCtx.Transfers.Callbacks); 816 817 pCtx->CmdCtx.Transfers.Callbacks.pvUser = pCtx; /* Assign context as user-provided callback data. */ 818 819 pCtx->CmdCtx.Transfers.Callbacks.pfnTransferInitialize = vboxClipboardOnTransferInitCallback; 820 pCtx->CmdCtx.Transfers.Callbacks.pfnTransferStart = vboxClipboardOnTransferStartCallback; 821 pCtx->CmdCtx.Transfers.Callbacks.pfnTransferComplete = vboxClipboardOnTransferCompleteCallback; 822 pCtx->CmdCtx.Transfers.Callbacks.pfnTransferError = vboxClipboardOnTransferErrorCallback; 823 } 895 /* Install callbacks. */ 896 RT_ZERO(pCtx->CmdCtx.Transfers.Callbacks); 897 898 pCtx->CmdCtx.Transfers.Callbacks.pvUser = pCtx; /* Assign context as user-provided callback data. */ 899 pCtx->CmdCtx.Transfers.Callbacks.cbUser = sizeof(SHCLCONTEXT); 900 901 pCtx->CmdCtx.Transfers.Callbacks.pfnTransferInitialize = vboxClipboardOnTransferInitCallback; 902 pCtx->CmdCtx.Transfers.Callbacks.pfnTransferStart = vboxClipboardOnTransferStartCallback; 903 pCtx->CmdCtx.Transfers.Callbacks.pfnTransferComplete = vboxClipboardOnTransferCompleteCallback; 904 pCtx->CmdCtx.Transfers.Callbacks.pfnTransferError = vboxClipboardOnTransferErrorCallback; 824 905 #endif 825 906 826 907 if (RT_SUCCESS(rc)) 827 908 { 828 /* Check if new Clipboard API is available. */829 909 rc = SharedClipboardWinCtxInit(&pCtx->Win); 830 910 if (RT_SUCCESS(rc)) … … 832 912 if (RT_SUCCESS(rc)) 833 913 { 834 rc = vboxClipboardCreateWindow(pCtx); 914 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 915 rc = SharedClipboardTransferCtxInit(&pCtx->TransferCtx); 916 #endif 835 917 if (RT_SUCCESS(rc)) 836 918 { 837 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 838 rc = SharedClipboardTransferCtxInit(&pCtx->TransferCtx); 919 /* Message pump thread for our proxy window. */ 920 rc = RTThreadCreate(&pCtx->hThread, vboxClipboardWindowThread, pCtx /* pvUser */, 921 0, RTTHREADTYPE_MSG_PUMP, RTTHREADFLAGS_WAITABLE, 922 "shclwnd"); 839 923 if (RT_SUCCESS(rc)) 840 #endif 841 *ppInstance = pCtx; 924 { 925 int rc2 = RTThreadUserWait(pCtx->hThread, 30 * 1000 /* Timeout in ms */); 926 AssertRC(rc2); 927 928 if (!pCtx->fStarted) /* Did the thread fail to start? */ 929 rc = VERR_NOT_SUPPORTED; /* Report back Shared Clipboard as not being supported. */ 930 } 931 } 932 933 if (RT_SUCCESS(rc)) 934 { 935 *ppInstance = pCtx; 842 936 } 843 937 else 844 {845 938 VbglR3ClipboardDisconnectEx(&pCtx->CmdCtx); 846 } 847 } 848 } 939 } 940 } 941 942 if (RT_FAILURE(rc)) 943 LogRel(("Shared Clipboard: Unable to initialize, rc=%Rrc\n", rc)); 849 944 850 945 LogFlowFuncLeaveRC(rc); … … 856 951 AssertPtr(pInstance); 857 952 LogFlowFunc(("pInstance=%p\n", pInstance)); 858 859 HRESULT hr = OleInitialize(NULL);860 if (FAILED(hr))861 {862 LogRel(("Shared Clipboard: Initializing OLE in worker thread failed (%Rhrc) -- file transfers unavailable\n", hr));863 /* Not critical, the rest of the clipboard might work. */864 }865 953 866 954 /* … … 875 963 const PSHCLWINCTX pWinCtx = &pCtx->Win; 876 964 965 LogRel2(("Shared Clipboard: Worker loop running, using protocol v%RU32\n", pCtx->CmdCtx.uProtocolVer)); 966 967 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 968 HRESULT hr = OleInitialize(NULL); 969 if (FAILED(hr)) 970 { 971 LogRel(("Shared Clipboard: Initializing OLE in worker thread failed (%Rhrc) -- file transfers unavailable\n", hr)); 972 /* Not critical, the rest of the clipboard might work. */ 973 } 974 else 975 LogRel(("Shared Clipboard: Initialized OLE in worker thraed\n")); 976 #endif 977 877 978 int rc; 878 979 879 LogFlowFunc((" Using protocol%RU32\n", pCtx->CmdCtx.uProtocolVer));980 LogFlowFunc(("uProtocolVer=%RU32\n", pCtx->CmdCtx.uProtocolVer)); 880 981 881 982 uint32_t uMsg; … … 946 1047 if (RT_FAILURE(rc)) 947 1048 { 1049 LogFlowFunc(("Getting next event failed with %Rrc\n", rc)); 1050 948 1051 VbglR3ClipboardEventFree(pEvent); 949 1052 pEvent = NULL; … … 987 1090 case VBGLR3CLIPBOARDEVENTTYPE_QUIT: 988 1091 { 989 /* The host is terminating. */ 990 LogRel(("Shared Clipboard: Terminating ...\n")); 1092 LogRel2(("Shared Clipboard: Host requested termination\n")); 991 1093 ASMAtomicXchgBool(pfShutdown, true); 992 1094 break; … … 994 1096 995 1097 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 996 case VBGLR3CLIPBOARDEVENTTYPE_ URI_TRANSFER_STATUS:1098 case VBGLR3CLIPBOARDEVENTTYPE_TRANSFER_STATUS: 997 1099 { 998 1100 /* Nothing to do here. */ 1101 rc = VINF_SUCCESS; 999 1102 break; 1000 1103 } 1001 1104 #endif 1002 case VBGLR3CLIPBOARDEVENTTYPE_INVALID: 1105 case VBGLR3CLIPBOARDEVENTTYPE_NONE: 1106 { 1107 /* Nothing to do here. */ 1108 rc = VINF_SUCCESS; 1109 break; 1110 } 1111 1003 1112 default: 1004 1113 { 1005 /* Wait a bit before retrying. */ 1006 RTThreadSleep(1000); 1007 1008 rc = VERR_NOT_SUPPORTED; 1009 break; 1114 AssertMsgFailedBreakStmt(("Event type %RU32 not implemented\n", pEvent->enmType), rc = VERR_NOT_SUPPORTED); 1010 1115 } 1011 1116 } … … 1022 1127 } 1023 1128 1129 LogRel(("Shared Clipboard: Worker loop ended\n")); 1130 1024 1131 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 1025 1132 OleSetClipboard(NULL); /* Make sure to flush the clipboard on destruction. */ … … 1060 1167 1061 1168 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 1062 OleSetClipboard(NULL); /* Make sure to flush the clipboard on destruction. */1063 OleUninitialize();1064 1065 1169 SharedClipboardTransferCtxDestroy(&pCtx->TransferCtx); 1066 1170 #endif -
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibClipboard.cpp
r80992 r81025 415 415 416 416 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 417 VBOX_SHCL_GUEST_FN_ROOT_LIST_ENTRY_READ, VBOX_SHCL_CPARMS_ROOT_LIST_ENTRY );417 VBOX_SHCL_GUEST_FN_ROOT_LIST_ENTRY_READ, VBOX_SHCL_CPARMS_ROOT_LIST_ENTRY_READ); 418 418 419 419 Msg.Parms.uContext.SetUInt32(pCtx->uContextID); … … 567 567 568 568 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 569 VBOX_SHCL_GUEST_FN_MSG_GET, VBOX_SHCL_CPARMS_ROOT_LIST_HDR_READ );569 VBOX_SHCL_GUEST_FN_MSG_GET, VBOX_SHCL_CPARMS_ROOT_LIST_HDR_READ_REQ); 570 570 571 571 Msg.ReqParms.uContext.SetUInt32(VBOX_SHCL_HOST_MSG_TRANSFER_ROOT_LIST_HDR_READ); … … 593 593 594 594 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 595 VBOX_SHCL_GUEST_FN_ROOT_LIST_HDR_WRITE, VBOX_SHCL_CPARMS_ROOT_LIST_HDR );595 VBOX_SHCL_GUEST_FN_ROOT_LIST_HDR_WRITE, VBOX_SHCL_CPARMS_ROOT_LIST_HDR_WRITE); 596 596 597 597 Msg.ReqParms.uContext.SetUInt32(pCtx->uContextID); … … 645 645 646 646 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 647 VBOX_SHCL_GUEST_FN_ROOT_LIST_ENTRY_WRITE, VBOX_SHCL_CPARMS_ROOT_LIST_ENTRY );647 VBOX_SHCL_GUEST_FN_ROOT_LIST_ENTRY_WRITE, VBOX_SHCL_CPARMS_ROOT_LIST_ENTRY_WRITE); 648 648 649 649 Msg.Parms.uContext.SetUInt32(pCtx->uContextID); … … 1427 1427 creationCtx.Interface.pfnObjClose = vbglR3ClipboardTransferIfaceObjClose; 1428 1428 creationCtx.Interface.pfnObjRead = vbglR3ClipboardTransferIfaceObjRead; 1429 1430 creationCtx.pvUser = pCmdCtx; 1429 1431 1430 1432 rc = SharedClipboardTransferSetInterface(pTransfer, &creationCtx); … … 1586 1588 pEvent->u.TransferStatus.uID = VBOX_SHCL_CONTEXTID_GET_TRANSFER(pCmdCtx->uContextID); 1587 1589 1588 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_ URI_TRANSFER_STATUS;1590 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_TRANSFER_STATUS; 1589 1591 1590 1592 LogRel2(("Shared Clipboard: Received status %s (rc=%Rrc) for transfer ID=%RU16\n", … … 1878 1880 } 1879 1881 1882 case VBOX_SHCL_HOST_MSG_QUIT: 1883 { 1884 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_QUIT; 1885 rc = VINF_SUCCESS; 1886 break; 1887 } 1888 1880 1889 default: 1881 1890 { -
trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp
r80905 r81025 367 367 if (ASMAtomicReadBool(&pTransfer->Thread.fStop)) 368 368 { 369 LogRel2(("Shared Clipboard: Stopping transfer calculati ng...\n"));369 LogRel2(("Shared Clipboard: Stopping transfer calculation ...\n")); 370 370 break; 371 371 } … … 378 378 pRootList = NULL; 379 379 380 if (RT_SUCCESS(rc)) 380 if ( RT_SUCCESS(rc) 381 && !ASMAtomicReadBool(&pTransfer->Thread.fStop)) 381 382 { 382 383 LogRel2(("Shared Clipboard: Transfer calculation complete (%zu root entries)\n", pThis->m_lstEntries.size())); … … 402 403 LogRel(("Shared Clipboard: No transfer root entries found -- should not happen, please file a bug report\n")); 403 404 } 404 else 405 else if (RT_FAILURE(rc)) 405 406 LogRel(("Shared Clipboard: Transfer failed with %Rrc\n", rc)); 406 407 } -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-common.cpp
r80990 r81025 890 890 RT_CASE_RET_STR(VBOX_SHCL_GUEST_FN_MSG_PEEK_WAIT); 891 891 RT_CASE_RET_STR(VBOX_SHCL_GUEST_FN_MSG_GET); 892 RT_CASE_RET_STR(VBOX_SHCL_GUEST_FN_STATUS);893 892 RT_CASE_RET_STR(VBOX_SHCL_GUEST_FN_REPLY); 894 893 RT_CASE_RET_STR(VBOX_SHCL_GUEST_FN_ROOT_LIST_HDR_READ); -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp
r80990 r81025 1178 1178 if (pTransfer->Callbacks.pfnTransferInitialize) 1179 1179 { 1180 SHCLTRANSFERCALLBACKDATA Data = { pTransfer, pTransfer->Callbacks.pvUser };1180 SHCLTRANSFERCALLBACKDATA Data = { pTransfer, pTransfer->Callbacks.pvUser, pTransfer->Callbacks.cbUser }; 1181 1181 rc = pTransfer->Callbacks.pfnTransferInitialize(&Data); 1182 1182 } … … 2285 2285 if (pTransfer->Callbacks.pfnTransferStart) 2286 2286 { 2287 SHCLTRANSFERCALLBACKDATA Data = { pTransfer, pTransfer->Callbacks.pvUser };2287 SHCLTRANSFERCALLBACKDATA Data = { pTransfer, pTransfer->Callbacks.pvUser, pTransfer->Callbacks.cbUser }; 2288 2288 rc = pTransfer->Callbacks.pfnTransferStart(&Data); 2289 2289 } … … 2326 2326 2327 2327 pTransfer->Callbacks.pvUser = pCallbacks->pvUser; 2328 pTransfer->Callbacks.cbUser = pCallbacks->cbUser; 2328 2329 } 2329 2330 … … 2638 2639 AssertPtrReturnVoid(pTransferCtx); 2639 2640 2640 LogFlowFunc(("pTransferCtx=%p, cTransfers=%RU 32, cRunning=%RU32\n",2641 LogFlowFunc(("pTransferCtx=%p, cTransfers=%RU16 cRunning=%RU16\n", 2641 2642 pTransferCtx, pTransferCtx->cTransfers, pTransferCtx->cRunning)); 2642 2643 2643 /* Remove all transfers which are not in a running state (e.g. only announced). */ 2644 PSHCLTRANSFER pTransfer, pTransferNext; 2645 RTListForEachSafe(&pTransferCtx->List, pTransfer, pTransferNext, SHCLTRANSFER, Node) 2646 { 2647 if (SharedClipboardTransferGetStatus(pTransfer) != SHCLTRANSFERSTATUS_STARTED) 2648 { 2649 SharedClipboardTransferDestroy(pTransfer); 2650 RTListNodeRemove(&pTransfer->Node); 2651 2652 RTMemFree(pTransfer); 2653 pTransfer = NULL; 2654 2655 Assert(pTransferCtx->cTransfers); 2656 pTransferCtx->cTransfers--; 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 } 2657 2661 } 2658 2662 } -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-win.cpp
r80966 r81025 181 181 if (!pWinCtx) 182 182 return; 183 184 LogFlowFuncEnter(); 183 185 184 186 if (RTCritSectIsInitialized(&pWinCtx->CritSect)) … … 894 896 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 895 897 896 LogFlowFuncEnter(); 897 898 int rc; 898 LogFlowFunc(("pWinCtx=%p\n", pWinCtx)); 899 899 900 900 AssertReturn(pTransfer->pvUser == NULL, VERR_WRONG_ORDER); 901 901 902 SharedClipboardWinTransferCtx *pWinURITransferCtx = new SharedClipboardWinTransferCtx(); 903 if (pWinURITransferCtx) 904 { 905 pTransfer->pvUser = pWinURITransferCtx; 906 pTransfer->cbUser = sizeof(SharedClipboardWinTransferCtx); 907 908 pWinURITransferCtx->pDataObj = new SharedClipboardWinDataObject(pTransfer); 909 if (pWinURITransferCtx->pDataObj) 910 { 911 rc = pWinURITransferCtx->pDataObj->Init(); 912 if (RT_SUCCESS(rc)) 902 /* Make sure to enter the critical section before setting the clipboard data, as otherwise WM_CLIPBOARDUPDATE 903 * might get called *before* we had the opportunity to set pWinCtx->hWndClipboardOwnerUs below. */ 904 int rc = RTCritSectEnter(&pWinCtx->CritSect); 905 if (RT_SUCCESS(rc)) 906 { 907 SharedClipboardWinTransferCtx *pWinURITransferCtx = new SharedClipboardWinTransferCtx(); 908 if (pWinURITransferCtx) 909 { 910 pTransfer->pvUser = pWinURITransferCtx; 911 pTransfer->cbUser = sizeof(SharedClipboardWinTransferCtx); 912 913 pWinURITransferCtx->pDataObj = new SharedClipboardWinDataObject(pTransfer); 914 if (pWinURITransferCtx->pDataObj) 913 915 { 914 SharedClipboardWinClose(); 915 /* Note: Clipboard must be closed first before calling OleSetClipboard(). */ 916 917 /** @todo There is a potential race between SharedClipboardWinClose() and OleSetClipboard(), 918 * where another application could own the clipboard (open), and thus the call to 919 * OleSetClipboard() will fail. Needs (better) fixing. */ 920 HRESULT hr = S_OK; 921 922 for (unsigned uTries = 0; uTries < 3; uTries++) 916 rc = pWinURITransferCtx->pDataObj->Init(); 917 if (RT_SUCCESS(rc)) 923 918 { 924 /* Make sure to enter the critical section before setting the clipboard data, as otherwise WM_CLIPBOARDUPDATE 925 * might get called *before* we had the opportunity to set pWinCtx->hWndClipboardOwnerUs below. */ 926 rc = RTCritSectEnter(&pWinCtx->CritSect); 927 if (RT_SUCCESS(rc)) 919 SharedClipboardWinClose(); 920 /* Note: Clipboard must be closed first before calling OleSetClipboard(). */ 921 922 /** @todo There is a potential race between SharedClipboardWinClose() and OleSetClipboard(), 923 * where another application could own the clipboard (open), and thus the call to 924 * OleSetClipboard() will fail. Needs (better) fixing. */ 925 HRESULT hr = S_OK; 926 927 for (unsigned uTries = 0; uTries < 3; uTries++) 928 928 { 929 929 hr = OleSetClipboard(pWinURITransferCtx->pDataObj); … … 939 939 pWinCtx->hWndClipboardOwnerUs = GetClipboardOwner(); 940 940 941 rc = RTCritSectLeave(&pWinCtx->CritSect); 942 AssertRC(rc); 941 LogFlowFunc(("hWndClipboardOwnerUs=%p\n", pWinCtx->hWndClipboardOwnerUs)); 943 942 break; 944 943 } 944 945 LogFlowFunc(("Failed with %Rhrc (try %u/3)\n", hr, uTries + 1)); 946 RTThreadSleep(500); /* Wait a bit. */ 945 947 } 946 948 947 rc = RTCritSectLeave(&pWinCtx->CritSect); 948 AssertRCBreak(rc); 949 950 LogFlowFunc(("Failed with %Rhrc (try %u/3)\n", hr, uTries + 1)); 951 RTThreadSleep(500); /* Wait a bit. */ 952 } 953 954 if (FAILED(hr)) 955 { 956 rc = VERR_ACCESS_DENIED; /** @todo Fudge; fix this. */ 957 LogRel(("Shared Clipboard: Failed with %Rhrc when setting data object to clipboard\n", hr)); 949 if (FAILED(hr)) 950 { 951 rc = VERR_ACCESS_DENIED; /** @todo Fudge; fix this. */ 952 LogRel(("Shared Clipboard: Failed with %Rhrc when setting data object to clipboard\n", hr)); 953 } 958 954 } 959 955 } 956 else 957 rc = VERR_NO_MEMORY; 960 958 } 961 959 else 962 960 rc = VERR_NO_MEMORY; 963 } 964 else 965 rc = VERR_NO_MEMORY; 961 962 int rc2 = RTCritSectLeave(&pWinCtx->CritSect); 963 AssertRC(rc2); 964 } 966 965 967 966 LogFlowFuncLeaveRC(rc); -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp
r80995 r81025 84 84 85 85 PSHCLCLIENTMSG pMsgHdr = shclSvcMsgAlloc(VBOX_SHCL_HOST_MSG_TRANSFER_ROOT_LIST_HDR_READ, 86 VBOX_SHCL_CPARMS_ROOT_LIST_HDR_READ );86 VBOX_SHCL_CPARMS_ROOT_LIST_HDR_READ_REQ); 87 87 if (pMsgHdr) 88 88 { … … 652 652 653 653 /** 654 * Returns whether a HGCM message is allowed in a certain service mode or not. 655 * 656 * @returns \c true if message is allowed, \c false if not. 657 * @param uMode Service mode to check allowance for. 658 * @param uMsg HGCM message to check allowance for. 659 */ 660 bool shclSvcTransferMsgIsAllowed(uint32_t uMode, uint32_t uMsg) 661 { 662 const bool fHostToGuest = uMode == VBOX_SHCL_MODE_HOST_TO_GUEST 663 || uMode == VBOX_SHCL_MODE_BIDIRECTIONAL; 664 665 const bool fGuestToHost = uMode == VBOX_SHCL_MODE_GUEST_TO_HOST 666 || uMode == VBOX_SHCL_MODE_BIDIRECTIONAL; 667 668 bool fAllowed = false; /* If in doubt, don't allow. */ 669 670 switch (uMsg) 671 { 672 case VBOX_SHCL_GUEST_FN_ROOT_LIST_HDR_WRITE: 673 RT_FALL_THROUGH(); 674 case VBOX_SHCL_GUEST_FN_ROOT_LIST_ENTRY_WRITE: 675 RT_FALL_THROUGH(); 676 case VBOX_SHCL_GUEST_FN_LIST_HDR_WRITE: 677 RT_FALL_THROUGH(); 678 case VBOX_SHCL_GUEST_FN_LIST_ENTRY_WRITE: 679 RT_FALL_THROUGH(); 680 case VBOX_SHCL_GUEST_FN_OBJ_WRITE: 681 fAllowed = fGuestToHost; 682 break; 683 684 case VBOX_SHCL_GUEST_FN_ROOT_LIST_HDR_READ: 685 RT_FALL_THROUGH(); 686 case VBOX_SHCL_GUEST_FN_ROOT_LIST_ENTRY_READ: 687 RT_FALL_THROUGH(); 688 case VBOX_SHCL_GUEST_FN_LIST_HDR_READ: 689 RT_FALL_THROUGH(); 690 case VBOX_SHCL_GUEST_FN_LIST_ENTRY_READ: 691 RT_FALL_THROUGH(); 692 case VBOX_SHCL_GUEST_FN_OBJ_READ: 693 fAllowed = fHostToGuest; 694 break; 695 696 case VBOX_SHCL_GUEST_FN_CONNECT: 697 RT_FALL_THROUGH(); 698 case VBOX_SHCL_GUEST_FN_MSG_PEEK_WAIT: 699 RT_FALL_THROUGH(); 700 case VBOX_SHCL_GUEST_FN_MSG_PEEK_NOWAIT: 701 RT_FALL_THROUGH(); 702 case VBOX_SHCL_GUEST_FN_MSG_GET: 703 RT_FALL_THROUGH(); 704 case VBOX_SHCL_GUEST_FN_REPLY: 705 RT_FALL_THROUGH(); 706 case VBOX_SHCL_GUEST_FN_CANCEL: 707 RT_FALL_THROUGH(); 708 case VBOX_SHCL_GUEST_FN_ERROR: 709 RT_FALL_THROUGH(); 710 case VBOX_SHCL_GUEST_FN_LIST_OPEN: 711 RT_FALL_THROUGH(); 712 case VBOX_SHCL_GUEST_FN_LIST_CLOSE: 713 RT_FALL_THROUGH(); 714 case VBOX_SHCL_GUEST_FN_OBJ_OPEN: 715 RT_FALL_THROUGH(); 716 case VBOX_SHCL_GUEST_FN_OBJ_CLOSE: 717 fAllowed = fHostToGuest || fGuestToHost; 718 break; 719 720 default: 721 break; 722 } 723 724 LogFlowFunc(("uMsg=%RU32 (%s), uMode=%RU32 -> fAllowed=%RTbool\n", uMsg, VBoxShClGuestMsgToStr(uMsg), uMode, fAllowed)); 725 return fAllowed; 726 } 727 728 /** 654 729 * Gets a transfer message reply from HGCM service parameters. 655 730 * … … 740 815 int rc; 741 816 742 if (cParms == VBOX_SHCL_CPARMS_ROOT_LIST_HDR )817 if (cParms == VBOX_SHCL_CPARMS_ROOT_LIST_HDR_WRITE) 743 818 { 744 819 rc = HGCMSvcGetU32(&paParms[1], &pRootLstHdr->fRoots); … … 766 841 int rc; 767 842 768 if (cParms == VBOX_SHCL_CPARMS_ROOT_LIST_ENTRY )843 if (cParms == VBOX_SHCL_CPARMS_ROOT_LIST_ENTRY_WRITE) 769 844 { 770 845 rc = HGCMSvcGetU32(&paParms[1], &pListEntry->fInfo); … … 1220 1295 pClient->State.uClientID, u32Function, VBoxShClGuestMsgToStr(u32Function), cParms, g_ExtState.pfnExtension)); 1221 1296 1222 #if 01223 1297 /* Check if we've the right mode set. */ 1224 1298 if (!shclSvcTransferMsgIsAllowed(shclSvcGetMode(), u32Function)) … … 1227 1301 return VERR_ACCESS_DENIED; 1228 1302 } 1229 #endif1230 1303 1231 1304 /* A (valid) service extension is needed because VBoxSVC needs to keep track of the … … 1250 1323 switch (u32Function) 1251 1324 { 1252 case VBOX_SHCL_GUEST_FN_STATUS:1253 break;1254 1325 default: 1255 1326 { … … 1287 1358 switch (u32Function) 1288 1359 { 1289 #if 0 1290 case VBOX_SHCL_GUEST_FN_STATUS: 1291 { 1292 if (cParms != VBOX_SHCL_CPARMS_STATUS) 1360 case VBOX_SHCL_GUEST_FN_REPLY: 1361 { 1362 rc = shclSvcTransferHandleReply(pClient, pTransfer, cParms, paParms); 1363 break; 1364 } 1365 1366 case VBOX_SHCL_GUEST_FN_ROOT_LIST_HDR_READ: 1367 { 1368 if (cParms != VBOX_SHCL_CPARMS_ROOT_LIST_HDR_READ) 1293 1369 break; 1294 1370 1295 SHCLTRANSFERSTATUS uStatus = SHCLTRANSFERSTATUS_NONE; 1296 rc = HGCMSvcGetU32(&paParms[1], &uStatus); 1297 if (RT_FAILURE(rc)) 1298 break; 1299 1300 LogFlowFunc(("uStatus: %RU32\n", uStatus)); 1301 1302 SharedClipboardTransferCtxTransfersCleanup(&pClient->URI); 1303 1304 if (SharedClipboardTransferCtxTransfersMaximumReached(&pClient->URI)) 1305 { 1306 rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED; 1307 break; 1308 } 1309 1310 if (uStatus == SHCLTRANSFERSTATUS_RUNNING) 1311 { 1312 const SHCLTRANSFERDIR enmDir = SHCLTRANSFERDIR_READ; 1313 1314 PSHCLTRANSFER pTransfer; 1315 rc = SharedClipboardTransferCreate(enmDir, 1316 SHCLSOURCE_REMOTE, &pTransfer); 1317 if (RT_SUCCESS(rc)) 1318 { 1319 rc = shclSvcTransferAreaRegister(&pClient->State, pTransfer); 1320 if (RT_SUCCESS(rc)) 1321 { 1322 SHCLPROVIDERCREATIONCTX creationCtx; 1323 RT_ZERO(creationCtx); 1324 1325 creationCtx.enmSource = pClient->State.enmSource; 1326 1327 creationCtx.Interface.pfnTransferOpen = shclSvcTransferOpen; 1328 creationCtx.Interface.pfnTransferClose = shclSvcTransferClose; 1329 creationCtx.Interface.pfnListOpen = shclSvcTransferListOpen; 1330 creationCtx.Interface.pfnListClose = shclSvcTransferListClose; 1331 creationCtx.Interface.pfnObjOpen = shclSvcTransferObjOpen; 1332 creationCtx.Interface.pfnObjClose = shclSvcTransferObjClose; 1333 1334 if (enmDir == SHCLTRANSFERDIR_READ) 1335 { 1336 creationCtx.Interface.pfnRootsGet = shclSvcTransferGetRoots; 1337 creationCtx.Interface.pfnListHdrRead = shclSvcTransferListHdrRead; 1338 creationCtx.Interface.pfnListEntryRead = shclSvcTransferListEntryRead; 1339 creationCtx.Interface.pfnObjRead = shclSvcTransferObjRead; 1340 } 1341 else 1342 { 1343 AssertFailed(); 1344 } 1345 1346 creationCtx.pvUser = pClient; 1347 1348 /* Register needed callbacks so that we can wait for the meta data to arrive here. */ 1349 SHCLTRANSFERCALLBACKS Callbacks; 1350 RT_ZERO(Callbacks); 1351 1352 Callbacks.pvUser = pClient; 1353 1354 Callbacks.pfnTransferPrepare = VBoxSvcClipboardTransferPrepareCallback; 1355 Callbacks.pfnTransferComplete = VBoxSvcClipboardTransferCompleteCallback; 1356 Callbacks.pfnTransferCanceled = VBoxSvcClipboardTransferCanceledCallback; 1357 Callbacks.pfnTransferError = VBoxSvcClipboardTransferErrorCallback; 1358 1359 SharedClipboardTransferSetCallbacks(pTransfer, &Callbacks); 1360 1361 rc = SharedClipboardTransferSetInterface(pTransfer, &creationCtx); 1362 if (RT_SUCCESS(rc)) 1363 rc = SharedClipboardTransferCtxTransferAdd(&pClient->URI, pTransfer); 1364 } 1365 1366 if (RT_SUCCESS(rc)) 1367 { 1368 rc = ShClSvcImplTransferCreate(pClient, pTransfer); 1369 if (RT_SUCCESS(rc)) 1370 rc = ShClSvcImplFormatAnnounce(pClient, VBOX_SHCL_FMT_URI_LIST); 1371 } 1372 1373 if (RT_FAILURE(rc)) 1374 { 1375 ShClSvcImplTransferDestroy(pClient, pTransfer); 1376 SharedClipboardTransferDestroy(pTransfer); 1377 } 1378 } 1379 } 1380 1381 LogFlowFunc(("[Client %RU32] VBOX_SHCL_GUEST_FN_STATUS: %Rrc\n", pClient->uClientID, rc)); 1382 1383 if (RT_FAILURE(rc)) 1384 LogRel(("Shared Clipboard: Initializing transfer failed with %Rrc\n", rc)); 1385 1386 break; 1387 } 1388 #endif 1389 1390 case VBOX_SHCL_GUEST_FN_REPLY: 1391 { 1392 rc = shclSvcTransferHandleReply(pClient, pTransfer, cParms, paParms); 1393 break; 1394 } 1395 1396 case VBOX_SHCL_GUEST_FN_ROOT_LIST_HDR_READ: 1397 { 1371 SHCLROOTLISTHDR rootListHdr; 1372 RT_ZERO(rootListHdr); 1373 1374 rootListHdr.cRoots = SharedClipboardTransferRootsCount(pTransfer); 1375 1376 HGCMSvcSetU32(&paParms[0], 0 /* Context ID */); 1377 HGCMSvcSetU32(&paParms[1], rootListHdr.fRoots); 1378 HGCMSvcSetU32(&paParms[2], rootListHdr.cRoots); 1379 1380 rc = VINF_SUCCESS; 1398 1381 break; 1399 1382 } … … 1424 1407 case VBOX_SHCL_GUEST_FN_ROOT_LIST_ENTRY_READ: 1425 1408 { 1426 #if 0 1427 SHCLROOTLISTENTRY lstEntry; 1428 rc = VBoxSvcClipboardGetRootListEntry(cParms, paParms, &lstEntry); 1429 if (RT_SUCCESS(rc)) 1430 { 1431 void *pvData = SharedClipboardTransferRootListEntryDup(&lstEntry); 1432 uint32_t cbData = sizeof(SHCLROOTLISTENTRY); 1433 1434 PSHCLTRANSFERPAYLOAD pPayload; 1435 rc = SharedClipboardTransferPayloadAlloc(SHCLTRANSFEREVENTTYPE_ROOT_LIST_HDR_READ, 1436 pvData, cbData, &pPayload); 1409 if (cParms != VBOX_SHCL_CPARMS_ROOT_LIST_ENTRY_READ) 1410 break; 1411 1412 /* paParms[1] contains fInfo flags, currently unused. */ 1413 uint32_t uIndex; 1414 rc = HGCMSvcGetU32(&paParms[2], &uIndex); 1415 if (RT_SUCCESS(rc)) 1416 { 1417 SHCLROOTLISTENTRY rootListEntry; 1418 rc = SharedClipboardTransferRootsEntry(pTransfer, uIndex, &rootListEntry); 1437 1419 if (RT_SUCCESS(rc)) 1438 rc = SharedClipboardTransferEventSignal(pTransfer, SHCLTRANSFEREVENTTYPE_ROOT_LIST_HDR_READ, 1439 pPayload); 1440 } 1441 break; 1442 #endif 1420 { 1421 HGCMSvcSetPv (&paParms[3], rootListEntry.pszName, rootListEntry.cbName); 1422 HGCMSvcSetU32(&paParms[4], rootListEntry.cbName); 1423 HGCMSvcSetPv (&paParms[5], rootListEntry.pvInfo, rootListEntry.cbInfo); 1424 } 1425 } 1426 break; 1443 1427 } 1444 1428 -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-utils.cpp
r80995 r81025 32 32 33 33 34 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS35 /**36 * Returns whether a HGCM message is allowed in a certain service mode or not.37 *38 * @returns \c true if message is allowed, \c false if not.39 * @param uMode Service mode to check allowance for.40 * @param uMsg HGCM message to check allowance for.41 */42 bool vboxSvcClipboardURIMsgIsAllowed(uint32_t uMode, uint32_t uMsg)43 {44 const bool fHostToGuest = uMode == VBOX_SHCL_MODE_HOST_TO_GUEST45 || uMode == VBOX_SHCL_MODE_BIDIRECTIONAL;46 47 const bool fGuestToHost = uMode == VBOX_SHCL_MODE_GUEST_TO_HOST48 || uMode == VBOX_SHCL_MODE_BIDIRECTIONAL;49 50 bool fAllowed = false; /* If in doubt, don't allow. */51 52 switch (uMsg)53 {54 case VBOX_SHCL_GUEST_FN_LIST_OPEN:55 RT_FALL_THROUGH();56 case VBOX_SHCL_GUEST_FN_LIST_CLOSE:57 RT_FALL_THROUGH();58 case VBOX_SHCL_GUEST_FN_LIST_HDR_READ:59 RT_FALL_THROUGH();60 case VBOX_SHCL_GUEST_FN_LIST_ENTRY_READ:61 RT_FALL_THROUGH();62 case VBOX_SHCL_GUEST_FN_OBJ_OPEN:63 RT_FALL_THROUGH();64 case VBOX_SHCL_GUEST_FN_OBJ_CLOSE:65 RT_FALL_THROUGH();66 case VBOX_SHCL_GUEST_FN_OBJ_READ:67 fAllowed = fHostToGuest;68 break;69 70 case VBOX_SHCL_GUEST_FN_MSG_PEEK_WAIT:71 RT_FALL_THROUGH();72 case VBOX_SHCL_GUEST_FN_MSG_PEEK_NOWAIT:73 RT_FALL_THROUGH();74 case VBOX_SHCL_GUEST_FN_MSG_GET:75 RT_FALL_THROUGH();76 case VBOX_SHCL_GUEST_FN_STATUS:77 RT_FALL_THROUGH();78 case VBOX_SHCL_GUEST_FN_CANCEL:79 RT_FALL_THROUGH();80 case VBOX_SHCL_GUEST_FN_ERROR:81 fAllowed = fHostToGuest || fGuestToHost;82 break;83 84 default:85 break;86 }87 88 fAllowed = true; /** @todo FIX !!!! */89 90 LogFlowFunc(("uMsg=%RU32, uMode=%RU32 -> fAllowed=%RTbool\n", uMsg, uMode, fAllowed));91 return fAllowed;92 }93 94 #if 095 int vboxSvcClipboardURIReportMsg(PSHCLCLIENT pClient, uint32_t uMsg, uint32_t uParm)96 {97 AssertPtrReturn(pClient, VERR_INVALID_POINTER);98 99 int rc = VINF_SUCCESS;100 101 switch (uMsg)102 {103 case VBOX_SHCL_HOST_MSG_TRANSFER_TRANSFER_START:104 {105 Assert(pClient->State.URI.fTransferStart == false);106 107 LogFlowFunc(("VBOX_SHCL_HOST_MSG_TRANSFER_TRANSFER_START\n"));108 109 if ( shclSvcGetMode() != VBOX_SHCL_MODE_HOST_TO_GUEST110 && shclSvcGetMode() != VBOX_SHCL_MODE_BIDIRECTIONAL)111 {112 LogFlowFunc(("Wrong clipboard mode, skipping\n"));113 break;114 }115 116 pClient->State.URI.fTransferStart = true;117 pClient->State.URI.enmTransferDir = (SHCLTRANSFERDIR)uParm;118 break;119 120 }121 122 default:123 AssertMsgFailed(("Invalid message %RU32\n", uMsg));124 rc = VERR_INVALID_PARAMETER;125 break;126 }127 128 LogFlowFuncLeaveRC(rc);129 return rc;130 }131 132 bool shclSvcTransferReturnMsg(PSHCLCLIENT pClient, uint32_t cParms, VBOXHGCMSVCPARM paParms[])133 {134 RT_NOREF(pClient, cParms, paParms);135 136 bool fHandled = false;137 138 if ( pClient->State.URI.fTransferStart139 && cParms >= 2)140 {141 HGCMSvcSetU32(&paParms[0], VBOX_SHCL_HOST_MSG_TRANSFER_TRANSFER_START);142 HGCMSvcSetU32(&paParms[1], pClient->State.URI.enmTransferDir);143 pClient->State.URI.fTransferStart = false;144 145 fHandled = true;146 }147 148 LogFlowFunc(("fHandled=%RTbool\n", fHandled));149 return fHandled;150 }151 #endif152 #endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */153
Note:
See TracChangeset
for help on using the changeset viewer.