Pin Chrome's shortcut to the Win10 Start menu on install and OS upgrade.
[chromium-blink-merge.git] / remoting / host / usage_stats_consent_win.cc
blobbacab67a1ae22cf9d120026eabc614efa6b0f889
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
3 // found in the LICENSE file.
5 #include "remoting/host/usage_stats_consent.h"
7 #include <windows.h>
8 #include <string>
10 #include "base/logging.h"
11 #include "base/strings/stringprintf.h"
12 #include "base/win/registry.h"
13 #include "remoting/host/win/omaha.h"
15 namespace {
17 // The following strings are used to construct the registry key names where
18 // we record whether the user has consented to crash dump collection.
19 // the user's consent to collect crash dumps is recorded.
20 const wchar_t kOmahaClientStateKeyFormat[] =
21 L"Software\\Google\\Update\\%ls\\%ls";
22 const wchar_t kOmahaClientState[] = L"ClientState";
23 const wchar_t kOmahaClientStateMedium[] = L"ClientStateMedium";
24 const wchar_t kOmahaUsagestatsValue[] = L"usagestats";
26 LONG ReadUsageStatsValue(const wchar_t* state_key, DWORD* usagestats_out) {
27 // presubmit: allow wstring
28 std::wstring client_state = base::StringPrintf(kOmahaClientStateKeyFormat,
29 state_key,
30 remoting::kHostOmahaAppid);
31 base::win::RegKey key;
32 LONG result = key.Open(HKEY_LOCAL_MACHINE, client_state.c_str(), KEY_READ);
33 if (result != ERROR_SUCCESS) {
34 return result;
37 return key.ReadValueDW(kOmahaUsagestatsValue, usagestats_out);
40 } // namespace
42 namespace remoting {
44 bool GetUsageStatsConsent(bool* allowed, bool* set_by_policy) {
45 // TODO(alexeypa): report whether the consent is set by policy once
46 // supported.
47 *set_by_policy = false;
49 // The user's consent to collect crash dumps is recored as the "usagestats"
50 // value in the ClientState or ClientStateMedium key. Probe
51 // the ClientStateMedium key first.
52 DWORD value = 0;
53 if (ReadUsageStatsValue(kOmahaClientStateMedium, &value) == ERROR_SUCCESS) {
54 *allowed = value != 0;
55 return true;
57 if (ReadUsageStatsValue(kOmahaClientState, &value) == ERROR_SUCCESS) {
58 *allowed = value != 0;
59 return true;
62 // We do not log the error code here because the logging hasn't been
63 // initialized yet.
64 return false;
67 bool IsUsageStatsAllowed() {
68 bool allowed;
69 bool set_by_policy;
70 return GetUsageStatsConsent(&allowed, &set_by_policy) && allowed;
73 bool SetUsageStatsConsent(bool allowed) {
74 DWORD value = allowed;
75 // presubmit: allow wstring
76 std::wstring client_state = base::StringPrintf(kOmahaClientStateKeyFormat,
77 kOmahaClientStateMedium,
78 kHostOmahaAppid);
79 base::win::RegKey key;
80 LONG result = key.Create(HKEY_LOCAL_MACHINE, client_state.c_str(),
81 KEY_SET_VALUE);
82 if (result == ERROR_SUCCESS) {
83 result = key.WriteValue(kOmahaUsagestatsValue, value);
84 if (result == ERROR_SUCCESS) {
85 return true;
89 PLOG(ERROR) << "Failed to record the user's consent to crash dump reporting";
90 return false;
93 } // namespace remoting