Changeset 79267 in vbox for trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp
- Timestamp:
- Jun 21, 2019 10:11:59 AM (6 years ago)
- Location:
- trunk/src/VBox
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox
- Property svn:mergeinfo
-
old new 9 9 /branches/VBox-5.1/src/VBox:112367,116543,116550,116568,116573 10 10 /branches/VBox-5.2/src/VBox:119536,120083,120099,120213,120221,120239,123597-123598,123600-123601,123755,124263,124273,124277-124279,124284-124286,124288-124290,125768,125779-125780,125812,127158-127159,127162-127167,127180 11 /branches/VBox-6.0/src/VBox:130474-130475,130477,130479 11 /branches/VBox-6.0/src/VBox:130474-130475,130477,130479,131352 12 12 /branches/aeichner/vbox-chromium-cleanup/src/VBox:129818-129851,129853-129861,129871-129872,129876,129880,129882,130013-130015,130094-130095 13 13 /branches/andy/draganddrop/src/VBox:90781-91268
-
- Property svn:mergeinfo
-
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp
r79176 r79267 44 44 45 45 /** 46 * Destroys a VBOXCLIPBOARDDIRDATA structure.47 *48 * @param pDirData VBOXCLIPBOARDDIRDATA structure to destroy.49 */50 void SharedClipboardURIDirDataDestroy(PVBOXCLIPBOARDDIRDATA pDirData)51 {52 if (!pDirData)53 return;54 55 if (pDirData->pszPath)56 {57 Assert(pDirData->cbPath);58 RTStrFree(pDirData->pszPath);59 pDirData->pszPath = NULL;60 }61 }62 63 /**64 * Destroys a VBOXCLIPBOARDFILEHDR structure.65 *66 * @param pFileHdr VBOXCLIPBOARDFILEHDR structure to destroy.67 */68 void SharedClipboardURIFileHdrDestroy(PVBOXCLIPBOARDFILEHDR pFileHdr)69 {70 if (!pFileHdr)71 return;72 73 if (pFileHdr->pszFilePath)74 {75 Assert(pFileHdr->pszFilePath);76 RTStrFree(pFileHdr->pszFilePath);77 pFileHdr->pszFilePath = NULL;78 }79 }80 81 /**82 * Destroys a VBOXCLIPBOARDFILEDATA structure.83 *84 * @param pFileData VBOXCLIPBOARDFILEDATA structure to destroy.85 */86 void SharedClipboardURIFileDataDestroy(PVBOXCLIPBOARDFILEDATA pFileData)87 {88 if (!pFileData)89 return;90 91 if (pFileData->pvData)92 {93 Assert(pFileData->cbData);94 RTMemFree(pFileData->pvData);95 pFileData->pvData = NULL;96 }97 }98 99 /**100 46 * Reads an URI data header from HGCM service parameters. 101 47 * … … 107 53 int VBoxSvcClipboardURIReadDataHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATAHDR pDataHdr) 108 54 { 109 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA_HDR) 110 return VERR_INVALID_PARAMETER; 111 112 RT_BZERO(pDataHdr, sizeof(VBOXCLIPBOARDDATAHDR)); 113 114 /* Note: Context ID (paParms[0]) not used yet. */ 115 int rc = HGCMSvcGetU32(&paParms[1], &pDataHdr->uFlags); 116 if (RT_SUCCESS(rc)) 117 rc = HGCMSvcGetU32(&paParms[2], &pDataHdr->uScreenId); 118 if (RT_SUCCESS(rc)) 119 rc = HGCMSvcGetU64(&paParms[3], &pDataHdr->cbTotal); 120 if (RT_SUCCESS(rc)) 121 rc = HGCMSvcGetU32(&paParms[4], &pDataHdr->cbMeta); 122 if (RT_SUCCESS(rc)) 123 rc = HGCMSvcGetPv(&paParms[5], &pDataHdr->pvMetaFmt, &pDataHdr->cbMetaFmt); 124 if (RT_SUCCESS(rc)) 125 rc = HGCMSvcGetU32(&paParms[6], &pDataHdr->cbMetaFmt); 126 if (RT_SUCCESS(rc)) 127 rc = HGCMSvcGetU64(&paParms[7], &pDataHdr->cObjects); 128 if (RT_SUCCESS(rc)) 129 rc = HGCMSvcGetU32(&paParms[8], &pDataHdr->enmCompression); 130 if (RT_SUCCESS(rc)) 131 rc = HGCMSvcGetU32(&paParms[9], (uint32_t *)&pDataHdr->enmChecksumType); 132 if (RT_SUCCESS(rc)) 133 rc = HGCMSvcGetPv(&paParms[10], &pDataHdr->pvChecksum, &pDataHdr->cbChecksum); 134 if (RT_SUCCESS(rc)) 135 rc = HGCMSvcGetU32(&paParms[11], &pDataHdr->cbChecksum); 136 137 LogFlowFunc(("fFlags=0x%x, cbMeta=%RU32, cbTotalSize=%RU64, cObj=%RU64\n", 138 pDataHdr->uFlags, pDataHdr->cbMeta, pDataHdr->cbTotal, pDataHdr->cObjects)); 139 140 if (RT_SUCCESS(rc)) 141 { 142 /** @todo Validate pvMetaFmt + cbMetaFmt. */ 143 /** @todo Validate header checksum. */ 144 } 55 int rc; 56 57 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA_HDR) 58 { 59 /* Note: Context ID (paParms[0]) not used yet. */ 60 rc = HGCMSvcGetU32(&paParms[1], &pDataHdr->uFlags); 61 if (RT_SUCCESS(rc)) 62 rc = HGCMSvcGetU32(&paParms[2], &pDataHdr->uScreenId); 63 if (RT_SUCCESS(rc)) 64 rc = HGCMSvcGetU64(&paParms[3], &pDataHdr->cbTotal); 65 if (RT_SUCCESS(rc)) 66 rc = HGCMSvcGetU32(&paParms[4], &pDataHdr->cbMeta); 67 if (RT_SUCCESS(rc)) 68 rc = HGCMSvcGetU32(&paParms[5], &pDataHdr->cbMetaFmt); 69 if (RT_SUCCESS(rc)) 70 rc = HGCMSvcGetPv(&paParms[6], &pDataHdr->pvMetaFmt, &pDataHdr->cbMetaFmt); 71 if (RT_SUCCESS(rc)) 72 rc = HGCMSvcGetU64(&paParms[7], &pDataHdr->cObjects); 73 if (RT_SUCCESS(rc)) 74 rc = HGCMSvcGetU32(&paParms[8], &pDataHdr->enmCompression); 75 if (RT_SUCCESS(rc)) 76 rc = HGCMSvcGetU32(&paParms[9], (uint32_t *)&pDataHdr->enmChecksumType); 77 if (RT_SUCCESS(rc)) 78 rc = HGCMSvcGetU32(&paParms[10], &pDataHdr->cbChecksum); 79 if (RT_SUCCESS(rc)) 80 rc = HGCMSvcGetPv(&paParms[11], &pDataHdr->pvChecksum, &pDataHdr->cbChecksum); 81 82 LogFlowFunc(("fFlags=0x%x, cbMeta=%RU32, cbTotalSize=%RU64, cObj=%RU64\n", 83 pDataHdr->uFlags, pDataHdr->cbMeta, pDataHdr->cbTotal, pDataHdr->cObjects)); 84 85 if (RT_SUCCESS(rc)) 86 { 87 /** @todo Validate pvMetaFmt + cbMetaFmt. */ 88 /** @todo Validate header checksum. */ 89 } 90 } 91 else 92 rc = VERR_INVALID_PARAMETER; 145 93 146 94 LogFlowFuncLeaveRC(rc); … … 158 106 int VBoxSvcClipboardURIReadDataChunk(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATACHUNK pDataChunk) 159 107 { 160 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA_CHUNK) 161 return VERR_INVALID_PARAMETER; 162 163 RT_BZERO(pDataChunk, sizeof(VBOXCLIPBOARDDATACHUNK)); 164 165 /* Note: Context ID (paParms[0]) not used yet. */ 166 int rc = HGCMSvcGetPv(&paParms[1], (void**)&pDataChunk->pvData, &pDataChunk->cbData); 167 if (RT_SUCCESS(rc)) 168 rc = HGCMSvcGetU32(&paParms[2], &pDataChunk->cbData); 169 if (RT_SUCCESS(rc)) 170 rc = HGCMSvcGetPv(&paParms[3], (void**)&pDataChunk->pvChecksum, &pDataChunk->cbChecksum); 171 if (RT_SUCCESS(rc)) 172 rc = HGCMSvcGetU32(&paParms[4], &pDataChunk->cbChecksum); 173 174 if (RT_SUCCESS(rc)) 175 { 176 if (!SharedClipboardURIDataChunkIsValid(pDataChunk)) 177 rc = VERR_INVALID_PARAMETER; 178 } 108 int rc; 109 110 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA_CHUNK) 111 { 112 /* Note: Context ID (paParms[0]) not used yet. */ 113 rc = HGCMSvcGetU32(&paParms[1], &pDataChunk->cbData); 114 if (RT_SUCCESS(rc)) 115 rc = HGCMSvcGetPv(&paParms[2], &pDataChunk->pvData, &pDataChunk->cbData); 116 if (RT_SUCCESS(rc)) 117 rc = HGCMSvcGetU32(&paParms[3], &pDataChunk->cbChecksum); 118 if (RT_SUCCESS(rc)) 119 rc = HGCMSvcGetPv(&paParms[4], &pDataChunk->pvChecksum, &pDataChunk->cbChecksum); 120 121 if (RT_SUCCESS(rc)) 122 { 123 if (!SharedClipboardURIDataChunkIsValid(pDataChunk)) 124 rc = VERR_INVALID_PARAMETER; 125 } 126 } 127 else 128 rc = VERR_INVALID_PARAMETER; 179 129 180 130 LogFlowFuncLeaveRC(rc); … … 192 142 int VBoxSvcClipboardURIReadDir(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDIRDATA pDirData) 193 143 { 194 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DIR) 195 return VERR_INVALID_PARAMETER; 196 197 RT_BZERO(pDirData, sizeof(VBOXCLIPBOARDDIRDATA)); 198 199 /* Note: Context ID (paParms[0]) not used yet. */ 200 int rc = HGCMSvcGetPv(&paParms[1], (void**)&pDirData->pszPath, &pDirData->cbPath); 201 if (RT_SUCCESS(rc)) 202 rc = HGCMSvcGetU32(&paParms[2], &pDirData->cbPath); 203 if (RT_SUCCESS(rc)) 204 rc = HGCMSvcGetU32(&paParms[3], &pDirData->fMode); 205 206 LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x\n", pDirData->pszPath, pDirData->cbPath, pDirData->fMode)); 207 208 if (RT_SUCCESS(rc)) 209 { 210 if (!SharedClipboardURIDirDataIsValid(pDirData)) 211 rc = VERR_INVALID_PARAMETER; 212 } 144 int rc; 145 146 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DIR) 147 { 148 /* Note: Context ID (paParms[0]) not used yet. */ 149 rc = HGCMSvcGetU32(&paParms[1], &pDirData->cbPath); 150 if (RT_SUCCESS(rc)) 151 rc = HGCMSvcGetPv(&paParms[2], (void **)&pDirData->pszPath, &pDirData->cbPath); 152 if (RT_SUCCESS(rc)) 153 rc = HGCMSvcGetU32(&paParms[3], &pDirData->fMode); 154 155 LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x\n", pDirData->pszPath, pDirData->cbPath, pDirData->fMode)); 156 157 if (RT_SUCCESS(rc)) 158 { 159 if (!SharedClipboardURIDirDataIsValid(pDirData)) 160 rc = VERR_INVALID_PARAMETER; 161 } 162 } 163 else 164 rc = VERR_INVALID_PARAMETER; 213 165 214 166 LogFlowFuncLeaveRC(rc); … … 226 178 int VBoxSvcClipboardURIReadFileHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEHDR pFileHdr) 227 179 { 228 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_FILE_HDR) 229 return VERR_INVALID_PARAMETER; 230 231 RT_BZERO(pFileHdr, sizeof(VBOXCLIPBOARDFILEHDR)); 232 233 /* Note: Context ID (paParms[0]) not used yet. */ 234 int rc = HGCMSvcGetPv(&paParms[1], (void**)&pFileHdr->pszFilePath, &pFileHdr->cbFilePath); 235 if (RT_SUCCESS(rc)) 236 rc = HGCMSvcGetU32(&paParms[2], &pFileHdr->cbFilePath); 237 if (RT_SUCCESS(rc)) 238 rc = HGCMSvcGetU32(&paParms[3], &pFileHdr->fFlags); 239 if (RT_SUCCESS(rc)) 240 rc = HGCMSvcGetU32(&paParms[4], &pFileHdr->fMode); 241 if (RT_SUCCESS(rc)) 242 rc = HGCMSvcGetU64(&paParms[5], &pFileHdr->cbSize); 243 244 LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x, cbSize=%RU64\n", 245 pFileHdr->pszFilePath, pFileHdr->cbFilePath, pFileHdr->fMode, pFileHdr->cbSize)); 180 int rc; 181 182 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_FILE_HDR) 183 { 184 /* Note: Context ID (paParms[0]) not used yet. */ 185 rc = HGCMSvcGetU32(&paParms[1], &pFileHdr->cbFilePath); 186 if (RT_SUCCESS(rc)) 187 rc = HGCMSvcGetPv(&paParms[2], (void **)&pFileHdr->pszFilePath, &pFileHdr->cbFilePath); 188 if (RT_SUCCESS(rc)) 189 rc = HGCMSvcGetU32(&paParms[3], &pFileHdr->fFlags); 190 if (RT_SUCCESS(rc)) 191 rc = HGCMSvcGetU32(&paParms[4], &pFileHdr->fMode); 192 if (RT_SUCCESS(rc)) 193 rc = HGCMSvcGetU64(&paParms[5], &pFileHdr->cbSize); 194 195 LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x, cbSize=%RU64\n", 196 pFileHdr->pszFilePath, pFileHdr->cbFilePath, pFileHdr->fMode, pFileHdr->cbSize)); 197 } 198 else 199 rc = VERR_INVALID_PARAMETER; 246 200 247 201 LogFlowFuncLeaveRC(rc); … … 259 213 int VBoxSvcClipboardURIReadFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData) 260 214 { 261 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_FILE_DATA) 262 return VERR_INVALID_PARAMETER; 263 264 RT_BZERO(pFileData, sizeof(VBOXCLIPBOARDFILEDATA)); 265 266 /* Note: Context ID (paParms[0]) not used yet. */ 267 int rc = HGCMSvcGetPv(&paParms[1], (void**)&pFileData->pvData, &pFileData->cbData); 268 if (RT_SUCCESS(rc)) 269 rc = HGCMSvcGetU32(&paParms[2], &pFileData->cbData); 270 if (RT_SUCCESS(rc)) 271 rc = HGCMSvcGetPv(&paParms[3], (void**)&pFileData->pvChecksum, &pFileData->cbChecksum); 272 if (RT_SUCCESS(rc)) 273 rc = HGCMSvcGetU32(&paParms[4], &pFileData->cbChecksum); 274 275 LogFlowFunc(("pvData=0x%p, cbData=%RU32\n", pFileData->pvData, pFileData->cbData)); 215 int rc; 216 217 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_FILE_DATA) 218 { 219 /* Note: Context ID (paParms[0]) not used yet. */ 220 rc = HGCMSvcGetU32(&paParms[1], &pFileData->cbData); 221 if (RT_SUCCESS(rc)) 222 rc = HGCMSvcGetPv(&paParms[2], &pFileData->pvData, &pFileData->cbData); 223 if (RT_SUCCESS(rc)) 224 rc = HGCMSvcGetU32(&paParms[3], &pFileData->cbChecksum); 225 if (RT_SUCCESS(rc)) 226 rc = HGCMSvcGetPv(&paParms[4], &pFileData->pvChecksum, &pFileData->cbChecksum); 227 228 LogFlowFunc(("pvData=0x%p, cbData=%RU32\n", pFileData->pvData, pFileData->cbData)); 229 } 230 else 231 rc = VERR_INVALID_PARAMETER; 276 232 277 233 LogFlowFuncLeaveRC(rc); … … 308 264 309 265 /* Check if we've the right mode set. */ 310 int rc = VERR_ACCESS_DENIED; /* Play safe. */311 312 266 if (!vboxSvcClipboardURIMsgIsAllowed(vboxSvcClipboardGetMode(), u32Function)) 313 return rc;267 return VERR_ACCESS_DENIED; 314 268 315 269 /* A (valid) service extension is needed because VBoxSVC needs to keep track of the … … 321 275 #endif 322 276 LogFunc(("Invalid / no service extension set, skipping URI handling\n")); 323 rc = VERR_NOT_SUPPORTED; 324 } 325 326 if (RT_FAILURE(rc)) 327 return rc; 328 329 const PSHAREDCLIPBOARDURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pClientData->URI, 0 /* Index */); 330 331 bool fWrite = false; 332 333 rc = VERR_INVALID_PARAMETER; /* Play safe. */ 277 return VERR_NOT_SUPPORTED; 278 } 279 280 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 281 { 282 LogFunc(("No active transfers found\n")); 283 return VERR_WRONG_ORDER; 284 } 285 286 const uint32_t uTransferID = 0; /* Only one transfer is supported at the moment. */ 287 288 const PSHAREDCLIPBOARDURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pClientData->URI, uTransferID); 289 if (!pTransfer) 290 { 291 LogFunc(("Transfer with ID %RU32 not found\n", uTransferID)); 292 return VERR_WRONG_ORDER; 293 } 294 295 bool fDispatchToProvider = false; /* Whether to (also) dispatch the HCGCM data to the transfer provider. */ 296 297 int rc = VERR_INVALID_PARAMETER; /* Play safe. */ 334 298 335 299 switch (u32Function) … … 337 301 case VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_HDR: 338 302 { 339 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_READ_DATA_HDR\n")); 340 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA_HDR) 341 { 342 bool fDetach = false; 343 344 if (RT_SUCCESS(rc)) 345 { 346 // pTransfer->Area. parms.uID 347 348 /** @todo Detach if header / meta size is 0. */ 349 } 350 351 /* Do we need to detach again because we're done? */ 352 if (fDetach) 353 vboxSvcClipboardURIAreaDetach(&pClientData->State, pTransfer); 354 } 303 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_HDR\n")); 355 304 break; 356 305 } … … 358 307 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_HDR: 359 308 { 360 361 RT_BREAKPOINT(); 362 363 if ( u32Function == VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_HDR 364 && SharedClipboardURICtxMaximumTransfersReached(&pClientData->URI)) 365 { 366 rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED; 367 break; 368 } 369 370 fWrite = true; 309 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_HDR\n")); 310 311 VBOXCLIPBOARDDATAHDR dataHdr; 312 rc = SharedClipboardURIDataHdrInit(&dataHdr); 313 if (RT_SUCCESS(rc)) 314 rc = VBoxSvcClipboardURIReadDataHdr(cParms, paParms, &dataHdr); 315 if (RT_SUCCESS(rc)) 316 { 317 AssertBreakStmt(pTransfer->State.pHeader == NULL, rc = VERR_WRONG_ORDER); 318 pTransfer->State.pHeader = SharedClipboardURIDataHdrDup(&dataHdr); 319 if (pTransfer->State.pHeader) 320 { 321 LogFlowFunc(("Meta data size is %RU32\n", pTransfer->State.pHeader->cbMeta)); 322 } 323 else 324 rc = VERR_NO_MEMORY; 325 } 326 break; 327 } 328 329 case VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_CHUNK: 330 { 331 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_CHUNK\n")); 371 332 break; 372 333 } … … 374 335 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_CHUNK: 375 336 { 376 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_DATA_CHUNK\n")); 377 378 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 379 { 380 rc = VERR_WRONG_ORDER; 381 break; 382 } 383 384 fWrite = true; 385 #if 0 337 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA_CHUNK\n")); 338 339 VBOXCLIPBOARDDATACHUNK dataChunk; 340 rc = SharedClipboardURIDataChunkInit(&dataChunk); 386 341 if (RT_SUCCESS(rc)) 387 { 388 /** @todo Validate checksum. */ 389 rc = SharedClipboardMetaDataAdd(&pTransfer->Meta, data.pvData, data.cbData); 342 rc = VBoxSvcClipboardURIReadDataChunk(cParms, paParms, &dataChunk); 343 if (RT_SUCCESS(rc)) 344 { 345 AssertPtrBreakStmt(pTransfer->State.pHeader, rc = VERR_WRONG_ORDER); 346 347 rc = SharedClipboardURITransferMetaDataAdd(pTransfer, dataChunk.pvData, dataChunk.cbData); 390 348 if ( RT_SUCCESS(rc) 391 && SharedClipboardMetaDataGetUsed(&pTransfer->Meta) == pTransfer->Header.cbMeta) /* Meta data transfer complete? */ 392 { 393 if (RT_SUCCESS(rc)) 394 { 395 396 } 397 398 /* We're done processing the meta data, so just destroy it. */ 399 SharedClipboardMetaDataDestroy(&pTransfer->Meta); 400 } 401 } 402 #endif 349 && SharedClipboardURITransferMetaDataIsComplete(pTransfer)) /* Meta data transfer complete? */ 350 { 351 rc = SharedClipboardURITransferPrepare(pTransfer); 352 } 353 } 354 403 355 break; 404 356 } … … 406 358 case VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DIR: 407 359 { 408 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_ FN_READ_DIR\n"));360 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DIR\n")); 409 361 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_DIR) 410 362 { … … 432 384 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DIR: 433 385 { 434 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_DIR\n")); 435 436 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 437 { 438 rc = VERR_WRONG_ORDER; 439 break; 440 } 441 442 #if 0 386 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DIR\n")); 387 388 VBOXCLIPBOARDDIRDATA dirData; 389 rc = VBoxSvcClipboardURIReadDir(cParms, paParms, &dirData); 443 390 if (RT_SUCCESS(rc)) 444 391 { … … 447 394 448 395 const char *pszCacheDir = pArea->GetDirAbs(); 449 char *pszDir = RTPathJoinA(pszCacheDir, d ata.pszPath);396 char *pszDir = RTPathJoinA(pszCacheDir, dirData.pszPath); 450 397 if (pszDir) 451 398 { 452 399 LogFlowFunc(("pszDir=%s\n", pszDir)); 453 400 454 rc = RTDirCreateFullPath(pszDir, d ata.fMode);401 rc = RTDirCreateFullPath(pszDir, dirData.fMode); 455 402 if (RT_SUCCESS(rc)) 456 403 { … … 465 412 rc = VERR_NO_MEMORY; 466 413 } 467 #endif468 414 break; 469 415 } … … 471 417 case VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_FILE_HDR: 472 418 { 473 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_ FN_READ_FILE_HDR\n"));419 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_FILE_HDR\n")); 474 420 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_FILE_HDR) 475 421 { 476 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI))477 {478 rc = VERR_WRONG_ORDER;479 break;480 }481 482 422 VBOXCLIPBOARDFILEHDR hdr; 483 423 rc = VBoxClipboardSvcImplURIReadFileHdr(pClientData, &hdr); … … 499 439 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_FILE_HDR: 500 440 { 501 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_FILE_HDR\n")); 502 503 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI)) 504 { 505 rc = VERR_WRONG_ORDER; 506 break; 507 } 508 509 #if 0 441 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_FILE_HDR\n")); 442 443 if (!SharedClipboardURIObjCtxIsValid(SharedClipboardURITransferGetCurrentObjCtx(pTransfer))) 444 { 445 pTransfer->ObjCtx.pObj = new SharedClipboardURIObject(SharedClipboardURIObject::Type_File); 446 if (pTransfer->ObjCtx.pObj) /** @todo Can this throw? */ 447 { 448 rc = VINF_SUCCESS; 449 } 450 else 451 rc = VERR_NO_MEMORY; 452 } 453 else /* There still is another object being processed? */ 454 rc = VERR_WRONG_ORDER; 455 456 if (RT_FAILURE(rc)) 457 break; 458 459 VBOXCLIPBOARDFILEHDR fileHdr; 460 rc = VBoxSvcClipboardURIReadFileHdr(cParms, paParms, &fileHdr); 461 if (RT_SUCCESS(rc)) 462 { 463 SharedClipboardArea *pArea = SharedClipboardURITransferGetArea(pTransfer); 464 AssertPtrBreakStmt(pArea, rc = VERR_WRONG_ORDER); 465 466 const char *pszCacheDir = pArea->GetDirAbs(); 467 468 RT_BREAKPOINT(); 469 470 char pszPathAbs[RTPATH_MAX]; 471 rc = RTPathJoin(pszPathAbs, sizeof(pszPathAbs), pszCacheDir, fileHdr.pszFilePath); 510 472 if (RT_SUCCESS(rc)) 511 473 { 512 if (!vboxSvcClipboardURIFileHdrIsValid(&data, &pTransfer->Header)) 513 { 514 rc = VERR_INVALID_PARAMETER; 515 } 516 else 517 { 518 if (pTransfer->ObjCtx.pObj == NULL) 519 { 520 pTransfer->ObjCtx.pObj = new SharedClipboardURIObject(SharedClipboardURIObject::Type_File); 521 if (!pTransfer->ObjCtx.pObj) /** @todo Can this throw? */ 522 rc = VERR_NO_MEMORY; 523 } 524 else /* There still is another object being processed? */ 525 rc = VERR_WRONG_ORDER; 526 } 527 } 528 529 if (RT_SUCCESS(rc)) 530 { 531 SharedClipboardArea *pArea = SharedClipboardURITransferGetArea(pTransfer); 532 AssertPtrBreakStmt(pArea, rc = VERR_INVALID_POINTER); 533 534 const char *pszCacheDir = pArea->GetDirAbs(); 535 536 char pszPathAbs[RTPATH_MAX]; 537 rc = RTPathJoin(pszPathAbs, sizeof(pszPathAbs), pszCacheDir, data.pszFilePath); 474 rc = SharedClipboardPathSanitize(pszPathAbs, sizeof(pszPathAbs)); 538 475 if (RT_SUCCESS(rc)) 539 476 { 540 rc = SharedClipboardPathSanitize(pszPathAbs, sizeof(pszPathAbs)); 477 PSHAREDCLIPBOARDCLIENTURIOBJCTX pObjCtx = SharedClipboardURITransferGetCurrentObjCtx(pTransfer); 478 AssertPtrBreakStmt(pObjCtx, VERR_INVALID_POINTER); 479 480 SharedClipboardURIObject *pObj = pObjCtx->pObj; 481 AssertPtrBreakStmt(pObj, VERR_INVALID_POINTER); 482 483 LogFlowFunc(("pszFile=%s\n", pszPathAbs)); 484 485 /** @todo Add sparse file support based on fFlags? (Use Open(..., fFlags | SPARSE). */ 486 rc = pObj->OpenFileEx(pszPathAbs, SharedClipboardURIObject::View_Target, 487 RTFILE_O_CREATE_REPLACE | RTFILE_O_WRITE | RTFILE_O_DENY_WRITE, 488 (fileHdr.fMode & RTFS_UNIX_MASK) | RTFS_UNIX_IRUSR | RTFS_UNIX_IWUSR); 541 489 if (RT_SUCCESS(rc)) 542 490 { 543 SharedClipboardURIObject *pObj = SharedClipboardURITransferGetObject(pTransfer, 0 /* Index */); 544 AssertPtrBreakStmt(pObj, VERR_INVALID_POINTER); 545 546 /** @todo Add sparse file support based on fFlags? (Use Open(..., fFlags | SPARSE). */ 547 rc = pObj->OpenFileEx(pszPathAbs, SharedClipboardURIObject::View_Target, 548 RTFILE_O_CREATE_REPLACE | RTFILE_O_WRITE | RTFILE_O_DENY_WRITE, 549 (data.fMode & RTFS_UNIX_MASK) | RTFS_UNIX_IRUSR | RTFS_UNIX_IWUSR); 550 if (RT_SUCCESS(rc)) 491 rc = pObj->SetSize(fileHdr.cbSize); 492 493 /** @todo Unescape path before printing. */ 494 LogRel2(("Clipboard: Transferring guest file '%s' to host (%RU64 bytes, mode 0x%x)\n", 495 pObj->GetDestPathAbs().c_str(), pObj->GetSize(), pObj->GetMode())); 496 497 if (pObj->IsComplete()) /* 0-byte file? We're done already. */ 551 498 { 552 rc = pObj->SetSize(data.cbSize); 553 554 /** @todo Unescape path before printing. */ 555 LogRel2(("Clipboard: Transferring guest file '%s' to host (%RU64 bytes, mode 0x%x)\n", 556 pObj->GetDestPathAbs().c_str(), pObj->GetSize(), pObj->GetMode())); 557 558 if (pObj->IsComplete()) /* 0-byte file? We're done already. */ 559 { 560 /** @todo Sanitize path. */ 561 LogRel2(("Clipboard: Transferring guest file '%s' (0 bytes) to host complete\n", 562 pObj->GetDestPathAbs().c_str())); 563 564 SharedClipboardURIObjCtxUninit(&pTransfer->ObjCtx); 565 } 566 567 /* Add for having a proper rollback. */ 568 int rc2 = pArea->AddFile(pszPathAbs); 569 AssertRC(rc2); 499 /** @todo Sanitize path. */ 500 LogRel2(("Clipboard: Transferring guest file '%s' (0 bytes) to host complete\n", 501 pObj->GetDestPathAbs().c_str())); 502 503 SharedClipboardURIObjCtxDestroy(&pTransfer->ObjCtx); 570 504 } 571 else 572 LogRel(("Clipboard: Error opening/creating guest file '%s' on host, rc=%Rrc\n", pszPathAbs, rc)); 505 506 /* Add for having a proper rollback. */ 507 int rc2 = pArea->AddFile(pszPathAbs); 508 AssertRC(rc2); 573 509 } 510 else 511 LogRel(("Clipboard: Error opening/creating guest file '%s' on host, rc=%Rrc\n", pszPathAbs, rc)); 574 512 } 575 }576 #endif 513 } 514 } 577 515 break; 578 516 } … … 609 547 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_FILE_DATA\n")); 610 548 611 if (!SharedClipboardURI CtxGetActiveTransfers(&pClientData->URI))549 if (!SharedClipboardURIObjCtxIsValid(&pTransfer->ObjCtx)) 612 550 { 613 551 rc = VERR_WRONG_ORDER; … … 615 553 } 616 554 617 #if 0 555 VBOXCLIPBOARDFILEDATA fileData; 556 rc = VBoxSvcClipboardURIReadFileData(cParms, paParms, &fileData); 618 557 if (RT_SUCCESS(rc)) 619 558 { 620 if (!vboxSvcClipboardURIFileDataIsValid(&data, &pTransfer->Header)) 621 rc = VERR_INVALID_PARAMETER; 622 623 if (!SharedClipboardURIObjCtxIsValid(&pTransfer->ObjCtx)) 624 rc = VERR_WRONG_ORDER; 625 } 626 627 if (RT_SUCCESS(rc)) 628 { 629 SharedClipboardURIObject *pObj = SharedClipboardURIObjCtxGetObj(&pTransfer->ObjCtx); 559 PSHAREDCLIPBOARDCLIENTURIOBJCTX pObjCtx = SharedClipboardURITransferGetCurrentObjCtx(pTransfer); 560 AssertPtrBreakStmt(pObjCtx, VERR_INVALID_POINTER); 561 562 SharedClipboardURIObject *pObj = pObjCtx->pObj; 630 563 AssertPtrBreakStmt(pObj, VERR_INVALID_POINTER); 631 564 632 565 uint32_t cbWritten; 633 rc = pObj->Write( data.pvData, data.cbData, &cbWritten);566 rc = pObj->Write(fileData.pvData, fileData.cbData, &cbWritten); 634 567 if (RT_SUCCESS(rc)) 635 568 { 636 Assert(cbWritten <= data.cbData);637 if (cbWritten < data.cbData)569 Assert(cbWritten <= fileData.cbData); 570 if (cbWritten < fileData.cbData) 638 571 { 639 572 /** @todo What to do when the host's disk is full? */ … … 643 576 if ( pObj->IsComplete() 644 577 || RT_FAILURE(rc)) 645 SharedClipboardURIObjCtx Uninit(&pTransfer->ObjCtx);578 SharedClipboardURIObjCtxDestroy(&pTransfer->ObjCtx); 646 579 } 647 580 else 648 581 LogRel(("Clipboard: Error writing guest file data for '%s', rc=%Rrc\n", pObj->GetDestPathAbs().c_str(), rc)); 649 582 } 650 #endif651 583 break; 652 584 } … … 667 599 } 668 600 601 if (fDispatchToProvider) 602 rc = VINF_SUCCESS; 603 669 604 if (RT_SUCCESS(rc)) 670 605 { 671 if (f Write)606 if (fDispatchToProvider) 672 607 { 673 608 SHAREDCLIPBOARDPROVIDERWRITEPARMS writeParms; … … 740 675 return VERR_NO_MEMORY; 741 676 742 VBOXCLIPBOARDEXTAREAPARMS parms; 743 RT_ZERO(parms); 744 745 parms.uID = NIL_SHAREDCLIPBOARDAREAID; 746 parms.u.fn_register.pvData = SharedClipboardMetaDataMutableRaw(&pTransfer->State.Meta); 747 parms.u.fn_register.cbData = (uint32_t)SharedClipboardMetaDataGetUsed(&pTransfer->State.Meta); 748 749 /* As the meta data is now complete, register a new clipboard on the host side. */ 750 int rc = g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_AREA_REGISTER, &parms, sizeof(parms)); 751 if (RT_SUCCESS(rc)) 752 { 753 /* Note: Do *not* specify SHAREDCLIPBOARDAREA_OPEN_FLAGS_MUST_NOT_EXIST as flags here, as VBoxSVC took care of the 754 * clipboard area creation already. */ 755 rc = pTransfer->pArea->OpenTemp(parms.uID /* Area ID */, 756 SHAREDCLIPBOARDAREA_OPEN_FLAGS_NONE); 757 } 758 759 LogFlowFunc(("Registered new clipboard area (%RU32) by client %RU32 with rc=%Rrc\n", 760 parms.uID, pClientState->u32ClientID, rc)); 677 int rc; 678 679 if (g_pfnExtension) 680 { 681 VBOXCLIPBOARDEXTAREAPARMS parms; 682 RT_ZERO(parms); 683 684 parms.uID = NIL_SHAREDCLIPBOARDAREAID; 685 686 if (pTransfer->State.pMeta) 687 { 688 parms.u.fn_register.pvData = SharedClipboardMetaDataMutableRaw(pTransfer->State.pMeta); 689 parms.u.fn_register.cbData = (uint32_t)SharedClipboardMetaDataGetUsed(pTransfer->State.pMeta); 690 } 691 692 /* As the meta data is now complete, register a new clipboard on the host side. */ 693 rc = g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_AREA_REGISTER, &parms, sizeof(parms)); 694 if (RT_SUCCESS(rc)) 695 { 696 /* Note: Do *not* specify SHAREDCLIPBOARDAREA_OPEN_FLAGS_MUST_NOT_EXIST as flags here, as VBoxSVC took care of the 697 * clipboard area creation already. */ 698 rc = pTransfer->pArea->OpenTemp(parms.uID /* Area ID */, 699 SHAREDCLIPBOARDAREA_OPEN_FLAGS_NONE); 700 } 701 702 LogFlowFunc(("Registered new clipboard area (%RU32) by client %RU32 with rc=%Rrc\n", 703 parms.uID, pClientState->u32ClientID, rc)); 704 } 705 else 706 rc = VERR_NOT_SUPPORTED; 761 707 762 708 LogFlowFuncLeaveRC(rc); … … 778 724 return VINF_SUCCESS; 779 725 780 VBOXCLIPBOARDEXTAREAPARMS parms; 781 RT_ZERO(parms); 782 783 parms.uID = pTransfer->pArea->GetID(); 784 785 int rc = g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_AREA_UNREGISTER, &parms, sizeof(parms)); 786 if (RT_SUCCESS(rc)) 787 { 788 rc = pTransfer->pArea->Close(); 789 if (RT_SUCCESS(rc)) 790 { 791 delete pTransfer->pArea; 792 pTransfer->pArea = NULL; 793 } 794 } 795 796 LogFlowFunc(("Unregistered clipboard area (%RU32) by client %RU32 with rc=%Rrc\n", 797 parms.uID, pClientState->u32ClientID, rc)); 726 int rc = VINF_SUCCESS; 727 728 if (g_pfnExtension) 729 { 730 VBOXCLIPBOARDEXTAREAPARMS parms; 731 RT_ZERO(parms); 732 733 parms.uID = pTransfer->pArea->GetID(); 734 735 rc = g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_AREA_UNREGISTER, &parms, sizeof(parms)); 736 if (RT_SUCCESS(rc)) 737 { 738 rc = pTransfer->pArea->Close(); 739 if (RT_SUCCESS(rc)) 740 { 741 delete pTransfer->pArea; 742 pTransfer->pArea = NULL; 743 } 744 } 745 746 LogFlowFunc(("Unregistered clipboard area (%RU32) by client %RU32 with rc=%Rrc\n", 747 parms.uID, pClientState->u32ClientID, rc)); 748 } 749 750 delete pTransfer->pArea; 751 pTransfer->pArea = NULL; 798 752 799 753 LogFlowFuncLeaveRC(rc); … … 819 773 return VERR_NO_MEMORY; 820 774 821 VBOXCLIPBOARDEXTAREAPARMS parms; 822 RT_ZERO(parms); 823 824 parms.uID = 0; /* 0 means most recent clipboard area. */ 825 826 /* The client now needs to attach to the most recent clipboard area 827 * to keep a reference to it. The host does the actual book keeping / cleanup then. 828 * 829 * This might fail if the host does not have a most recent clipboard area (yet). */ 830 int rc = g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_AREA_ATTACH, &parms, sizeof(parms)); 831 if (RT_SUCCESS(rc)) 832 rc = pTransfer->pArea->OpenTemp(parms.uID /* Area ID */); 833 834 LogFlowFunc(("Attached client %RU32 to clipboard area %RU32 with rc=%Rrc\n", 835 pClientState->u32ClientID, parms.uID, rc)); 775 int rc = VINF_SUCCESS; 776 777 if (g_pfnExtension) 778 { 779 VBOXCLIPBOARDEXTAREAPARMS parms; 780 RT_ZERO(parms); 781 782 parms.uID = 0; /* 0 means most recent clipboard area. */ 783 784 /* The client now needs to attach to the most recent clipboard area 785 * to keep a reference to it. The host does the actual book keeping / cleanup then. 786 * 787 * This might fail if the host does not have a most recent clipboard area (yet). */ 788 rc = g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_AREA_ATTACH, &parms, sizeof(parms)); 789 if (RT_SUCCESS(rc)) 790 rc = pTransfer->pArea->OpenTemp(parms.uID /* Area ID */); 791 792 LogFlowFunc(("Attached client %RU32 to clipboard area %RU32 with rc=%Rrc\n", 793 pClientState->u32ClientID, parms.uID, rc)); 794 } 795 else 796 rc = VERR_NOT_SUPPORTED; 836 797 837 798 LogFlowFuncLeaveRC(rc); … … 869 830 } 870 831 871 LogFlowFuncLeaveRC(rc); 872 return rc; 873 } 874 832 delete pTransfer->pArea; 833 pTransfer->pArea = NULL; 834 835 LogFlowFuncLeaveRC(rc); 836 return rc; 837 } 838
Note:
See TracChangeset
for help on using the changeset viewer.