Index: components/update_client/ping_manager.cc |
diff --git a/components/update_client/ping_manager.cc b/components/update_client/ping_manager.cc |
index 97ca49f9b0f73d05343efdcad2d73bf4935d2ea3..7cb6749d8d94439d495afa977401e35813e484cc 100644 |
--- a/components/update_client/ping_manager.cc |
+++ b/components/update_client/ping_manager.cc |
@@ -12,19 +12,14 @@ |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
-#include "base/compiler_specific.h" |
#include "base/location.h" |
#include "base/logging.h" |
#include "base/macros.h" |
#include "base/memory/ptr_util.h" |
#include "base/sequenced_task_runner.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "components/update_client/component.h" |
#include "components/update_client/configurator.h" |
+#include "components/update_client/protocol_builder.h" |
#include "components/update_client/request_sender.h" |
-#include "components/update_client/updater_state.h" |
#include "components/update_client/utils.h" |
#include "net/url_request/url_fetcher.h" |
#include "url/gurl.h" |
@@ -33,146 +28,6 @@ namespace update_client { |
namespace { |
-// Returns a string literal corresponding to the value of the downloader |d|. |
-const char* DownloaderToString(CrxDownloader::DownloadMetrics::Downloader d) { |
- switch (d) { |
- case CrxDownloader::DownloadMetrics::kUrlFetcher: |
- return "direct"; |
- case CrxDownloader::DownloadMetrics::kBits: |
- return "bits"; |
- default: |
- return "unknown"; |
- } |
-} |
- |
-// Returns a string representing a sequence of download complete events |
-// corresponding to each download metrics in |item|. |
-std::string BuildDownloadCompleteEventElements(const Component& component) { |
- using base::StringAppendF; |
- std::string download_events; |
- for (const auto& metrics : component.download_metrics()) { |
- std::string event("<event eventtype=\"14\""); |
- StringAppendF(&event, " eventresult=\"%d\"", metrics.error == 0); |
- StringAppendF(&event, " downloader=\"%s\"", |
- DownloaderToString(metrics.downloader)); |
- if (metrics.error) { |
- StringAppendF(&event, " errorcode=\"%d\"", metrics.error); |
- } |
- StringAppendF(&event, " url=\"%s\"", metrics.url.spec().c_str()); |
- |
- // -1 means that the byte counts are not known. |
- if (metrics.downloaded_bytes != -1) { |
- StringAppendF(&event, " downloaded=\"%s\"", |
- base::Int64ToString(metrics.downloaded_bytes).c_str()); |
- } |
- if (metrics.total_bytes != -1) { |
- StringAppendF(&event, " total=\"%s\"", |
- base::Int64ToString(metrics.total_bytes).c_str()); |
- } |
- |
- if (metrics.download_time_ms) { |
- StringAppendF(&event, " download_time_ms=\"%s\"", |
- base::Uint64ToString(metrics.download_time_ms).c_str()); |
- } |
- StringAppendF(&event, "/>"); |
- |
- download_events += event; |
- } |
- return download_events; |
-} |
- |
-// Returns a string representing one ping event for the update of a component. |
-// The event type for this ping event is 3. |
-std::string BuildUpdateCompleteEventElement(const Component& component) { |
- DCHECK(component.state() == ComponentState::kUpdateError || |
- component.state() == ComponentState::kUpdated); |
- |
- using base::StringAppendF; |
- |
- std::string ping_event("<event eventtype=\"3\""); |
- const int event_result = component.state() == ComponentState::kUpdated; |
- StringAppendF(&ping_event, " eventresult=\"%d\"", event_result); |
- if (component.error_category()) |
- StringAppendF(&ping_event, " errorcat=\"%d\"", component.error_category()); |
- if (component.error_code()) |
- StringAppendF(&ping_event, " errorcode=\"%d\"", component.error_code()); |
- if (component.extra_code1()) |
- StringAppendF(&ping_event, " extracode1=\"%d\"", component.extra_code1()); |
- if (HasDiffUpdate(component)) |
- StringAppendF(&ping_event, " diffresult=\"%d\"", |
- !component.diff_update_failed()); |
- if (component.diff_error_category()) { |
- StringAppendF(&ping_event, " differrorcat=\"%d\"", |
- component.diff_error_category()); |
- } |
- if (component.diff_error_code()) |
- StringAppendF(&ping_event, " differrorcode=\"%d\"", |
- component.diff_error_code()); |
- if (component.diff_extra_code1()) { |
- StringAppendF(&ping_event, " diffextracode1=\"%d\"", |
- component.diff_extra_code1()); |
- } |
- if (!component.previous_fp().empty()) |
- StringAppendF(&ping_event, " previousfp=\"%s\"", |
- component.previous_fp().c_str()); |
- if (!component.next_fp().empty()) |
- StringAppendF(&ping_event, " nextfp=\"%s\"", component.next_fp().c_str()); |
- StringAppendF(&ping_event, "/>"); |
- return ping_event; |
-} |
- |
-// Returns a string representing one ping event for the uninstall of a |
-// component. The event type for this ping event is 4. |
-std::string BuildUninstalledEventElement(const Component& component) { |
- DCHECK(component.state() == ComponentState::kUninstalled); |
- |
- using base::StringAppendF; |
- |
- std::string ping_event("<event eventtype=\"4\" eventresult=\"1\""); |
- if (component.extra_code1()) |
- StringAppendF(&ping_event, " extracode1=\"%d\"", component.extra_code1()); |
- StringAppendF(&ping_event, "/>"); |
- return ping_event; |
-} |
- |
-// Builds a ping message for the specified component. |
-std::string BuildPing(const Configurator& config, const Component& component) { |
- const char app_element_format[] = |
- "<app appid=\"%s\" version=\"%s\" nextversion=\"%s\">" |
- "%s" |
- "%s" |
- "</app>"; |
- |
- std::string ping_event; |
- switch (component.state()) { |
- case ComponentState::kUpdateError: // Fall through. |
- case ComponentState::kUpdated: |
- ping_event = BuildUpdateCompleteEventElement(component); |
- break; |
- case ComponentState::kUninstalled: |
- ping_event = BuildUninstalledEventElement(component); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- |
- const std::string app_element(base::StringPrintf( |
- app_element_format, |
- component.id().c_str(), // "appid" |
- component.previous_version().GetString().c_str(), // "version" |
- component.next_version().GetString().c_str(), // "nextversion" |
- ping_event.c_str(), // ping event |
- BuildDownloadCompleteEventElements(component) |
- .c_str())); // download events |
- |
- // The ping request does not include any updater state. |
- return BuildProtocolRequest( |
- config.GetProdId(), config.GetBrowserVersion().GetString(), |
- config.GetChannel(), config.GetLang(), config.GetOSLongName(), |
- config.GetDownloadPreference(), app_element, "", nullptr); |
-} |
- |
// Sends a fire and forget ping. The instances of this class have no |
// ownership and they self-delete upon completion. One instance of this class |
// can send only one ping. |
@@ -219,7 +74,7 @@ bool PingSender::SendPing(const Component& component) { |
if (urls.empty()) |
return false; |
- request_sender_.reset(new RequestSender(config_)); |
+ request_sender_ = base::MakeUnique<RequestSender>(config_); |
request_sender_->Send( |
false, BuildPing(*config_, component), urls, |
base::Bind(&PingSender::OnRequestSenderComplete, base::Unretained(this))); |