- Timestamp:
- Jun 24, 2019 10:18:19 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 131514
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/include/VBox/GuestHost/SharedClipboard-uri.h ¶
r79267 r79299 503 503 504 504 /** 505 * Enumeration to specify the Shared Clipboard provider source type.506 */ 507 typedef enum SHAREDCLIPBOARD PROVIDERSOURCE505 * Enumeration to specify the Shared Clipboard URI provider source type. 506 */ 507 typedef enum SHAREDCLIPBOARDURIPROVIDERSOURCE 508 508 { 509 509 /** Invalid source type. */ 510 SHAREDCLIPBOARD PROVIDERSOURCE_INVALID = 0,510 SHAREDCLIPBOARDURIPROVIDERSOURCE_INVALID = 0, 511 511 /** Source is VbglR3. */ 512 SHAREDCLIPBOARD PROVIDERSOURCE_VBGLR3,512 SHAREDCLIPBOARDURIPROVIDERSOURCE_VBGLR3, 513 513 /** Source is the host service. */ 514 SHAREDCLIPBOARD PROVIDERSOURCE_HOSTSERVICE515 } SHAREDCLIPBOARD PROVIDERSOURCE;514 SHAREDCLIPBOARDURIPROVIDERSOURCE_HOSTSERVICE 515 } SHAREDCLIPBOARDURIPROVIDERSOURCE; 516 516 517 517 class SharedClipboardProvider; … … 553 553 { 554 554 /** Specifies what the source of the provider is. */ 555 SHAREDCLIPBOARDPROVIDERSOURCE enmSource; 555 SHAREDCLIPBOARDURIPROVIDERSOURCE enmSource; 556 /** Specifies whether the provider will read or write data. */ 557 SHAREDCLIPBOARDURITRANSFERDIR enmDir; 556 558 /** Optional callback table; can be NULL if not needed. */ 557 559 PSHAREDCLIPBOARDPROVIDERCALLBACKS pCallbacks; … … 625 627 public: /* Interface to be implemented. */ 626 628 629 virtual int Prepare(void); 630 627 631 virtual int ReadDataHdr(PVBOXCLIPBOARDDATAHDR *ppDataHdr); 628 632 virtual int WriteDataHdr(const PVBOXCLIPBOARDDATAHDR pDataHdr); … … 697 701 /** Number of references to this instance. */ 698 702 volatile uint32_t m_cRefs; 703 /** The provider's transfer direction. */ 704 SHAREDCLIPBOARDURITRANSFERDIR m_enmDir; 699 705 /** The provider's callback table. */ 700 706 SHAREDCLIPBOARDPROVIDERCALLBACKS m_Callbacks; … … 759 765 public: 760 766 767 int Prepare(void); 768 761 769 int ReadDataHdr(PVBOXCLIPBOARDDATAHDR *ppDataHdr); 762 770 int WriteDataHdr(const PVBOXCLIPBOARDDATAHDR pDataHdr); … … 811 819 typedef FNSHAREDCLIPBOARDURITRANSFERSTARTED *PFNSHAREDCLIPBOARDURITRANSFERSTARTED; 812 820 821 typedef DECLCALLBACK(void) FNSHAREDCLIPBOARDURITRANSFERPREPARE(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData); 822 /** Pointer to a FNSHAREDCLIPBOARDURITRANSFERPREPARE function. */ 823 typedef FNSHAREDCLIPBOARDURITRANSFERPREPARE *PFNSHAREDCLIPBOARDURITRANSFERPREPARE; 824 825 typedef DECLCALLBACK(void) FNSHAREDCLIPBOARDURIMETADATACOMPLETE(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData); 826 /** Pointer to a FNSHAREDCLIPBOARDURIMETADATACOMPLETE function. */ 827 typedef FNSHAREDCLIPBOARDURIMETADATACOMPLETE *PFNSHAREDCLIPBOARDURIMETADATACOMPLETE; 828 813 829 typedef DECLCALLBACK(void) FNSHAREDCLIPBOARDURITRANSFERCANCELED(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData); 814 830 /** Pointer to a FNSHAREDCLIPBOARDURITRANSFERCANCELED function. */ … … 831 847 /** Saved user pointer. */ 832 848 void *pvUser; 849 /** Function pointer, called when the transfer is going to be prepared. */ 850 PFNSHAREDCLIPBOARDURITRANSFERPREPARE pfnTransferPrepare; 833 851 /** Function pointer, called when the transfer has been started. */ 834 852 PFNSHAREDCLIPBOARDURITRANSFERSTARTED pfnTransferStarted; 853 /** Function pointer, called when reading / writing meta data is complete. */ 854 PFNSHAREDCLIPBOARDURIMETADATACOMPLETE pfnMetaDataComplete; 835 855 /** Function pointer, called when the transfer is complete. */ 836 856 PFNSHAREDCLIPBOARDURITRANSFERCOMPLETE pfnTransferComplete; … … 933 953 SharedClipboardURIObject *SharedClipboardURITransferGetObject(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint64_t uIdx); 934 954 int SharedClipboardURITransferRun(PSHAREDCLIPBOARDURITRANSFER pTransfer, bool fAsync); 935 void SharedClipboardURITransferSetCallbacks(PSHAREDCLIPBOARDURITRANSFER pTransfer, PSHAREDCLIPBOARDURITRANSFERCALLBACKS pCallbacks); 955 void SharedClipboardURITransferSetCallbacks(PSHAREDCLIPBOARDURITRANSFER pTransfer, 956 PSHAREDCLIPBOARDURITRANSFERCALLBACKS pCallbacks); 936 957 937 958 int SharedClipboardURITransferMetaDataAdd(PSHAREDCLIPBOARDURITRANSFER pTransfer, const void *pvMeta, uint32_t cbMeta); 938 959 bool SharedClipboardURITransferMetaDataIsComplete(PSHAREDCLIPBOARDURITRANSFER pTransfer); 939 int SharedClipboardURITransferMetaGet(PSHAREDCLIPBOARDURITRANSFER pTransfer, const void *pvMeta, uint32_t cbMeta);940 960 int SharedClipboardURITransferMetaDataRead(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t *pcbRead); 941 961 int SharedClipboardURITransferMetaDataWrite(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t *pcbWritten); -
TabularUnified trunk/include/VBox/GuestHost/SharedClipboard-win.h ¶
r79267 r79299 216 216 217 217 int copyToHGlobal(const void *pvData, size_t cbData, UINT fFlags, HGLOBAL *phGlobal); 218 int createFileGroupDescriptorFromURIList(const SharedClipboardURIList &URIList, bool fUnicode, HGLOBAL *phGlobal); 218 int createFileGroupDescriptorFromTransfer(PSHAREDCLIPBOARDURITRANSFER pTransfer, 219 bool fUnicode, HGLOBAL *phGlobal); 219 220 220 221 bool lookupFormatEtc(LPFORMATETC pFormatEtc, ULONG *puIndex); 221 222 void registerFormat(LPFORMATETC pFormatEtc, CLIPFORMAT clipFormat, TYMED tyMed = TYMED_HGLOBAL, 222 223 LONG lindex = -1, DWORD dwAspect = DVASPECT_CONTENT, DVTARGETDEVICE *pTargetDevice = NULL); 224 225 protected: /* URI transfer callbacks */ 226 227 static DECLCALLBACK(void) onMetaDataCompleteCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData); 223 228 224 229 protected: … … 232 237 IStream *m_pStream; 233 238 ULONG m_uObjIdx; 239 /** Event being triggered when reading the meta data has been completed.*/ 240 RTSEMEVENT m_EventMetaDataComplete; 234 241 }; 235 242 -
TabularUnified trunk/include/VBox/HostServices/VBoxClipboardSvc.h ¶
r79267 r79299 449 449 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 450 450 int VBoxSvcClipboardURIReadDataHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATAHDR pDataHdr); 451 int VBoxSvcClipboardURIWriteDataHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATAHDR pDataHdr); 451 452 int VBoxSvcClipboardURIReadDataChunk(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATACHUNK pDataChunk); 453 int VBoxSvcClipboardURIWriteDataChunk(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATACHUNK pDataChunk); 452 454 int VBoxSvcClipboardURIReadDir(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDIRDATA pDirData); 455 int VBoxSvcClipboardURIWriteDir(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDIRDATA pDirData); 453 456 int VBoxSvcClipboardURIReadFileHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEHDR pFileHdr); 457 int VBoxSvcClipboardURIWriteFileHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEHDR pFileHdr); 454 458 int VBoxSvcClipboardURIReadFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData); 459 int VBoxSvcClipboardURIWriteFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData); 455 460 #endif 456 461 -
TabularUnified trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp ¶
r79271 r79299 347 347 SHAREDCLIPBOARDPROVIDERCREATIONCTX creationCtx; 348 348 RT_ZERO(creationCtx); 349 creationCtx.enmSource = SHAREDCLIPBOARDPROVIDERSOURCE_VBGLR3; 349 creationCtx.enmSource = SHAREDCLIPBOARDURIPROVIDERSOURCE_VBGLR3; 350 creationCtx.enmDir = SHAREDCLIPBOARDURITRANSFERDIR_READ; 350 351 creationCtx.u.VbglR3.uClientID = pCtx->u32ClientID; 351 352 … … 469 470 SHAREDCLIPBOARDPROVIDERCREATIONCTX creationCtx; 470 471 RT_ZERO(creationCtx); 471 creationCtx.enmSource = SHAREDCLIPBOARDPROVIDERSOURCE_VBGLR3; 472 creationCtx.enmSource = SHAREDCLIPBOARDURIPROVIDERSOURCE_VBGLR3; 473 creationCtx.enmDir = SHAREDCLIPBOARDURITRANSFERDIR_WRITE; 472 474 creationCtx.u.VbglR3.uClientID = pCtx->u32ClientID; 473 475 -
TabularUnified trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp ¶
r79267 r79299 121 121 m_enmStatus = Initialized; 122 122 123 int rc2 = RTSemEventCreate(&m_EventMetaDataComplete); 124 AssertRC(rc2); 125 123 126 AssertPtr(m_pTransfer->pProvider); 124 127 m_pTransfer->pProvider->AddRef(); … … 130 133 VBoxClipboardWinDataObject::~VBoxClipboardWinDataObject(void) 131 134 { 135 RTSemEventDestroy(m_EventMetaDataComplete); 136 132 137 if (m_pTransfer->pProvider) 133 138 m_pTransfer->pProvider->Release(); … … 218 223 219 224 /** 220 * Creates a FILEGROUPDESCRIPTOR object from a given Shared Clipboard URI list and stores 221 * the result into an HGLOBAL object. 225 * Creates a FILEGROUPDESCRIPTOR object from a given URI transfer and stores the result into an HGLOBAL object. 222 226 * 223 227 * @returns VBox status code. 224 * @param URIList URI list to create objectfor.228 * @param pTransfer URI transfer to create file grou desciprtor for. 225 229 * @param fUnicode Whether the FILEGROUPDESCRIPTOR object shall contain Unicode data or not. 226 230 * @param phGlobal Where to store the allocated HGLOBAL object on success. 227 231 */ 228 int VBoxClipboardWinDataObject::createFileGroupDescriptorFrom URIList(const SharedClipboardURIList &URIList,229 bool fUnicode, HGLOBAL *phGlobal)230 { 231 Assert Return(URIList.GetRootCount(), VERR_INVALID_PARAMETER);232 AssertPtrReturn(phGlobal, 232 int VBoxClipboardWinDataObject::createFileGroupDescriptorFromTransfer(PSHAREDCLIPBOARDURITRANSFER pTransfer, 233 bool fUnicode, HGLOBAL *phGlobal) 234 { 235 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 236 AssertPtrReturn(phGlobal, VERR_INVALID_POINTER); 233 237 234 238 LogFlowFuncEnter(); 239 240 SharedClipboardURIList *pURIList = SharedClipboardURITransferGetList(pTransfer); 241 if (!pURIList) 242 return VERR_WRONG_ORDER; 235 243 236 244 const size_t cbFileGroupDescriptor = fUnicode ? sizeof(FILEGROUPDESCRIPTORW) : sizeof(FILEGROUPDESCRIPTORA); 237 245 const size_t cbFileDescriptor = fUnicode ? sizeof(FILEDESCRIPTORW) : sizeof(FILEDESCRIPTORA); 238 246 239 const UINT cItems = (UINT) URIList.GetRootCount(); /** @todo UINT vs. uint64_t */247 const UINT cItems = (UINT)pURIList->GetRootCount(); /** @todo UINT vs. uint64_t */ 240 248 const size_t cbFGD = cbFileGroupDescriptor + (cbFileDescriptor * (cItems - 1)); 241 249 … … 258 266 RT_BZERO(pFD, cbFileDescriptor); 259 267 260 const SharedClipboardURIObject *pObj = URIList.At(i);268 const SharedClipboardURIObject *pObj = pURIList->At(i); 261 269 AssertPtr(pObj); 262 270 const char *pszFile = pObj->GetSourcePathAbs().c_str(); … … 373 381 HRESULT hr = DV_E_FORMATETC; /* Play safe. */ 374 382 375 LogRel2((" Clipboard: cfFormat=%RI16, sFormat=%s, tyMed=%RU32, dwAspect=%RU32 -> lIndex=%u\n",383 LogRel2(("Shared Clipboard: cfFormat=%RI16, sFormat=%s, tyMed=%RU32, dwAspect=%RU32 -> lIndex=%u\n", 376 384 pThisFormat->cfFormat, VBoxClipboardWinDataObject::ClipboardFormatToString(pFormatEtc->cfFormat), 377 385 pThisFormat->tymed, pThisFormat->dwAspect, lIndex)); … … 391 399 #endif 392 400 { 393 break; 394 #if 0 395 const bool fUnicode = lIndex == FormatIndex_FileDescriptorW; 396 397 LogFlowFunc(("FormatIndex_FileDescriptor%s\n", fUnicode ? "W" : "A")); 398 399 int rc = SharedClipboardURITransferMetaDataRead(m_pTransfer, NULL /* cbRead */); 401 int rc = SharedClipboardURITransferPrepare(m_pTransfer); 400 402 if (RT_SUCCESS(rc)) 401 403 { 402 const SharedClipboardURIList *pURIList = SharedClipboardURITransferGetList(m_pTransfer); 403 if ( pURIList 404 && !pURIList->IsEmpty()) 404 const bool fUnicode = lIndex == FormatIndex_FileDescriptorW; 405 406 LogFlowFunc(("FormatIndex_FileDescriptor%s\n", fUnicode ? "W" : "A")); 407 408 /* Register needed callbacks so that we can wait for the meta data to arrive here. */ 409 SHAREDCLIPBOARDURITRANSFERCALLBACKS Callbacks; 410 RT_ZERO(Callbacks); 411 Callbacks.pfnMetaDataComplete = VBoxClipboardWinDataObject::onMetaDataCompleteCallback; 412 413 SharedClipboardURITransferSetCallbacks(m_pTransfer, &Callbacks); 414 415 /* Start the transfer asynchronously in a separate thread. */ 416 rc = SharedClipboardURITransferRun(m_pTransfer, true /* fAsync */); 417 if (RT_SUCCESS(rc)) 405 418 { 406 HGLOBAL hGlobal; 407 rc = createFileGroupDescriptorFromURIList(*pURIList, fUnicode, &hGlobal); 419 /* Wait for the meta data to arrive. */ 420 LogFlowFunc(("Waiting for meta data to arrive ...\n")); 421 rc = RTSemEventWait(m_EventMetaDataComplete, 30 * 1000 /* 30s timeout */); 408 422 if (RT_SUCCESS(rc)) 409 423 { 410 pMedium->tymed = TYMED_HGLOBAL; 411 pMedium->hGlobal = hGlobal; 412 /* Note: hGlobal now is being owned by pMedium / the caller. */ 413 414 hr = S_OK; 424 const SharedClipboardURIList *pURIList = SharedClipboardURITransferGetList(m_pTransfer); 425 if ( pURIList 426 && !pURIList->IsEmpty()) 427 { 428 HGLOBAL hGlobal; 429 rc = createFileGroupDescriptorFromTransfer(m_pTransfer, fUnicode, &hGlobal); 430 if (RT_SUCCESS(rc)) 431 { 432 pMedium->tymed = TYMED_HGLOBAL; 433 pMedium->hGlobal = hGlobal; 434 /* Note: hGlobal now is being owned by pMedium / the caller. */ 435 436 hr = S_OK; 437 } 438 } 415 439 } 416 440 } 417 441 } 418 #endif419 442 break; 420 443 } … … 452 475 453 476 if (hr == DV_E_FORMATETC) 454 LogRel((" Clipboard: Error handling format\n"));477 LogRel(("Shared Clipboard: Error handling format\n")); 455 478 456 479 LogFlowFunc(("hr=%Rhrc\n", hr)); … … 689 712 //&& pFormatEtc->dwAspect == m_pFormatEtc[i].dwAspect) 690 713 { 691 LogRel3((" Clipboard: Format found: tyMed=%RI32, cfFormat=%RI16, sFormats=%s, dwAspect=%RI32, ulIndex=%RU32\n",714 LogRel3(("Shared Clipboard: Format found: tyMed=%RI32, cfFormat=%RI16, sFormats=%s, dwAspect=%RI32, ulIndex=%RU32\n", 692 715 pFormatEtc->tymed, pFormatEtc->cfFormat, VBoxClipboardWinDataObject::ClipboardFormatToString(m_pFormatEtc[i].cfFormat), 693 716 pFormatEtc->dwAspect, i)); … … 698 721 } 699 722 700 LogRel3((" Clipboard: Format NOT found: tyMed=%RI32, cfFormat=%RI16, sFormats=%s, dwAspect=%RI32\n",723 LogRel3(("Shared Clipboard: Format NOT found: tyMed=%RI32, cfFormat=%RI16, sFormats=%s, dwAspect=%RI32\n", 701 724 pFormatEtc->tymed, pFormatEtc->cfFormat, VBoxClipboardWinDataObject::ClipboardFormatToString(pFormatEtc->cfFormat), 702 725 pFormatEtc->dwAspect)); … … 721 744 } 722 745 746 /* static */ 747 DECLCALLBACK(void) VBoxClipboardWinDataObject::onMetaDataCompleteCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData) 748 { 749 VBoxClipboardWinDataObject *pThis = (VBoxClipboardWinDataObject *)pData->pvUser; 750 751 LogFlowFunc(("pThis=%p\n", pThis)); 752 753 int rc2 = RTSemEventSignal(pThis->m_EventMetaDataComplete); 754 AssertRC(rc2); 755 } 756 -
TabularUnified trunk/src/VBox/GuestHost/SharedClipboard/ClipboardProvider-HostService.cpp ¶
r79267 r79299 51 51 } 52 52 53 int SharedClipboardProviderHostService::Prepare(void) 54 { 55 LogFlowFuncEnter(); 56 57 /*return vboxSvcClipboardReportMsg(, 58 VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, );*/ 59 return 0; 60 } 61 53 62 int SharedClipboardProviderHostService::ReadDataHdr(PVBOXCLIPBOARDDATAHDR *ppDataHdr) 54 63 { 55 RT_NOREF(ppDataHdr); 64 AssertPtrReturn(ppDataHdr, VERR_INVALID_POINTER); 65 66 LogFlowFuncEnter(); 67 56 68 /*return eventWait(VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_HDR, m_Callbacks.pfnReadDataHdr, m_uTimeoutMs, 57 69 (void **)ppDataHdr);*/ … … 61 73 int SharedClipboardProviderHostService::WriteDataHdr(const PVBOXCLIPBOARDDATAHDR pDataHdr) 62 74 { 63 RT_NOREF(pDataHdr);75 AssertPtrReturn(pDataHdr, VERR_INVALID_POINTER); 64 76 65 77 LogFlowFuncEnter(); -
TabularUnified trunk/src/VBox/GuestHost/SharedClipboard/ClipboardProvider.cpp ¶
r79267 r79299 148 148 SharedClipboardProvider::SharedClipboardProvider(void) 149 149 : m_cRefs(0) 150 , m_enmDir(SHAREDCLIPBOARDURITRANSFERDIR_UNKNOWN) 150 151 , m_uTimeoutMs(30 * 1000 /* 30s timeout by default */) 151 152 { … … 178 179 { 179 180 #ifdef VBOX_WITH_SHARED_CLIPBOARD_GUEST 180 case SHAREDCLIPBOARD PROVIDERSOURCE_VBGLR3:181 case SHAREDCLIPBOARDURIPROVIDERSOURCE_VBGLR3: 181 182 pProvider = new SharedClipboardProviderVbglR3(pCtx->u.VbglR3.uClientID); 182 183 break; … … 184 185 185 186 #ifdef VBOX_WITH_SHARED_CLIPBOARD_HOST 186 case SHAREDCLIPBOARD PROVIDERSOURCE_HOSTSERVICE:187 case SHAREDCLIPBOARDURIPROVIDERSOURCE_HOSTSERVICE: 187 188 pProvider = new SharedClipboardProviderHostService(pCtx->u.HostService.pArea); 188 189 break; … … 245 246 * Stubs. 246 247 */ 248 249 int SharedClipboardProvider::Prepare(void) 250 { 251 return VINF_SUCCESS; 252 } 247 253 248 254 int SharedClipboardProvider::ReadDataHdr(PVBOXCLIPBOARDDATAHDR *ppDataHdr) -
TabularUnified trunk/src/VBox/GuestHost/SharedClipboard/clipboard-uri.cpp ¶
r79276 r79299 637 637 pTransfer->cbUser = 0; 638 638 639 RT_ZERO(pTransfer->Callbacks); 640 639 641 pTransfer->pURIList = new SharedClipboardURIList(); 640 642 if (!pTransfer->pURIList) … … 708 710 LogFlowFuncEnter(); 709 711 710 AssertPtrReturn(pTransfer->State.pMeta, VERR_WRONG_ORDER);711 AssertPtrReturn(pTransfer->pURIList, VERR_WRONG_ORDER);712 713 PSHAREDCLIPBOARDMETADATA pMeta = pTransfer->State.pMeta;714 AssertPtrReturn(pMeta, VERR_WRONG_ORDER);715 716 712 int rc; 717 713 718 714 LogFlowFunc(("enmDir=%RU32\n", pTransfer->State.enmDir)); 719 715 716 if (pTransfer->Callbacks.pfnTransferPrepare) 717 { 718 SHAREDCLIPBOARDURITRANSFERCALLBACKDATA callbackData = { pTransfer, pTransfer->Callbacks.pvUser }; 719 pTransfer->Callbacks.pfnTransferPrepare(&callbackData); 720 } 721 720 722 if (pTransfer->State.enmDir == SHAREDCLIPBOARDURITRANSFERDIR_READ) 721 723 { 724 rc = pTransfer->pProvider->Prepare(); 725 #if 0 722 726 rc = pTransfer->pURIList->SetFromURIData(SharedClipboardMetaDataRaw(pMeta), 723 727 SharedClipboardMetaDataGetUsed(pMeta), 724 728 SHAREDCLIPBOARDURILIST_FLAGS_NONE); 725 729 /** @todo Verify pvMetaFmt. */ 730 #endif 726 731 727 732 sharedClipboardURITransferMetaDataDestroyInternal(pTransfer); … … 729 734 else if (pTransfer->State.enmDir == SHAREDCLIPBOARDURITRANSFERDIR_WRITE) 730 735 { 736 AssertPtrReturn(pTransfer->State.pMeta, VERR_WRONG_ORDER); 737 AssertPtrReturn(pTransfer->pURIList, VERR_WRONG_ORDER); 738 739 const PSHAREDCLIPBOARDMETADATA pMeta = pTransfer->State.pMeta; 740 731 741 rc = pTransfer->pURIList->AppendURIPathsFromList((char *)SharedClipboardMetaDataRaw(pMeta), 732 742 SharedClipboardMetaDataGetUsed(pMeta), … … 947 957 * @returns VBox status code. 948 958 * @param pTransfer URI clipboard transfer to set callbacks for. 949 * @param pCallbacks Pointer to callback table to set. Specify NULL to unset existing callbacks. 950 */ 951 void SharedClipboardURITransferSetCallbacks(PSHAREDCLIPBOARDURITRANSFER pTransfer, PSHAREDCLIPBOARDURITRANSFERCALLBACKS pCallbacks) 959 * @param pCallbacks Pointer to callback table to set. 960 */ 961 void SharedClipboardURITransferSetCallbacks(PSHAREDCLIPBOARDURITRANSFER pTransfer, 962 PSHAREDCLIPBOARDURITRANSFERCALLBACKS pCallbacks) 952 963 { 953 964 AssertPtrReturnVoid(pTransfer); 954 /* pCallbacks might be NULL to unset callbacks. */965 AssertPtrReturnVoid(pCallbacks); 955 966 956 967 LogFlowFunc(("pCallbacks=%p\n", pCallbacks)); 957 968 958 if (pCallbacks) 959 { 960 pTransfer->Callbacks = *pCallbacks; 961 } 962 else 963 RT_ZERO(pTransfer->Callbacks); 969 #define SET_CALLBACK(a_pfnCallback) \ 970 if (pCallbacks->a_pfnCallback) \ 971 pTransfer->Callbacks.a_pfnCallback = pCallbacks->a_pfnCallback 972 973 SET_CALLBACK(pfnTransferPrepare); 974 SET_CALLBACK(pfnTransferStarted); 975 SET_CALLBACK(pfnMetaDataComplete); 976 SET_CALLBACK(pfnTransferCanceled); 977 SET_CALLBACK(pfnTransferError); 978 SET_CALLBACK(pfnTransferStarted); 979 980 #undef SET_CALLBACK 964 981 } 965 982 … … 1033 1050 1034 1051 LogFlowFuncEnter(); 1052 1053 if (pTransfer->Callbacks.pfnTransferStarted) 1054 { 1055 SHAREDCLIPBOARDURITRANSFERCALLBACKDATA callbackData = { pTransfer, pTransfer->Callbacks.pvUser }; 1056 pTransfer->Callbacks.pfnTransferStarted(&callbackData); 1057 } 1035 1058 1036 1059 int rc = SharedClipboardURITransferMetaDataRead(pTransfer, NULL /* pcbRead */); … … 1234 1257 { 1235 1258 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 1259 /* pcbRead is optional. */ 1236 1260 1237 1261 LogFlowFuncEnter(); … … 1250 1274 if (pvMeta) 1251 1275 { 1276 AssertPtr(pTransfer->State.pHeader); 1252 1277 uint32_t cbMetaToRead = pTransfer->State.pHeader->cbMeta; 1253 1278 while (cbMetaToRead) … … 1273 1298 if (pcbRead) 1274 1299 *pcbRead = cbReadTotal; 1300 1301 if (pTransfer->Callbacks.pfnMetaDataComplete) 1302 { 1303 SHAREDCLIPBOARDURITRANSFERCALLBACKDATA callbackData = { pTransfer, pTransfer->Callbacks.pvUser }; 1304 pTransfer->Callbacks.pfnMetaDataComplete(&callbackData); 1305 } 1275 1306 } 1276 1307 } … … 1293 1324 { 1294 1325 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 1326 /* pcbWritten is optional. */ 1295 1327 1296 1328 AssertPtr(pTransfer->pProvider); … … 1329 1361 if (pcbWritten) 1330 1362 *pcbWritten = cbWrittenTotal; 1363 1364 if (pTransfer->Callbacks.pfnMetaDataComplete) 1365 { 1366 SHAREDCLIPBOARDURITRANSFERCALLBACKDATA callbackData = { pTransfer, pTransfer->Callbacks.pvUser }; 1367 pTransfer->Callbacks.pfnMetaDataComplete(&callbackData); 1368 } 1331 1369 } 1332 1370 } … … 1493 1531 LogFlowFuncEnter(); 1494 1532 1533 if (pTransfer->Callbacks.pfnTransferStarted) 1534 { 1535 SHAREDCLIPBOARDURITRANSFERCALLBACKDATA callbackData = { pTransfer, pTransfer->Callbacks.pvUser }; 1536 pTransfer->Callbacks.pfnTransferStarted(&callbackData); 1537 } 1538 1495 1539 int rc = SharedClipboardURITransferMetaDataWrite(pTransfer, NULL /* pcbWritten */); 1496 1540 if (RT_SUCCESS(rc)) -
TabularUnified trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp ¶
r79276 r79299 97 97 98 98 /** 99 * Reads an URI data header from HGCM service parameters. 100 * 101 * @returns VBox status code. 102 * @param cParms Number of HGCM parameters supplied in \a paParms. 103 * @param paParms Array of HGCM parameters. 104 * @param pDataHdr Pointer to data to write the the HGCM parameters. 105 */ 106 int VBoxSvcClipboardURIWriteDataHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATAHDR pDataHdr) 107 { 108 int rc; 109 110 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA_HDR) 111 { 112 /** @todo Set pvMetaFmt + cbMetaFmt. */ 113 /** @todo Calculate header checksum. */ 114 115 /* Note: Context ID (paParms[0]) not used yet. */ 116 HGCMSvcSetU32(&paParms[1], pDataHdr->uFlags); 117 HGCMSvcSetU32(&paParms[2], pDataHdr->uScreenId); 118 HGCMSvcSetU64(&paParms[3], pDataHdr->cbTotal); 119 HGCMSvcSetU32(&paParms[4], pDataHdr->cbMeta); 120 HGCMSvcSetU32(&paParms[5], pDataHdr->cbMetaFmt); 121 HGCMSvcSetPv (&paParms[6], pDataHdr->pvMetaFmt, pDataHdr->cbMetaFmt); 122 HGCMSvcSetU64(&paParms[7], pDataHdr->cObjects); 123 HGCMSvcSetU32(&paParms[8], pDataHdr->enmCompression); 124 HGCMSvcSetU32(&paParms[9], (uint32_t)pDataHdr->enmChecksumType); 125 HGCMSvcSetU32(&paParms[10], pDataHdr->cbChecksum); 126 HGCMSvcSetPv (&paParms[11], pDataHdr->pvChecksum, pDataHdr->cbChecksum); 127 128 LogFlowFunc(("fFlags=0x%x, cbMeta=%RU32, cbTotalSize=%RU64, cObj=%RU64\n", 129 pDataHdr->uFlags, pDataHdr->cbMeta, pDataHdr->cbTotal, pDataHdr->cObjects)); 130 131 rc = VINF_SUCCESS; 132 } 133 else 134 rc = VERR_INVALID_PARAMETER; 135 136 LogFlowFuncLeaveRC(rc); 137 return rc; 138 } 139 140 /** 99 141 * Reads an URI data chunk from HGCM service parameters. 100 142 * … … 133 175 134 176 /** 177 * Writes an URI data chunk to HGCM service parameters. 178 * 179 * @returns VBox status code. 180 * @param cParms Number of HGCM parameters supplied in \a paParms. 181 * @param paParms Array of HGCM parameters. 182 * @param pDataChunk Pointer to data to write the the HGCM parameters. 183 */ 184 int VBoxSvcClipboardURIWriteDataChunk(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATACHUNK pDataChunk) 185 { 186 int rc; 187 188 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA_CHUNK) 189 { 190 /** @todo Calculate chunk checksum. */ 191 192 /* Note: Context ID (paParms[0]) not used yet. */ 193 HGCMSvcSetU32(&paParms[1], pDataChunk->cbData); 194 HGCMSvcSetPv (&paParms[2], pDataChunk->pvData, pDataChunk->cbData); 195 HGCMSvcSetU32(&paParms[3], pDataChunk->cbChecksum); 196 HGCMSvcSetPv (&paParms[4], pDataChunk->pvChecksum, pDataChunk->cbChecksum); 197 198 rc = VINF_SUCCESS; 199 } 200 else 201 rc = VERR_INVALID_PARAMETER; 202 203 LogFlowFuncLeaveRC(rc); 204 return rc; 205 } 206 207 /** 135 208 * Reads an URI directory entry from HGCM service parameters. 136 209 * … … 169 242 170 243 /** 244 * Writes an URI directory entry to HGCM service parameters. 245 * 246 * @returns VBox status code. 247 * @param cParms Number of HGCM parameters supplied in \a paParms. 248 * @param paParms Array of HGCM parameters. 249 * @param pDirData Pointer to data to write the the HGCM parameters. 250 */ 251 int VBoxSvcClipboardURIWriteDir(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDIRDATA pDirData) 252 { 253 int rc; 254 255 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_DIR) 256 { 257 /* Note: Context ID (paParms[0]) not used yet. */ 258 HGCMSvcSetU32(&paParms[1], pDirData->cbPath); 259 HGCMSvcSetPv (&paParms[2], pDirData->pszPath, pDirData->cbPath); 260 HGCMSvcSetU32(&paParms[3], pDirData->fMode); 261 262 rc = VINF_SUCCESS; 263 } 264 else 265 rc = VERR_INVALID_PARAMETER; 266 267 LogFlowFuncLeaveRC(rc); 268 return rc; 269 } 270 271 /** 171 272 * Reads an URI file header from HGCM service parameters. 172 273 * … … 204 305 205 306 /** 307 * Writes an URI file header to HGCM service parameters. 308 * 309 * @returns VBox status code. 310 * @param cParms Number of HGCM parameters supplied in \a paParms. 311 * @param paParms Array of HGCM parameters. 312 * @param pFileHdr Pointer to data to write the the HGCM parameters. 313 */ 314 int VBoxSvcClipboardURIWriteFileHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEHDR pFileHdr) 315 { 316 int rc; 317 318 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_FILE_HDR) 319 { 320 /* Note: Context ID (paParms[0]) not used yet. */ 321 HGCMSvcSetU32(&paParms[1], pFileHdr->cbFilePath); 322 HGCMSvcSetPv (&paParms[2], pFileHdr->pszFilePath, pFileHdr->cbFilePath); 323 HGCMSvcSetU32(&paParms[3], pFileHdr->fFlags); 324 HGCMSvcSetU32(&paParms[4], pFileHdr->fMode); 325 HGCMSvcSetU64(&paParms[5], pFileHdr->cbSize); 326 327 rc = VINF_SUCCESS; 328 } 329 else 330 rc = VERR_INVALID_PARAMETER; 331 332 LogFlowFuncLeaveRC(rc); 333 return rc; 334 } 335 336 /** 206 337 * Reads an URI file data chunk from HGCM service parameters. 207 338 * … … 227 358 228 359 LogFlowFunc(("pvData=0x%p, cbData=%RU32\n", pFileData->pvData, pFileData->cbData)); 360 } 361 else 362 rc = VERR_INVALID_PARAMETER; 363 364 LogFlowFuncLeaveRC(rc); 365 return rc; 366 } 367 368 /** 369 * Writes an URI file data chunk to HGCM service parameters. 370 * 371 * @returns VBox status code. 372 * @param cParms Number of HGCM parameters supplied in \a paParms. 373 * @param paParms Array of HGCM parameters. 374 * @param pFileData Pointer to data to write the the HGCM parameters. 375 */ 376 int VBoxSvcClipboardURIWriteFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData) 377 { 378 int rc; 379 380 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_FILE_DATA) 381 { 382 /* Note: Context ID (paParms[0]) not used yet. */ 383 HGCMSvcSetU32(&paParms[1], pFileData->cbData); 384 HGCMSvcSetPv (&paParms[2], pFileData->pvData, pFileData->cbData); 385 HGCMSvcSetU32(&paParms[3], pFileData->cbChecksum); 386 HGCMSvcSetPv (&paParms[4], pFileData->pvChecksum, pFileData->cbChecksum); 387 388 rc = VINF_SUCCESS; 229 389 } 230 390 else … … 293 453 } 294 454 295 bool f DispatchToProvider = false; /* Whether to (also) dispatch the HGCM data to the transfer provider. */455 bool fWriteToProvider = false; /* Whether to (also) dispatch the HGCM data to the transfer provider. */ 296 456 297 457 int rc = VERR_INVALID_PARAMETER; /* Play safe. */ … … 597 757 } 598 758 599 if (f DispatchToProvider)759 if (fWriteToProvider) 600 760 rc = VINF_SUCCESS; 601 761 602 762 if (RT_SUCCESS(rc)) 603 763 { 604 if (f DispatchToProvider)764 if (fWriteToProvider) 605 765 { 606 766 SHAREDCLIPBOARDPROVIDERWRITEPARMS writeParms; -
TabularUnified trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-win.cpp ¶
r79269 r79299 128 128 * @param pCtx Clipboard context to use. 129 129 * @param fFormat Format to receive data in. 130 * @param uTimeoutMs Timeout (in ms). Specify 0 if no waiting is required. 130 * @param uTimeoutMs Timeout (in ms) to wait until the render event has been triggered. 131 * Specify 0 if no waiting is required. 131 132 */ 132 133 static int vboxClipboardWinRequestData(PVBOXCLIPBOARDCONTEXT pCtx, VBOXCLIPBOARDFORMAT fFormat, … … 328 329 { 329 330 rc = VBoxClipboardWinURIAnnounce(pWinCtx, &pCtx->pClientData->URI, pTransfer); 330 if (RT_SUCCESS(rc)) 331 { 332 rc = vboxClipboardWinRequestData(pCtx, fFormats, 0 /* Waiting not required */); /** FIX !!!!!!!!!!!! NEEDS TO GO INTO IDATAOBJECT GetData() !!!! */ 333 } 331 332 /* Note: The actual requesting + retrieving of data will be done in the IDataObject implementation 333 (ClipboardDataObjectImpl::GetData()). */ 334 334 } 335 335 else -
TabularUnified trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp ¶
r79275 r79299 638 638 SHAREDCLIPBOARDPROVIDERCREATIONCTX creationCtx; 639 639 RT_ZERO(creationCtx); 640 creationCtx.enmSource = SHAREDCLIPBOARDPROVIDERSOURCE_HOSTSERVICE; 640 creationCtx.enmSource = SHAREDCLIPBOARDURIPROVIDERSOURCE_HOSTSERVICE; 641 creationCtx.enmDir = SHAREDCLIPBOARDURITRANSFERDIR_READ; 641 642 creationCtx.u.HostService.pArea = pTransfer->pArea; 642 643
Note:
See TracChangeset
for help on using the changeset viewer.