// Copyright 2015 The Crashpad Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "client/crash_report_database.h" #include "build/build_config.h" namespace crashpad { CrashReportDatabase::Report::Report() : uuid(), file_path(), id(), creation_time(0), uploaded(false), last_upload_attempt_time(0), upload_attempts(0), upload_explicitly_requested(false), total_size(0u) {} CrashReportDatabase::NewReport::NewReport() : writer_(std::make_unique()), file_remover_(), attachment_writers_(), attachment_removers_(), uuid_(), database_() {} CrashReportDatabase::NewReport::~NewReport() = default; bool CrashReportDatabase::NewReport::Initialize( CrashReportDatabase* database, const base::FilePath& directory, const base::FilePath::StringType& extension) { database_ = database; if (!uuid_.InitializeWithNew()) { return false; } #if defined(OS_WIN) const std::wstring uuid_string = uuid_.ToWString(); #else const std::string uuid_string = uuid_.ToString(); #endif const base::FilePath path = directory.Append(uuid_string + extension); if (!writer_->Open( path, FileWriteMode::kCreateOrFail, FilePermissions::kOwnerOnly)) { return false; } file_remover_.reset(path); return true; } FileReaderInterface* CrashReportDatabase::NewReport::Reader() { auto reader = std::make_unique(); if (!reader->Open(file_remover_.get())) { return nullptr; } reader_ = std::move(reader); return reader_.get(); } CrashReportDatabase::UploadReport::UploadReport() : Report(), reader_(std::make_unique()), database_(nullptr), attachment_readers_(), attachment_map_(), report_metrics_(false) {} CrashReportDatabase::UploadReport::~UploadReport() { if (database_) { database_->RecordUploadAttempt(this, false, std::string()); } } bool CrashReportDatabase::UploadReport::Initialize(const base::FilePath& path, CrashReportDatabase* db) { database_ = db; InitializeAttachments(); return reader_->Open(path); } CrashReportDatabase::OperationStatus CrashReportDatabase::RecordUploadComplete( std::unique_ptr report_in, const std::string& id) { UploadReport* report = const_cast(report_in.get()); report->database_ = nullptr; return RecordUploadAttempt(report, true, id); } } // namespace crashpad