Index: common/stats_uploader.cc |
diff --git a/common/stats_uploader.cc b/common/stats_uploader.cc |
deleted file mode 100644 |
index 9e41f11b6c1038f1bcbccd94ce19637f498fbc47..0000000000000000000000000000000000000000 |
--- a/common/stats_uploader.cc |
+++ /dev/null |
@@ -1,283 +0,0 @@ |
-// Copyright 2008-2010 Google Inc. |
-// |
-// 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 "omaha/common/stats_uploader.h" |
-#include <atlbase.h> |
-#include <atlconv.h> |
-#include <atlstr.h> |
-#include <ctime> |
-#include "omaha/base/const_object_names.h" |
-#include "omaha/base/constants.h" |
-#include "omaha/base/debug.h" |
-#include "omaha/base/error.h" |
-#include "omaha/base/logging.h" |
-#include "omaha/base/omaha_version.h" |
-#include "omaha/base/safe_format.h" |
-#include "omaha/base/scoped_impersonation.h" |
-#include "omaha/base/synchronized.h" |
-#include "omaha/base/reg_key.h" |
-#include "omaha/base/utils.h" |
-#include "omaha/base/vista_utils.h" |
-#include "omaha/common/config_manager.h" |
-#include "omaha/common/goopdate_utils.h" |
-#include "omaha/net/network_config.h" |
-#include "omaha/net/network_request.h" |
-#include "omaha/net/simple_request.h" |
-#include "omaha/statsreport/aggregator-win32.h" |
-#include "omaha/statsreport/const-win32.h" |
-#include "omaha/statsreport/formatter.h" |
-#include "omaha/statsreport/metrics.h" |
-#include "omaha/statsreport/persistent_iterator-win32.h" |
- |
-using stats_report::g_global_metrics; |
- |
-using stats_report::kCountsKeyName; |
-using stats_report::kTimingsKeyName; |
-using stats_report::kIntegersKeyName; |
-using stats_report::kBooleansKeyName; |
-using stats_report::kStatsKeyFormatString; |
-using stats_report::kLastTransmissionTimeValueName; |
- |
-using stats_report::Formatter; |
-using stats_report::MetricsAggregatorWin32; |
-using stats_report::PersistentMetricsIteratorWin32; |
- |
-namespace omaha { |
- |
-namespace { |
- |
-HRESULT ResetPersistentMetrics(RegKey* key) { |
- ASSERT1(key); |
- HRESULT result = S_OK; |
- DWORD now_sec = static_cast<DWORD>(time(NULL)); |
- HRESULT hr = key->SetValue(kLastTransmissionTimeValueName, now_sec); |
- if (FAILED(hr)) { |
- result = hr; |
- } |
- hr = key->DeleteSubKey(kCountsKeyName); |
- if (FAILED(hr)) { |
- result = hr; |
- } |
- hr = key->DeleteSubKey(kTimingsKeyName); |
- if (FAILED(hr)) { |
- result = hr; |
- } |
- hr = key->DeleteSubKey(kIntegersKeyName); |
- if (FAILED(hr)) { |
- result = hr; |
- } |
- hr = key->DeleteSubKey(kBooleansKeyName); |
- if (FAILED(hr)) { |
- result = hr; |
- } |
- return result; |
-} |
- |
-// Returns S_OK without uploading in OEM mode. |
-HRESULT UploadMetrics(bool is_machine, |
- const TCHAR* extra_url_data, |
- const TCHAR* content) { |
- ASSERT1(content); |
- |
- CString uid = goopdate_utils::GetUserIdLazyInit(is_machine); |
- |
- // Impersonate the user if the caller is machine, running as local system, |
- // and a user is logged on to the system. |
- scoped_handle impersonation_token( |
- goopdate_utils::GetImpersonationTokenForMachineProcess(is_machine)); |
- scoped_impersonation impersonate_user(get(impersonation_token)); |
- |
- // Do not access the network during an OEM install. |
- if (!ConfigManager::Instance()->CanUseNetwork(is_machine)) { |
- CORE_LOG(L1, (_T("[Stats not uploaded because network use prohibited]"))); |
- return GOOPDATE_E_CANNOT_USE_NETWORK; |
- } |
- |
- const TCHAR* version = GetVersionString(); |
- CString test_source(ConfigManager::Instance()->GetTestSource()); |
- |
- CString url; |
- HRESULT hr = ConfigManager::Instance()->GetUsageStatsReportUrl(&url); |
- if (FAILED(hr)) { |
- CORE_LOG(LE, (_T("[GetUsageStatsReportUrl failed][0x%08x]"), hr)); |
- return hr; |
- } |
- SafeCStringAppendFormat(&url, _T("?%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s"), |
- kMetricsServerParamSourceId, kMetricsProductName, |
- kMetricsServerParamVersion, version, |
- kMetricsServerParamIsMachine, is_machine ? _T("1") : _T("0"), |
- kMetricsServerTestSource, test_source, |
- kMetricsServerUserId, uid, |
- extra_url_data); |
- |
- CORE_LOG(L3, (_T("[upload usage stats][%s]"), content)); |
- |
- NetworkConfig* network_config = NULL; |
- NetworkConfigManager& network_manager = NetworkConfigManager::Instance(); |
- hr = network_manager.GetUserNetworkConfig(&network_config); |
- if (FAILED(hr)) { |
- CORE_LOG(LE, (_T("[GetUserNetworkConfig failed][0x%08x]"), hr)); |
- return hr; |
- } |
- NetworkRequest network_request(network_config->session()); |
- |
- network_request.set_num_retries(1); |
- network_request.AddHttpRequest(new SimpleRequest); |
- |
- // PostRequest falls back to https. |
- std::vector<uint8> response_buffer; |
- return PostRequest(&network_request, true, url, content, &response_buffer); |
-} |
- |
-HRESULT ReportMetrics(bool is_machine, |
- const TCHAR* extra_url_data, |
- DWORD interval) { |
- PersistentMetricsIteratorWin32 it(kMetricsProductName, is_machine), end; |
- Formatter formatter(CT2A(kMetricsProductName), interval); |
- |
- for (; it != end; ++it) { |
- formatter.AddMetric(*it); |
- } |
- |
- return UploadMetrics(is_machine, extra_url_data, CA2T(formatter.output())); |
-} |
- |
-HRESULT DoResetMetrics(bool is_machine) { |
- CString key_name; |
- key_name.Format(kStatsKeyFormatString, kMetricsProductName); |
- HKEY parent_key = is_machine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
- RegKey key; |
- HRESULT hr = key.Create(parent_key, key_name); |
- if (FAILED(hr)) { |
- CORE_LOG(LE, (_T("[Unable to create metrics key][0x%08x]"), hr)); |
- return hr; |
- } |
- return ResetPersistentMetrics(&key); |
-} |
- |
-HRESULT DoAggregateMetrics(bool is_machine) { |
- MetricsAggregatorWin32 aggregator(g_global_metrics, |
- kMetricsProductName, |
- is_machine); |
- if (!aggregator.AggregateMetrics()) { |
- CORE_LOG(LW, (_T("[Metrics aggregation failed for unknown reasons]"))); |
- return GOOPDATE_E_METRICS_AGGREGATE_FAILED; |
- } |
- return S_OK; |
-} |
- |
-HRESULT DoAggregateAndReportMetrics(bool is_machine, bool force_report) { |
- CString key_name; |
- key_name.Format(kStatsKeyFormatString, kMetricsProductName); |
- HKEY parent_key = is_machine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
- RegKey key; |
- HRESULT hr = key.Create(parent_key, key_name); |
- if (FAILED(hr)) { |
- CORE_LOG(LE, (_T("[Unable to create metrics key][0x%08x]"), hr)); |
- return hr; |
- } |
- |
- DWORD now_sec = static_cast<DWORD>(time(NULL)); |
- |
- DWORD last_transmission_sec(0); |
- hr = key.GetValue(kLastTransmissionTimeValueName, &last_transmission_sec); |
- |
- // Reset and start over if last transmission time is missing or hinky. |
- if (FAILED(hr) || last_transmission_sec > now_sec) { |
- CORE_LOG(LW, (_T("[hinky or missing last transmission time][%u][now: %u]"), |
- last_transmission_sec, now_sec)); |
- ResetPersistentMetrics(&key); |
- return S_OK; |
- } |
- |
- hr = DoAggregateMetrics(is_machine); |
- if (FAILED(hr)) { |
- CORE_LOG(LE, (_T("[DoAggregateMetrics failed][0x%08x]"), hr)); |
- return hr; |
- } |
- |
- DWORD time_since_last_transmission = now_sec - last_transmission_sec; |
- if (!force_report && |
- time_since_last_transmission < kMetricsUploadIntervalSec) { |
- CORE_LOG(L1, (_T("[Stats upload not needed][last: %u][now: %u]"), |
- last_transmission_sec, now_sec)); |
- return S_OK; |
- } |
- |
- // Report the metrics, reset the metrics, and update 'LastTransmission'. |
- hr = ReportMetrics(is_machine, NULL, time_since_last_transmission); |
- if (FAILED(hr)) { |
- CORE_LOG(LE, (_T("[Stats upload failed][0x%08x]"), hr)); |
- return hr; |
- } |
- |
- VERIFY1(SUCCEEDED(ResetPersistentMetrics(&key))); |
- CORE_LOG(L3, (_T("[Stats upload successful]"))); |
- return S_OK; |
-} |
- |
-bool InitializeLock(GLock* lock, bool is_machine) { |
- ASSERT1(lock); |
- NamedObjectAttributes attributes; |
- GetNamedObjectAttributes(kMetricsSerializer, is_machine, &attributes); |
- return lock->InitializeWithSecAttr(attributes.name, &attributes.sa); |
-} |
- |
-} // namespace |
- |
- |
-HRESULT ResetMetrics(bool is_machine) { |
- CORE_LOG(L2, (_T("[ResetMetrics]"))); |
- GLock lock; |
- if (!InitializeLock(&lock, is_machine)) { |
- return GOOPDATE_E_METRICS_LOCK_INIT_FAILED; |
- } |
- __mutexScope(lock); |
- return DoResetMetrics(is_machine); |
-} |
- |
-HRESULT AggregateMetrics(bool is_machine) { |
- CORE_LOG(L2, (_T("[AggregateMetrics]"))); |
- |
- if (!ConfigManager::Instance()->CanCollectStats(is_machine)) { |
- return S_OK; |
- } |
- |
- GLock lock; |
- if (!InitializeLock(&lock, is_machine)) { |
- return GOOPDATE_E_METRICS_LOCK_INIT_FAILED; |
- } |
- __mutexScope(lock); |
- return DoAggregateMetrics(is_machine); |
-} |
- |
-HRESULT AggregateAndReportMetrics(bool is_machine, bool force_report) { |
- CORE_LOG(L2, (_T("[AggregateAndReportMetrics]"))); |
- |
- if (!ConfigManager::Instance()->CanCollectStats(is_machine)) { |
- return S_OK; |
- } |
- |
- GLock lock; |
- if (!InitializeLock(&lock, is_machine)) { |
- return GOOPDATE_E_METRICS_LOCK_INIT_FAILED; |
- } |
- __mutexScope(lock); |
- return DoAggregateAndReportMetrics(is_machine, force_report); |
-} |
- |
-} // namespace omaha |
- |