| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ash/system_logs/crosapi_system_log_source.h" |
| |
| #include "base/functional/bind.h" |
| #include "chrome/browser/ash/crosapi/browser_manager.h" |
| |
| namespace system_logs { |
| |
| namespace { |
| constexpr char kLacrosLogEntryPrefix[] = "Lacros "; |
| } // namespace |
| |
| CrosapiSystemLogSource::CrosapiSystemLogSource() |
| : SystemLogsSource("LacrosSystemLog") { |
| crosapi::BrowserManager::Get()->AddObserver(this); |
| } |
| |
| CrosapiSystemLogSource::~CrosapiSystemLogSource() { |
| crosapi::BrowserManager::Get()->RemoveObserver(this); |
| } |
| |
| void CrosapiSystemLogSource::Fetch(SysLogsSourceCallback callback) { |
| DCHECK(callback_.is_null()); |
| DCHECK(!callback.is_null()); |
| |
| if (crosapi::BrowserManager::Get()->IsRunning()) { |
| callback_ = std::move(callback); |
| crosapi::BrowserManager::Get()->GetFeedbackData( |
| base::BindOnce(&CrosapiSystemLogSource::OnGetFeedbackData, |
| weak_ptr_factory_.GetWeakPtr())); |
| } else { |
| // Fetch is called right after the data source is added to the |
| // SystemLogsFetcher when Lacros is running, it is unlikely Lacros will |
| // be terminated before Fetch is called. But it does not hurt to check |
| // again and handle the case for playing safely. |
| std::move(callback).Run(std::make_unique<SystemLogsResponse>()); |
| } |
| } |
| |
| void CrosapiSystemLogSource::OnGetFeedbackData(base::Value system_infos) { |
| auto response = std::make_unique<SystemLogsResponse>(); |
| DCHECK(system_infos.is_dict()); |
| if (system_infos.is_dict()) { |
| for (const auto item : system_infos.GetDict()) { |
| std::string log_entry_key = kLacrosLogEntryPrefix + item.first; |
| if (item.second.is_string()) { |
| response->emplace(log_entry_key, item.second.GetString()); |
| } else { |
| LOG(ERROR) << "Failed to retrieve the content for log entry: " |
| << log_entry_key; |
| } |
| } |
| } |
| std::move(callback_).Run(std::move(response)); |
| } |
| |
| void CrosapiSystemLogSource::OnMojoDisconnected() { |
| if (callback_.is_null()) |
| return; |
| |
| // Run callback_ with empty response. |
| std::move(callback_).Run(std::make_unique<SystemLogsResponse>()); |
| } |
| |
| } // namespace system_logs |