| // 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::Dict system_infos) { | 
 |   auto response = std::make_unique<SystemLogsResponse>(); | 
 |   for (const auto item : system_infos) { | 
 |     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 |