Changeset 80845 in vbox for trunk/src/VBox/Additions/WINNT/VBoxTray
- Timestamp:
- Sep 17, 2019 9:05:21 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp
r80667 r80845 55 55 { 56 56 /** Pointer to the VBoxClient service environment. */ 57 const VBOXSERVICEENV 57 const VBOXSERVICEENV *pEnv; 58 58 /** Command context. */ 59 VBGLR3SHCLCMDCTX 59 VBGLR3SHCLCMDCTX CmdCtx; 60 60 /** Windows-specific context data. */ 61 SHCLWINCTX Win;62 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 63 /** URItransfer data. */64 SHCLURICTX URI;61 SHCLWINCTX Win; 62 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 63 /** Associated transfer data. */ 64 SHCLURICTX URI; 65 65 #endif 66 66 } SHCLCONTEXT, *PSHCLCONTEXT; … … 69 69 typedef struct _SHCLURIREADTHREADCTX 70 70 { 71 PSHCLCONTEXT 71 PSHCLCONTEXT pClipboardCtx; 72 72 PSHCLURITRANSFER pTransfer; 73 73 } SHCLURIREADTHREADCTX, *PSHCLURIREADTHREADCTX; … … 75 75 typedef struct _SHCLURIWRITETHREADCTX 76 76 { 77 PSHCLCONTEXT 77 PSHCLCONTEXT pClipboardCtx; 78 78 PSHCLURITRANSFER pTransfer; 79 79 } SHCLURIWRITETHREADCTX, *PSHCLURIWRITETHREADCTX; … … 100 100 101 101 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 102 #if 0 102 103 static DECLCALLBACK(int) vboxClipboardURIWriteThread(RTTHREAD ThreadSelf, void *pvUser) 103 104 { … … 157 158 return rc; 158 159 } 159 160 static DECLCALLBACK(void) vboxClipboardURITransferCompleteCallback(PSHCLURITRANSFERCALLBACKDATA pData, int rc) 161 { 162 RT_NOREF(rc); 163 164 LogFlowFunc(("pData=%p, rc=%Rrc\n", pData, rc)); 165 166 LogRel2(("Shared Clipboard: Transfer to destination complete\n")); 167 160 #endif 161 162 static void vboxClipboardURITransferCallbackCleanup(PSHCLURITRANSFERCALLBACKDATA pData) 163 { 168 164 PSHCLURICTX pCtx = (PSHCLURICTX)pData->pvUser; 169 165 AssertPtr(pCtx); … … 178 174 } 179 175 180 int rc2 = SharedClipboardURICtxTransfer Remove(pCtx, pTransfer);176 int rc2 = SharedClipboardURICtxTransferUnregister(pCtx, pTransfer->State.uID); 181 177 AssertRC(rc2); 178 179 SharedClipboardURITransferDestroy(pTransfer); 180 181 RTMemFree(pTransfer); 182 pTransfer = NULL; 183 } 184 185 static DECLCALLBACK(void) vboxClipboardURITransferCompleteCallback(PSHCLURITRANSFERCALLBACKDATA pData, int rc) 186 { 187 RT_NOREF(rc); 188 189 LogFlowFunc(("pData=%p, rc=%Rrc\n", pData, rc)); 190 191 LogRel2(("Shared Clipboard: Transfer to destination complete\n")); 192 193 vboxClipboardURITransferCallbackCleanup(pData); 182 194 } 183 195 … … 190 202 LogRel(("Shared Clipboard: Transfer to destination failed with %Rrc\n", rc)); 191 203 192 PSHCLURICTX pCtx = (PSHCLURICTX)pData->pvUser; 193 AssertPtr(pCtx); 194 195 PSHCLURITRANSFER pTransfer = pData->pTransfer; 196 AssertPtr(pTransfer); 197 198 if (pTransfer->pvUser) /* SharedClipboardWinURITransferCtx */ 199 { 200 delete pTransfer->pvUser; 201 pTransfer->pvUser = NULL; 202 } 203 204 int rc2 = SharedClipboardURICtxTransferRemove(pCtx, pTransfer); 205 AssertRC(rc2); 204 vboxClipboardURITransferCallbackCleanup(pData); 206 205 } 207 206 … … 640 639 case SHCL_WIN_WM_REPORT_FORMATS: 641 640 { 642 LogFunc((" VBOX_CLIPBOARD_WM_REPORT_FORMATS\n"));641 LogFunc(("SHCL_WIN_WM_REPORT_FORMATS\n")); 643 642 644 643 /* Announce available formats. Do not insert data -- will be inserted in WM_RENDERFORMAT. */ … … 647 646 Assert(pEvent->enmType == VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS); 648 647 649 const SHCLFORMATS fFormats = pEvent->u.Report Formats.uFormats;648 const SHCLFORMATS fFormats = pEvent->u.ReportedFormats.uFormats; 650 649 651 650 if (fFormats != VBOX_SHARED_CLIPBOARD_FMT_NONE) /* Could arrive with some older GA versions. */ … … 661 660 LogFunc(("VBOX_SHARED_CLIPBOARD_FMT_URI_LIST\n")); 662 661 663 PSHCLURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pCtx->URI, 664 0 /* uIdx */); 662 PSHCLURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pCtx->URI, 0); /** @todo FIX !!! */ 665 663 if (pTransfer) 666 664 { … … 687 685 } 688 686 689 LogFunc((" VBOX_CLIPBOARD_WM_SET_FORMATS: fFormats=0x%x, lastErr=%ld\n", fFormats, GetLastError()));687 LogFunc(("SHCL_WIN_WM_REPORT_FORMATS: fFormats=0x%x, lastErr=%ld\n", fFormats, GetLastError())); 690 688 break; 691 689 } … … 702 700 HANDLE hClip = NULL; 703 701 704 LogFlowFunc((" VBOX_CLIPBOARD_WM_READ_DATA: uFormat=0x%x\n", uFormat));702 LogFlowFunc(("SHCL_WIN_WM_READ_DATA: uFormat=0x%x\n", uFormat)); 705 703 706 704 int rc = SharedClipboardWinOpen(hwnd); … … 781 779 { 782 780 PSHCLURITRANSFER pTransfer; 783 rc = SharedClipboardURITransferCreate(SHCLURITRANSFERDIR_WRITE, 784 SHCLSOURCE_LOCAL, 785 &pTransfer); 781 rc = SharedClipboardURITransferCreate(&pTransfer); 782 if (RT_SUCCESS(rc)) 783 rc = SharedClipboardURITransferInit(pTransfer, 0 /* uID */, 784 SHCLURITRANSFERDIR_WRITE, SHCLSOURCE_LOCAL); 786 785 if (RT_SUCCESS(rc)) 787 786 { 788 rc = SharedClipboardURICtxTransferAdd(&pCtx->URI, pTransfer); 789 if (RT_SUCCESS(rc)) 787 /* The data data in CF_HDROP format, as the files are locally present and don't need to be 788 * presented as a IDataObject or IStream. */ 789 HANDLE hClip = hClip = GetClipboardData(CF_HDROP); 790 if (hClip) 790 791 { 791 /* The data data in CF_HDROP format, as the files are locally present and don't need to be 792 * presented as a IDataObject or IStream. */ 793 HANDLE hClip = hClip = GetClipboardData(CF_HDROP); 794 if (hClip) 792 HDROP hDrop = (HDROP)GlobalLock(hClip); 793 if (hDrop) 795 794 { 796 HDROP hDrop = (HDROP)GlobalLock(hClip); 797 if (hDrop) 795 char *papszList; 796 uint32_t cbList; 797 rc = SharedClipboardWinDropFilesToStringList((DROPFILES *)hDrop, &papszList, &cbList); 798 799 GlobalUnlock(hClip); 800 801 if (RT_SUCCESS(rc)) 798 802 { 799 char *papszList; 800 uint32_t cbList; 801 rc = SharedClipboardWinDropFilesToStringList((DROPFILES *)hDrop, &papszList, &cbList); 802 803 GlobalUnlock(hClip); 804 803 rc = SharedClipboardURILTransferSetRoots(pTransfer, 804 papszList, cbList + 1 /* Include termination */); 805 805 if (RT_SUCCESS(rc)) 806 806 { 807 rc = SharedClipboardURILTransferSetRoots(pTransfer,808 papszList, cbList + 1 /* Include termination */);809 if ( RT_SUCCESS(rc))807 PSHCLURIWRITETHREADCTX pThreadCtx 808 = (PSHCLURIWRITETHREADCTX)RTMemAllocZ(sizeof(SHCLURIWRITETHREADCTX)); 809 if (pThreadCtx) 810 810 { 811 PSHCLURIWRITETHREADCTX pThreadCtx 812 = (PSHCLURIWRITETHREADCTX)RTMemAllocZ(sizeof(SHCLURIWRITETHREADCTX)); 813 if (pThreadCtx) 811 pThreadCtx->pClipboardCtx = pCtx; 812 pThreadCtx->pTransfer = pTransfer; 813 814 rc = SharedClipboardURITransferPrepare(pTransfer); 815 if (RT_SUCCESS(rc)) 814 816 { 815 pThreadCtx->pClipboardCtx = pCtx; 816 pThreadCtx->pTransfer = pTransfer; 817 818 rc = SharedClipboardURITransferPrepare(pTransfer); 817 rc = SharedClipboardURICtxTransferRegister(&pCtx->URI, pTransfer, 818 NULL /* puTransferID */); 819 #if 0 819 820 if (RT_SUCCESS(rc)) 820 821 { … … 823 824 /* pThreadCtx now is owned by vboxClipboardURIWriteThread(). */ 824 825 } 826 #endif 825 827 } 826 else827 rc = VERR_NO_MEMORY;828 828 } 829 830 if (papszList) 831 RTStrFree(papszList); 829 else 830 rc = VERR_NO_MEMORY; 832 831 } 832 833 if (papszList) 834 RTStrFree(papszList); 833 835 } 834 else835 {836 hClip = NULL;837 }836 } 837 else 838 { 839 hClip = NULL; 838 840 } 839 841 } … … 844 846 845 847 if (RT_FAILURE(rc)) 846 LogFunc((" VBOX_CLIPBOARD_WM_READ_DATA: Failed with rc=%Rrc\n", rc));847 } 848 #endif 848 LogFunc(("SHCL_WIN_WM_READ_DATA: Failed with rc=%Rrc\n", rc)); 849 } 850 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 849 851 850 852 if (hClip == NULL) 851 853 { 852 LogFunc((" VBOX_CLIPBOARD_WM_READ_DATA: hClip=NULL, lastError=%ld\n", GetLastError()));854 LogFunc(("SHCL_WIN_WM_READ_DATA: hClip=NULL, lastError=%ld\n", GetLastError())); 853 855 854 856 /* Requested clipboard format is not available, send empty data. */ … … 863 865 break; 864 866 } 867 868 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 869 case SHCL_WIN_WM_URI_TRANSFER_STATUS: 870 { 871 LogFunc(("SHCL_WIN_WM_URI_TRANSFER_STATUS\n")); 872 873 break; 874 } 875 #endif 865 876 866 877 #if 0 … … 942 953 } 943 954 944 #if 1945 955 /* The host wants to write URI data. */ 946 956 case VBOX_CLIPBOARD_WM_URI_START_WRITE: … … 997 1007 break; 998 1008 } 999 #endif 1000 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 1009 #endif /* 0 */ 1001 1010 1002 1011 case WM_DESTROY: … … 1097 1106 1098 1107 UnregisterClass(s_szClipWndClassName, pCtx->pEnv->hInstance); 1108 1109 SharedClipboardWinCtxDestroy(&pCtx->Win); 1099 1110 } 1100 1111 … … 1124 1135 { 1125 1136 /* Do not use clipboard for remote sessions. */ 1126 LogRel((" Clipboard: Clipboard has been disabled for a remote session\n"));1137 LogRel(("Shared Clipboard: Clipboard has been disabled for a remote session\n")); 1127 1138 return VERR_NOT_SUPPORTED; 1128 1139 } … … 1136 1147 if (FAILED(hr)) 1137 1148 { 1138 LogRel((" Clipboard: Initializing OLE failed (%Rhrc) -- file transfers unavailable\n"));1149 LogRel(("Shared Clipboard: Initializing OLE failed (%Rhrc) -- file transfers unavailable\n")); 1139 1150 /* Not critical, the rest of the clipboard might work. */ 1140 1151 } 1141 1152 else 1142 LogRel((" Clipboard: Initialized OLE\n"));1153 LogRel(("Shared Clipboard: Initialized OLE\n")); 1143 1154 #endif 1144 1155 … … 1146 1157 { 1147 1158 /* Check if new Clipboard API is available. */ 1148 /* ignore rc */ SharedClipboardWinCheckAndInitNewAPI(&pCtx->Win.newAPI);1149 1150 rc = VbglR3ClipboardConnectEx(&pCtx->CmdCtx);1159 rc = SharedClipboardWinCtxInit(&pCtx->Win); 1160 if (RT_SUCCESS(rc)) 1161 rc = VbglR3ClipboardConnectEx(&pCtx->CmdCtx); 1151 1162 if (RT_SUCCESS(rc)) 1152 1163 { … … 1214 1225 { 1215 1226 pEvent = (PVBGLR3CLIPBOARDEVENT)RTMemAllocZ(sizeof(VBGLR3CLIPBOARDEVENT)); 1216 if (!pEvent) 1217 { 1218 rc = VERR_NO_MEMORY; 1219 break; 1220 } 1227 AssertPtrBreakStmt(pEvent, rc = VERR_NO_MEMORY); 1221 1228 1222 1229 switch (uMsg) … … 1225 1232 { 1226 1233 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS; 1227 pEvent->u.Report Formats.uFormats = uFormats;1234 pEvent->u.ReportedFormats.uFormats = uFormats; 1228 1235 break; 1229 1236 } … … 1244 1251 else /* Protocol >= v1. */ 1245 1252 { 1246 rc = VbglR3ClipboardEventGetNext(&pCtx->CmdCtx, &pEvent); 1253 pEvent = (PVBGLR3CLIPBOARDEVENT)RTMemAllocZ(sizeof(VBGLR3CLIPBOARDEVENT)); 1254 AssertPtrBreakStmt(pEvent, rc = VERR_NO_MEMORY); 1255 1256 uint32_t uMsg = 0; 1257 uint32_t cParms = 0; 1258 rc = VbglR3ClipboardMsgPeekWait(&pCtx->CmdCtx, &uMsg, &cParms, NULL /* pidRestoreCheck */); 1259 if (RT_SUCCESS(rc)) 1260 { 1261 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 1262 rc = VbglR3ClipboardEventGetNextEx(uMsg, cParms, &pCtx->CmdCtx, &pCtx->URI, pEvent); 1263 #else 1264 rc = VbglR3ClipboardEventGetNext(uMsg, cParms, &pCtx->CmdCtx, pEvent); 1265 #endif 1266 } 1247 1267 } 1248 1268 1249 1269 if (RT_FAILURE(rc)) 1250 1270 { 1271 VbglR3ClipboardEventFree(pEvent); 1272 pEvent = NULL; 1273 1251 1274 if (*pfShutdown) 1252 1275 break; … … 1280 1303 break; 1281 1304 } 1282 #if 0 1283 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START: 1284 { 1285 const UINT uMsg = u32Formats == 0 ? 1286 VBOX_CLIPBOARD_WM_URI_START_READ : VBOX_CLIPBOARD_WM_URI_START_WRITE; 1287 1288 ::PostMessage(pWinCtx->hWnd, uMsg, 0 /* wParm */, 0 /* lParm */); 1305 1306 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 1307 case VBGLR3CLIPBOARDEVENTTYPE_URI_TRANSFER_STATUS: 1308 { 1309 ::PostMessage(pWinCtx->hWnd, SHCL_WIN_WM_URI_TRANSFER_STATUS, 1310 0 /* wParm */, (LPARAM)pEvent /* lParm */); 1289 1311 break; 1290 1312 } … … 1293 1315 { 1294 1316 /* The host is terminating. */ 1295 LogRel((" Clipboard: Terminating ...\n"));1317 LogRel(("Shared Clipboard: Terminating ...\n")); 1296 1318 ASMAtomicXchgBool(pfShutdown, true); 1297 1319 break;
Note:
See TracChangeset
for help on using the changeset viewer.