Changeset 79497 in vbox for trunk/src/VBox/Additions/common
- Timestamp:
- Jul 3, 2019 1:28:33 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 131761
- Location:
- trunk/src/VBox/Additions/common
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuest/lib/Makefile.kmk
r78897 r79497 152 152 ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 153 153 VBoxGuestR3Lib_SOURCES += \ 154 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardMetaData.cpp \155 154 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardMIME.cpp 156 155 endif -
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibClipboard.cpp
r79267 r79497 50 50 * Prototypes * 51 51 *********************************************************************************************************************************/ 52 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST53 static int vbglR3ClipboardWriteErrorInternal(HGCMCLIENTID idClient, int rcErr);54 #endif55 52 56 53 … … 67 64 if (rc == VERR_HGCM_SERVICE_NOT_FOUND) 68 65 rc = VINF_PERMISSION_DENIED; 66 67 LogFlowFuncLeaveRC(rc); 69 68 return rc; 70 69 } … … 84 83 85 84 /** 86 * Get a host message. 85 * Get a host message, old version. 86 * 87 * Note: This is the old message which still is being used for the non-URI Shared Clipboard transfers, 88 * to not break compatibility with older additions / VBox versions. 87 89 * 88 90 * This will block until a message becomes available. … … 93 95 * @param pfFormats Where to store the format(s) the message applies to. 94 96 */ 95 VBGLR3DECL(int) VbglR3ClipboardGetHostMsg(HGCMCLIENTID idClient, uint32_t *pidMsg, uint32_t *pfFormats) 96 { 97 VBoxClipboardGetHostMsg Msg; 98 99 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, VBOX_SHARED_CLIPBOARD_CPARMS_GET_HOST_MSG); 97 VBGLR3DECL(int) VbglR3ClipboardGetHostMsgOld(HGCMCLIENTID idClient, uint32_t *pidMsg, uint32_t *pfFormats) 98 { 99 VBoxClipboardGetHostMsgOld Msg; 100 101 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 102 VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG_OLD, VBOX_SHARED_CLIPBOARD_CPARMS_GET_HOST_MSG_OLD); 103 100 104 VbglHGCMParmUInt32Set(&Msg.msg, 0); 101 105 VbglHGCMParmUInt32Set(&Msg.formats, 0); … … 157 161 } 158 162 159 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 160 /** 161 * Reads a (meta) data header from the host. 162 * 163 * @returns IPRT status code. 164 * @param idClient The client id returned by VbglR3ClipboardConnect(). 165 * @param pDataHdr Where to store the read meta data header. 166 */ 167 VBGLR3DECL(int) VbglR3ClipboardReadDataHdr(HGCMCLIENTID idClient, PVBOXCLIPBOARDDATAHDR pDataHdr) 168 { 169 AssertPtrReturn(pDataHdr, VERR_INVALID_POINTER); 170 171 VBoxClipboardReadDataHdrMsg Msg; 172 RT_ZERO(Msg); 173 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 174 VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_HDR, VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA_HDR); 175 Msg.uContext.SetUInt32(0); 176 Msg.uFlags.SetUInt32(0); 177 Msg.uScreenId.SetUInt32(0); 178 Msg.cbTotal.SetUInt64(0); 179 Msg.cbMeta.SetUInt32(0); 180 Msg.cbMetaFmt.SetUInt32(0); 181 Msg.pvMetaFmt.SetPtr(pDataHdr->pvMetaFmt, pDataHdr->cbMetaFmt); 182 Msg.cObjects.SetUInt64(0); 163 static int vbglR3ClipboardGetNextMsgType(HGCMCLIENTID idClient, uint32_t *puMsg, uint32_t *pcParms, bool fWait) 164 { 165 AssertPtrReturn(puMsg, VERR_INVALID_POINTER); 166 AssertPtrReturn(pcParms, VERR_INVALID_POINTER); 167 168 VBoxClipboardGetHostMsg Msg; 169 RT_ZERO(Msg); 170 171 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 172 VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, VBOX_SHARED_CLIPBOARD_CPARMS_GET_HOST_MSG); 173 174 Msg.uMsg.SetUInt32(0); 175 Msg.cParms.SetUInt32(0); 176 Msg.fBlock.SetUInt32(fWait ? 1 : 0); 177 178 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 179 if (RT_SUCCESS(rc)) 180 { 181 rc = Msg.uMsg.GetUInt32(puMsg); 182 if (RT_SUCCESS(rc)) 183 rc = Msg.cParms.GetUInt32(pcParms); 184 } 185 186 LogFlowFuncLeaveRC(rc); 187 return rc; 188 } 189 190 static int vbglR3ClipboardRecvListOpen(HGCMCLIENTID idClient, PVBOXCLIPBOARDLISTHDR pListHdr) 191 { 192 AssertPtrReturn(pListHdr, VERR_INVALID_POINTER); 193 194 VBoxClipboardListOpenMsg Msg; 195 RT_ZERO(Msg); 196 197 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 198 VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_OPEN); 199 200 Msg.uContext.SetUInt32(0); /** @todo Context ID not used yet. */ 201 Msg.uHandle.SetUInt64(0); 202 Msg.fList.SetUInt32(0); 203 Msg.fFeatures.SetUInt32(0); 204 Msg.cbFilter.SetUInt32(0); 205 Msg.pvFilter.SetPtr(pListHdr->pszFilter, pListHdr->cbFilter); 206 207 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 208 if (RT_SUCCESS(rc)) 209 { 210 rc = Msg.fList.GetUInt32(&pListHdr->fList); AssertRC(rc); 211 rc = Msg.fFeatures.GetUInt32(&pListHdr->fFeatures); AssertRC(rc); 212 } 213 214 LogFlowFuncLeaveRC(rc); 215 return rc; 216 } 217 218 static int vbglR3ClipboardRecvListClose(HGCMCLIENTID idClient, PVBOXCLIPBOARDLISTHANDLE phList) 219 { 220 AssertPtrReturn(phList, VERR_INVALID_POINTER); 221 222 VBoxClipboardListCloseMsg Msg; 223 RT_ZERO(Msg); 224 225 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 226 VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_CLOSE); 227 228 Msg.uContext.SetUInt32(0); /** @todo Context ID not used yet. */ 229 Msg.uHandle.SetUInt64(0); 230 231 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 232 if (RT_SUCCESS(rc)) 233 { 234 rc = Msg.uHandle.GetUInt64(phList); AssertRC(rc); 235 } 236 237 LogFlowFuncLeaveRC(rc); 238 return rc; 239 } 240 241 static int vbglR3ClipboardRecvListHdrRead(HGCMCLIENTID idClient, PVBOXCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTHDR pListHdr) 242 { 243 AssertPtrReturn(pListHdr, VERR_INVALID_POINTER); 244 AssertPtrReturn(phList, VERR_INVALID_POINTER); 245 246 VBoxClipboardListHdrReadMsg Msg; 247 RT_ZERO(Msg); 248 249 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 250 VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR_READ); 251 252 Msg.uContext.SetUInt32(0); /** @todo Context ID not used yet. */ 253 Msg.uHandle.SetUInt64(0); 254 Msg.cTotalObjects.SetUInt64(0); 255 Msg.cbTotalSize.SetUInt64(0); 183 256 Msg.enmCompression.SetUInt32(0); 184 257 Msg.enmChecksumType.SetUInt32(0); 185 Msg.pvChecksum.SetPtr(pDataHdr->pvChecksum, pDataHdr->cbChecksum); 186 Msg.cbChecksum.SetUInt32(0); 187 188 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 189 if (RT_SUCCESS(rc)) 190 { 191 /* Msg.uContext not needed here. */ 192 Msg.uFlags.GetUInt32(&pDataHdr->uFlags); 193 Msg.uScreenId.GetUInt32(&pDataHdr->uScreenId); 194 Msg.cbTotal.GetUInt64(&pDataHdr->cbTotal); 195 Msg.cbMeta.GetUInt32(&pDataHdr->cbMeta); 196 Msg.cbMetaFmt.GetUInt32(&pDataHdr->cbMetaFmt); 197 Msg.cObjects.GetUInt64(&pDataHdr->cObjects); 198 Msg.enmCompression.GetUInt32(&pDataHdr->enmCompression); 199 Msg.enmChecksumType.GetUInt32((uint32_t *)&pDataHdr->enmChecksumType); 200 Msg.cbChecksum.GetUInt32(&pDataHdr->cbChecksum); 201 202 AssertReturn(SharedClipboardURIDataHdrIsValid(pDataHdr), VERR_INVALID_PARAMETER); 203 } 204 205 LogFlowFuncLeaveRC(rc); 206 return rc; 207 } 208 209 /** 210 * Sends a guest clipboard data header to the host. 211 * 212 * This is usually called in reply to a VBOX_SHARED_CLIPBOARD_HOST_READ_DATA message from the host 213 * (if URI format is specified). 258 259 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 260 if (RT_SUCCESS(rc)) 261 { 262 rc = Msg.uHandle.GetUInt64(phList); AssertRC(rc); 263 } 264 265 LogFlowFuncLeaveRC(rc); 266 return rc; 267 } 268 269 static int vbglR3ClipboardRecvListEntryRead(HGCMCLIENTID idClient, PVBOXCLIPBOARDLISTHANDLE phList, 270 PVBOXCLIPBOARDLISTENTRY pListEntry) 271 { 272 AssertPtrReturn(pListEntry, VERR_INVALID_POINTER); 273 AssertPtrReturn(phList, VERR_INVALID_POINTER); 274 275 VBoxClipboardListEntryReadMsg Msg; 276 RT_ZERO(Msg); 277 278 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 279 VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ); 280 281 Msg.uContext.SetUInt32(0); /** @todo Context ID not used yet. */ 282 Msg.uHandle.SetUInt64(0); 283 Msg.fInfo.SetUInt32(0); 284 Msg.cbInfo.SetUInt32(0); 285 Msg.pvInfo.SetPtr(pListEntry->pvInfo, pListEntry->cbInfo); 286 287 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 288 if (RT_SUCCESS(rc)) 289 { 290 rc = Msg.uHandle.GetUInt64(phList); AssertRC(rc); 291 rc = Msg.fInfo.GetUInt32(&pListEntry->fInfo); AssertRC(rc); 292 rc = Msg.cbInfo.GetUInt32(&pListEntry->cbInfo); AssertRC(rc); 293 } 294 295 LogFlowFuncLeaveRC(rc); 296 return rc; 297 } 298 299 VBGLR3DECL(int) VbglR3ClipboardEventGetNext(HGCMCLIENTID idClient, PSHAREDCLIPBOARDURITRANSFER pTransfer, 300 PVBGLR3CLIPBOARDEVENT *ppEvent) 301 { 302 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 303 AssertPtrReturn(ppEvent, VERR_INVALID_POINTER); 304 305 PVBGLR3CLIPBOARDEVENT pEvent = (PVBGLR3CLIPBOARDEVENT)RTMemAllocZ(sizeof(VBGLR3CLIPBOARDEVENT)); 306 if (!pEvent) 307 return VERR_NO_MEMORY; 308 309 uint32_t uMsg = 0; 310 uint32_t cParms = 0; 311 int rc = vbglR3ClipboardGetNextMsgType(idClient, &uMsg, &cParms, true /* fWait */); 312 if (RT_SUCCESS(rc)) 313 { 314 /** @todo Check for VM session change. */ 315 } 316 317 #if 0 318 typedef struct _ 319 { 320 union 321 { 322 struct Dir 323 { 324 RTDIR hDir; 325 }; 326 } u; 327 }; 328 #endif 329 330 if (RT_SUCCESS(rc)) 331 { 332 LogFunc(("Handling uMsg=%RU32\n", uMsg)); 333 334 switch (uMsg) 335 { 336 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 337 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN: 338 { 339 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN\n")); 340 341 VBOXCLIPBOARDLISTHDR listHdr; 342 rc = SharedClipboardURIListHdrInit(&listHdr); 343 if (RT_SUCCESS(rc)) 344 { 345 rc = vbglR3ClipboardRecvListOpen(idClient, &listHdr); 346 if (RT_SUCCESS(rc)) 347 { 348 rc = SharedClipboardURITransferListOpen(pTransfer, &listHdr, NULL /* phList */); 349 } 350 351 SharedClipboardURIListHdrDestroy(&listHdr); 352 } 353 354 break; 355 } 356 357 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE: 358 { 359 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE\n")); 360 361 VBOXCLIPBOARDLISTHANDLE hList; 362 rc = vbglR3ClipboardRecvListClose(idClient, &hList); 363 if (RT_SUCCESS(rc)) 364 { 365 rc = SharedClipboardURITransferListClose(pTransfer, hList); 366 } 367 368 break; 369 } 370 371 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ: 372 { 373 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ\n")); 374 375 /** @todo Handle filter + list features. */ 376 377 VBOXCLIPBOARDLISTHDR listHdr; 378 rc = SharedClipboardURIListHdrInit(&listHdr); 379 if (RT_SUCCESS(rc)) 380 { 381 VBOXCLIPBOARDLISTHANDLE hList; 382 rc = vbglR3ClipboardRecvListHdrRead(idClient, &hList, &listHdr); 383 if (RT_SUCCESS(rc)) 384 { 385 if (SharedClipboardURITransferListHandleIsValid(pTransfer, hList)) 386 { 387 rc = VbglR3ClipboardSendListHdrWrite(idClient, hList, &listHdr); 388 } 389 else 390 rc = VERR_INVALID_HANDLE; 391 } 392 393 SharedClipboardURIListHdrDestroy(&listHdr); 394 } 395 396 break; 397 } 398 399 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_WRITE: 400 { 401 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_WRITE\n")); 402 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_LIST_HDR_WRITE; 403 break; 404 } 405 406 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ: 407 { 408 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ\n")); 409 410 VBOXCLIPBOARDLISTENTRY listEntry; 411 rc = SharedClipboardURIListEntryInit(&listEntry); 412 if (RT_SUCCESS(rc)) 413 { 414 VBOXCLIPBOARDLISTHANDLE hList; 415 rc = vbglR3ClipboardRecvListEntryRead(idClient, &hList, &listEntry); 416 if (RT_SUCCESS(rc)) 417 { 418 if (SharedClipboardURITransferListHandleIsValid(pTransfer, hList)) 419 { 420 rc = VbglR3ClipboardSendListEntryWrite(idClient, hList, &listEntry); 421 } 422 else 423 rc = VERR_INVALID_HANDLE; 424 } 425 426 SharedClipboardURIListEntryDestroy(&listEntry); 427 } 428 break; 429 } 430 431 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_WRITE: 432 { 433 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_WRITE\n")); 434 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_LIST_ENTRY_WRITE; 435 break; 436 } 437 438 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN: 439 { 440 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN\n")); 441 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_OBJ_OPEN; 442 break; 443 } 444 445 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_CLOSE: 446 { 447 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_CLOSE\n")); 448 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_OBJ_CLOSE; 449 break; 450 } 451 452 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_READ: 453 { 454 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_READ\n")); 455 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_OBJ_READ; 456 break; 457 } 458 459 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE: 460 { 461 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE\n")); 462 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_OBJ_WRITE; 463 break; 464 } 465 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 466 467 default: 468 rc = VERR_NOT_SUPPORTED; 469 break; 470 } 471 } 472 473 474 if (RT_SUCCESS(rc)) 475 { 476 if (pEvent->enmType != VBGLR3CLIPBOARDEVENTTYPE_INVALID) 477 { 478 *ppEvent = pEvent; 479 } 480 else 481 VbglR3ClipboardEventFree(pEvent); 482 } 483 else 484 { 485 /* Report error back to the host. */ 486 VbglR3ClipboardWriteError(idClient, rc); 487 488 VbglR3ClipboardEventFree(pEvent); 489 } 490 491 LogFlowFuncLeaveRC(rc); 492 return rc; 493 } 494 495 /** 496 * Frees (destroys) a formerly allocated Shared Clipboard event. 497 * 498 * @returns IPRT status code. 499 * @param pEvent Event to free (destroy). 500 */ 501 VBGLR3DECL(void) VbglR3ClipboardEventFree(PVBGLR3CLIPBOARDEVENT pEvent) 502 { 503 if (!pEvent) 504 return; 505 506 /* Some messages require additional cleanup. */ 507 switch (pEvent->enmType) 508 { 509 default: 510 break; 511 } 512 513 RTMemFree(pEvent); 514 pEvent = NULL; 515 } 516 517 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 518 /** 519 * Sends a list header to the host. 214 520 * 215 521 * @returns VBox status code. 216 522 * @param idClient The client id returned by VbglR3ClipboardConnect(). 217 * @param pDataHdr Pointer to data header to send. 218 */ 219 VBGLR3DECL(int) VbglR3ClipboardWriteDataHdr(HGCMCLIENTID idClient, const PVBOXCLIPBOARDDATAHDR pDataHdr) 220 { 221 VBoxClipboardWriteDataHdrMsg Msg; 222 RT_ZERO(Msg); 223 224 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_HDR, VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA_HDR); 225 226 AssertReturn(SharedClipboardURIDataHdrIsValid(pDataHdr), VERR_INVALID_PARAMETER); 227 228 Msg.uContext.SetUInt32(0); /** @todo Not used yet. */ 229 Msg.uFlags.SetUInt32(pDataHdr->uFlags); /** @todo Not used yet. */ 230 Msg.uScreenId.SetUInt32(pDataHdr->uScreenId); /** @todo Not used yet. */ 231 Msg.cbTotal.SetUInt64(pDataHdr->cbTotal); 232 Msg.cbMeta.SetUInt32(pDataHdr->cbMeta); 233 Msg.cbMetaFmt.SetUInt32(pDataHdr->cbMetaFmt); 234 Msg.pvMetaFmt.SetPtr(pDataHdr->pvMetaFmt, pDataHdr->cbMetaFmt); 235 Msg.cObjects.SetUInt64(pDataHdr->cObjects); 236 Msg.enmCompression.SetUInt32(pDataHdr->enmCompression); /** @todo Not used yet. */ 237 Msg.enmChecksumType.SetUInt32(RTDIGESTTYPE_INVALID); /** @todo Not used yet. */ 238 Msg.cbChecksum.SetUInt32(0); /** @todo Not used yet. */ 239 Msg.pvChecksum.SetPtr(NULL, 0); /** @todo Not used yet. */ 240 241 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 242 243 LogFlowFunc(("cbTotal=%RU64, cbMeta=%RU32, pvMetaFmt=%p (%RU32), cObjects=%RU64, rc=%Rrc\n", 244 pDataHdr->cbTotal, pDataHdr->cbMeta, pDataHdr->pvMetaFmt, pDataHdr->cbMetaFmt, pDataHdr->cObjects, rc)); 245 246 LogFlowFuncLeaveRC(rc); 247 return rc; 248 } 249 250 /** 251 * Reads a (meta) data chunk from the host. 523 * @param hList List handle to send header for. 524 * @param pListHdr List header to send. 525 */ 526 VBGLR3DECL(int) VbglR3ClipboardSendListHdrWrite(HGCMCLIENTID idClient, 527 VBOXCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr) 528 { 529 VBoxClipboardListHdrWriteMsg Msg; 530 RT_ZERO(Msg); 531 532 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 533 VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR_WRITE); 534 535 Msg.uContext.SetUInt32(0); /** @todo Not used yet. */ 536 Msg.uHandle.SetUInt64(hList); 537 Msg.cTotalObjects.SetUInt64(pListHdr->cTotalObjects); 538 Msg.cbTotalSize.SetUInt64(pListHdr->cbTotalSize); 539 Msg.enmCompression.SetUInt32(pListHdr->enmCompression); 540 Msg.enmChecksumType.SetUInt32(RTDIGESTTYPE_INVALID); 541 542 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 543 544 LogFlowFuncLeaveRC(rc); 545 return rc; 546 } 547 548 /** 549 * Sends a list entry to the host. 252 550 * 253 551 * @returns IPRT status code. 254 * @param idClient The client id returned by VbglR3ClipboardConnect(). 255 * @param pDataHdr Data header to use. Need for accounting and stuff. 256 * @param pvData Where to store the received data from the host. 257 * @param cbData Size (in bytes) of where to store the received data. 258 * @param pcbDataRecv Where to store the received amount of data (in bytes). 259 */ 260 static int vbglR3ClipboardReadDataChunk(HGCMCLIENTID idClient, PVBOXCLIPBOARDDATAHDR pDataHdr, 261 void *pvData, uint32_t cbData, uint32_t *pcbDataRecv) 262 { 263 AssertPtrReturn(pDataHdr, VERR_INVALID_POINTER); 264 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 265 AssertReturn(cbData, VERR_INVALID_PARAMETER); 266 AssertPtrNullReturn(pcbDataRecv, VERR_INVALID_POINTER); 267 268 LogFlowFunc(("pvDate=%p, cbData=%RU32\n", pvData, cbData)); 269 270 VBoxClipboardReadDataChunkMsg Msg; 271 RT_ZERO(Msg); 272 273 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 274 VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_CHUNK, VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA_CHUNK); 552 * @param idClient The client id returned by VbglR3ClipboardConnect() 553 * @param hList List handle to send entry for. 554 * @param pListEntry List entry to send. 555 */ 556 VBGLR3DECL(int) VbglR3ClipboardSendListEntryWrite(HGCMCLIENTID idClient, 557 VBOXCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry) 558 { 559 AssertPtrReturn(pListEntry, VERR_INVALID_POINTER); 560 561 VBoxClipboardListEntryWriteMsg Msg; 562 RT_ZERO(Msg); 563 564 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 565 VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_WRITE); 566 567 Msg.uContext.SetUInt32(0); /** @todo Not used yet. */ 568 Msg.uHandle.SetUInt64(hList); 569 Msg.fInfo.SetUInt32(pListEntry->fInfo); 570 Msg.cbInfo.SetUInt32(pListEntry->cbInfo); 571 Msg.pvInfo.SetPtr(pListEntry->pvInfo, pListEntry->cbInfo); 572 573 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 574 575 LogFlowFuncLeaveRC(rc); 576 return rc; 577 } 578 579 VBGLR3DECL(int) VbglR3ClipboardObjOpen(HGCMCLIENTID idClient, 580 const char *pszPath, PVBOXCLIPBOARDCREATEPARMS pCreateParms, 581 PSHAREDCLIPBOARDOBJHANDLE phObj) 582 { 583 AssertPtrReturn(pszPath, VERR_INVALID_POINTER); 584 AssertPtrReturn(pCreateParms, VERR_INVALID_POINTER); 585 AssertPtrReturn(phObj, VERR_INVALID_POINTER); 586 587 VBoxClipboardObjOpenMsg Msg; 588 RT_ZERO(Msg); 589 590 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 591 VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_OPEN, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_OPEN); 592 593 int rc; 594 595 char *pszPathTmp = RTStrDup(pszPath); 596 if (pszPathTmp) 597 { 598 Msg.szPath.SetPtr((void *)pszPathTmp, (uint32_t)strlen(pszPathTmp) + 1 /* Include terminating zero */); 599 Msg.parms.SetPtr(pCreateParms, sizeof(VBOXCLIPBOARDCREATEPARMS)); 600 601 rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 602 if (RT_SUCCESS(rc)) 603 { 604 *phObj = pCreateParms->uHandle; 605 } 606 607 RTStrFree(pszPathTmp); 608 } 609 else 610 rc = VERR_NO_MEMORY; 611 612 LogFlowFuncLeaveRC(rc); 613 return rc; 614 } 615 616 VBGLR3DECL(int) VbglR3ClipboardObjClose(HGCMCLIENTID idClient, SHAREDCLIPBOARDOBJHANDLE hObj) 617 { 618 VBoxClipboardObjCloseMsg Msg; 619 RT_ZERO(Msg); 620 621 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 622 VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_CLOSE, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_CLOSE); 623 624 Msg.uHandle.SetUInt64(hObj); 625 626 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 627 628 LogFlowFuncLeaveRC(rc); 629 return rc; 630 } 631 632 VBGLR3DECL(int) VbglR3ClipboardObjRead(HGCMCLIENTID idClient, SHAREDCLIPBOARDOBJHANDLE hObj, 633 void *pvData, uint32_t cbData, uint32_t *pcbRead) 634 { 635 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 636 AssertReturn(cbData, VERR_INVALID_PARAMETER); 637 /* pcbRead is optional. */ 638 639 VBoxClipboardObjReadWriteMsg Msg; 640 RT_ZERO(Msg); 641 642 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_READ, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_READ); 643 644 Msg.uContext.SetUInt32(0); 645 Msg.uHandle.SetUInt64(hObj); 275 646 Msg.pvData.SetPtr(pvData, cbData); 276 647 Msg.cbData.SetUInt32(0); … … 281 652 if (RT_SUCCESS(rc)) 282 653 { 283 uint32_t cbDataRecv;284 rc = Msg.cbData.GetUInt32(&cbDataRecv);285 AssertRC(rc); 286 if ( RT_SUCCESS(rc))654 /** @todo Context ID not used yet. */ 655 /** @todo Add checksum support. */ 656 657 if (pcbRead) 287 658 { 288 /** @todo Use checksum for validating the received data. */ 289 if (pcbDataRecv) 290 *pcbDataRecv = cbDataRecv; 291 LogFlowFuncLeaveRC(rc); 292 return rc; 659 rc = Msg.cbData.GetUInt32(pcbRead); AssertRC(rc); 660 AssertReturn(cbData >= *pcbRead, VERR_TOO_MUCH_DATA); 293 661 } 294 662 } 295 663 296 /* failure */ 297 LogFlowFuncLeaveRC(rc); 298 return rc; 299 } 300 301 /** 302 * Helper function for reading the actual clipboard (meta) data from the host. Do not call directly. 303 * 304 * @returns IPRT status code. 305 * @param idClient The client id returned by VbglR3ClipboardConnect(). 306 * @param pDataHdr Pointer to data header to use. 307 * @param pvMeta Where to store the received meta data. 308 * @param cbMeta Size (in bytes) of meta data buffer. 309 * @param pcbRead How much bytes were read on success. Optional. 310 */ 311 static int vbglR3ClipboardReadMetaDataLoop(HGCMCLIENTID idClient, PVBOXCLIPBOARDDATAHDR pDataHdr, 312 void *pvMeta, uint32_t cbMeta, uint32_t *pcbRead) 313 { 314 AssertPtrReturn(pDataHdr, VERR_INVALID_POINTER); 315 AssertPtrReturn(pvMeta, VERR_INVALID_POINTER); 316 317 LogFlowFuncEnter(); 318 319 int rc = VINF_SUCCESS; 320 321 uint32_t cbReadTotal = 0; 322 323 LogFlowFunc(("cbTotal=%RU64, cbMeta=%RU32, cObjects=%RU32\n", pDataHdr->cbTotal, pDataHdr->cbMeta, pDataHdr->cObjects)); 324 if (pDataHdr->cbMeta) 325 { 326 uint32_t cbToRead = RT_MIN(cbMeta, pDataHdr->cbMeta); 327 while (cbToRead) 328 { 329 uint32_t cbRead; 330 rc = vbglR3ClipboardReadDataChunk(idClient, pDataHdr, 331 (uint8_t *)pvMeta + cbReadTotal, cbToRead, &cbRead); 332 if (RT_FAILURE(rc)) 333 break; 334 335 Assert(cbToRead >= cbRead); 336 cbToRead -= cbRead; 337 338 cbReadTotal += cbRead; 339 } 340 } 341 342 if (RT_SUCCESS(rc)) 343 { 344 if (pcbRead) 345 *pcbRead = cbReadTotal; 346 } 347 348 LogFlowFuncLeaveRC(rc); 349 return rc; 350 } 351 352 /** 353 * Reads the actual meta data from the host, internal version. 354 * 355 * @returns IPRT status code. 356 * @param idClient The client id returned by VbglR3ClipboardConnect(). 357 * @param pDataHdr Pointer to data header to use. 358 * @param pvMeta Where to store the received meta data. 359 * @param cbMeta Size (in bytes) of meta data buffer. 360 * @param pcbRead How much bytes were read on success. Optional. 361 */ 362 static int vbglR3ClipboardReadMetaDataInternal(HGCMCLIENTID idClient, PVBOXCLIPBOARDDATAHDR pDataHdr, 363 void *pvMeta, uint32_t cbMeta, uint32_t *pcbRead) 364 { 365 LogFlowFuncEnter(); 366 367 int rc = vbglR3ClipboardReadMetaDataLoop(idClient, pDataHdr, pvMeta, cbMeta, pcbRead); 368 369 LogFlowFuncLeaveRC(rc); 370 return rc; 371 } 372 373 /** 374 * Reads the actual meta data from the host, extended version. 375 * 376 * @returns IPRT status code. 377 * @param idClient The client id returned by VbglR3ClipboardConnect(). 378 * @param pvMeta Where to store the received meta data. 379 * @param cbMeta Size (in bytes) of meta data buffer. 380 * @param pcbRead How much bytes were read on success. Optional. 381 */ 382 VBGLR3DECL(int) VbglR3ClipboardReadMetaDataEx(HGCMCLIENTID idClient, PVBOXCLIPBOARDDATAHDR pDataHdr, 383 void *pvMeta, uint32_t cbMeta, uint32_t *pcbRead) 384 { 385 return vbglR3ClipboardReadMetaDataInternal(idClient, pDataHdr, pvMeta, cbMeta, pcbRead); 386 } 387 388 /** 389 * Reads the actual meta data from the host. 390 * 391 * @returns IPRT status code. 392 * @param idClient The client id returned by VbglR3ClipboardConnect(). 393 * @param pvMeta Where to store the received meta data. 394 * @param cbMeta Size (in bytes) of meta data buffer. 395 * @param pcbRead How much bytes were read on success. Optional. 396 */ 397 VBGLR3DECL(int) VbglR3ClipboardReadMetaData(HGCMCLIENTID idClient, PVBOXCLIPBOARDDATAHDR pDataHdr, 398 void *pvMeta, uint32_t cbMeta, uint32_t *pcbRead) 399 { 400 return VbglR3ClipboardReadMetaDataEx(idClient, pDataHdr, pvMeta, cbMeta, pcbRead); 401 } 402 403 /** 404 * Writes a (meta) data chunk to the host. 405 * 406 * @returns IPRT status code. 407 * @param idClient The client id returned by VbglR3ClipboardConnect(). 408 * @param pDataHdr Data header to use. Need for accounting and stuff. 409 * @param pvData Where to store the received data from the host. 410 * @param cbData Size (in bytes) of where to store the received data. 411 * @param pcbDataWritten Where to store the written amount of data (in bytes). 412 */ 413 static int vbglR3ClipboardWriteDataChunk(HGCMCLIENTID idClient, PVBOXCLIPBOARDDATAHDR pDataHdr, 414 void *pvData, uint32_t cbData, uint32_t *pcbDataWritten) 415 { 416 AssertPtrReturn(pDataHdr, VERR_INVALID_POINTER); 417 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 418 AssertReturn(cbData, VERR_INVALID_PARAMETER); 419 AssertPtrNullReturn(pcbDataWritten, VERR_INVALID_POINTER); 420 421 LogFlowFunc(("pvDate=%p, cbData=%RU32\n", pvData, cbData)); 422 423 VBoxClipboardReadDataChunkMsg Msg; 424 RT_ZERO(Msg); 425 426 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 427 VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_CHUNK, VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA_CHUNK); 428 429 Msg.uContext.SetUInt32(0); /** @todo Not used yet. */ 664 LogFlowFuncLeaveRC(rc); 665 return rc; 666 } 667 668 VBGLR3DECL(int) VbglR3ClipboardObjWrite(HGCMCLIENTID idClient, 669 SHAREDCLIPBOARDOBJHANDLE hObj, 670 void *pvData, uint32_t cbData, uint32_t *pcbWritten) 671 { 672 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 673 AssertReturn(cbData, VERR_INVALID_PARAMETER); 674 /* pcbWritten is optional. */ 675 676 VBoxClipboardObjReadWriteMsg Msg; 677 RT_ZERO(Msg); 678 679 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_WRITE, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_WRITE); 680 681 Msg.uContext.SetUInt32(0); 682 Msg.uHandle.SetUInt64(hObj); 683 Msg.pvData.SetPtr(pvData, cbData); 430 684 Msg.cbData.SetUInt32(cbData); 431 Msg.pvData.SetPtr(pvData, cbData);432 Msg.cbChecksum.SetUInt32(0);433 Msg.pvChecksum.SetPtr(NULL, 0);434 435 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));436 if (RT_SUCCESS(rc))437 {438 if (pcbDataWritten)439 *pcbDataWritten = cbData;440 }441 442 /* failure */443 LogFlowFuncLeaveRC(rc);444 return rc;445 }446 447 /**448 * Writes the actual meta data to the host, internal version.449 *450 * @returns IPRT status code.451 * @param idClient The client id returned by VbglR3ClipboardConnect().452 * @param pDataHdr Pointer to data header to use.453 * @param pvMeta Meta data buffer to write.454 * @param cbMeta Size (in bytes) of meta data buffer.455 * @param pcbWritten How much bytes were written on success. Optional.456 */457 static int vbglR3ClipboardWriteMetaDataInternal(HGCMCLIENTID idClient, PVBOXCLIPBOARDDATAHDR pDataHdr,458 const void *pvMeta, uint32_t cbMeta, uint32_t *pcbWritten)459 {460 AssertPtrReturn(pDataHdr, VERR_INVALID_POINTER);461 AssertPtrReturn(pvMeta, VERR_INVALID_POINTER);462 463 LogFlowFuncEnter();464 465 int rc = VINF_SUCCESS;466 467 uint32_t cbWrittenTotal = 0;468 469 LogFlowFunc(("cbTotal=%RU64, cbMeta=%RU32, cObjects=%RU32\n", pDataHdr->cbTotal, pDataHdr->cbMeta, pDataHdr->cObjects));470 if (pDataHdr->cbMeta)471 {472 uint32_t cbToWrite = RT_MIN(cbMeta, pDataHdr->cbMeta);473 while (cbToWrite)474 {475 uint32_t cbWritten;476 rc = vbglR3ClipboardWriteDataChunk(idClient, pDataHdr,477 (uint8_t *)pvMeta + cbWrittenTotal, cbToWrite, &cbWritten);478 if (RT_FAILURE(rc))479 break;480 481 Assert(cbToWrite >= cbWritten);482 cbToWrite -= cbWritten;483 484 cbWrittenTotal += cbWritten;485 }486 }487 488 if (RT_SUCCESS(rc))489 {490 if (pcbWritten)491 *pcbWritten = cbWrittenTotal;492 }493 494 LogFlowFunc(("cbWrittenTotal=%RU32, rc=%Rrc\n", cbWrittenTotal, rc));495 return rc;496 }497 498 /**499 * Writes the actual meta data to the host, extended version.500 *501 * @returns IPRT status code.502 * @param idClient The client id returned by VbglR3ClipboardConnect().503 * @param pDataHdr Pointer to data header to use.504 * @param pvMeta Pointer to meta data buffer.505 * @param cbMeta Size (in bytes) of meta data buffer.506 * @param pcbWritten How much bytes were written on success. Optional.507 */508 VBGLR3DECL(int) VbglR3ClipboardWriteMetaDataEx(HGCMCLIENTID idClient, PVBOXCLIPBOARDDATAHDR pDataHdr,509 const void *pvMeta, uint32_t cbMeta, uint32_t *pcbWritten)510 {511 int rc = vbglR3ClipboardWriteMetaDataInternal(idClient, pDataHdr, pvMeta, cbMeta, pcbWritten);512 513 LogFlowFuncLeaveRC(rc);514 return rc;515 }516 517 /**518 * Writes the actual meta data to the host.519 *520 * @returns IPRT status code.521 * @param idClient The client id returned by VbglR3ClipboardConnect().522 * @param pDataHdr Pointer to data header to use.523 * @param pvMeta Pointer to meta data buffer.524 * @param cbMeta Size (in bytes) of meta data buffer.525 * @param pcbWritten How much bytes were written on success. Optional.526 */527 VBGLR3DECL(int) VbglR3ClipboardWriteMetaData(HGCMCLIENTID idClient, PVBOXCLIPBOARDDATAHDR pDataHdr,528 const void *pvMeta, uint32_t cbMeta, uint32_t *pcbWritten)529 {530 return VbglR3ClipboardWriteMetaDataEx(idClient, pDataHdr, pvMeta, cbMeta, pcbWritten);531 }532 533 /**534 * Reads a directory entry from the host.535 *536 * @returns IPRT status code.537 * @param idClient The client id returned by VbglR3ClipboardConnect().538 * @param pszDirname Where to store the directory name of the directory being created.539 * @param cbDirname Size (in bytes) of where to store the directory name of the directory being created.540 * @param pcbDirnameRecv Size (in bytes) of the actual directory name received.541 * @param pfMode Where to store the directory creation mode.542 */543 VBGLR3DECL(int) VbglR3ClipboardReadDir(HGCMCLIENTID idClient,544 char *pszDirname,545 uint32_t cbDirname,546 uint32_t *pcbDirnameRecv,547 uint32_t *pfMode)548 {549 AssertPtrReturn(pszDirname, VERR_INVALID_POINTER);550 AssertReturn(cbDirname, VERR_INVALID_PARAMETER);551 AssertPtrReturn(pcbDirnameRecv, VERR_INVALID_POINTER);552 AssertPtrReturn(pfMode, VERR_INVALID_POINTER);553 554 VBoxClipboardReadDirMsg Msg;555 RT_ZERO(Msg);556 557 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DIR, VBOX_SHARED_CLIPBOARD_CPARMS_READ_DIR);558 /** @todo Context ID not used yet. */559 Msg.uContext.SetUInt32(0);560 Msg.pvName.SetPtr(pszDirname, cbDirname);561 Msg.cbName.SetUInt32(cbDirname);562 Msg.fMode.SetUInt32(0);563 564 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));565 if (RT_SUCCESS(rc))566 {567 /** @todo Context ID not used yet. */568 rc = Msg.cbName.GetUInt32(pcbDirnameRecv); AssertRC(rc);569 rc = Msg.fMode.GetUInt32(pfMode); AssertRC(rc);570 571 AssertReturn(cbDirname >= *pcbDirnameRecv, VERR_TOO_MUCH_DATA);572 }573 574 return rc;575 }576 577 /**578 * Writes a guest directory to the host.579 *580 * @returns IPRT status code.581 * @param idClient The client id returned by VbglR3ClipboardConnect().582 * @param pszPath Directory path.583 * @param cbPath Size (in bytes) of directory path.584 * @param fMode File mode for directory (IPRT-style).585 */586 VBGLR3DECL(int) VbglR3ClipboardWriteDir(HGCMCLIENTID idClient,587 const char *pszPath,588 uint32_t cbPath,589 uint32_t fMode)590 {591 const size_t cchDir = strlen(pszPath);592 593 if ( !cchDir594 || cchDir > RTPATH_MAX595 || cchDir != cbPath) /* UTF-8 */596 return VERR_INVALID_PARAMETER;597 598 const uint32_t cbPathSz = (uint32_t)cchDir + 1; /* Include termination. */599 600 VBoxClipboardWriteDirMsg Msg;601 RT_ZERO(Msg);602 603 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DIR, VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DIR);604 /** @todo Context ID not used yet. */605 Msg.pvName.SetPtr((void *)pszPath, (uint32_t)cbPathSz);606 Msg.cbName.SetUInt32(cbPathSz);607 Msg.fMode.SetUInt32(fMode);608 609 return VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));610 }611 612 /**613 * Receives a file header from the host.614 *615 * @returns IPRT status code.616 * @param idClient The client id returned by VbglR3ClipboardConnect().617 * @param pszFilename Where to store the file name of the file being transferred.618 * @param cbFilename Size (in bytes) of where to store the file name of the file being transferred.619 * @param puFlags File transfer flags. Currently not being used.620 * @param pfMode Where to store the file creation mode.621 * @param pcbTotal Where to store the file size (in bytes).622 */623 VBGLR3DECL(int) VbglR3ClipboardReadFileHdr(HGCMCLIENTID idClient,624 char *pszFilename,625 uint32_t cbFilename,626 uint32_t *puFlags,627 uint32_t *pfMode,628 uint64_t *pcbTotal)629 {630 AssertPtrReturn(pszFilename, VERR_INVALID_POINTER);631 AssertReturn(cbFilename, VERR_INVALID_PARAMETER);632 AssertPtrReturn(puFlags, VERR_INVALID_POINTER);633 AssertPtrReturn(pfMode, VERR_INVALID_POINTER);634 AssertReturn(pcbTotal, VERR_INVALID_POINTER);635 636 VBoxClipboardReadFileHdrMsg Msg;637 RT_ZERO(Msg);638 639 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,640 VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_FILE_HDR, VBOX_SHARED_CLIPBOARD_CPARMS_READ_FILE_HDR);641 Msg.uContext.SetUInt32(0); /** @todo Not used yet. */642 Msg.pvName.SetPtr(pszFilename, cbFilename);643 Msg.cbName.SetUInt32(cbFilename);644 Msg.uFlags.SetUInt32(0);645 Msg.fMode.SetUInt32(0);646 Msg.cbTotal.SetUInt64(0);647 648 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));649 if (RT_SUCCESS(rc))650 {651 /** @todo Get context ID. */652 rc = Msg.uFlags.GetUInt32(puFlags); AssertRC(rc);653 rc = Msg.fMode.GetUInt32(pfMode); AssertRC(rc);654 rc = Msg.cbTotal.GetUInt64(pcbTotal); AssertRC(rc);655 }656 657 return rc;658 }659 660 /**661 * Writes a file header from the guest to the host.662 *663 * @returns VBox status code.664 * @param idClient The client id returned by VbglR3ClipboardConnect().665 * @param pszFilename File name this header belong to.666 * @param cbFilename Size (in bytes) of file name.667 * @param fFlags Transfer flags; not being used and will be ignored.668 * @param fMode File mode.669 * @param cbTotal File size (in bytes).670 */671 VBGLR3DECL(int) VbglR3ClipboardWriteFileHdr(HGCMCLIENTID idClient, const char *pszFilename, uint32_t cbFilename,672 uint32_t fFlags, uint32_t fMode, uint64_t cbTotal)673 {674 RT_NOREF(fFlags);675 676 const size_t cchFile = strlen(pszFilename);677 678 if ( !cchFile679 || cchFile > RTPATH_MAX680 || cchFile != cbFilename)681 return VERR_INVALID_PARAMETER;682 683 const uint32_t cbFileSz = (uint32_t)cchFile + 1; /* Include termination. */684 685 VBoxClipboardWriteFileHdrMsg MsgHdr;686 RT_ZERO(MsgHdr);687 688 VBGL_HGCM_HDR_INIT(&MsgHdr.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_FILE_HDR, VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_FILE_HDR);689 MsgHdr.uContext.SetUInt32(0); /* Context ID; unused at the moment. */690 MsgHdr.cbName.SetUInt32(cbFileSz);691 MsgHdr.pvName.SetPtr((void *)pszFilename, (uint32_t)(cbFileSz));692 MsgHdr.uFlags.SetUInt32(0); /* Flags; unused at the moment. */693 MsgHdr.fMode.SetUInt32(fMode); /* File mode */694 MsgHdr.cbTotal.SetUInt64(cbTotal); /* File size (in bytes). */695 696 return VbglR3HGCMCall(&MsgHdr.hdr, sizeof(MsgHdr));697 }698 699 /**700 * Reads a file data chunk from the host.701 *702 * @returns IPRT status code.703 * @param idClient The client id returned by VbglR3ClipboardConnect().704 * @param pvData Where to store the file data chunk.705 * @param cbData Size (in bytes) of where to store the data chunk.706 * @param pcbRead Size (in bytes) of the actual data chunk size read.707 */708 VBGLR3DECL(int) VbglR3ClipboardReadFileData(HGCMCLIENTID idClient,709 void *pvData,710 uint32_t cbData,711 uint32_t *pcbRead)712 {713 AssertPtrReturn(pvData, VERR_INVALID_POINTER);714 AssertReturn(cbData, VERR_INVALID_PARAMETER);715 AssertPtrReturn(pcbRead, VERR_INVALID_POINTER);716 717 VBoxClipboardReadFileDataMsg Msg;718 RT_ZERO(Msg);719 720 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,721 VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_FILE_DATA, VBOX_SHARED_CLIPBOARD_CPARMS_READ_FILE_DATA);722 Msg.uContext.SetUInt32(0);723 Msg.pvData.SetPtr(pvData, cbData);724 Msg.cbData.SetUInt32(0);725 685 Msg.pvChecksum.SetPtr(NULL, 0); 726 686 Msg.cbChecksum.SetUInt32(0); … … 729 689 if (RT_SUCCESS(rc)) 730 690 { 731 /** @todo Context ID not used yet. */ 732 rc = Msg.cbData.GetUInt32(pcbRead); AssertRC(rc); 733 AssertReturn(cbData >= *pcbRead, VERR_TOO_MUCH_DATA); 734 /** @todo Add checksum support. */ 735 } 736 737 return rc; 738 } 739 740 /** 741 * Writes a file data chunk to the host. 742 * 743 * @returns VBox status code. 744 * @param idClient The client id returned by VbglR3ClipboardConnect(). 745 * @param pvData Data chunk to write. 746 * @param cbData Size (in bytes) of data chunk to write. 747 * @param pcbWritten Returns how many bytes written. 748 */ 749 VBGLR3DECL(int) VbglR3ClipboardWriteFileData(HGCMCLIENTID idClient, void *pvData, uint32_t cbData, uint32_t *pcbWritten) 750 { 751 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 752 AssertReturn(cbData, VERR_INVALID_PARAMETER); 753 AssertPtrReturn(pcbWritten, VERR_INVALID_POINTER); 754 755 VBoxClipboardWriteFileDataMsg MsgData; 756 RT_ZERO(MsgData); 757 758 VBGL_HGCM_HDR_INIT(&MsgData.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_FILE_DATA, VBOX_SHARED_CLIPBOARD_CPARMS_READ_FILE_DATA); 759 MsgData.uContext.SetUInt32(0); /* Context ID; unused at the moment. */ 760 MsgData.pvData.SetPtr(pvData, cbData); 761 MsgData.cbData.SetUInt32(cbData); 762 MsgData.pvChecksum.SetPtr(NULL, 0); 763 MsgData.cbChecksum.SetUInt32(0); 764 765 int rc = VbglR3HGCMCall(&MsgData.hdr, sizeof(MsgData)); 766 if (RT_SUCCESS(rc)) 767 { 768 *pcbWritten = cbData; 769 } 770 691 if (pcbWritten) 692 *pcbWritten = cbData; 693 } 694 695 LogFlowFuncLeaveRC(rc); 771 696 return rc; 772 697 } … … 827 752 { 828 753 int rc = vbglR3ClipboardWriteDataRaw(idClient, fFormat, pv, cb); 829 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST830 if (RT_FAILURE(rc))831 {832 int rc2 = vbglR3ClipboardWriteErrorInternal(idClient, rc);833 if (RT_FAILURE(rc2))834 LogFlowFunc(("Unable to send error (%Rrc) to host, rc=%Rrc\n", rc, rc2));835 }836 #endif837 754 838 755 return rc; … … 847 764 * @param rcErr Error (IPRT-style) to send. 848 765 */ 849 static int vbglR3ClipboardWriteErrorInternal(HGCMCLIENTID idClient, int rcErr)766 VBGLR3DECL(int) VbglR3ClipboardWriteError(HGCMCLIENTID idClient, int rcErr) 850 767 { 851 768 VBoxClipboardWriteErrorMsg Msg; 852 769 RT_ZERO(Msg); 853 770 854 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_ERROR, 2); 771 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR, VBOX_SHARED_CLIPBOARD_CPARMS_ERROR); 772 855 773 /** @todo Context ID not used yet. */ 856 774 Msg.uContext.SetUInt32(0); … … 859 777 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 860 778 861 /*862 * Never return an error if the host did not accept the error at the current863 * time. This can be due to the host not having any appropriate callbacks864 * set which would handle that error.865 *866 * bird: Looks like VERR_NOT_SUPPORTED is what the host will return if it867 * doesn't an appropriate callback. The code used to ignore ALL errors868 * the host would return, also relevant ones.869 */870 779 if (RT_FAILURE(rc)) 871 780 LogFlowFunc(("Sending error %Rrc failed with rc=%Rrc\n", rcErr, rc)); … … 873 782 rc = VINF_SUCCESS; 874 783 875 return rc; 876 } 877 878 /** 879 * Writes an error back to the host. 880 * 881 * @returns IPRT status code. 882 * @param idClient The client id returned by VbglR3ClipboardConnect(). 883 * @param rcErr Error (IPRT-style) to send. 884 */ 885 VBGLR3DECL(int) vbglR3ClipboardWriteError(HGCMCLIENTID idClient, int rcErr) 886 { 887 return vbglR3ClipboardWriteErrorInternal(idClient, rcErr); 784 if (RT_FAILURE(rc)) 785 LogRel(("Shared Clipboard: Reporting error %Rrc to the host failed with %Rrc\n", rcErr, rc)); 786 787 LogFlowFuncLeaveRC(rc); 788 return rc; 888 789 } 889 790 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ -
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibDragAndDrop.cpp
r78080 r79497 359 359 * @returns IPRT status code. 360 360 * @param pCtx DnD context to use. 361 * @param p DataHdr DnD data header to use. Needed for accounting.361 * @param pListHdr DnD data header to use. Needed for accounting. 362 362 * @param pDroppedFiles Dropped files object to use for maintaining the file creation / locking. 363 363 */ 364 static int vbglR3DnDHGRecvURIData(PVBGLR3GUESTDNDCMDCTX pCtx, PVBOXDNDSND DATAHDR pDataHdr, DnDDroppedFiles *pDroppedFiles)364 static int vbglR3DnDHGRecvURIData(PVBGLR3GUESTDNDCMDCTX pCtx, PVBOXDNDSNDListHdr pListHdr, DnDDroppedFiles *pDroppedFiles) 365 365 { 366 366 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 367 AssertPtrReturn(p DataHdr, VERR_INVALID_POINTER);367 AssertPtrReturn(pListHdr, VERR_INVALID_POINTER); 368 368 AssertPtrReturn(pDroppedFiles, VERR_INVALID_POINTER); 369 369 370 370 /* Only count the raw data minus the already received meta data. */ 371 Assert(p DataHdr->cbTotal >= pDataHdr->cbMeta);372 uint64_t cbToRecvBytes = p DataHdr->cbTotal - pDataHdr->cbMeta;373 uint64_t cToRecvObjs = p DataHdr->cObjects;371 Assert(pListHdr->cbTotal >= pListHdr->cbMeta); 372 uint64_t cbToRecvBytes = pListHdr->cbTotal - pListHdr->cbMeta; 373 uint64_t cToRecvObjs = pListHdr->cObjects; 374 374 375 375 LogFlowFunc(("cbToRecvBytes=%RU64, cToRecvObjs=%RU64, (cbTotal=%RU64, cbMeta=%RU32)\n", 376 cbToRecvBytes, cToRecvObjs, p DataHdr->cbTotal, pDataHdr->cbMeta));376 cbToRecvBytes, cToRecvObjs, pListHdr->cbTotal, pListHdr->cbMeta)); 377 377 378 378 /* Anything to do at all? */ … … 641 641 * @returns IPRT status code. 642 642 * @param pCtx DnD context to use. 643 * @param p DataHdr DnD data header to use. Need for accounting and stuff.643 * @param pListHdr DnD data header to use. Need for accounting and stuff. 644 644 * @param pvData Where to store the received data from the host. 645 645 * @param cbData Size (in bytes) of where to store the received data. 646 646 * @param pcbDataRecv Where to store the received amount of data (in bytes). 647 647 */ 648 static int vbglR3DnDHGRecvDataRaw(PVBGLR3GUESTDNDCMDCTX pCtx, PVBOXDNDSND DATAHDR pDataHdr,648 static int vbglR3DnDHGRecvDataRaw(PVBGLR3GUESTDNDCMDCTX pCtx, PVBOXDNDSNDListHdr pListHdr, 649 649 void *pvData, uint32_t cbData, uint32_t *pcbDataRecv) 650 650 { 651 651 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 652 AssertPtrReturn(p DataHdr, VERR_INVALID_POINTER);652 AssertPtrReturn(pListHdr, VERR_INVALID_POINTER); 653 653 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 654 654 AssertReturn(cbData, VERR_INVALID_PARAMETER); … … 694 694 * @returns IPRT status code. 695 695 * @param pCtx DnD context to use. 696 * @param p DataHdr Where to store the receivd DnD data header.697 */ 698 static int vbglR3DnDHGRecv DataHdr(PVBGLR3GUESTDNDCMDCTX pCtx, PVBOXDNDSNDDATAHDR pDataHdr)696 * @param pListHdr Where to store the receivd DnD data header. 697 */ 698 static int vbglR3DnDHGRecvListHdr(PVBGLR3GUESTDNDCMDCTX pCtx, PVBOXDNDSNDListHdr pListHdr) 699 699 { 700 700 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 701 AssertPtrReturn(p DataHdr, VERR_INVALID_POINTER);701 AssertPtrReturn(pListHdr, VERR_INVALID_POINTER); 702 702 703 703 Assert(pCtx->uProtocol >= 3); /* Only for protocol v3 and up. */ 704 704 705 VBOXDNDHGSEND DATAHDRMSG Msg;705 VBOXDNDHGSENDListHdrMSG Msg; 706 706 RT_ZERO(Msg); 707 707 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, HOST_DND_HG_SND_DATA_HDR, 12); … … 711 711 Msg.cbTotal.SetUInt64(0); 712 712 Msg.cbMeta.SetUInt32(0); 713 Msg.pvMetaFmt.SetPtr(p DataHdr->pvMetaFmt, pDataHdr->cbMetaFmt);713 Msg.pvMetaFmt.SetPtr(pListHdr->pvMetaFmt, pListHdr->cbMetaFmt); 714 714 Msg.cbMetaFmt.SetUInt32(0); 715 715 Msg.cObjects.SetUInt64(0); 716 716 Msg.enmCompression.SetUInt32(0); 717 717 Msg.enmChecksumType.SetUInt32(0); 718 Msg.pvChecksum.SetPtr(p DataHdr->pvChecksum, pDataHdr->cbChecksum);718 Msg.pvChecksum.SetPtr(pListHdr->pvChecksum, pListHdr->cbChecksum); 719 719 Msg.cbChecksum.SetUInt32(0); 720 720 … … 723 723 { 724 724 /* Msg.uContext not needed here. */ 725 Msg.uFlags.GetUInt32(&p DataHdr->uFlags);726 Msg.uScreenId.GetUInt32(&p DataHdr->uScreenId);727 Msg.cbTotal.GetUInt64(&p DataHdr->cbTotal);728 Msg.cbMeta.GetUInt32(&p DataHdr->cbMeta);729 Msg.cbMetaFmt.GetUInt32(&p DataHdr->cbMetaFmt);730 Msg.cObjects.GetUInt64(&p DataHdr->cObjects);731 Msg.enmCompression.GetUInt32(&p DataHdr->enmCompression);732 Msg.enmChecksumType.GetUInt32((uint32_t *)&p DataHdr->enmChecksumType);733 Msg.cbChecksum.GetUInt32(&p DataHdr->cbChecksum);725 Msg.uFlags.GetUInt32(&pListHdr->uFlags); 726 Msg.uScreenId.GetUInt32(&pListHdr->uScreenId); 727 Msg.cbTotal.GetUInt64(&pListHdr->cbTotal); 728 Msg.cbMeta.GetUInt32(&pListHdr->cbMeta); 729 Msg.cbMetaFmt.GetUInt32(&pListHdr->cbMetaFmt); 730 Msg.cObjects.GetUInt64(&pListHdr->cObjects); 731 Msg.enmCompression.GetUInt32(&pListHdr->enmCompression); 732 Msg.enmChecksumType.GetUInt32((uint32_t *)&pListHdr->enmChecksumType); 733 Msg.cbChecksum.GetUInt32(&pListHdr->cbChecksum); 734 734 } 735 735 … … 744 744 * @returns IPRT status code. 745 745 * @param pCtx DnD context to use. 746 * @param p DataHdr Where to store the data header data.746 * @param pListHdr Where to store the data header data. 747 747 * @param ppvData Returns the received meta data. Needs to be free'd by the caller. 748 748 * @param pcbData Where to store the size (in bytes) of the received meta data. 749 749 */ 750 static int vbglR3DnDHGRecvDataLoop(PVBGLR3GUESTDNDCMDCTX pCtx, PVBOXDNDSND DATAHDR pDataHdr,750 static int vbglR3DnDHGRecvDataLoop(PVBGLR3GUESTDNDCMDCTX pCtx, PVBOXDNDSNDListHdr pListHdr, 751 751 void **ppvData, uint64_t *pcbData) 752 752 { 753 753 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 754 AssertPtrReturn(p DataHdr, VERR_INVALID_POINTER);754 AssertPtrReturn(pListHdr, VERR_INVALID_POINTER); 755 755 AssertPtrReturn(ppvData, VERR_INVALID_POINTER); 756 756 AssertPtrReturn(pcbData, VERR_INVALID_POINTER); … … 761 761 LogFlowFuncEnter(); 762 762 763 rc = vbglR3DnDHGRecv DataHdr(pCtx, pDataHdr);763 rc = vbglR3DnDHGRecvListHdr(pCtx, pListHdr); 764 764 if (RT_FAILURE(rc)) 765 765 return rc; 766 766 767 LogFlowFunc(("cbTotal=%RU64, cbMeta=%RU32, cObjects=%RU32\n", p DataHdr->cbTotal, pDataHdr->cbMeta, pDataHdr->cObjects));768 if (p DataHdr->cbMeta)767 LogFlowFunc(("cbTotal=%RU64, cbMeta=%RU32, cObjects=%RU32\n", pListHdr->cbTotal, pListHdr->cbMeta, pListHdr->cObjects)); 768 if (pListHdr->cbMeta) 769 769 { 770 770 uint64_t cbDataTmp = 0; 771 void *pvDataTmp = RTMemAlloc(p DataHdr->cbMeta);771 void *pvDataTmp = RTMemAlloc(pListHdr->cbMeta); 772 772 if (!pvDataTmp) 773 773 rc = VERR_NO_MEMORY; … … 776 776 { 777 777 uint8_t *pvDataOff = (uint8_t *)pvDataTmp; 778 while (cbDataTmp < p DataHdr->cbMeta)778 while (cbDataTmp < pListHdr->cbMeta) 779 779 { 780 rc = vbglR3DnDHGRecvDataRaw(pCtx, p DataHdr,781 pvDataOff, RT_MIN(p DataHdr->cbMeta - cbDataTmp, pCtx->cbMaxChunkSize),780 rc = vbglR3DnDHGRecvDataRaw(pCtx, pListHdr, 781 pvDataOff, RT_MIN(pListHdr->cbMeta - cbDataTmp, pCtx->cbMaxChunkSize), 782 782 &cbDataRecv); 783 783 if (RT_SUCCESS(rc)) 784 784 { 785 785 LogFlowFunc(("cbDataRecv=%RU32, cbDataTmp=%RU64\n", cbDataRecv, cbDataTmp)); 786 Assert(cbDataTmp + cbDataRecv <= p DataHdr->cbMeta);786 Assert(cbDataTmp + cbDataRecv <= pListHdr->cbMeta); 787 787 cbDataTmp += cbDataRecv; 788 788 pvDataOff += cbDataRecv; … … 794 794 if (RT_SUCCESS(rc)) 795 795 { 796 Assert(cbDataTmp == p DataHdr->cbMeta);796 Assert(cbDataTmp == pListHdr->cbMeta); 797 797 798 798 LogFlowFunc(("Received %RU64 bytes of data\n", cbDataTmp)); … … 833 833 /* The rest is optional. */ 834 834 835 VBOXDND DATAHDR dataHdr;836 RT_ZERO( dataHdr);835 VBOXDNDListHdr ListHdr; 836 RT_ZERO(ListHdr); 837 837 838 838 AssertMsg(pCtx->cbMaxChunkSize, ("Maximum chunk size must not be 0\n")); 839 839 840 dataHdr.cbMetaFmt = pCtx->cbMaxChunkSize;841 dataHdr.pvMetaFmt = RTMemAlloc(dataHdr.cbMetaFmt);842 if (! dataHdr.pvMetaFmt)840 ListHdr.cbMetaFmt = pCtx->cbMaxChunkSize; 841 ListHdr.pvMetaFmt = RTMemAlloc(ListHdr.cbMetaFmt); 842 if (!ListHdr.pvMetaFmt) 843 843 return VERR_NO_MEMORY; 844 844 … … 849 849 uint64_t cbData = 0; 850 850 851 int rc = vbglR3DnDHGRecvDataLoop(pCtx, & dataHdr, &pvData, &cbData);851 int rc = vbglR3DnDHGRecvDataLoop(pCtx, &ListHdr, &pvData, &cbData); 852 852 if (RT_SUCCESS(rc)) 853 853 { … … 860 860 * VBoxTray) small by not having too much redundant code. 861 861 */ 862 Assert( dataHdr.cbMetaFmt);863 AssertPtr( dataHdr.pvMetaFmt);864 if (DnDMIMEHasFileURLs((char *) dataHdr.pvMetaFmt, dataHdr.cbMetaFmt)) /* URI data. */862 Assert(ListHdr.cbMetaFmt); 863 AssertPtr(ListHdr.pvMetaFmt); 864 if (DnDMIMEHasFileURLs((char *)ListHdr.pvMetaFmt, ListHdr.cbMetaFmt)) /* URI data. */ 865 865 { 866 866 AssertPtr(pvData); … … 869 869 rc = lstURI.SetFromURIData(pvData, cbData, 0 /* fFlags */); 870 870 if (RT_SUCCESS(rc)) 871 rc = vbglR3DnDHGRecvURIData(pCtx, & dataHdr, &droppedFiles);871 rc = vbglR3DnDHGRecvURIData(pCtx, &ListHdr, &droppedFiles); 872 872 873 873 if (RT_SUCCESS(rc)) /** @todo Remove this block as soon as we hand in DnDURIList. */ … … 905 905 } 906 906 907 if ( dataHdr.pvMetaFmt)908 RTMemFree( dataHdr.pvMetaFmt);907 if (ListHdr.pvMetaFmt) 908 RTMemFree(ListHdr.pvMetaFmt); 909 909 910 910 if (RT_SUCCESS(rc)) … … 1480 1480 * @param pvData Data block to send. 1481 1481 * @param cbData Size (in bytes) of data block to send. 1482 * @param p DataHdr Data header to use -- needed for accounting.1482 * @param pListHdr Data header to use -- needed for accounting. 1483 1483 */ 1484 1484 static int vbglR3DnDGHSendDataInternal(PVBGLR3GUESTDNDCMDCTX pCtx, 1485 void *pvData, uint64_t cbData, PVBOXDNDSND DATAHDR pDataHdr)1485 void *pvData, uint64_t cbData, PVBOXDNDSNDListHdr pListHdr) 1486 1486 { 1487 1487 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 1488 1488 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 1489 1489 AssertReturn(cbData, VERR_INVALID_PARAMETER); 1490 AssertPtrReturn(p DataHdr, VERR_INVALID_POINTER);1491 1492 VBOXDNDGHSEND DATAHDRMSG MsgHdr;1490 AssertPtrReturn(pListHdr, VERR_INVALID_POINTER); 1491 1492 VBOXDNDGHSENDListHdrMSG MsgHdr; 1493 1493 RT_ZERO(MsgHdr); 1494 1494 … … 1497 1497 MsgHdr.uFlags.SetUInt32(0); /** @todo Not used yet. */ 1498 1498 MsgHdr.uScreenId.SetUInt32(0); /** @todo Not used for guest->host (yet). */ 1499 MsgHdr.cbTotal.SetUInt64(p DataHdr->cbTotal);1500 MsgHdr.cbMeta.SetUInt32(p DataHdr->cbMeta);1501 MsgHdr.pvMetaFmt.SetPtr(p DataHdr->pvMetaFmt, pDataHdr->cbMetaFmt);1502 MsgHdr.cbMetaFmt.SetUInt32(p DataHdr->cbMetaFmt);1503 MsgHdr.cObjects.SetUInt64(p DataHdr->cObjects);1499 MsgHdr.cbTotal.SetUInt64(pListHdr->cbTotal); 1500 MsgHdr.cbMeta.SetUInt32(pListHdr->cbMeta); 1501 MsgHdr.pvMetaFmt.SetPtr(pListHdr->pvMetaFmt, pListHdr->cbMetaFmt); 1502 MsgHdr.cbMetaFmt.SetUInt32(pListHdr->cbMetaFmt); 1503 MsgHdr.cObjects.SetUInt64(pListHdr->cObjects); 1504 1504 MsgHdr.enmCompression.SetUInt32(0); /** @todo Not used yet. */ 1505 1505 MsgHdr.enmChecksumType.SetUInt32(RTDIGESTTYPE_INVALID); /** @todo Not used yet. */ … … 1510 1510 1511 1511 LogFlowFunc(("cbTotal=%RU64, cbMeta=%RU32, cObjects=%RU64, rc=%Rrc\n", 1512 p DataHdr->cbTotal, pDataHdr->cbMeta, pDataHdr->cObjects, rc));1512 pListHdr->cbTotal, pListHdr->cbMeta, pListHdr->cObjects, rc)); 1513 1513 1514 1514 if (RT_SUCCESS(rc)) … … 1733 1733 /* cbData can be 0. */ 1734 1734 1735 VBOXDND DATAHDR dataHdr;1736 RT_ZERO( dataHdr);1735 VBOXDNDListHdr ListHdr; 1736 RT_ZERO(ListHdr); 1737 1737 1738 1738 /* For raw data only the total size is required to be specified. */ 1739 dataHdr.cbTotal = cbData;1740 1741 return vbglR3DnDGHSendDataInternal(pCtx, pvData, cbData, & dataHdr);1739 ListHdr.cbTotal = cbData; 1740 1741 return vbglR3DnDGHSendDataInternal(pCtx, pvData, cbData, &ListHdr); 1742 1742 } 1743 1743 … … 1786 1786 const uint32_t cbMetaFmt = (uint32_t)strlen(szMetaFmt) + 1; /* Include termination. */ 1787 1787 1788 VBOXDND DATAHDR dataHdr;1789 dataHdr.uFlags = 0; /* Flags not used yet. */1790 dataHdr.cbTotal = cbTotal;1791 dataHdr.cbMeta = cbURLIist;1792 dataHdr.pvMetaFmt = (void *)szMetaFmt;1793 dataHdr.cbMetaFmt = cbMetaFmt;1794 dataHdr.cObjects = lstURI.GetTotalCount();1788 VBOXDNDListHdr ListHdr; 1789 ListHdr.uFlags = 0; /* Flags not used yet. */ 1790 ListHdr.cbTotal = cbTotal; 1791 ListHdr.cbMeta = cbURLIist; 1792 ListHdr.pvMetaFmt = (void *)szMetaFmt; 1793 ListHdr.cbMetaFmt = cbMetaFmt; 1794 ListHdr.cObjects = lstURI.GetTotalCount(); 1795 1795 1796 1796 rc = vbglR3DnDGHSendDataInternal(pCtx, 1797 pvURIList, cbURLIist, & dataHdr);1797 pvURIList, cbURLIist, &ListHdr); 1798 1798 } 1799 1799 else -
trunk/src/VBox/Additions/common/VBoxService/VBoxServiceClipboard-os2.cpp
r78346 r79497 884 884 uint32_t Msg; 885 885 uint32_t fFormats; 886 rc = VbglR3ClipboardGetHostMsg (g_u32ClientId, &Msg, &fFormats);886 rc = VbglR3ClipboardGetHostMsgOld(g_u32ClientId, &Msg, &fFormats); 887 887 if (RT_SUCCESS(rc)) 888 888 {
Note:
See TracChangeset
for help on using the changeset viewer.