Changeset 98320 in vbox
- Timestamp:
- Jan 26, 2023 3:50:47 PM (2 years ago)
- Location:
- trunk/src/VBox/Frontends/VBoxBugReport
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VBoxBugReport/VBoxBugReport.cpp
r98103 r98320 270 270 BugReportStream::BugReportStream(const char *pszTitle) : BugReportItem(pszTitle) 271 271 { 272 m_hVfsIos = NIL_RTVFSIOSTREAM; 272 273 handleRtError(RTPathTemp(m_szFileName, RTPATH_MAX), 273 274 "Failed to obtain path to temporary folder"); … … 276 277 handleRtError(RTFileCreateTemp(m_szFileName, 0600), 277 278 "Failed to create temporary file '%s'", m_szFileName); 278 handleRtError(RT StrmOpen(m_szFileName, "w", &m_Strm),279 handleRtError(RTVfsIoStrmOpenNormal(m_szFileName, RTFILE_O_OPEN | RTFILE_O_WRITE | RTFILE_O_DENY_NONE, &m_hVfsIos), 279 280 "Failed to open '%s'", m_szFileName); 280 281 } … … 282 283 BugReportStream::~BugReportStream() 283 284 { 284 if (m_ Strm)285 RT StrmClose(m_Strm);285 if (m_hVfsIos != NIL_RTVFSIOSTREAM) 286 RTVfsIoStrmRelease(m_hVfsIos); 286 287 RTFileDelete(m_szFileName); 287 288 } … … 291 292 va_list va; 292 293 va_start(va, pszFmt); 293 int cb = RT StrmPrintfV(m_Strm, pszFmt, va);294 int cb = RTVfsIoStrmPrintfV(m_hVfsIos, pszFmt, va); 294 295 va_end(va); 295 296 return cb; … … 298 299 int BugReportStream::putStr(const char *pszString) 299 300 { 300 return RT StrmPutStr(m_Strm, pszString);301 } 302 303 PRTSTREAM BugReportStream::getStream(void)304 { 305 RT StrmClose(m_Strm);306 handleRtError(RT StrmOpen(m_szFileName, "r", &m_Strm),301 return RTVfsIoStrmPrintf(m_hVfsIos, "%s", pszString); 302 } 303 304 RTVFSIOSTREAM BugReportStream::getStream(void) 305 { 306 RTVfsIoStrmRelease(m_hVfsIos); 307 handleRtError(RTVfsIoStrmOpenNormal(m_szFileName, RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_NONE, &m_hVfsIos), 307 308 "Failed to open '%s'", m_szFileName); 308 return m_ Strm;309 return m_hVfsIos; 309 310 } 310 311 … … 314 315 BugReportFile::BugReportFile(const char *pszPath, const char *pszShortName) : BugReportItem(pszShortName) 315 316 { 316 m_ Strm = 0;317 m_hVfsIos = NIL_RTVFSIOSTREAM; 317 318 m_pszPath = RTStrDup(pszPath); 318 319 } … … 320 321 BugReportFile::~BugReportFile() 321 322 { 322 if (m_ Strm)323 RT StrmClose(m_Strm);323 if (m_hVfsIos != NIL_RTVFSIOSTREAM) 324 RTVfsIoStrmRelease(m_hVfsIos); 324 325 if (m_pszPath) 325 326 RTStrFree(m_pszPath); 326 327 } 327 328 328 PRTSTREAM BugReportFile::getStream(void)329 { 330 handleRtError(RT StrmOpen(m_pszPath, "rb", &m_Strm),329 RTVFSIOSTREAM BugReportFile::getStream(void) 330 { 331 handleRtError(RTVfsIoStrmOpenNormal(m_pszPath, RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_NONE, &m_hVfsIos), 331 332 "Failed to open '%s'", m_pszPath); 332 return m_ Strm;333 return m_hVfsIos; 333 334 } 334 335 335 336 336 337 BugReportCommand::BugReportCommand(const char *pszTitle, const char *pszExec, ...) 337 : BugReportItem(pszTitle), m_ Strm(NULL)338 : BugReportItem(pszTitle), m_hVfsIos(NIL_RTVFSIOSTREAM) 338 339 { 339 340 unsigned cArgs = 0; … … 358 359 BugReportCommand::~BugReportCommand() 359 360 { 360 if (m_ Strm)361 RT StrmClose(m_Strm);361 if (m_hVfsIos != NIL_RTVFSIOSTREAM) 362 RTVfsIoStrmRelease(m_hVfsIos); 362 363 RTFileDelete(m_szFileName); 363 364 for (size_t i = 0; i < RT_ELEMENTS(m_papszArgs) && m_papszArgs[i]; ++i) … … 365 366 } 366 367 367 PRTSTREAM BugReportCommand::getStream(void)368 RTVFSIOSTREAM BugReportCommand::getStream(void) 368 369 { 369 370 handleRtError(RTPathTemp(m_szFileName, RTPATH_MAX), … … 391 392 RTFileClose(hStdOutErr.u.hFile); 392 393 393 handleRtError(RT StrmOpen(m_szFileName, "r", &m_Strm),394 handleRtError(RTVfsIoStrmOpenNormal(m_szFileName, RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_NONE, &m_hVfsIos), 394 395 "Failed to open '%s'", m_szFileName); 395 return m_ Strm;396 return m_hVfsIos; 396 397 } 397 398 398 399 399 400 BugReportCommandTemp::BugReportCommandTemp(const char *pszTitle, const char *pszExec, ...) 400 : BugReportItem(pszTitle), m_ Strm(NULL)401 : BugReportItem(pszTitle), m_hVfsIos(NIL_RTVFSIOSTREAM) 401 402 { 402 403 handleRtError(RTPathTemp(m_szFileName, RTPATH_MAX), … … 430 431 BugReportCommandTemp::~BugReportCommandTemp() 431 432 { 432 if (m_ Strm)433 RT StrmClose(m_Strm);433 if (m_hVfsIos != NIL_RTVFSIOSTREAM) 434 RTVfsIoStrmRelease(m_hVfsIos); 434 435 RTFileDelete(m_szErrFileName); 435 436 RTFileDelete(m_szFileName); … … 438 439 } 439 440 440 PRTSTREAM BugReportCommandTemp::getStream(void)441 RTVFSIOSTREAM BugReportCommandTemp::getStream(void) 441 442 { 442 443 handleRtError(RTPathTemp(m_szErrFileName, RTPATH_MAX), … … 468 469 469 470 if (status.enmReason == RTPROCEXITREASON_NORMAL && status.iStatus == 0) 470 handleRtError(RTStrmOpen(m_szFileName, "r", &m_Strm), "Failed to open '%s'", m_szFileName); 471 handleRtError(RTVfsIoStrmOpenNormal(m_szFileName, RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_NONE, &m_hVfsIos), 472 "Failed to open '%s'", m_szFileName); 471 473 else 472 handleRtError(RTStrmOpen(m_szErrFileName, "r", &m_Strm), "Failed to open '%s'", m_szErrFileName); 473 return m_Strm; 474 handleRtError(RTVfsIoStrmOpenNormal(m_szErrFileName, RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_NONE, &m_hVfsIos), 475 "Failed to open '%s'", m_szErrFileName); 476 return m_hVfsIos; 474 477 } 475 478 … … 493 496 throw RTCError(com::Utf8StrFmt("Write failure (cb=%d)\n", cb)); 494 497 495 PRTSTREAM strmIn = NULL;498 RTVFSIOSTREAM hVfsIos = NIL_RTVFSIOSTREAM; 496 499 try 497 500 { 498 strmIn= item->getStream();501 hVfsIos = item->getStream(); 499 502 } 500 503 catch (RTCError &e) 501 504 { 502 strmIn = NULL;505 hVfsIos = NIL_RTVFSIOSTREAM; 503 506 RTStrmPutStr(m_StrmTxt, e.what()); 504 507 } … … 506 509 int rc = VINF_SUCCESS; 507 510 508 if ( strmIn)511 if (hVfsIos != NIL_RTVFSIOSTREAM) 509 512 { 510 513 char buf[64*1024]; 511 514 size_t cbRead, cbWritten; 512 515 cbRead = cbWritten = 0; 513 while (RT_SUCCESS(rc = RT StrmReadEx(strmIn, buf, sizeof(buf), &cbRead)) && cbRead)516 while (RT_SUCCESS(rc = RTVfsIoStrmRead(hVfsIos, buf, sizeof(buf), true /*fBlocking*/, &cbRead)) && cbRead) 514 517 { 515 518 rc = RTStrmWriteEx(m_StrmTxt, applyFilters(item, buf, &cbRead), cbRead, &cbWritten); … … 525 528 526 529 BugReportTarGzip::BugReportTarGzip(const char *pszFileName) 527 : BugReport(pszFileName), m_hTar (NIL_RTTAR), m_hTarFile(NIL_RTTARFILE)530 : BugReport(pszFileName), m_hTarFss(NIL_RTVFSFSSTREAM) 528 531 { 529 532 VfsIoStreamHandle hVfsOut; … … 534 537 "Failed to create compressed stream for '%s'", pszFileName); 535 538 536 handleRtError(RTPathTemp(m_szTarName, RTPATH_MAX), 537 "Failed to obtain path to temporary folder"); 538 handleRtError(RTPathAppend(m_szTarName, RTPATH_MAX, "BugRepXXXXX.tar"), 539 "Failed to append path"); 540 handleRtError(RTFileCreateTemp(m_szTarName, 0600), 541 "Failed to create temporary file '%s'", m_szTarName); 542 handleRtError(RTFileDelete(m_szTarName), 543 "Failed to delete temporary file '%s'", m_szTarName); 544 handleRtError(RTTarOpen(&m_hTar, m_szTarName, RTFILE_O_CREATE | RTFILE_O_WRITE | RTFILE_O_DENY_ALL), 545 "Failed to create TAR file '%s'", m_szTarName); 546 539 int rc = RTZipTarFsStreamToIoStream(m_hVfsGzip.get(), RTZIPTARFORMAT_DEFAULT, RTZIPTAR_C_SPARSE, &m_hTarFss); 540 handleRtError(rc, "Failed to create TAR file '%s'", m_szTarName); 547 541 } 548 542 549 543 BugReportTarGzip::~BugReportTarGzip() 550 544 { 551 if (m_hTarFile != NIL_RTTARFILE) 552 RTTarFileClose(m_hTarFile); 553 if (m_hTar != NIL_RTTAR) 554 RTTarClose(m_hTar); 545 if (m_hTarFss != NIL_RTVFSFSSTREAM) 546 RTVfsFsStrmRelease(m_hTarFss); 547 } 548 549 void BugReportTarGzip::dumpExceptionToArchive(RTCString &strTarFile, RTCError &e) 550 { 551 RTVFSFILE hVfsFile; 552 int rc = RTVfsMemFileCreate(NIL_RTVFSIOSTREAM, _1K/*cbEstimate*/, &hVfsFile); 553 if (RT_SUCCESS(rc)) 554 { 555 rc = RTVfsFileWrite(hVfsFile, e.what(), RTStrNLen(e.what(), 1024), NULL /*pcbWritten*/); 556 if (RT_SUCCESS(rc)) 557 { 558 rc = RTVfsFileSeek(hVfsFile, 0 /*offSeek*/, RTFILE_SEEK_BEGIN, NULL /*poffActual*/); 559 if (RT_SUCCESS(rc)) 560 { 561 RTVFSOBJ hVfsObj = RTVfsObjFromFile(hVfsFile); 562 rc = RTVfsFsStrmAdd(m_hTarFss, strTarFile.c_str(), hVfsObj, 0 /*fFlags*/); 563 RTVfsObjRelease(hVfsObj); 564 } 565 } 566 RTVfsFileRelease(hVfsFile); 567 } 568 handleRtError(rc, "Failed to add exception text to TAR archive '%s'", m_szTarName); 555 569 } 556 570 … … 562 576 */ 563 577 RTCString strTarFile = RTCString(item->getTitle()).substr(0, RTStrNLen(item->getTitle(), 99)); 564 handleRtError(RTTarFileOpen(m_hTar, &m_hTarFile, strTarFile.c_str(), 565 RTFILE_O_CREATE | RTFILE_O_WRITE | RTFILE_O_DENY_NONE), 566 "Failed to open '%s' in TAR", strTarFile.c_str()); 567 568 PRTSTREAM strmIn = NULL; 578 RTVFSIOSTREAM hVfsIos = NIL_RTVFSIOSTREAM; 569 579 try 570 580 { 571 strmIn= item->getStream();581 hVfsIos = item->getStream(); 572 582 } 573 583 catch (RTCError &e) 574 584 { 575 strmIn = NULL; 576 handleRtError(RTTarFileWriteAt(m_hTarFile, 0, e.what(), RTStrNLen(e.what(), 1024), NULL), 577 "Failed to write %u bytes to TAR", RTStrNLen(e.what(), 1024)); 578 } 579 580 int rc = VINF_SUCCESS; 581 582 if (strmIn) 583 { 584 char buf[64*1024]; 585 size_t cbRead = 0; 586 for (uint64_t offset = 0; 587 RT_SUCCESS(rc = RTStrmReadEx(strmIn, buf, sizeof(buf), &cbRead)) && cbRead; 588 offset += cbRead) 589 { 590 handleRtError(RTTarFileWriteAt(m_hTarFile, offset, applyFilters(item, buf, &cbRead), cbRead, NULL), 591 "Failed to write %u bytes to TAR", cbRead); 592 } 593 } 594 595 if (m_hTarFile) 596 { 597 handleRtError(RTTarFileClose(m_hTarFile), "Failed to close '%s' in TAR", strTarFile.c_str()); 598 m_hTarFile = NIL_RTTARFILE; 585 hVfsIos = NIL_RTVFSIOSTREAM; 586 dumpExceptionToArchive(strTarFile, e); 587 } 588 589 if (hVfsIos != NIL_RTVFSIOSTREAM) 590 { 591 RTVFSOBJ hVfsObjIos = RTVfsObjFromIoStream(hVfsIos); 592 int rc = RTVfsFsStrmAdd(m_hTarFss, strTarFile.c_str(), hVfsObjIos, 0 /*fFlags*/); 593 RTVfsObjRelease(hVfsObjIos); 594 handleRtError(rc, "Failed to add file to TAR archive '%s'", m_szTarName); 599 595 } 600 596 } … … 602 598 void BugReportTarGzip::complete(void) 603 599 { 604 if (m_hTarFile != NIL_RTTARFILE) 605 { 606 RTTarFileClose(m_hTarFile); 607 m_hTarFile = NIL_RTTARFILE; 608 } 609 if (m_hTar != NIL_RTTAR) 610 { 611 RTTarClose(m_hTar); 612 m_hTar = NIL_RTTAR; 613 } 614 615 VfsIoStreamHandle hVfsIn; 616 handleRtError(RTVfsIoStrmOpenNormal(m_szTarName, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE, 617 hVfsIn.getPtr()), 618 "Failed to open TAR file '%s'", m_szTarName); 619 620 int rc; 621 char buf[_64K]; 622 size_t cbRead = 0; 623 while (RT_SUCCESS(rc = RTVfsIoStrmRead(hVfsIn.get(), buf, sizeof(buf), true, &cbRead)) && cbRead) 624 handleRtError(RTVfsIoStrmWrite(m_hVfsGzip.get(), buf, cbRead, true, NULL), 625 "Failed to write into compressed stream"); 626 handleRtError(rc, "Failed to read from TAR stream"); 600 if (m_hTarFss != NIL_RTVFSFSSTREAM) 601 { 602 RTVfsFsStrmRelease(m_hTarFss); 603 m_hTarFss = NIL_RTVFSFSSTREAM; 604 } 627 605 handleRtError(RTVfsIoStrmFlush(m_hVfsGzip.get()), "Failed to flush output stream"); 628 606 m_hVfsGzip.release(); -
trunk/src/VBox/Frontends/VBoxBugReport/VBoxBugReport.h
r98103 r98320 46 46 #include <iprt/path.h> 47 47 #include <iprt/stream.h> 48 #include <iprt/tar.h>49 48 #include <iprt/vfs.h> 49 #include <iprt/zip.h> 50 50 #include <iprt/cpp/list.h> 51 51 … … 130 130 virtual ~BugReportItem(); 131 131 virtual const char *getTitle(void); 132 virtual PRTSTREAM getStream(void) = 0;132 virtual RTVFSIOSTREAM getStream(void) = 0; 133 133 void addFilter(BugReportFilter *filter); 134 134 void *applyFilter(void *pvSource, size_t *pcbInOut); … … 169 169 BugReportStream(const char *pszTitle); 170 170 virtual ~BugReportStream(); 171 virtual PRTSTREAM getStream(void);171 virtual RTVFSIOSTREAM getStream(void); 172 172 protected: 173 173 int printf(const char *pszFmt, ...); 174 174 int putStr(const char *pszString); 175 175 private: 176 PRTSTREAM m_Strm;176 RTVFSIOSTREAM m_hVfsIos; 177 177 char m_szFileName[RTPATH_MAX]; 178 178 }; … … 206 206 virtual void complete(void); 207 207 private: 208 void dumpExceptionToArchive(RTCString &strTarFile, RTCError &e); 209 208 210 /* 209 211 * Helper class to release handles going out of scope. … … 228 230 VfsIoStreamHandle m_hVfsGzip; 229 231 230 RTTAR m_hTar; 231 RTTARFILE m_hTarFile; 232 RTVFSFSSTREAM m_hTarFss; 232 233 char m_szTarName[RTPATH_MAX]; 233 234 }; … … 242 243 BugReportFile(const char *pszPath, const char *pcszName); 243 244 virtual ~BugReportFile(); 244 virtual PRTSTREAM getStream(void);245 virtual RTVFSIOSTREAM getStream(void); 245 246 246 247 private: 247 248 char *m_pszPath; 248 PRTSTREAM m_Strm;249 RTVFSIOSTREAM m_hVfsIos; 249 250 }; 250 251 … … 257 258 BugReportCommand(const char *pszTitle, const char *pszExec, ...); 258 259 virtual ~BugReportCommand(); 259 virtual PRTSTREAM getStream(void);260 private: 261 PRTSTREAM m_Strm;260 virtual RTVFSIOSTREAM getStream(void); 261 private: 262 RTVFSIOSTREAM m_hVfsIos; 262 263 char m_szFileName[RTPATH_MAX]; 263 264 char *m_papszArgs[32]; … … 272 273 BugReportCommandTemp(const char *pszTitle, const char *pszExec, ...); 273 274 virtual ~BugReportCommandTemp(); 274 virtual PRTSTREAM getStream(void);275 private: 276 PRTSTREAM m_Strm;275 virtual RTVFSIOSTREAM getStream(void); 276 private: 277 RTVFSIOSTREAM m_hVfsIos; 277 278 char m_szFileName[RTPATH_MAX]; 278 279 char m_szErrFileName[RTPATH_MAX]; -
trunk/src/VBox/Frontends/VBoxBugReport/VBoxBugReportWin.cpp
r98103 r98320 268 268 BugReportUsbTreeWin(); 269 269 virtual ~BugReportUsbTreeWin(); 270 virtual PRTSTREAM getStream(void) { enumerate(); return BugReportStream::getStream(); }270 virtual RTVFSIOSTREAM getStream(void) { enumerate(); return BugReportStream::getStream(); } 271 271 private: 272 272 class AutoHandle { … … 582 582 BugReportDriversWin(); 583 583 virtual ~BugReportDriversWin(); 584 virtual PRTSTREAM getStream(void) { enumerateDrivers(); return BugReportStream::getStream(); }584 virtual RTVFSIOSTREAM getStream(void) { enumerateDrivers(); return BugReportStream::getStream(); } 585 585 private: 586 586 void enumerateDrivers(void);
Note:
See TracChangeset
for help on using the changeset viewer.