| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/system_logs/debug_daemon_log_source.h" | 5 #include "chrome/browser/chromeos/system_logs/debug_daemon_log_source.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/file_util.h" |
| 9 #include "base/logging.h" | 10 #include "base/logging.h" |
| 10 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/memory/weak_ptr.h" | 12 #include "base/memory/weak_ptr.h" |
| 12 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 13 #include "chrome/browser/chromeos/system_logs/system_logs_fetcher.h" | 14 #include "chrome/browser/chromeos/system_logs/system_logs_fetcher.h" |
| 14 #include "chrome/common/chrome_switches.h" | 15 #include "chrome/common/chrome_switches.h" |
| 15 #include "chromeos/dbus/dbus_thread_manager.h" | 16 #include "chromeos/dbus/dbus_thread_manager.h" |
| 16 #include "chromeos/dbus/debug_daemon_client.h" | 17 #include "chromeos/dbus/debug_daemon_client.h" |
| 17 #include "content/public/browser/browser_thread.h" | 18 #include "content/public/browser/browser_thread.h" |
| 18 | 19 |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 const char kNotAvailable[] = "<not available>"; | 22 const char kNotAvailable[] = "<not available>"; |
| 22 const char kRoutesKeyName[] = "routes"; | 23 const char kRoutesKeyName[] = "routes"; |
| 23 const char kNetworkStatusKeyName[] = "network-status"; | 24 const char kNetworkStatusKeyName[] = "network-status"; |
| 24 const char kModemStatusKeyName[] = "modem-status"; | 25 const char kModemStatusKeyName[] = "modem-status"; |
| 26 const char kUserLogFileKeyName[] = "user_log_files"; |
| 25 } // namespace | 27 } // namespace |
| 26 | 28 |
| 27 namespace chromeos { | 29 namespace chromeos { |
| 28 | 30 |
| 29 // Fetches logs from the debug daemon over DBus. When all the logs have been | 31 // Fetches logs from the debug daemon over DBus. When all the logs have been |
| 30 // fetched, forwards the results to the supplied Request. Used like: | 32 // fetched, forwards the results to the supplied Request. Used like: |
| 31 // DebugDaemonLogSource* fetcher = new DebugDaemonLogSource(request); | 33 // DebugDaemonLogSource* fetcher = new DebugDaemonLogSource(request); |
| 32 // fetcher->Fetch(); | 34 // fetcher->Fetch(); |
| 33 // Note that you do not need to delete the fetcher; it will delete itself after | 35 // Note that you do not need to delete the fetcher; it will delete itself after |
| 34 // Fetch() has forwarded the result to the request handler. | 36 // Fetch() has forwarded the result to the request handler. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 56 ++num_pending_requests_; | 58 ++num_pending_requests_; |
| 57 client->GetNetworkStatus(base::Bind(&DebugDaemonLogSource::OnGetNetworkStatus, | 59 client->GetNetworkStatus(base::Bind(&DebugDaemonLogSource::OnGetNetworkStatus, |
| 58 weak_ptr_factory_.GetWeakPtr())); | 60 weak_ptr_factory_.GetWeakPtr())); |
| 59 ++num_pending_requests_; | 61 ++num_pending_requests_; |
| 60 client->GetModemStatus(base::Bind(&DebugDaemonLogSource::OnGetModemStatus, | 62 client->GetModemStatus(base::Bind(&DebugDaemonLogSource::OnGetModemStatus, |
| 61 weak_ptr_factory_.GetWeakPtr())); | 63 weak_ptr_factory_.GetWeakPtr())); |
| 62 ++num_pending_requests_; | 64 ++num_pending_requests_; |
| 63 client->GetAllLogs(base::Bind(&DebugDaemonLogSource::OnGetLogs, | 65 client->GetAllLogs(base::Bind(&DebugDaemonLogSource::OnGetLogs, |
| 64 weak_ptr_factory_.GetWeakPtr())); | 66 weak_ptr_factory_.GetWeakPtr())); |
| 65 ++num_pending_requests_; | 67 ++num_pending_requests_; |
| 68 client->GetUserLogFiles(base::Bind(&DebugDaemonLogSource::OnGetUserLogFiles, |
| 69 weak_ptr_factory_.GetWeakPtr())); |
| 70 ++num_pending_requests_; |
| 66 } | 71 } |
| 67 | 72 |
| 68 void DebugDaemonLogSource::OnGetRoutes(bool succeeded, | 73 void DebugDaemonLogSource::OnGetRoutes(bool succeeded, |
| 69 const std::vector<std::string>& routes) { | 74 const std::vector<std::string>& routes) { |
| 70 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 75 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 71 | 76 |
| 72 if (succeeded) | 77 if (succeeded) |
| 73 (*response_)[kRoutesKeyName] = JoinString(routes, '\n'); | 78 (*response_)[kRoutesKeyName] = JoinString(routes, '\n'); |
| 74 else | 79 else |
| 75 (*response_)[kRoutesKeyName] = kNotAvailable; | 80 (*response_)[kRoutesKeyName] = kNotAvailable; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 92 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 97 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 93 | 98 |
| 94 if (succeeded) | 99 if (succeeded) |
| 95 (*response_)[kModemStatusKeyName] = status; | 100 (*response_)[kModemStatusKeyName] = status; |
| 96 else | 101 else |
| 97 (*response_)[kModemStatusKeyName] = kNotAvailable; | 102 (*response_)[kModemStatusKeyName] = kNotAvailable; |
| 98 RequestCompleted(); | 103 RequestCompleted(); |
| 99 } | 104 } |
| 100 | 105 |
| 101 void DebugDaemonLogSource::OnGetLogs(bool /* succeeded */, | 106 void DebugDaemonLogSource::OnGetLogs(bool /* succeeded */, |
| 102 const std::map<std::string, | 107 const KeyValueMap& logs) { |
| 103 std::string>& logs) { | |
| 104 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 108 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 105 | 109 |
| 106 // We ignore 'succeeded' for this callback - we want to display as much of the | 110 // We ignore 'succeeded' for this callback - we want to display as much of the |
| 107 // debug info as we can even if we failed partway through parsing, and if we | 111 // debug info as we can even if we failed partway through parsing, and if we |
| 108 // couldn't fetch any of it, none of the fields will even appear. | 112 // couldn't fetch any of it, none of the fields will even appear. |
| 109 response_->insert(logs.begin(), logs.end()); | 113 response_->insert(logs.begin(), logs.end()); |
| 110 RequestCompleted(); | 114 RequestCompleted(); |
| 111 } | 115 } |
| 112 | 116 |
| 117 void DebugDaemonLogSource::OnGetUserLogFiles( |
| 118 bool succeeded, |
| 119 const KeyValueMap& user_log_files) { |
| 120 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 121 if (succeeded) { |
| 122 content::BrowserThread::PostBlockingPoolTaskAndReply( |
| 123 FROM_HERE, |
| 124 base::Bind( |
| 125 &DebugDaemonLogSource::ReadUserLogFiles, |
| 126 weak_ptr_factory_.GetWeakPtr(), |
| 127 user_log_files), |
| 128 base::Bind(&DebugDaemonLogSource::RequestCompleted, |
| 129 weak_ptr_factory_.GetWeakPtr())); |
| 130 } else { |
| 131 (*response_)[kUserLogFileKeyName] = kNotAvailable; |
| 132 RequestCompleted(); |
| 133 } |
| 134 } |
| 135 |
| 136 void DebugDaemonLogSource::ReadUserLogFiles(const KeyValueMap& user_log_files) { |
| 137 for (KeyValueMap::const_iterator it = user_log_files.begin(); |
| 138 it != user_log_files.end(); |
| 139 ++it) { |
| 140 std::string value; |
| 141 bool read_success = file_util::ReadFileToString( |
| 142 FilePath(it->second), &value); |
| 143 if (read_success && !value.empty()) |
| 144 (*response_)[it->first] = value; |
| 145 else |
| 146 (*response_)[it->second] = kNotAvailable; |
| 147 } |
| 148 } |
| 149 |
| 113 void DebugDaemonLogSource::RequestCompleted() { | 150 void DebugDaemonLogSource::RequestCompleted() { |
| 114 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 151 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 115 DCHECK(!callback_.is_null()); | 152 DCHECK(!callback_.is_null()); |
| 116 | 153 |
| 117 --num_pending_requests_; | 154 --num_pending_requests_; |
| 118 if (num_pending_requests_ > 0) | 155 if (num_pending_requests_ > 0) |
| 119 return; | 156 return; |
| 120 callback_.Run(response_.get()); | 157 callback_.Run(response_.get()); |
| 121 } | 158 } |
| 122 | 159 |
| 123 } // namespace chromeos | 160 } // namespace chromeos |
| OLD | NEW |