Chromium Code Reviews| Index: chrome/installer/util/google_update_settings.cc |
| =================================================================== |
| --- chrome/installer/util/google_update_settings.cc (revision 87612) |
| +++ chrome/installer/util/google_update_settings.cc (working copy) |
| @@ -26,6 +26,17 @@ |
| namespace { |
| +const wchar_t kGoogleUpdatePoliciesKey[] = |
| + L"SOFTWARE\\Policies\\Google\\Update"; |
| +const wchar_t kGoogleUpdateUpdatePolicyValue[] = L"UpdateDefault"; |
| +const wchar_t kGoogleUpdateUpdateOverrideValuePrefix[] = L"Update"; |
| +const GoogleUpdateSettings::UpdatePolicy kGoogleUpdateDefaultUpdatePolicy = |
| +#if defined(GOOGLE_CHROME_BUILD) |
| + GoogleUpdateSettings::AUTOMATIC_UPDATES; |
| +#else |
| + GoogleUpdateSettings::UPDATES_DISABLED; |
| +#endif |
| + |
| // An list of search results in increasing order of desirability. |
| enum EulaSearchResult { |
| NO_SETTING, |
| @@ -143,6 +154,30 @@ |
| return true; |
| } |
| +// Populates |update_policy| with the UpdatePolicy enum value corresponding to a |
| +// DWORD read from the registry and returns true if |value| is within range. |
| +// If |value| is out of range, returns false without modifying |update_policy|. |
| +bool GetUpdatePolicyFromDword( |
| + const DWORD value, |
| + GoogleUpdateSettings::UpdatePolicy* update_policy) { |
| + COMPILE_ASSERT(GoogleUpdateSettings::UPDATES_DISABLED == 0, |
| + dont_reorder_GoogleUpdateSettings_UpdatePolicy); |
| + COMPILE_ASSERT(GoogleUpdateSettings::AUTOMATIC_UPDATES == 1, |
| + dont_reorder_GoogleUpdateSettings_UpdatePolicy); |
| + COMPILE_ASSERT(GoogleUpdateSettings::MANUAL_UPDATES_ONLY == 2, |
| + dont_reorder_GoogleUpdateSettings_UpdatePolicy); |
|
robertshield
2011/06/08 16:06:52
Can these asserts go near the enum declaration? I
grt (UTC plus 2)
2011/06/08 16:31:32
Done.
|
| + switch (value) { |
| + case GoogleUpdateSettings::UPDATES_DISABLED: |
| + case GoogleUpdateSettings::AUTOMATIC_UPDATES: |
| + case GoogleUpdateSettings::MANUAL_UPDATES_ONLY: |
| + *update_policy = static_cast<GoogleUpdateSettings::UpdatePolicy>(value); |
| + return true; |
| + default: |
| + LOG(WARNING) << "Unexpected update policy override value: " << value; |
| + } |
| + return false; |
| +} |
| + |
| } // namespace |
| // Older versions of Chrome unconditionally read from HKCU\...\ClientState\... |
| @@ -486,3 +521,44 @@ |
| return (StartsWith(brand, L"GG", true) || StartsWith(brand, L"EU", true)); |
| } |
| + |
| +GoogleUpdateSettings::UpdatePolicy GoogleUpdateSettings::GetAppUpdatePolicy( |
| + const std::wstring& app_guid, |
| + bool* is_overridden) { |
| + bool found_override = false; |
| + UpdatePolicy update_policy = kGoogleUpdateDefaultUpdatePolicy; |
| + |
| +#if defined(GOOGLE_CHROME_BUILD) |
| + DCHECK(!app_guid.empty()); |
| + RegKey policy_key; |
| + |
| + // Google Update Group Policy settings are always in HKLM. |
| + if (policy_key.Open(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey, |
| + KEY_QUERY_VALUE) == ERROR_SUCCESS) { |
| + static const size_t kPrefixLen = |
| + arraysize(kGoogleUpdateUpdateOverrideValuePrefix) - 1; |
| + DWORD value; |
| + std::wstring app_update_override; |
| + app_update_override.reserve(kPrefixLen + app_guid.size()); |
| + app_update_override.append(kGoogleUpdateUpdateOverrideValuePrefix, |
| + kPrefixLen); |
| + app_update_override.append(app_guid); |
| + // First try to read and comprehend the app-specific override. |
| + found_override = (policy_key.ReadValueDW(app_update_override.c_str(), |
| + &value) == ERROR_SUCCESS && |
| + GetUpdatePolicyFromDword(value, &update_policy)); |
| + |
| + // Failing that, try to read and comprehend the default override. |
| + if (!found_override && |
| + policy_key.ReadValueDW(kGoogleUpdateUpdatePolicyValue, |
| + &value) == ERROR_SUCCESS) { |
| + GetUpdatePolicyFromDword(value, &update_policy); |
| + } |
| + } |
| +#endif // defined(GOOGLE_CHROME_BUILD) |
| + |
| + if (is_overridden != NULL) |
| + *is_overridden = found_override; |
| + |
| + return update_policy; |
| +} |