| 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 // NOTE: This code is a legacy utility API for partners to check whether | 5 // NOTE: This code is a legacy utility API for partners to check whether |
| 6 // Chrome can be installed and launched. Recent updates are being made | 6 // Chrome can be installed and launched. Recent updates are being made |
| 7 // to add new functionality. These updates use code from Chromium, the old | 7 // to add new functionality. These updates use code from Chromium, the old |
| 8 // coded against the win32 api directly. If you have an itch to shave a | 8 // coded against the win32 api directly. If you have an itch to shave a |
| 9 // yak, feel free to re-write the old code too. | 9 // yak, feel free to re-write the old code too. |
| 10 | 10 |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 } | 196 } |
| 197 | 197 |
| 198 ::RegCloseKey(key); | 198 ::RegCloseKey(key); |
| 199 } | 199 } |
| 200 | 200 |
| 201 return can_re_offer; | 201 return can_re_offer; |
| 202 } | 202 } |
| 203 | 203 |
| 204 bool IsChromeInstalled(HKEY root_key) { | 204 bool IsChromeInstalled(HKEY root_key) { |
| 205 RegKey key; | 205 RegKey key; |
| 206 return key.Open(root_key, | 206 return key.Open(root_key, kChromeRegClientsKey, KEY_READ) == ERROR_SUCCESS && |
| 207 kChromeRegClientsKey, | |
| 208 KEY_READ | KEY_WOW64_32KEY) == ERROR_SUCCESS && | |
| 209 key.HasValue(kChromeRegVersion); | 207 key.HasValue(kChromeRegVersion); |
| 210 } | 208 } |
| 211 | 209 |
| 212 // Returns true if the |subkey| in |root| has the kC1FKey entry set to 1. | 210 // Returns true if the |subkey| in |root| has the kC1FKey entry set to 1. |
| 213 bool RegKeyHasC1F(HKEY root, const wchar_t* subkey) { | 211 bool RegKeyHasC1F(HKEY root, const wchar_t* subkey) { |
| 214 RegKey key; | 212 RegKey key; |
| 215 DWORD value; | 213 DWORD value; |
| 216 return key.Open(root, subkey, KEY_READ | KEY_WOW64_32KEY) == ERROR_SUCCESS && | 214 return key.Open(root, subkey, KEY_READ) == ERROR_SUCCESS && |
| 217 key.ReadValueDW(kC1FKey, &value) == ERROR_SUCCESS && | 215 key.ReadValueDW(kC1FKey, &value) == ERROR_SUCCESS && |
| 218 value == static_cast<DWORD>(1); | 216 value == static_cast<DWORD>(1); |
| 219 } | 217 } |
| 220 | 218 |
| 221 bool IsC1FSent() { | 219 bool IsC1FSent() { |
| 222 // The C1F RLZ key can either be in HKCU or in HKLM (the HKLM RLZ key is made | 220 // The C1F RLZ key can either be in HKCU or in HKLM (the HKLM RLZ key is made |
| 223 // readable to all-users via rlz_lib::CreateMachineState()) and can either be | 221 // readable to all-users via rlz_lib::CreateMachineState()) and can either be |
| 224 // in sent or pending state. Return true if there is a match for any of these | 222 // in sent or pending state. Return true if there is a match for any of these |
| 225 // 4 states. | 223 // 4 states. |
| 226 return RegKeyHasC1F(HKEY_CURRENT_USER, kC1FSentKey) || | 224 return RegKeyHasC1F(HKEY_CURRENT_USER, kC1FSentKey) || |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 return (check == TRUE); | 269 return (check == TRUE); |
| 272 } | 270 } |
| 273 | 271 |
| 274 bool VerifyHKLMAccess() { | 272 bool VerifyHKLMAccess() { |
| 275 wchar_t str[] = L"test"; | 273 wchar_t str[] = L"test"; |
| 276 bool result = false; | 274 bool result = false; |
| 277 DWORD disposition = 0; | 275 DWORD disposition = 0; |
| 278 HKEY key = NULL; | 276 HKEY key = NULL; |
| 279 | 277 |
| 280 if (::RegCreateKeyEx(HKEY_LOCAL_MACHINE, kGCAPITempKey, 0, NULL, | 278 if (::RegCreateKeyEx(HKEY_LOCAL_MACHINE, kGCAPITempKey, 0, NULL, |
| 281 REG_OPTION_NON_VOLATILE, | 279 REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, |
| 282 KEY_READ | KEY_WRITE | KEY_WOW64_32KEY, NULL, | |
| 283 &key, &disposition) == ERROR_SUCCESS) { | 280 &key, &disposition) == ERROR_SUCCESS) { |
| 284 if (::RegSetValueEx(key, str, 0, REG_SZ, (LPBYTE)str, | 281 if (::RegSetValueEx(key, str, 0, REG_SZ, (LPBYTE)str, |
| 285 (DWORD)lstrlen(str)) == ERROR_SUCCESS) { | 282 (DWORD)lstrlen(str)) == ERROR_SUCCESS) { |
| 286 result = true; | 283 result = true; |
| 287 RegDeleteValue(key, str); | 284 RegDeleteValue(key, str); |
| 288 } | 285 } |
| 289 | 286 |
| 290 RegCloseKey(key); | 287 RegCloseKey(key); |
| 291 | 288 |
| 292 // If we create the main key, delete the entire key. | 289 // If we create the main key, delete the entire key. |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 | 588 |
| 592 BOOL __stdcall LaunchGoogleChromeInBackground() { | 589 BOOL __stdcall LaunchGoogleChromeInBackground() { |
| 593 return LaunchGoogleChromeWithDimensions(-1, -1, -1, -1, true); | 590 return LaunchGoogleChromeWithDimensions(-1, -1, -1, -1, true); |
| 594 } | 591 } |
| 595 | 592 |
| 596 int __stdcall GoogleChromeDaysSinceLastRun() { | 593 int __stdcall GoogleChromeDaysSinceLastRun() { |
| 597 int days_since_last_run = std::numeric_limits<int>::max(); | 594 int days_since_last_run = std::numeric_limits<int>::max(); |
| 598 | 595 |
| 599 if (IsChromeInstalled(HKEY_LOCAL_MACHINE) || | 596 if (IsChromeInstalled(HKEY_LOCAL_MACHINE) || |
| 600 IsChromeInstalled(HKEY_CURRENT_USER)) { | 597 IsChromeInstalled(HKEY_CURRENT_USER)) { |
| 601 RegKey client_state(HKEY_CURRENT_USER, | 598 RegKey client_state( |
| 602 kChromeRegClientStateKey, | 599 HKEY_CURRENT_USER, kChromeRegClientStateKey, KEY_QUERY_VALUE); |
| 603 KEY_QUERY_VALUE | KEY_WOW64_32KEY); | |
| 604 if (client_state.Valid()) { | 600 if (client_state.Valid()) { |
| 605 std::wstring last_run; | 601 std::wstring last_run; |
| 606 int64 last_run_value = 0; | 602 int64 last_run_value = 0; |
| 607 if (client_state.ReadValue(google_update::kRegLastRunTimeField, | 603 if (client_state.ReadValue(google_update::kRegLastRunTimeField, |
| 608 &last_run) == ERROR_SUCCESS && | 604 &last_run) == ERROR_SUCCESS && |
| 609 base::StringToInt64(last_run, &last_run_value)) { | 605 base::StringToInt64(last_run, &last_run_value)) { |
| 610 Time last_run_time = Time::FromInternalValue(last_run_value); | 606 Time last_run_time = Time::FromInternalValue(last_run_value); |
| 611 TimeDelta difference = Time::NowFromSystemTime() - last_run_time; | 607 TimeDelta difference = Time::NowFromSystemTime() - last_run_time; |
| 612 | 608 |
| 613 // We can end up with negative numbers here, given changes in system | 609 // We can end up with negative numbers here, given changes in system |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 745 days_since_last_run < kRelaunchMinDaysDormant) { | 741 days_since_last_run < kRelaunchMinDaysDormant) { |
| 746 if (error_code) | 742 if (error_code) |
| 747 *error_code = RELAUNCH_ERROR_NOTDORMANT; | 743 *error_code = RELAUNCH_ERROR_NOTDORMANT; |
| 748 return FALSE; | 744 return FALSE; |
| 749 } | 745 } |
| 750 | 746 |
| 751 // e) a minimum period (6 months) must have passed since the previous | 747 // e) a minimum period (6 months) must have passed since the previous |
| 752 // relaunch offer for the current user; | 748 // relaunch offer for the current user; |
| 753 RegKey key; | 749 RegKey key; |
| 754 DWORD min_relaunch_date; | 750 DWORD min_relaunch_date; |
| 755 if (key.Open(HKEY_CURRENT_USER, | 751 if (key.Open(HKEY_CURRENT_USER, kChromeRegClientStateKey, |
| 756 kChromeRegClientStateKey, | 752 KEY_QUERY_VALUE) == ERROR_SUCCESS && |
| 757 KEY_QUERY_VALUE | KEY_WOW64_32KEY) == ERROR_SUCCESS && | |
| 758 key.ReadValueDW(kRelaunchAllowedAfterValue, | 753 key.ReadValueDW(kRelaunchAllowedAfterValue, |
| 759 &min_relaunch_date) == ERROR_SUCCESS && | 754 &min_relaunch_date) == ERROR_SUCCESS && |
| 760 FormatDateOffsetByMonths(0) < min_relaunch_date) { | 755 FormatDateOffsetByMonths(0) < min_relaunch_date) { |
| 761 if (error_code) | 756 if (error_code) |
| 762 *error_code = RELAUNCH_ERROR_ALREADY_RELAUNCHED; | 757 *error_code = RELAUNCH_ERROR_ALREADY_RELAUNCHED; |
| 763 return FALSE; | 758 return FALSE; |
| 764 } | 759 } |
| 765 | 760 |
| 766 return TRUE; | 761 return TRUE; |
| 767 } | 762 } |
| 768 | 763 |
| 769 BOOL __stdcall SetRelaunchOffered(const wchar_t** partner_brandcode_list, | 764 BOOL __stdcall SetRelaunchOffered(const wchar_t** partner_brandcode_list, |
| 770 int partner_brandcode_list_length, | 765 int partner_brandcode_list_length, |
| 771 const wchar_t* relaunch_brandcode, | 766 const wchar_t* relaunch_brandcode, |
| 772 int shell_mode, | 767 int shell_mode, |
| 773 DWORD* error_code) { | 768 DWORD* error_code) { |
| 774 if (!CanOfferRelaunch(partner_brandcode_list, partner_brandcode_list_length, | 769 if (!CanOfferRelaunch(partner_brandcode_list, partner_brandcode_list_length, |
| 775 shell_mode, error_code)) | 770 shell_mode, error_code)) |
| 776 return FALSE; | 771 return FALSE; |
| 777 | 772 |
| 778 // Store the relaunched brand code and the minimum date for relaunch (6 months | 773 // Store the relaunched brand code and the minimum date for relaunch (6 months |
| 779 // from now), and set the Omaha experiment label. | 774 // from now), and set the Omaha experiment label. |
| 780 RegKey key; | 775 RegKey key; |
| 781 if (key.Create(HKEY_CURRENT_USER, | 776 if (key.Create(HKEY_CURRENT_USER, kChromeRegClientStateKey, |
| 782 kChromeRegClientStateKey, | 777 KEY_SET_VALUE) != ERROR_SUCCESS || |
| 783 KEY_SET_VALUE | KEY_WOW64_32KEY) != ERROR_SUCCESS || | |
| 784 key.WriteValue(kRelaunchBrandcodeValue, | 778 key.WriteValue(kRelaunchBrandcodeValue, |
| 785 relaunch_brandcode) != ERROR_SUCCESS || | 779 relaunch_brandcode) != ERROR_SUCCESS || |
| 786 key.WriteValue(kRelaunchAllowedAfterValue, | 780 key.WriteValue(kRelaunchAllowedAfterValue, |
| 787 FormatDateOffsetByMonths(6)) != ERROR_SUCCESS || | 781 FormatDateOffsetByMonths(6)) != ERROR_SUCCESS || |
| 788 !SetRelaunchExperimentLabels(relaunch_brandcode, shell_mode)) { | 782 !SetRelaunchExperimentLabels(relaunch_brandcode, shell_mode)) { |
| 789 if (error_code) | 783 if (error_code) |
| 790 *error_code = RELAUNCH_ERROR_RELAUNCH_FAILED; | 784 *error_code = RELAUNCH_ERROR_RELAUNCH_FAILED; |
| 791 return FALSE; | 785 return FALSE; |
| 792 } | 786 } |
| 793 | 787 |
| 794 return TRUE; | 788 return TRUE; |
| 795 } | 789 } |
| OLD | NEW |