Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Crashpad Authors. All rights reserved. | 1 // Copyright 2015 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 476 } | 476 } |
| 477 | 477 |
| 478 // static | 478 // static |
| 479 OperationStatus Metadata::VerifyReport(const ReportDisk& report_disk, | 479 OperationStatus Metadata::VerifyReport(const ReportDisk& report_disk, |
| 480 ReportState desired_state) { | 480 ReportState desired_state) { |
| 481 return (report_disk.state == desired_state) | 481 return (report_disk.state == desired_state) |
| 482 ? VerifyReportAnyState(report_disk) | 482 ? VerifyReportAnyState(report_disk) |
| 483 : CrashReportDatabase::kBusyError; | 483 : CrashReportDatabase::kBusyError; |
| 484 } | 484 } |
| 485 | 485 |
| 486 bool EnsureDirectory(const base::FilePath& path) { | |
| 487 DWORD fileattr = GetFileAttributes(path.value().c_str()); | |
| 488 if (fileattr == INVALID_FILE_ATTRIBUTES) { | |
| 489 PLOG(ERROR) << "GetFileAttributes " << base::UTF16ToUTF8(path.value()); | |
| 490 return false; | |
| 491 } | |
| 492 if ((fileattr & FILE_ATTRIBUTE_DIRECTORY) == 0) { | |
| 493 LOG(ERROR) << "GetFileAttributes " | |
| 494 << base::UTF16ToUTF8(path.value()) | |
| 495 << ": not a directory"; | |
| 496 return false; | |
| 497 } | |
| 498 return true; | |
| 499 } | |
| 500 | |
| 486 //! \brief Ensures that the node at path is a directory, and creates it if it | 501 //! \brief Ensures that the node at path is a directory, and creates it if it |
| 487 //! does not exist. | 502 //! does not exist. |
| 488 //! | 503 //! |
| 489 //! \return If the path points to a file, rather than a directory, or the | 504 //! \return If the path points to a file, rather than a directory, or the |
| 490 //! directory could not be created, returns `false`. Otherwise, returns | 505 //! directory could not be created, returns `false`. Otherwise, returns |
| 491 //! `true`, indicating that path already was or now is a directory. | 506 //! `true`, indicating that path already was or now is a directory. |
| 492 bool CreateDirectoryIfNecessary(const base::FilePath& path) { | 507 bool CreateDirectoryIfNecessary(const base::FilePath& path) { |
| 493 if (CreateDirectory(path.value().c_str(), nullptr)) | 508 if (CreateDirectory(path.value().c_str(), nullptr)) |
| 494 return true; | 509 return true; |
| 495 if (GetLastError() != ERROR_ALREADY_EXISTS) { | 510 if (GetLastError() != ERROR_ALREADY_EXISTS) { |
| 496 PLOG(ERROR) << "CreateDirectory"; | 511 PLOG(ERROR) << "CreateDirectory " << base::UTF16ToUTF8(path.value()); |
| 497 return false; | 512 return false; |
| 498 } | 513 } |
| 499 DWORD fileattr = GetFileAttributes(path.value().c_str()); | 514 return EnsureDirectory(path); |
| 500 if (fileattr == INVALID_FILE_ATTRIBUTES) { | |
| 501 PLOG(ERROR) << "GetFileAttributes"; | |
| 502 return false; | |
| 503 } | |
| 504 if ((fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0) | |
| 505 return true; | |
| 506 LOG(ERROR) << "not a directory"; | |
| 507 return false; | |
| 508 } | 515 } |
| 509 | 516 |
| 510 // CrashReportDatabaseWin ------------------------------------------------------ | 517 // CrashReportDatabaseWin ------------------------------------------------------ |
| 511 | 518 |
| 512 class CrashReportDatabaseWin : public CrashReportDatabase { | 519 class CrashReportDatabaseWin : public CrashReportDatabase { |
| 513 public: | 520 public: |
| 514 explicit CrashReportDatabaseWin(const base::FilePath& path); | 521 explicit CrashReportDatabaseWin(const base::FilePath& path); |
| 515 ~CrashReportDatabaseWin() override; | 522 ~CrashReportDatabaseWin() override; |
| 516 | 523 |
| 517 bool Initialize(); | 524 bool Initialize(bool may_create); |
| 518 | 525 |
| 519 // CrashReportDatabase: | 526 // CrashReportDatabase: |
| 520 Settings* GetSettings() override; | 527 Settings* GetSettings() override; |
| 521 OperationStatus PrepareNewCrashReport(NewReport** report) override; | 528 OperationStatus PrepareNewCrashReport(NewReport** report) override; |
| 522 OperationStatus FinishedWritingCrashReport(NewReport* report, | 529 OperationStatus FinishedWritingCrashReport(NewReport* report, |
| 523 UUID* uuid) override; | 530 UUID* uuid) override; |
| 524 OperationStatus ErrorWritingCrashReport(NewReport* report) override; | 531 OperationStatus ErrorWritingCrashReport(NewReport* report) override; |
| 525 OperationStatus LookUpCrashReport(const UUID& uuid, Report* report) override; | 532 OperationStatus LookUpCrashReport(const UUID& uuid, Report* report) override; |
| 526 OperationStatus GetPendingReports(std::vector<Report>* reports) override; | 533 OperationStatus GetPendingReports(std::vector<Report>* reports) override; |
| 527 OperationStatus GetCompletedReports(std::vector<Report>* reports) override; | 534 OperationStatus GetCompletedReports(std::vector<Report>* reports) override; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 545 CrashReportDatabaseWin::CrashReportDatabaseWin(const base::FilePath& path) | 552 CrashReportDatabaseWin::CrashReportDatabaseWin(const base::FilePath& path) |
| 546 : CrashReportDatabase(), | 553 : CrashReportDatabase(), |
| 547 base_dir_(path), | 554 base_dir_(path), |
| 548 settings_(base_dir_.Append(kSettings)), | 555 settings_(base_dir_.Append(kSettings)), |
| 549 initialized_() { | 556 initialized_() { |
| 550 } | 557 } |
| 551 | 558 |
| 552 CrashReportDatabaseWin::~CrashReportDatabaseWin() { | 559 CrashReportDatabaseWin::~CrashReportDatabaseWin() { |
| 553 } | 560 } |
| 554 | 561 |
| 555 bool CrashReportDatabaseWin::Initialize() { | 562 bool CrashReportDatabaseWin::Initialize(bool may_create) { |
| 556 INITIALIZATION_STATE_SET_INITIALIZING(initialized_); | 563 INITIALIZATION_STATE_SET_INITIALIZING(initialized_); |
| 557 | 564 |
| 558 // Ensure the database and report subdirectories exist. | 565 // Ensure the databse directory exists. |
|
scottmg
2015/10/07 20:58:18
'database' if you didn't already land.
Mark Mentovai
2015/10/07 21:03:34
scottmg wrote:
| |
| 559 if (!CreateDirectoryIfNecessary(base_dir_) || | 566 if (may_create) { |
| 560 !CreateDirectoryIfNecessary(base_dir_.Append(kReportsDirectory))) | 567 if (!CreateDirectoryIfNecessary(base_dir_)) |
| 568 return false; | |
| 569 } else if (!EnsureDirectory(base_dir_)) { | |
| 570 return false; | |
| 571 } | |
| 572 | |
| 573 // Ensure that the report subdirectory exists. | |
| 574 if (!CreateDirectoryIfNecessary(base_dir_.Append(kReportsDirectory))) | |
| 561 return false; | 575 return false; |
| 562 | 576 |
| 563 // TODO(scottmg): When are completed reports pruned from disk? Delete here or | 577 // TODO(scottmg): When are completed reports pruned from disk? Delete here or |
| 564 // maybe on AcquireMetadata(). | 578 // maybe on AcquireMetadata(). |
| 565 | 579 |
| 566 if (!settings_.Initialize()) | 580 if (!settings_.Initialize()) |
| 567 return false; | 581 return false; |
| 568 | 582 |
| 569 INITIALIZATION_STATE_SET_VALID(initialized_); | 583 INITIALIZATION_STATE_SET_VALID(initialized_); |
| 570 return true; | 584 return true; |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 744 if (os == kNoError) | 758 if (os == kNoError) |
| 745 report_disk->state = ReportState::kCompleted; | 759 report_disk->state = ReportState::kCompleted; |
| 746 return os; | 760 return os; |
| 747 } | 761 } |
| 748 | 762 |
| 749 scoped_ptr<Metadata> CrashReportDatabaseWin::AcquireMetadata() { | 763 scoped_ptr<Metadata> CrashReportDatabaseWin::AcquireMetadata() { |
| 750 base::FilePath metadata_file = base_dir_.Append(kMetadataFileName); | 764 base::FilePath metadata_file = base_dir_.Append(kMetadataFileName); |
| 751 return Metadata::Create(metadata_file, base_dir_.Append(kReportsDirectory)); | 765 return Metadata::Create(metadata_file, base_dir_.Append(kReportsDirectory)); |
| 752 } | 766 } |
| 753 | 767 |
| 768 scoped_ptr<CrashReportDatabase> InitializeInternal( | |
| 769 const base::FilePath& path, bool may_create) { | |
| 770 scoped_ptr<CrashReportDatabaseWin> database_win( | |
| 771 new CrashReportDatabaseWin(path)); | |
| 772 return database_win->Initialize(may_create) | |
| 773 ? database_win.Pass() : scoped_ptr<CrashReportDatabaseWin>(); | |
|
Robert Sesek
2015/10/07 21:04:33
nit: shouldn't ? go on the previous line?
Mark Mentovai
2015/10/07 21:07:09
Robert Sesek wrote:
| |
| 774 } | |
| 775 | |
| 754 } // namespace | 776 } // namespace |
| 755 | 777 |
| 756 // static | 778 // static |
| 757 scoped_ptr<CrashReportDatabase> CrashReportDatabase::Initialize( | 779 scoped_ptr<CrashReportDatabase> CrashReportDatabase::Initialize( |
| 758 const base::FilePath& path) { | 780 const base::FilePath& path) { |
| 759 scoped_ptr<CrashReportDatabaseWin> database_win( | 781 return InitializeInternal(path, true); |
| 760 new CrashReportDatabaseWin(path)); | 782 } |
| 761 return database_win->Initialize() ? database_win.Pass() | 783 |
| 762 : scoped_ptr<CrashReportDatabaseWin>(); | 784 // static |
| 785 scoped_ptr<CrashReportDatabase> CrashReportDatabase::InitializeWithoutCreating( | |
| 786 const base::FilePath& path) { | |
| 787 return InitializeInternal(path, false); | |
| 763 } | 788 } |
| 764 | 789 |
| 765 } // namespace crashpad | 790 } // namespace crashpad |
| OLD | NEW |