| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "chrome/test/mini_installer_test/chrome_mini_installer.h" | 5 #include "chrome/test/mini_installer_test/chrome_mini_installer.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
| 9 #include "base/platform_thread.h" | 9 #include "base/platform_thread.h" |
| 10 #include "base/process_util.h" | 10 #include "base/process_util.h" |
| 11 #include "base/registry.h" | 11 #include "base/registry.h" |
| 12 #include "base/string_number_conversions.h" | 12 #include "base/string_number_conversions.h" |
| 13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 14 #include "chrome/installer/util/browser_distribution.h" | 14 #include "chrome/installer/util/browser_distribution.h" |
| 15 #include "chrome/installer/util/google_update_constants.h" | 15 #include "chrome/installer/util/google_update_constants.h" |
| 16 #include "chrome/test/mini_installer_test/mini_installer_test_constants.h" | 16 #include "chrome/test/mini_installer_test/mini_installer_test_constants.h" |
| 17 #include "chrome/test/mini_installer_test/mini_installer_test_util.h" | 17 #include "chrome/test/mini_installer_test/mini_installer_test_util.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 19 |
| 20 // Constructor. | |
| 21 ChromeMiniInstaller::ChromeMiniInstaller(const std::wstring& install_type, | 20 ChromeMiniInstaller::ChromeMiniInstaller(const std::wstring& install_type, |
| 22 bool is_chrome_frame) : is_chrome_frame_(is_chrome_frame), | 21 bool is_chrome_frame) |
| 23 install_type_(install_type) { | 22 : is_chrome_frame_(is_chrome_frame), |
| 23 install_type_(install_type), |
| 24 has_diff_installer_(false), |
| 25 has_full_installer_(false), |
| 26 has_prev_installer_(false) { |
| 24 installer_name_ = StringPrintf(L"%ls (%ls)", | 27 installer_name_ = StringPrintf(L"%ls (%ls)", |
| 25 mini_installer_constants::kChromeBuildType, install_type_.c_str()); | 28 mini_installer_constants::kChromeBuildType, install_type_.c_str()); |
| 26 | |
| 27 has_diff_installer_ = false; | |
| 28 has_full_installer_ = false; | |
| 29 has_prev_installer_ = false; | |
| 30 } | 29 } |
| 31 | 30 |
| 32 void ChromeMiniInstaller::SetBuildUnderTest(const std::wstring& build) { | 31 void ChromeMiniInstaller::SetBuildUnderTest(const std::wstring& build) { |
| 33 // Locate the full, diff, and previous installers. | 32 // Locate the full, diff, and previous installers. |
| 34 const wchar_t * build_prefix; | 33 const wchar_t * build_prefix; |
| 35 if (LowerCaseEqualsASCII(build, "dev")) | 34 if (LowerCaseEqualsASCII(build, "dev")) |
| 36 build_prefix = mini_installer_constants::kDevChannelBuild; | 35 build_prefix = mini_installer_constants::kDevChannelBuild; |
| 37 else if (LowerCaseEqualsASCII(build, "stable")) | 36 else if (LowerCaseEqualsASCII(build, "stable")) |
| 38 build_prefix = mini_installer_constants::kStableChannelBuild; | 37 build_prefix = mini_installer_constants::kStableChannelBuild; |
| 39 else if (LowerCaseEqualsASCII(build, "latest")) | 38 else if (LowerCaseEqualsASCII(build, "latest")) |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 InstallMiniInstaller(over_install, full_installer_); | 130 InstallMiniInstaller(over_install, full_installer_); |
| 132 } | 131 } |
| 133 | 132 |
| 134 // Installs the Chrome mini-installer, checks the registry and shortcuts. | 133 // Installs the Chrome mini-installer, checks the registry and shortcuts. |
| 135 void ChromeMiniInstaller::InstallMiniInstaller(bool over_install, | 134 void ChromeMiniInstaller::InstallMiniInstaller(bool over_install, |
| 136 const std::wstring& path) { | 135 const std::wstring& path) { |
| 137 std::wstring exe_name = file_util::GetFilenameFromPath(path); | 136 std::wstring exe_name = file_util::GetFilenameFromPath(path); |
| 138 printf("\nChrome will be installed at %ls level\n", install_type_.c_str()); | 137 printf("\nChrome will be installed at %ls level\n", install_type_.c_str()); |
| 139 printf("\nWill proceed with the test only if this path exists: %ls\n\n", | 138 printf("\nWill proceed with the test only if this path exists: %ls\n\n", |
| 140 path.c_str()); | 139 path.c_str()); |
| 141 ASSERT_TRUE(file_util::PathExists(FilePath::FromWStringHack(path))); | 140 ASSERT_TRUE(file_util::PathExists(FilePath(path))); |
| 142 LaunchInstaller(path, exe_name.c_str()); | 141 LaunchInstaller(path, exe_name.c_str()); |
| 143 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | 142 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| 144 ASSERT_TRUE(CheckRegistryKey(dist->GetVersionKey())); | 143 ASSERT_TRUE(CheckRegistryKey(dist->GetVersionKey())); |
| 145 VerifyInstall(over_install); | 144 VerifyInstall(over_install); |
| 146 } | 145 } |
| 147 | 146 |
| 148 // This method tests the standalone installer by verifying the steps listed at: | 147 // This method tests the standalone installer by verifying the steps listed at: |
| 149 // https://sites.google.com/a/google.com/chrome-pmo/ | 148 // https://sites.google.com/a/google.com/chrome-pmo/ |
| 150 // standalone-installers/testing-standalone-installers | 149 // standalone-installers/testing-standalone-installers |
| 151 // This method applies appropriate tags to standalone installer and deletes | 150 // This method applies appropriate tags to standalone installer and deletes |
| 152 // old installer before running the new tagged installer. It also verifies | 151 // old installer before running the new tagged installer. It also verifies |
| 153 // that the installed version is correct. | 152 // that the installed version is correct. |
| 154 void ChromeMiniInstaller::InstallStandaloneInstaller() { | 153 void ChromeMiniInstaller::InstallStandaloneInstaller() { |
| 155 standalone_installer = true; | |
| 156 file_util::Delete(mini_installer_constants::kStandaloneInstaller, true); | 154 file_util::Delete(mini_installer_constants::kStandaloneInstaller, true); |
| 157 std::wstring tag_installer_command; | 155 std::wstring tag_installer_command; |
| 158 ASSERT_TRUE(MiniInstallerTestUtil::GetCommandForTagging( | 156 ASSERT_TRUE(MiniInstallerTestUtil::GetCommandForTagging( |
| 159 &tag_installer_command)); | 157 &tag_installer_command)); |
| 160 base::LaunchApp(tag_installer_command, true, false, NULL); | 158 base::LaunchApp(tag_installer_command, true, false, NULL); |
| 161 std::wstring installer_path = MiniInstallerTestUtil::GetFilePath( | 159 std::wstring installer_path = MiniInstallerTestUtil::GetFilePath( |
| 162 mini_installer_constants::kStandaloneInstaller); | 160 mini_installer_constants::kStandaloneInstaller); |
| 163 InstallMiniInstaller(false, installer_path); | 161 InstallMiniInstaller(false, installer_path); |
| 164 ASSERT_TRUE(VerifyStandaloneInstall()); | 162 ASSERT_TRUE(VerifyStandaloneInstall()); |
| 165 file_util::Delete(mini_installer_constants::kStandaloneInstaller, true); | 163 file_util::Delete(mini_installer_constants::kStandaloneInstaller, true); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 MiniInstallerTestUtil::CloseProcesses(L"IEXPLORE.EXE"); | 249 MiniInstallerTestUtil::CloseProcesses(L"IEXPLORE.EXE"); |
| 252 MiniInstallerTestUtil::CloseProcesses(installer_util::kChromeExe); | 250 MiniInstallerTestUtil::CloseProcesses(installer_util::kChromeExe); |
| 253 MiniInstallerTestUtil::CloseProcesses(installer_util::kNaClExe); | 251 MiniInstallerTestUtil::CloseProcesses(installer_util::kNaClExe); |
| 254 std::wstring uninstall_path = GetUninstallPath(); | 252 std::wstring uninstall_path = GetUninstallPath(); |
| 255 if (uninstall_path == L"") { | 253 if (uninstall_path == L"") { |
| 256 printf("\n %ls install is in a weird state. Cleaning the machine...\n", | 254 printf("\n %ls install is in a weird state. Cleaning the machine...\n", |
| 257 product_name.c_str()); | 255 product_name.c_str()); |
| 258 CleanChromeInstall(); | 256 CleanChromeInstall(); |
| 259 return; | 257 return; |
| 260 } | 258 } |
| 261 ASSERT_TRUE(file_util::PathExists(FilePath::FromWStringHack(uninstall_path))); | 259 ASSERT_TRUE(file_util::PathExists(FilePath(uninstall_path))); |
| 262 std::wstring uninstall_args(L"\""); | 260 std::wstring uninstall_args(L"\""); |
| 263 uninstall_args.append(uninstall_path); | 261 uninstall_args.append(uninstall_path); |
| 264 uninstall_args.append(L"\" --uninstall --force-uninstall"); | 262 uninstall_args.append(L"\" --uninstall --force-uninstall"); |
| 265 if (is_chrome_frame_) | 263 if (is_chrome_frame_) |
| 266 uninstall_args.append(L" --chrome-frame"); | 264 uninstall_args.append(L" --chrome-frame"); |
| 267 if (install_type_ == mini_installer_constants::kSystemInstall) | 265 if (install_type_ == mini_installer_constants::kSystemInstall) |
| 268 uninstall_args = uninstall_args + L" --system-level"; | 266 uninstall_args = uninstall_args + L" --system-level"; |
| 269 base::LaunchApp(uninstall_args, false, false, NULL); | 267 base::LaunchApp(uninstall_args, false, false, NULL); |
| 270 if (is_chrome_frame_) | 268 if (is_chrome_frame_) |
| 271 ASSERT_TRUE(CloseUninstallWindow()); | 269 ASSERT_TRUE(CloseUninstallWindow()); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 pv_key.append(dist->GetAppGuid()); | 428 pv_key.append(dist->GetAppGuid()); |
| 431 | 429 |
| 432 RegKey key; | 430 RegKey key; |
| 433 if (key.Open(GetRootRegistryKey(), pv_key.c_str(), KEY_ALL_ACCESS)) | 431 if (key.Open(GetRootRegistryKey(), pv_key.c_str(), KEY_ALL_ACCESS)) |
| 434 ASSERT_TRUE(key.DeleteValue(L"pv")); | 432 ASSERT_TRUE(key.DeleteValue(L"pv")); |
| 435 printf("Deleted %ls key\n", pv_key.c_str()); | 433 printf("Deleted %ls key\n", pv_key.c_str()); |
| 436 } | 434 } |
| 437 | 435 |
| 438 // Verifies if Chrome shortcut exists. | 436 // Verifies if Chrome shortcut exists. |
| 439 void ChromeMiniInstaller::FindChromeShortcut() { | 437 void ChromeMiniInstaller::FindChromeShortcut() { |
| 440 std::wstring username, path, append_path, uninstall_lnk, shortcut_path; | |
| 441 bool return_val = false; | 438 bool return_val = false; |
| 442 path = GetStartMenuShortcutPath(); | 439 FilePath uninstall_lnk; |
| 443 file_util::AppendToPath(&path, mini_installer_constants::kChromeBuildType); | 440 FilePath path = GetStartMenuShortcutPath(); |
| 441 path = path.Append(mini_installer_constants::kChromeBuildType); |
| 444 // Verify if path exists. | 442 // Verify if path exists. |
| 445 if (file_util::PathExists(FilePath::FromWStringHack(path))) { | 443 if (file_util::PathExists(path)) { |
| 446 return_val = true; | 444 return_val = true; |
| 447 uninstall_lnk = path; | 445 uninstall_lnk = path; |
| 448 file_util::AppendToPath(&path, | 446 path = path.Append(mini_installer_constants::kChromeLaunchShortcut); |
| 449 mini_installer_constants::kChromeLaunchShortcut); | 447 uninstall_lnk = uninstall_lnk.Append( |
| 450 file_util::AppendToPath(&uninstall_lnk, | 448 mini_installer_constants::kChromeUninstallShortcut); |
| 451 mini_installer_constants::kChromeUninstallShortcut); | 449 ASSERT_TRUE(file_util::PathExists(path)); |
| 452 ASSERT_TRUE(file_util::PathExists(FilePath::FromWStringHack(path))); | 450 ASSERT_TRUE(file_util::PathExists(uninstall_lnk)); |
| 453 ASSERT_TRUE(file_util::PathExists( | |
| 454 FilePath::FromWStringHack(uninstall_lnk))); | |
| 455 } | 451 } |
| 456 if (return_val) | 452 if (return_val) { |
| 457 printf("Chrome shortcuts found are:\n%ls\n%ls\n\n", | 453 printf("Chrome shortcuts found are:\n%ls\n%ls\n\n", |
| 458 path.c_str(), uninstall_lnk.c_str()); | 454 path.value().c_str(), uninstall_lnk.value().c_str()); |
| 459 else | 455 } else { |
| 460 printf("Chrome shortcuts not found\n\n"); | 456 printf("Chrome shortcuts not found\n\n"); |
| 457 } |
| 461 } | 458 } |
| 462 | 459 |
| 463 // This method returns path to either program files | 460 // This method returns path to either program files |
| 464 // or documents and setting based on the install type. | 461 // or documents and setting based on the install type. |
| 465 std::wstring ChromeMiniInstaller::GetChromeInstallDirectoryLocation() { | 462 std::wstring ChromeMiniInstaller::GetChromeInstallDirectoryLocation() { |
| 466 FilePath path; | 463 FilePath path; |
| 467 if (install_type_ == mini_installer_constants::kSystemInstall) | 464 if (install_type_ == mini_installer_constants::kSystemInstall) |
| 468 PathService::Get(base::DIR_PROGRAM_FILES, &path); | 465 PathService::Get(base::DIR_PROGRAM_FILES, &path); |
| 469 else | 466 else |
| 470 PathService::Get(base::DIR_LOCAL_APP_DATA, &path); | 467 PathService::Get(base::DIR_LOCAL_APP_DATA, &path); |
| 471 return path.ToWStringHack(); | 468 return path.ToWStringHack(); |
| 472 } | 469 } |
| 473 | 470 |
| 474 // This method gets the shortcut path from startmenu based on install type | 471 FilePath ChromeMiniInstaller::GetStartMenuShortcutPath() { |
| 475 std::wstring ChromeMiniInstaller::GetStartMenuShortcutPath() { | |
| 476 FilePath path_name; | 472 FilePath path_name; |
| 477 if (install_type_ == mini_installer_constants::kSystemInstall) | 473 if (install_type_ == mini_installer_constants::kSystemInstall) |
| 478 PathService::Get(base::DIR_COMMON_START_MENU, &path_name); | 474 PathService::Get(base::DIR_COMMON_START_MENU, &path_name); |
| 479 else | 475 else |
| 480 PathService::Get(base::DIR_START_MENU, &path_name); | 476 PathService::Get(base::DIR_START_MENU, &path_name); |
| 481 return path_name.ToWStringHack(); | 477 return path_name; |
| 482 } | 478 } |
| 483 | 479 |
| 484 // Gets the path for uninstall. | 480 // Gets the path for uninstall. |
| 485 std::wstring ChromeMiniInstaller::GetUninstallPath() { | 481 std::wstring ChromeMiniInstaller::GetUninstallPath() { |
| 486 std::wstring username, append_path, path, reg_key_value; | 482 std::wstring path, reg_key_value; |
| 487 if (!GetChromeVersionFromRegistry(®_key_value)) | 483 if (!GetChromeVersionFromRegistry(®_key_value)) |
| 488 return L""; | 484 return std::wstring(); |
| 489 path = GetChromeInstallDirectoryLocation(); | 485 path = GetChromeInstallDirectoryLocation(); |
| 490 if (is_chrome_frame_) | 486 if (is_chrome_frame_) { |
| 491 file_util::AppendToPath(&path, | 487 file_util::AppendToPath(&path, |
| 492 mini_installer_constants::kChromeFrameAppDir); | 488 mini_installer_constants::kChromeFrameAppDir); |
| 493 else | 489 } else { |
| 494 file_util::AppendToPath(&path, mini_installer_constants::kChromeAppDir); | 490 file_util::AppendToPath(&path, mini_installer_constants::kChromeAppDir); |
| 491 } |
| 495 file_util::AppendToPath(&path, reg_key_value); | 492 file_util::AppendToPath(&path, reg_key_value); |
| 496 file_util::AppendToPath(&path, installer_util::kInstallerDir); | 493 file_util::AppendToPath(&path, installer_util::kInstallerDir); |
| 497 file_util::AppendToPath(&path, | 494 file_util::AppendToPath(&path, |
| 498 mini_installer_constants::kChromeSetupExecutable); | 495 mini_installer_constants::kChromeSetupExecutable); |
| 499 if (!file_util::PathExists(FilePath::FromWStringHack(path))) { | 496 if (!file_util::PathExists(FilePath(path))) { |
| 500 printf("This uninstall path is not correct %ls. Will not proceed further", | 497 printf("This uninstall path is not correct %ls. Will not proceed further", |
| 501 path.c_str()); | 498 path.c_str()); |
| 502 return L""; | 499 return L""; |
| 503 } | 500 } |
| 504 printf("uninstall path is %ls\n", path.c_str()); | 501 printf("uninstall path is %ls\n", path.c_str()); |
| 505 return path; | 502 return path; |
| 506 } | 503 } |
| 507 | 504 |
| 508 // Returns Chrome pv registry key value | 505 // Returns Chrome pv registry key value |
| 509 bool ChromeMiniInstaller::GetChromeVersionFromRegistry( | 506 bool ChromeMiniInstaller::GetChromeVersionFromRegistry( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 522 HKEY ChromeMiniInstaller::GetRootRegistryKey() { | 519 HKEY ChromeMiniInstaller::GetRootRegistryKey() { |
| 523 HKEY type = HKEY_CURRENT_USER; | 520 HKEY type = HKEY_CURRENT_USER; |
| 524 if (install_type_ == mini_installer_constants::kSystemInstall) | 521 if (install_type_ == mini_installer_constants::kSystemInstall) |
| 525 type = HKEY_LOCAL_MACHINE; | 522 type = HKEY_LOCAL_MACHINE; |
| 526 return type; | 523 return type; |
| 527 } | 524 } |
| 528 | 525 |
| 529 // Launches the chrome installer and waits for it to end. | 526 // Launches the chrome installer and waits for it to end. |
| 530 void ChromeMiniInstaller::LaunchInstaller(const std::wstring& path, | 527 void ChromeMiniInstaller::LaunchInstaller(const std::wstring& path, |
| 531 const wchar_t* process_name) { | 528 const wchar_t* process_name) { |
| 532 ASSERT_TRUE(file_util::PathExists(FilePath::FromWStringHack(path))); | 529 ASSERT_TRUE(file_util::PathExists(FilePath(path))); |
| 533 if (install_type_ == mini_installer_constants::kSystemInstall) { | 530 if (install_type_ == mini_installer_constants::kSystemInstall) { |
| 534 std::wstring launch_args; | 531 std::wstring launch_args; |
| 535 if (is_chrome_frame_) { | 532 if (is_chrome_frame_) { |
| 536 launch_args.append(L" --do-not-create-shortcuts"); | 533 launch_args.append(L" --do-not-create-shortcuts"); |
| 537 launch_args.append(L" --do-not-register-for-update-launch"); | 534 launch_args.append(L" --do-not-register-for-update-launch"); |
| 538 launch_args.append(L" --chrome-frame"); | 535 launch_args.append(L" --chrome-frame"); |
| 539 } | 536 } |
| 540 launch_args.append(L" --system-level"); | 537 launch_args.append(L" --system-level"); |
| 541 base::LaunchApp(L"\"" + path + L"\"" + launch_args, false, false, NULL); | 538 base::LaunchApp(L"\"" + path + L"\"" + launch_args, false, false, NULL); |
| 542 } else { | 539 } else { |
| 543 base::LaunchApp(L"\"" + path + L"\"", false, false, NULL); | 540 base::LaunchApp(L"\"" + path + L"\"", false, false, NULL); |
| 544 } | 541 } |
| 545 printf("Waiting while this process is running %ls ....\n", process_name); | 542 printf("Waiting while this process is running %ls ....\n", process_name); |
| 546 MiniInstallerTestUtil::VerifyProcessLaunch(process_name, true); | 543 MiniInstallerTestUtil::VerifyProcessLaunch(process_name, true); |
| 547 ASSERT_TRUE(MiniInstallerTestUtil::VerifyProcessClose(process_name)); | 544 ASSERT_TRUE(MiniInstallerTestUtil::VerifyProcessClose(process_name)); |
| 548 } | 545 } |
| 549 | 546 |
| 550 // Gets the path to launch Chrome. | 547 // Gets the path to launch Chrome. |
| 551 bool ChromeMiniInstaller::GetChromeLaunchPath(std::wstring* launch_path) { | 548 bool ChromeMiniInstaller::GetChromeLaunchPath(std::wstring* launch_path) { |
| 552 std::wstring path; | 549 std::wstring path; |
| 553 path = GetChromeInstallDirectoryLocation(); | 550 path = GetChromeInstallDirectoryLocation(); |
| 554 file_util::AppendToPath(&path, mini_installer_constants::kChromeAppDir); | 551 file_util::AppendToPath(&path, mini_installer_constants::kChromeAppDir); |
| 555 file_util::AppendToPath(&path, installer_util::kChromeExe); | 552 file_util::AppendToPath(&path, installer_util::kChromeExe); |
| 556 launch_path->assign(path); | 553 launch_path->assign(path); |
| 557 return(file_util::PathExists(FilePath::FromWStringHack(path))); | 554 return file_util::PathExists(FilePath(path)); |
| 558 } | 555 } |
| 559 | 556 |
| 560 // Launch Chrome to see if it works after overinstall. Then close it. | 557 // Launch Chrome to see if it works after overinstall. Then close it. |
| 561 void ChromeMiniInstaller::LaunchAndCloseChrome(bool over_install) { | 558 void ChromeMiniInstaller::LaunchAndCloseChrome(bool over_install) { |
| 562 VerifyChromeLaunch(true); | 559 VerifyChromeLaunch(true); |
| 563 if ((install_type_ == mini_installer_constants::kSystemInstall) && | 560 if ((install_type_ == mini_installer_constants::kSystemInstall) && |
| 564 (!over_install)) { | 561 (!over_install)) { |
| 565 MiniInstallerTestUtil::VerifyProcessLaunch( | 562 MiniInstallerTestUtil::VerifyProcessLaunch( |
| 566 installer_util::kChromeExe, true); | 563 installer_util::kChromeExe, true); |
| 567 } | 564 } |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 // This method will verify if the installed build is correct. | 653 // This method will verify if the installed build is correct. |
| 657 bool ChromeMiniInstaller::VerifyStandaloneInstall() { | 654 bool ChromeMiniInstaller::VerifyStandaloneInstall() { |
| 658 std::wstring reg_key_value_returned, standalone_installer_version; | 655 std::wstring reg_key_value_returned, standalone_installer_version; |
| 659 MiniInstallerTestUtil::GetStandaloneVersion(&standalone_installer_version); | 656 MiniInstallerTestUtil::GetStandaloneVersion(&standalone_installer_version); |
| 660 GetChromeVersionFromRegistry(®_key_value_returned); | 657 GetChromeVersionFromRegistry(®_key_value_returned); |
| 661 if (standalone_installer_version.compare(reg_key_value_returned) == 0) | 658 if (standalone_installer_version.compare(reg_key_value_returned) == 0) |
| 662 return true; | 659 return true; |
| 663 else | 660 else |
| 664 return false; | 661 return false; |
| 665 } | 662 } |
| OLD | NEW |