Changeset 79120 in vbox for trunk/src/VBox/HostServices/SharedClipboard
- Timestamp:
- Jun 13, 2019 10:08:33 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 131284
- Location:
- trunk/src/VBox/HostServices/SharedClipboard
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-internal.h
r79107 r79120 137 137 int vboxSvcClipboardURIReportMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Msg, uint32_t u32Formats); 138 138 bool vboxSvcClipboardURIReturnMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t cParms, VBOXHGCMSVCPARM paParms[]); 139 bool vboxSvcClipboardURIDataHdrIsValid(PVBOXCLIPBOARDDATAHDR pDataHdr);140 bool vboxSvcClipboardURIDataChunkIsValid(PVBOXCLIPBOARDDATACHUNK pDataChunk);141 void vboxSvcClipboardURIDirDataDestroy(PVBOXCLIPBOARDDIRDATA pDirData);142 bool vboxSvcClipboardURIDirDataIsValid(PVBOXCLIPBOARDDIRDATA pDirData);143 void vboxSvcClipboardURIFileHdrDestroy(PVBOXCLIPBOARDFILEHDR pFileHdr);144 bool vboxSvcClipboardURIFileHdrIsValid(PVBOXCLIPBOARDFILEHDR pFileHdr, PVBOXCLIPBOARDDATAHDR pDataHdr);145 void vboxSvcClipboardURIFileDataDestroy(PVBOXCLIPBOARDFILEDATA pFileData);146 bool vboxSvcClipboardURIFileDataIsValid(PVBOXCLIPBOARDFILEDATA pFileData, PVBOXCLIPBOARDDATAHDR pDataHdr);147 139 # endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 148 140 -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp
r79107 r79120 48 48 * @param pDirData VBOXCLIPBOARDDIRDATA structure to destroy. 49 49 */ 50 void vboxSvcClipboardURIDirDataDestroy(PVBOXCLIPBOARDDIRDATA pDirData)50 void SharedClipboardURIDirDataDestroy(PVBOXCLIPBOARDDIRDATA pDirData) 51 51 { 52 52 if (!pDirData) … … 66 66 * @param pFileHdr VBOXCLIPBOARDFILEHDR structure to destroy. 67 67 */ 68 void vboxSvcClipboardURIFileHdrDestroy(PVBOXCLIPBOARDFILEHDR pFileHdr)68 void SharedClipboardURIFileHdrDestroy(PVBOXCLIPBOARDFILEHDR pFileHdr) 69 69 { 70 70 if (!pFileHdr) … … 84 84 * @param pFileData VBOXCLIPBOARDFILEDATA structure to destroy. 85 85 */ 86 void vboxSvcClipboardURIFileDataDestroy(PVBOXCLIPBOARDFILEDATA pFileData)86 void SharedClipboardURIFileDataDestroy(PVBOXCLIPBOARDFILEDATA pFileData) 87 87 { 88 88 if (!pFileData) … … 95 95 pFileData->pvData = NULL; 96 96 } 97 } 98 99 int VBoxSvcClipboardURIReadDataHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATAHDR pDataHdr) 100 { 101 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA_HDR) 102 return VERR_INVALID_PARAMETER; 103 104 RT_BZERO(pDataHdr, sizeof(VBOXCLIPBOARDDATAHDR)); 105 106 /* Note: Context ID (paParms[0]) not used yet. */ 107 int rc = HGCMSvcGetU32(&paParms[1], &pDataHdr->uFlags); 108 if (RT_SUCCESS(rc)) 109 rc = HGCMSvcGetU32(&paParms[2], &pDataHdr->uScreenId); 110 if (RT_SUCCESS(rc)) 111 rc = HGCMSvcGetU64(&paParms[3], &pDataHdr->cbTotal); 112 if (RT_SUCCESS(rc)) 113 rc = HGCMSvcGetU32(&paParms[4], &pDataHdr->cbMeta); 114 if (RT_SUCCESS(rc)) 115 rc = HGCMSvcGetPv(&paParms[5], &pDataHdr->pvMetaFmt, &pDataHdr->cbMetaFmt); 116 if (RT_SUCCESS(rc)) 117 rc = HGCMSvcGetU32(&paParms[6], &pDataHdr->cbMetaFmt); 118 if (RT_SUCCESS(rc)) 119 rc = HGCMSvcGetU64(&paParms[7], &pDataHdr->cObjects); 120 if (RT_SUCCESS(rc)) 121 rc = HGCMSvcGetU32(&paParms[8], &pDataHdr->enmCompression); 122 if (RT_SUCCESS(rc)) 123 rc = HGCMSvcGetU32(&paParms[9], (uint32_t *)&pDataHdr->enmChecksumType); 124 if (RT_SUCCESS(rc)) 125 rc = HGCMSvcGetPv(&paParms[10], &pDataHdr->pvChecksum, &pDataHdr->cbChecksum); 126 if (RT_SUCCESS(rc)) 127 rc = HGCMSvcGetU32(&paParms[11], &pDataHdr->cbChecksum); 128 129 LogFlowFunc(("fFlags=0x%x, cbMeta=%RU32, cbTotalSize=%RU64, cObj=%RU64\n", 130 pDataHdr->uFlags, pDataHdr->cbMeta, pDataHdr->cbTotal, pDataHdr->cObjects)); 131 132 if (RT_SUCCESS(rc)) 133 { 134 /** @todo Validate pvMetaFmt + cbMetaFmt. */ 135 /** @todo Validate header checksum. */ 136 } 137 138 LogFlowFuncLeaveRC(rc); 139 return rc; 140 } 141 142 int VBoxSvcClipboardURIReadDataChunk(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATACHUNK pDataChunk) 143 { 144 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA_CHUNK) 145 return VERR_INVALID_PARAMETER; 146 147 RT_BZERO(pDataChunk, sizeof(VBOXCLIPBOARDDATACHUNK)); 148 149 /* Note: Context ID (paParms[0]) not used yet. */ 150 int rc = HGCMSvcGetPv(&paParms[1], (void**)&pDataChunk->pvData, &pDataChunk->cbData); 151 if (RT_SUCCESS(rc)) 152 rc = HGCMSvcGetU32(&paParms[2], &pDataChunk->cbData); 153 if (RT_SUCCESS(rc)) 154 rc = HGCMSvcGetPv(&paParms[3], (void**)&pDataChunk->pvChecksum, &pDataChunk->cbChecksum); 155 if (RT_SUCCESS(rc)) 156 rc = HGCMSvcGetU32(&paParms[4], &pDataChunk->cbChecksum); 157 158 if (RT_SUCCESS(rc)) 159 { 160 if (!SharedClipboardURIDataChunkIsValid(pDataChunk)) 161 rc = VERR_INVALID_PARAMETER; 162 } 163 164 LogFlowFuncLeaveRC(rc); 165 return rc; 166 } 167 168 int VBoxSvcClipboardURIReadDir(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDIRDATA pDirData) 169 { 170 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DIR) 171 return VERR_INVALID_PARAMETER; 172 173 RT_BZERO(pDirData, sizeof(VBOXCLIPBOARDDIRDATA)); 174 175 /* Note: Context ID (paParms[0]) not used yet. */ 176 int rc = HGCMSvcGetPv(&paParms[1], (void**)&pDirData->pszPath, &pDirData->cbPath); 177 if (RT_SUCCESS(rc)) 178 rc = HGCMSvcGetU32(&paParms[2], &pDirData->cbPath); 179 if (RT_SUCCESS(rc)) 180 rc = HGCMSvcGetU32(&paParms[3], &pDirData->fMode); 181 182 LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x\n", pDirData->pszPath, pDirData->cbPath, pDirData->fMode)); 183 184 if (RT_SUCCESS(rc)) 185 { 186 if (!SharedClipboardURIDirDataIsValid(pDirData)) 187 rc = VERR_INVALID_PARAMETER; 188 } 189 190 LogFlowFuncLeaveRC(rc); 191 return rc; 192 } 193 194 int VBoxSvcClipboardURIReadFileHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEHDR pFileHdr) 195 { 196 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_FILE_HDR) 197 return VERR_INVALID_PARAMETER; 198 199 RT_BZERO(pFileHdr, sizeof(VBOXCLIPBOARDFILEHDR)); 200 201 /* Note: Context ID (paParms[0]) not used yet. */ 202 int rc = HGCMSvcGetPv(&paParms[1], (void**)&pFileHdr->pszFilePath, &pFileHdr->cbFilePath); 203 if (RT_SUCCESS(rc)) 204 rc = HGCMSvcGetU32(&paParms[2], &pFileHdr->cbFilePath); 205 if (RT_SUCCESS(rc)) 206 rc = HGCMSvcGetU32(&paParms[3], &pFileHdr->fFlags); 207 if (RT_SUCCESS(rc)) 208 rc = HGCMSvcGetU32(&paParms[4], &pFileHdr->fMode); 209 if (RT_SUCCESS(rc)) 210 rc = HGCMSvcGetU64(&paParms[5], &pFileHdr->cbSize); 211 212 LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x, cbSize=%RU64\n", 213 pFileHdr->pszFilePath, pFileHdr->cbFilePath, pFileHdr->fMode, pFileHdr->cbSize)); 214 215 LogFlowFuncLeaveRC(rc); 216 return rc; 217 } 218 219 int VBoxSvcClipboardURIReadFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData) 220 { 221 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_FILE_DATA) 222 return VERR_INVALID_PARAMETER; 223 224 RT_BZERO(pFileData, sizeof(VBOXCLIPBOARDFILEDATA)); 225 226 /* Note: Context ID (paParms[0]) not used yet. */ 227 int rc = HGCMSvcGetPv(&paParms[1], (void**)&pFileData->pvData, &pFileData->cbData); 228 if (RT_SUCCESS(rc)) 229 rc = HGCMSvcGetU32(&paParms[2], &pFileData->cbData); 230 if (RT_SUCCESS(rc)) 231 rc = HGCMSvcGetPv(&paParms[3], (void**)&pFileData->pvChecksum, &pFileData->cbChecksum); 232 if (RT_SUCCESS(rc)) 233 rc = HGCMSvcGetU32(&paParms[4], &pFileData->cbChecksum); 234 235 LogFlowFunc(("pvData=0x%p, cbData=%RU32\n", pFileData->pvData, pFileData->cbData)); 236 237 LogFlowFuncLeaveRC(rc); 238 return rc; 97 239 } 98 240 … … 151 293 switch (u32Function) 152 294 { 153 case VBOX_SHARED_CLIPBOARD_ FN_READ_DATA_HDR:295 case VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_HDR: 154 296 { 155 297 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_READ_DATA_HDR\n")); … … 172 314 } 173 315 174 case VBOX_SHARED_CLIPBOARD_FN_WRITE_DATA_HDR: 175 { 176 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_DATA_HDR\n")); 177 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA_HDR) 178 { 179 if (SharedClipboardURICtxMaximumTransfersReached(&pClientData->URI)) 180 { 181 rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED; 182 break; 183 } 184 185 RT_ZERO(pTransfer->Header); 186 /* Note: Context ID (paParms[0]) not used yet. */ 187 rc = HGCMSvcGetU32(&paParms[1], &pTransfer->Header.uFlags); 188 if (RT_SUCCESS(rc)) 189 rc = HGCMSvcGetU32(&paParms[2], &pTransfer->Header.uScreenId); 190 if (RT_SUCCESS(rc)) 191 rc = HGCMSvcGetU64(&paParms[3], &pTransfer->Header.cbTotal); 192 if (RT_SUCCESS(rc)) 193 rc = HGCMSvcGetU32(&paParms[4], &pTransfer->Header.cbMeta); 194 if (RT_SUCCESS(rc)) 195 rc = HGCMSvcGetPv(&paParms[5], &pTransfer->Header.pvMetaFmt, &pTransfer->Header.cbMetaFmt); 196 if (RT_SUCCESS(rc)) 197 rc = HGCMSvcGetU32(&paParms[6], &pTransfer->Header.cbMetaFmt); 198 if (RT_SUCCESS(rc)) 199 rc = HGCMSvcGetU64(&paParms[7], &pTransfer->Header.cObjects); 200 if (RT_SUCCESS(rc)) 201 rc = HGCMSvcGetU32(&paParms[8], &pTransfer->Header.enmCompression); 202 if (RT_SUCCESS(rc)) 203 rc = HGCMSvcGetU32(&paParms[9], (uint32_t *)&pTransfer->Header.enmChecksumType); 204 if (RT_SUCCESS(rc)) 205 rc = HGCMSvcGetPv(&paParms[10], &pTransfer->Header.pvChecksum, &pTransfer->Header.cbChecksum); 206 if (RT_SUCCESS(rc)) 207 rc = HGCMSvcGetU32(&paParms[11], &pTransfer->Header.cbChecksum); 208 209 LogFlowFunc(("fFlags=0x%x, cbMeta=%RU32, cbTotalSize=%RU64, cObj=%RU64\n", 210 pTransfer->Header.uFlags, pTransfer->Header.cbMeta, pTransfer->Header.cbTotal, pTransfer->Header.cObjects)); 211 212 if (RT_SUCCESS(rc)) 213 { 214 /** @todo Validate pvMetaFmt + cbMetaFmt. */ 215 /** @todo Validate checksum. */ 216 rc = SharedClipboardMetaDataResize(&pTransfer->Meta, pTransfer->Header.cbMeta); 217 } 218 } 219 220 break; 221 } 222 223 case VBOX_SHARED_CLIPBOARD_FN_WRITE_DATA_CHUNK: 316 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_HDR: 317 RT_FALL_THROUGH(); 318 #if 0 319 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_CHUNK: 320 RT_FALL_THROUGH(); 321 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DIR: 322 RT_FALL_THROUGH(); 323 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_FILE_HDR: 324 RT_FALL_THROUGH(); 325 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_FILE_DATA: 326 RT_FALL_THROUGH(); 327 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_CANCEL: 328 RT_FALL_THROUGH(); 329 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_ERROR: 330 { 331 if ( u32Function == VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_HDR 332 && SharedClipboardURICtxMaximumTransfersReached(&pClientData->URI)) 333 { 334 rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED; 335 break; 336 } 337 338 SHAREDCLIPBOARDPROVIDERWRITEPARMS writeParms; 339 RT_ZERO(writeParms); 340 341 writeParms.u.HostService.uMsg = u32Function; 342 writeParms.u.HostService.cParms = cParms; 343 writeParms.u.HostService.paParms = paParms; 344 345 rc = pTransfer->pProvider->Write(&writeParms); 346 347 348 349 break; 350 } 351 #endif 352 353 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_CHUNK: 224 354 { 225 355 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_DATA_CHUNK\n")); 226 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA_CHUNK) 227 { 228 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 229 { 230 rc = VERR_WRONG_ORDER; 231 break; 232 } 233 234 VBOXCLIPBOARDDATACHUNK data; 235 RT_ZERO(data); 236 /* Note: Context ID (paParms[0]) not used yet. */ 237 rc = HGCMSvcGetPv(&paParms[1], (void**)&data.pvData, &data.cbData); 238 if (RT_SUCCESS(rc)) 239 rc = HGCMSvcGetU32(&paParms[2], &data.cbData); 240 if (RT_SUCCESS(rc)) 241 rc = HGCMSvcGetPv(&paParms[3], (void**)&data.pvChecksum, &data.cbChecksum); 242 if (RT_SUCCESS(rc)) 243 rc = HGCMSvcGetU32(&paParms[4], &data.cbChecksum); 244 245 if (RT_SUCCESS(rc)) 246 { 247 if (!vboxSvcClipboardURIDataChunkIsValid(&data)) 248 rc = VERR_INVALID_PARAMETER; 249 } 250 251 if (RT_SUCCESS(rc)) 252 { 253 /** @todo Validate checksum. */ 254 rc = SharedClipboardMetaDataAdd(&pTransfer->Meta, data.pvData, data.cbData); 255 if ( RT_SUCCESS(rc) 256 && SharedClipboardMetaDataGetUsed(&pTransfer->Meta) == pTransfer->Header.cbMeta) /* Meta data transfer complete? */ 356 357 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 358 { 359 rc = VERR_WRONG_ORDER; 360 break; 361 } 362 363 #if 0 364 if (RT_SUCCESS(rc)) 365 { 366 /** @todo Validate checksum. */ 367 rc = SharedClipboardMetaDataAdd(&pTransfer->Meta, data.pvData, data.cbData); 368 if ( RT_SUCCESS(rc) 369 && SharedClipboardMetaDataGetUsed(&pTransfer->Meta) == pTransfer->Header.cbMeta) /* Meta data transfer complete? */ 370 { 371 if (RT_SUCCESS(rc)) 257 372 { 258 if (RT_SUCCESS(rc)) 259 { 260 261 } 262 263 /* We're done processing the meta data, so just destroy it. */ 264 SharedClipboardMetaDataDestroy(&pTransfer->Meta); 373 265 374 } 266 } 267 } 268 break; 269 } 270 271 case VBOX_SHARED_CLIPBOARD_FN_READ_DIR: 375 376 /* We're done processing the meta data, so just destroy it. */ 377 SharedClipboardMetaDataDestroy(&pTransfer->Meta); 378 } 379 } 380 #endif 381 break; 382 } 383 384 case VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DIR: 272 385 { 273 386 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_READ_DIR\n")); … … 289 402 HGCMSvcSetU32(&paParms[3], data.fMode); 290 403 291 vboxSvcClipboardURIDirDataDestroy(&data);292 } 293 } 294 break; 295 } 296 297 case VBOX_SHARED_CLIPBOARD_ FN_WRITE_DIR:404 SharedClipboardURIDirDataDestroy(&data); 405 } 406 } 407 break; 408 } 409 410 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DIR: 298 411 { 299 412 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_DIR\n")); 300 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DIR) 301 { 302 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 303 { 304 rc = VERR_WRONG_ORDER; 305 break; 306 } 307 308 VBOXCLIPBOARDDIRDATA data; 309 RT_ZERO(data); 310 /* Note: Context ID (paParms[0]) not used yet. */ 311 rc = HGCMSvcGetPv(&paParms[1], (void**)&data.pszPath, &data.cbPath); 312 if (RT_SUCCESS(rc)) 313 rc = HGCMSvcGetU32(&paParms[2], &data.cbPath); 314 if (RT_SUCCESS(rc)) 315 rc = HGCMSvcGetU32(&paParms[3], &data.fMode); 316 317 LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x\n", data.pszPath, data.cbPath, data.fMode)); 318 319 if (RT_SUCCESS(rc)) 320 { 321 if (!vboxSvcClipboardURIDirDataIsValid(&data)) 322 rc = VERR_INVALID_PARAMETER; 323 } 324 325 if (RT_SUCCESS(rc)) 326 { 327 SharedClipboardArea *pArea = SharedClipboardURITransferGetArea(pTransfer); 328 AssertPtrBreakStmt(pArea, rc = VERR_INVALID_POINTER); 329 330 const char *pszCacheDir = pArea->GetDirAbs(); 331 char *pszDir = RTPathJoinA(pszCacheDir, data.pszPath); 332 if (pszDir) 413 414 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 415 { 416 rc = VERR_WRONG_ORDER; 417 break; 418 } 419 420 #if 0 421 if (RT_SUCCESS(rc)) 422 { 423 SharedClipboardArea *pArea = SharedClipboardURITransferGetArea(pTransfer); 424 AssertPtrBreakStmt(pArea, rc = VERR_INVALID_POINTER); 425 426 const char *pszCacheDir = pArea->GetDirAbs(); 427 char *pszDir = RTPathJoinA(pszCacheDir, data.pszPath); 428 if (pszDir) 429 { 430 LogFlowFunc(("pszDir=%s\n", pszDir)); 431 432 rc = RTDirCreateFullPath(pszDir, data.fMode); 433 if (RT_SUCCESS(rc)) 333 434 { 334 LogFlowFunc(("pszDir=%s\n", pszDir)); 335 336 rc = RTDirCreateFullPath(pszDir, data.fMode); 337 if (RT_SUCCESS(rc)) 338 { 339 /* Add for having a proper rollback. */ 340 int rc2 = pArea->AddDir(pszDir); 341 AssertRC(rc2); 342 } 343 344 RTStrFree(pszDir); 435 /* Add for having a proper rollback. */ 436 int rc2 = pArea->AddDir(pszDir); 437 AssertRC(rc2); 345 438 } 346 else 347 rc = VERR_NO_MEMORY; 348 } 349 } 350 break; 351 } 352 353 case VBOX_SHARED_CLIPBOARD_FN_READ_FILE_HDR: 439 440 RTStrFree(pszDir); 441 } 442 else 443 rc = VERR_NO_MEMORY; 444 } 445 #endif 446 break; 447 } 448 449 case VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_FILE_HDR: 354 450 { 355 451 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_READ_FILE_HDR\n")); … … 373 469 HGCMSvcSetU64(&paParms[5], hdr.cbSize); 374 470 375 vboxSvcClipboardURIFileHdrDestroy(&hdr);376 } 377 } 378 break; 379 } 380 381 case VBOX_SHARED_CLIPBOARD_ FN_WRITE_FILE_HDR:471 SharedClipboardURIFileHdrDestroy(&hdr); 472 } 473 } 474 break; 475 } 476 477 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_FILE_HDR: 382 478 { 383 479 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_FILE_HDR\n")); 384 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_FILE_HDR) 385 { 480 386 481 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 387 482 { … … 390 485 } 391 486 392 VBOXCLIPBOARDFILEHDR data; 393 RT_ZERO(data); 394 /* Note: Context ID (paParms[0]) not used yet. */ 395 rc = HGCMSvcGetPv(&paParms[1], (void**)&data.pszFilePath, &data.cbFilePath); 396 if (RT_SUCCESS(rc)) 397 rc = HGCMSvcGetU32(&paParms[2], &data.cbFilePath); 398 if (RT_SUCCESS(rc)) 399 rc = HGCMSvcGetU32(&paParms[3], &data.fFlags); 400 if (RT_SUCCESS(rc)) 401 rc = HGCMSvcGetU32(&paParms[4], &data.fMode); 402 if (RT_SUCCESS(rc)) 403 rc = HGCMSvcGetU64(&paParms[5], &data.cbSize); 404 405 LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x, cbSize=%RU64\n", 406 data.pszFilePath, data.cbFilePath, data.fMode, data.cbSize)); 407 487 #if 0 408 488 if (RT_SUCCESS(rc)) 409 489 { … … 471 551 } 472 552 } 473 474 } 475 break; 476 } 477 478 case VBOX_SHARED_CLIPBOARD_ FN_READ_FILE_DATA:553 } 554 #endif 555 break; 556 } 557 558 case VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_FILE_DATA: 479 559 { 480 560 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_READ_FILE_DATA\n")); … … 497 577 HGCMSvcSetU32(&paParms[4], data.cbChecksum); 498 578 499 vboxSvcClipboardURIFileDataDestroy(&data);500 } 501 } 502 break; 503 } 504 505 case VBOX_SHARED_CLIPBOARD_ FN_WRITE_FILE_DATA:579 SharedClipboardURIFileDataDestroy(&data); 580 } 581 } 582 break; 583 } 584 585 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_FILE_DATA: 506 586 { 507 587 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_FILE_DATA\n")); 508 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_FILE_DATA) 509 { 510 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 511 { 588 589 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 590 { 591 rc = VERR_WRONG_ORDER; 592 break; 593 } 594 595 #if 0 596 if (RT_SUCCESS(rc)) 597 { 598 if (!vboxSvcClipboardURIFileDataIsValid(&data, &pTransfer->Header)) 599 rc = VERR_INVALID_PARAMETER; 600 601 if (!SharedClipboardURIObjCtxIsValid(&pTransfer->ObjCtx)) 512 602 rc = VERR_WRONG_ORDER; 513 break; 514 } 515 516 VBOXCLIPBOARDFILEDATA data; 517 RT_ZERO(data); 518 /* Note: Context ID (paParms[0]) not used yet. */ 519 rc = HGCMSvcGetPv(&paParms[1], (void**)&data.pvData, &data.cbData); 603 } 604 605 if (RT_SUCCESS(rc)) 606 { 607 SharedClipboardURIObject *pObj = SharedClipboardURIObjCtxGetObj(&pTransfer->ObjCtx); 608 AssertPtrBreakStmt(pObj, VERR_INVALID_POINTER); 609 610 uint32_t cbWritten; 611 rc = pObj->Write(data.pvData, data.cbData, &cbWritten); 520 612 if (RT_SUCCESS(rc)) 521 rc = HGCMSvcGetU32(&paParms[2], &data.cbData); 522 if (RT_SUCCESS(rc)) 523 rc = HGCMSvcGetPv(&paParms[3], (void**)&data.pvChecksum, &data.cbChecksum); 524 if (RT_SUCCESS(rc)) 525 rc = HGCMSvcGetU32(&paParms[4], &data.cbChecksum); 526 527 LogFlowFunc(("pvData=0x%p, cbData=%RU32\n", data.pvData, data.cbData)); 528 529 if (RT_SUCCESS(rc)) 530 { 531 if (!vboxSvcClipboardURIFileDataIsValid(&data, &pTransfer->Header)) 532 rc = VERR_INVALID_PARAMETER; 533 534 if (!SharedClipboardURIObjCtxIsValid(&pTransfer->ObjCtx)) 535 rc = VERR_WRONG_ORDER; 536 } 537 538 if (RT_SUCCESS(rc)) 539 { 540 SharedClipboardURIObject *pObj = SharedClipboardURIObjCtxGetObj(&pTransfer->ObjCtx); 541 AssertPtrBreakStmt(pObj, VERR_INVALID_POINTER); 542 543 uint32_t cbWritten; 544 rc = pObj->Write(data.pvData, data.cbData, &cbWritten); 545 if (RT_SUCCESS(rc)) 613 { 614 Assert(cbWritten <= data.cbData); 615 if (cbWritten < data.cbData) 546 616 { 547 Assert(cbWritten <= data.cbData); 548 if (cbWritten < data.cbData) 549 { 550 /** @todo What to do when the host's disk is full? */ 551 rc = VERR_DISK_FULL; 552 } 553 554 if ( pObj->IsComplete() 555 || RT_FAILURE(rc)) 556 SharedClipboardURIObjCtxUninit(&pTransfer->ObjCtx); 617 /** @todo What to do when the host's disk is full? */ 618 rc = VERR_DISK_FULL; 557 619 } 558 else 559 LogRel(("Clipboard: Error writing guest file data for '%s', rc=%Rrc\n", pObj->GetDestPathAbs().c_str(), rc)); 560 } 561 } 562 break; 563 } 564 565 case VBOX_SHARED_CLIPBOARD_FN_WRITE_CANCEL: 620 621 if ( pObj->IsComplete() 622 || RT_FAILURE(rc)) 623 SharedClipboardURIObjCtxUninit(&pTransfer->ObjCtx); 624 } 625 else 626 LogRel(("Clipboard: Error writing guest file data for '%s', rc=%Rrc\n", pObj->GetDestPathAbs().c_str(), rc)); 627 } 628 #endif 629 break; 630 } 631 632 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_CANCEL: 566 633 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_CANCEL\n")); 567 634 AssertFailedStmt(rc = VERR_NOT_IMPLEMENTED); 568 635 break; 569 636 570 case VBOX_SHARED_CLIPBOARD_ FN_WRITE_ERROR:637 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_ERROR: 571 638 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_ERROR\n")); 572 639 AssertFailedStmt(rc = VERR_NOT_IMPLEMENTED); … … 618 685 } 619 686 687 /** 688 * Registers an URI clipboard area. 689 * 690 * @returns VBox status code. 691 * @param pClientState Client state to use. 692 * @param pTransfer URI transfer to register a clipboard area for. 693 */ 620 694 int vboxSvcClipboardURIAreaRegister(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer) 621 695 { … … 633 707 634 708 parms.uID = NIL_SHAREDCLIPBOARDAREAID; 635 parms.u.fn_register.pvData = SharedClipboardMetaDataMutableRaw(&pTransfer-> Meta);636 parms.u.fn_register.cbData = (uint32_t)SharedClipboardMetaDataGetUsed(&pTransfer-> Meta);709 parms.u.fn_register.pvData = SharedClipboardMetaDataMutableRaw(&pTransfer->Cache.Meta); 710 parms.u.fn_register.cbData = (uint32_t)SharedClipboardMetaDataGetUsed(&pTransfer->Cache.Meta); 637 711 638 712 /* As the meta data is now complete, register a new clipboard on the host side. */ 639 713 int rc = g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_AREA_REGISTER, &parms, sizeof(parms)); 640 714 if (RT_SUCCESS(rc)) 641 rc = pTransfer->pArea->OpenTemp(parms.uID /* Area ID */); 715 rc = pTransfer->pArea->OpenTemp(parms.uID /* Area ID */, 716 SHAREDCLIPBOARDAREA_OPEN_FLAGS_MUST_NOT_EXIST); 642 717 643 718 LogFlowFunc(("Registered new clipboard area (%RU32) by client %RU32 with rc=%Rrc\n", … … 648 723 } 649 724 725 /** 726 * Unregisters an URI clipboard area. 727 * 728 * @returns VBox status code. 729 * @param pClientState Client state to use. 730 * @param pTransfer URI transfer to unregister a clipboard area from. 731 */ 732 int vboxSvcClipboardURIAreaUnregister(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer) 733 { 734 LogFlowFuncEnter(); 735 736 if (!pTransfer->pArea) 737 return VINF_SUCCESS; 738 739 VBOXCLIPBOARDEXTAREAPARMS parms; 740 RT_ZERO(parms); 741 742 parms.uID = pTransfer->pArea->GetID(); 743 744 int rc = g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_AREA_UNREGISTER, &parms, sizeof(parms)); 745 if (RT_SUCCESS(rc)) 746 { 747 rc = pTransfer->pArea->Close(); 748 if (RT_SUCCESS(rc)) 749 { 750 delete pTransfer->pArea; 751 pTransfer->pArea = NULL; 752 } 753 } 754 755 LogFlowFunc(("Unregistered clipboard area (%RU32) by client %RU32 with rc=%Rrc\n", 756 parms.uID, pClientState->u32ClientID, rc)); 757 758 LogFlowFuncLeaveRC(rc); 759 return rc; 760 } 761 762 /** 763 * Attaches to an existing (registered) URI clipboard area. 764 * 765 * @returns VBox status code. 766 * @param pClientState Client state to use. 767 * @param pTransfer URI transfer to attach a clipboard area to. 768 */ 650 769 int vboxSvcClipboardURIAreaAttach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer) 651 770 { … … 679 798 } 680 799 800 /** 801 * Detaches from an URI clipboard area. 802 * 803 * @returns VBox status code. 804 * @param pClientState Client state to use. 805 * @param pTransfer URI transfer to detach a clipboard area from. 806 */ 681 807 int vboxSvcClipboardURIAreaDetach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer) 682 808 { -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.h
r79107 r79120 26 26 27 27 int vboxSvcClipboardURIAreaRegister(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer); 28 int vboxSvcClipboardURIAreaUnregister(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer); 28 29 int vboxSvcClipboardURIAreaAttach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer); 29 30 int vboxSvcClipboardURIAreaDetach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer); -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-utils.cpp
r79107 r79120 168 168 return fHandled; 169 169 } 170 171 /**172 * Returns whether a given clipboard data header is valid or not.173 *174 * @returns \c true if valid, \c false if not.175 * @param pDataHdr Clipboard data header to validate.176 */177 bool vboxSvcClipboardURIDataHdrIsValid(PVBOXCLIPBOARDDATAHDR pDataHdr)178 {179 RT_NOREF(pDataHdr);180 return true; /** @todo Implement this. */181 }182 183 /**184 * Returns whether a given clipboard data chunk is valid or not.185 *186 * @returns \c true if valid, \c false if not.187 * @param pDataChunk Clipboard data chunk to validate.188 */189 bool vboxSvcClipboardURIDataChunkIsValid(PVBOXCLIPBOARDDATACHUNK pDataChunk)190 {191 RT_NOREF(pDataChunk);192 return true; /** @todo Implement this. */193 }194 195 /**196 * Returns whether given clipboard directory data is valid or not.197 *198 * @returns \c true if valid, \c false if not.199 * @param pDirData Clipboard directory data to validate.200 */201 bool vboxSvcClipboardURIDirDataIsValid(PVBOXCLIPBOARDDIRDATA pDirData)202 {203 if ( !pDirData->cbPath204 || pDirData->cbPath > RTPATH_MAX)205 return false;206 207 if (!RTStrIsValidEncoding(pDirData->pszPath))208 return false;209 210 return true;211 }212 213 /**214 * Returns whether a given clipboard file header is valid or not.215 *216 * @returns \c true if valid, \c false if not.217 * @param pFileHdr Clipboard file header to validate.218 * @param pDataHdr Data header to use for validation.219 */220 bool vboxSvcClipboardURIFileHdrIsValid(PVBOXCLIPBOARDFILEHDR pFileHdr, PVBOXCLIPBOARDDATAHDR pDataHdr)221 {222 if ( !pFileHdr->cbFilePath223 || pFileHdr->cbFilePath > RTPATH_MAX)224 return false;225 226 if (!RTStrIsValidEncoding(pFileHdr->pszFilePath))227 return false;228 229 if (pFileHdr->cbSize > pDataHdr->cbTotal)230 return false;231 232 return true;233 }234 235 /**236 * Returns whether given clipboard file data is valid or not.237 *238 * @returns \c true if valid, \c false if not.239 * @param pFileData Clipboard file data to validate.240 * @param pDataHdr Data header to use for validation.241 */242 bool vboxSvcClipboardURIFileDataIsValid(PVBOXCLIPBOARDFILEDATA pFileData, PVBOXCLIPBOARDDATAHDR pDataHdr)243 {244 RT_NOREF(pFileData, pDataHdr);245 return true;246 }247 170 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 248 171 -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp
r79108 r79120 511 511 switch (u32Function) 512 512 { 513 case VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG:513 case VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG: 514 514 { 515 515 /* The quest requests a host message. */ … … 555 555 } break; 556 556 557 case VBOX_SHARED_CLIPBOARD_ FN_REPORT_FORMATS:557 case VBOX_SHARED_CLIPBOARD_GUEST_FN_REPORT_FORMATS: 558 558 { 559 559 /* The guest reports that some formats are available. */ … … 601 601 602 602 PSHAREDCLIPBOARDURITRANSFER pTransfer; 603 rc = SharedClipboardURITransferCreate(SHAREDCLIPBOARDURITRANSFERDIR_READ, &creationCtx, &pTransfer); 603 rc = SharedClipboardURITransferCreate(SHAREDCLIPBOARDURITRANSFERDIR_READ, 604 &creationCtx, &pTransfer); 604 605 if (RT_SUCCESS(rc)) 606 { 605 607 rc = SharedClipboardURICtxTransferAdd(&pClientData->URI, pTransfer); 608 if (RT_SUCCESS(rc)) 609 rc = vboxSvcClipboardURIAreaRegister(&pClientData->State, pTransfer); 610 } 606 611 } 607 612 else … … 617 622 } break; 618 623 619 case VBOX_SHARED_CLIPBOARD_ FN_READ_DATA:624 case VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA: 620 625 { 621 626 /* The guest wants to read data in the given format. */ … … 716 721 } break; 717 722 718 case VBOX_SHARED_CLIPBOARD_ FN_WRITE_DATA:723 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA: 719 724 { 720 725 /* The guest writes the requested data. */ -
trunk/src/VBox/HostServices/SharedClipboard/testcase/tstClipboardServiceHost.cpp
r79036 r79120 118 118 HGCMSvcSetU32(&parms[1], 0); 119 119 call.rc = VERR_TRY_AGAIN; 120 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG,120 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, 121 121 2, parms, 0); 122 122 RTTESTI_CHECK_RC(call.rc, VERR_TRY_AGAIN); /* This should get updated only when the guest call completes. */ … … 127 127 RTTESTI_CHECK_RC_OK(call.rc); 128 128 call.rc = VERR_TRY_AGAIN; 129 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG,129 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, 130 130 2, parms, 0); 131 131 RTTESTI_CHECK_RC(call.rc, VERR_TRY_AGAIN); /* This call should not complete yet. */ … … 138 138 HGCMSvcSetU32(&parms[1], 0); 139 139 call.rc = VERR_TRY_AGAIN; 140 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG,140 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, 141 141 2, parms, 0); 142 142 RTTESTI_CHECK(parms[0].u.uint32 == VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); … … 144 144 RTTESTI_CHECK_RC_OK(call.rc); 145 145 call.rc = VERR_TRY_AGAIN; 146 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG,146 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, 147 147 2, parms, 0); 148 148 RTTESTI_CHECK_RC(call.rc, VERR_TRY_AGAIN); /* This call should not complete yet. */ … … 153 153 HGCMSvcSetU32(&parms[1], 0); 154 154 call.rc = VERR_TRY_AGAIN; 155 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG,155 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, 156 156 2, parms, 0); 157 157 RTTESTI_CHECK_RC(call.rc, VERR_TRY_AGAIN); /* This should get updated only when the guest call completes. */ … … 162 162 RTTESTI_CHECK_RC_OK(call.rc); 163 163 call.rc = VERR_TRY_AGAIN; 164 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG,164 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, 165 165 2, parms, 0); 166 166 RTTESTI_CHECK(parms[0].u.uint32 == VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); … … 168 168 RTTESTI_CHECK_RC_OK(call.rc); 169 169 call.rc = VERR_TRY_AGAIN; 170 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG,170 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, 171 171 2, parms, 0); 172 172 RTTESTI_CHECK_RC(call.rc, VERR_TRY_AGAIN); /* This call should not complete yet. */ … … 179 179 HGCMSvcSetU32(&parms[1], 0); 180 180 call.rc = VERR_TRY_AGAIN; 181 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG,181 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, 182 182 2, parms, 0); 183 183 RTTESTI_CHECK(parms[0].u.uint32 == VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); … … 185 185 RTTESTI_CHECK_RC_OK(call.rc); 186 186 call.rc = VERR_TRY_AGAIN; 187 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG,187 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, 188 188 2, parms, 0); 189 189 RTTESTI_CHECK(parms[0].u.uint32 == VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); … … 191 191 RTTESTI_CHECK_RC_OK(call.rc); 192 192 call.rc = VERR_TRY_AGAIN; 193 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_ FN_GET_HOST_MSG,193 table.pfnCall(NULL, &call, 1 /* clientId */, &g_Client, VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, 194 194 2, parms, 0); 195 195 RTTESTI_CHECK_RC(call.rc, VERR_TRY_AGAIN); /* This call should not complete yet. */
Note:
See TracChangeset
for help on using the changeset viewer.