| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // This file defines functions that integrate Chrome in Windows shell. These | 5 // This file defines functions that integrate Chrome in Windows shell. These |
| 6 // functions can be used by Chrome as well as Chrome installer. All of the | 6 // functions can be used by Chrome as well as Chrome installer. All of the |
| 7 // work is done by the local functions defined in anonymous namespace in | 7 // work is done by the local functions defined in anonymous namespace in |
| 8 // this class. | 8 // this class. |
| 9 | 9 |
| 10 #include "chrome/installer/util/shell_util.h" | 10 #include "chrome/installer/util/shell_util.h" |
| (...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 for (std::list<RegistryEntry*>::const_iterator itr = entries.begin(); | 538 for (std::list<RegistryEntry*>::const_iterator itr = entries.begin(); |
| 539 itr != entries.end() && !cleanup_needed; ++itr) { | 539 itr != entries.end() && !cleanup_needed; ++itr) { |
| 540 cleanup_needed = (*itr)->NameExistsInHKLM(); | 540 cleanup_needed = (*itr)->NameExistsInHKLM(); |
| 541 } | 541 } |
| 542 return cleanup_needed; | 542 return cleanup_needed; |
| 543 } | 543 } |
| 544 | 544 |
| 545 bool ShellUtil::CreateChromeDesktopShortcut(BrowserDistribution* dist, | 545 bool ShellUtil::CreateChromeDesktopShortcut(BrowserDistribution* dist, |
| 546 const std::wstring& chrome_exe, | 546 const std::wstring& chrome_exe, |
| 547 const std::wstring& description, | 547 const std::wstring& description, |
| 548 const std::wstring& appended_name, |
| 549 const std::wstring& arguments, |
| 548 ShellChange shell_change, | 550 ShellChange shell_change, |
| 549 bool alternate, | 551 bool alternate, |
| 550 bool create_new) { | 552 bool create_new) { |
| 551 std::wstring shortcut_name; | 553 std::wstring shortcut_name; |
| 552 if (!ShellUtil::GetChromeShortcutName(dist, &shortcut_name, alternate)) | 554 if (!ShellUtil::GetChromeShortcutName(dist, alternate, appended_name, |
| 555 &shortcut_name)) |
| 553 return false; | 556 return false; |
| 554 | 557 |
| 555 bool ret = false; | 558 bool ret = false; |
| 556 if (shell_change == ShellUtil::CURRENT_USER) { | 559 if (shell_change == ShellUtil::CURRENT_USER) { |
| 557 FilePath shortcut_path; | 560 FilePath shortcut_path; |
| 558 // We do not want to create a desktop shortcut to Chrome in the current | 561 // We do not want to create a desktop shortcut to Chrome in the current |
| 559 // user's desktop folder if there is already one in the "All Users" | 562 // user's desktop folder if there is already one in the "All Users" |
| 560 // desktop folder. | 563 // desktop folder. |
| 561 bool got_system_desktop = ShellUtil::GetDesktopPath(true, &shortcut_path); | 564 bool got_system_desktop = ShellUtil::GetDesktopPath(true, &shortcut_path); |
| 562 FilePath shortcut = shortcut_path.Append(shortcut_name); | 565 FilePath shortcut = shortcut_path.Append(shortcut_name); |
| 563 if (!got_system_desktop || !file_util::PathExists(shortcut)) { | 566 if (!got_system_desktop || !file_util::PathExists(shortcut)) { |
| 564 // Either we couldn't query the "All Users" Desktop folder or there's | 567 // Either we couldn't query the "All Users" Desktop folder or there's |
| 565 // nothing in it, so let's continue. | 568 // nothing in it, so let's continue. |
| 566 if (ShellUtil::GetDesktopPath(false, &shortcut_path)) { | 569 if (ShellUtil::GetDesktopPath(false, &shortcut_path)) { |
| 567 shortcut = shortcut_path.Append(shortcut_name); | 570 shortcut = shortcut_path.Append(shortcut_name); |
| 568 ret = ShellUtil::UpdateChromeShortcut(dist, chrome_exe, | 571 ret = ShellUtil::UpdateChromeShortcut(dist, |
| 572 chrome_exe, |
| 569 shortcut.value(), | 573 shortcut.value(), |
| 570 description, create_new); | 574 arguments, |
| 575 description, |
| 576 create_new); |
| 571 } | 577 } |
| 572 } | 578 } |
| 573 } else if (shell_change == ShellUtil::SYSTEM_LEVEL) { | 579 } else if (shell_change == ShellUtil::SYSTEM_LEVEL) { |
| 574 FilePath shortcut_path; | 580 FilePath shortcut_path; |
| 575 if (ShellUtil::GetDesktopPath(true, &shortcut_path)) { | 581 if (ShellUtil::GetDesktopPath(true, &shortcut_path)) { |
| 576 FilePath shortcut = shortcut_path.Append(shortcut_name); | 582 FilePath shortcut = shortcut_path.Append(shortcut_name); |
| 577 ret = ShellUtil::UpdateChromeShortcut(dist, chrome_exe, | 583 ret = ShellUtil::UpdateChromeShortcut(dist, |
| 584 chrome_exe, |
| 578 shortcut.value(), | 585 shortcut.value(), |
| 579 description, create_new); | 586 arguments, |
| 587 description, |
| 588 create_new); |
| 580 } | 589 } |
| 581 } else { | 590 } else { |
| 582 NOTREACHED(); | 591 NOTREACHED(); |
| 583 } | 592 } |
| 584 return ret; | 593 return ret; |
| 585 } | 594 } |
| 586 | 595 |
| 587 bool ShellUtil::CreateChromeQuickLaunchShortcut(BrowserDistribution* dist, | 596 bool ShellUtil::CreateChromeQuickLaunchShortcut(BrowserDistribution* dist, |
| 588 const std::wstring& chrome_exe, | 597 const std::wstring& chrome_exe, |
| 589 int shell_change, | 598 int shell_change, |
| 590 bool create_new) { | 599 bool create_new) { |
| 591 std::wstring shortcut_name; | 600 std::wstring shortcut_name; |
| 592 if (!ShellUtil::GetChromeShortcutName(dist, &shortcut_name, false)) | 601 if (!ShellUtil::GetChromeShortcutName(dist, false, L"", &shortcut_name)) |
| 593 return false; | 602 return false; |
| 594 | 603 |
| 595 bool ret = true; | 604 bool ret = true; |
| 596 // First create shortcut for the current user. | 605 // First create shortcut for the current user. |
| 597 if (shell_change & ShellUtil::CURRENT_USER) { | 606 if (shell_change & ShellUtil::CURRENT_USER) { |
| 598 std::wstring user_ql_path; | 607 std::wstring user_ql_path; |
| 599 if (ShellUtil::GetQuickLaunchPath(false, &user_ql_path)) { | 608 if (ShellUtil::GetQuickLaunchPath(false, &user_ql_path)) { |
| 600 file_util::AppendToPath(&user_ql_path, shortcut_name); | 609 file_util::AppendToPath(&user_ql_path, shortcut_name); |
| 601 ret = ShellUtil::UpdateChromeShortcut(dist, chrome_exe, user_ql_path, | 610 ret = ShellUtil::UpdateChromeShortcut(dist, chrome_exe, user_ql_path, |
| 602 L"", create_new); | 611 L"", L"", create_new); |
| 603 } else { | 612 } else { |
| 604 ret = false; | 613 ret = false; |
| 605 } | 614 } |
| 606 } | 615 } |
| 607 | 616 |
| 608 // Add a shortcut to Default User's profile so that all new user profiles | 617 // Add a shortcut to Default User's profile so that all new user profiles |
| 609 // get it. | 618 // get it. |
| 610 if (shell_change & ShellUtil::SYSTEM_LEVEL) { | 619 if (shell_change & ShellUtil::SYSTEM_LEVEL) { |
| 611 std::wstring default_ql_path; | 620 std::wstring default_ql_path; |
| 612 if (ShellUtil::GetQuickLaunchPath(true, &default_ql_path)) { | 621 if (ShellUtil::GetQuickLaunchPath(true, &default_ql_path)) { |
| 613 file_util::AppendToPath(&default_ql_path, shortcut_name); | 622 file_util::AppendToPath(&default_ql_path, shortcut_name); |
| 614 ret = ShellUtil::UpdateChromeShortcut(dist, chrome_exe, default_ql_path, | 623 ret = ShellUtil::UpdateChromeShortcut(dist, chrome_exe, default_ql_path, |
| 615 L"", create_new) && ret; | 624 L"", L"", create_new) && ret; |
| 616 } else { | 625 } else { |
| 617 ret = false; | 626 ret = false; |
| 618 } | 627 } |
| 619 } | 628 } |
| 620 | 629 |
| 621 return ret; | 630 return ret; |
| 622 } | 631 } |
| 623 | 632 |
| 624 std::wstring ShellUtil::GetChromeIcon(BrowserDistribution* dist, | 633 std::wstring ShellUtil::GetChromeIcon(BrowserDistribution* dist, |
| 625 const std::wstring& chrome_exe) { | 634 const std::wstring& chrome_exe) { |
| 626 std::wstring chrome_icon(chrome_exe); | 635 std::wstring chrome_icon(chrome_exe); |
| 627 chrome_icon.append(L","); | 636 chrome_icon.append(L","); |
| 628 chrome_icon.append(base::IntToString16(dist->GetIconIndex())); | 637 chrome_icon.append(base::IntToString16(dist->GetIconIndex())); |
| 629 return chrome_icon; | 638 return chrome_icon; |
| 630 } | 639 } |
| 631 | 640 |
| 632 std::wstring ShellUtil::GetChromeShellOpenCmd(const std::wstring& chrome_exe) { | 641 std::wstring ShellUtil::GetChromeShellOpenCmd(const std::wstring& chrome_exe) { |
| 633 return L"\"" + chrome_exe + L"\" -- \"%1\""; | 642 return L"\"" + chrome_exe + L"\" -- \"%1\""; |
| 634 } | 643 } |
| 635 | 644 |
| 636 bool ShellUtil::GetChromeShortcutName(BrowserDistribution* dist, | 645 bool ShellUtil::GetChromeShortcutName(BrowserDistribution* dist, |
| 637 std::wstring* shortcut, bool alternate) { | 646 bool alternate, |
| 647 const std::wstring& appended_name, |
| 648 std::wstring* shortcut) { |
| 638 shortcut->assign(alternate ? dist->GetAlternateApplicationName() : | 649 shortcut->assign(alternate ? dist->GetAlternateApplicationName() : |
| 639 dist->GetAppShortCutName()); | 650 dist->GetAppShortCutName()); |
| 651 if (appended_name.length() > 0) { |
| 652 shortcut->append(L" ("); |
| 653 shortcut->append(appended_name); |
| 654 shortcut->append(L")"); |
| 655 } |
| 640 shortcut->append(L".lnk"); | 656 shortcut->append(L".lnk"); |
| 641 return true; | 657 return true; |
| 642 } | 658 } |
| 643 | 659 |
| 644 bool ShellUtil::GetDesktopPath(bool system_level, FilePath* path) { | 660 bool ShellUtil::GetDesktopPath(bool system_level, FilePath* path) { |
| 645 wchar_t desktop[MAX_PATH]; | 661 wchar_t desktop[MAX_PATH]; |
| 646 int dir = system_level ? CSIDL_COMMON_DESKTOPDIRECTORY : | 662 int dir = system_level ? CSIDL_COMMON_DESKTOPDIRECTORY : |
| 647 CSIDL_DESKTOPDIRECTORY; | 663 CSIDL_DESKTOPDIRECTORY; |
| 648 if (FAILED(SHGetFolderPath(NULL, dir, NULL, SHGFP_TYPE_CURRENT, desktop))) | 664 if (FAILED(SHGetFolderPath(NULL, dir, NULL, SHGFP_TYPE_CURRENT, desktop))) |
| 649 return false; | 665 return false; |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 } else { | 963 } else { |
| 948 // we need admin rights to register our capability. If we don't | 964 // we need admin rights to register our capability. If we don't |
| 949 // have them and can't elevate, give up. | 965 // have them and can't elevate, give up. |
| 950 return false; | 966 return false; |
| 951 } | 967 } |
| 952 } | 968 } |
| 953 | 969 |
| 954 bool ShellUtil::RemoveChromeDesktopShortcut(BrowserDistribution* dist, | 970 bool ShellUtil::RemoveChromeDesktopShortcut(BrowserDistribution* dist, |
| 955 int shell_change, bool alternate) { | 971 int shell_change, bool alternate) { |
| 956 std::wstring shortcut_name; | 972 std::wstring shortcut_name; |
| 957 if (!ShellUtil::GetChromeShortcutName(dist, &shortcut_name, alternate)) | 973 if (!ShellUtil::GetChromeShortcutName(dist, alternate, L"", |
| 974 &shortcut_name)) |
| 958 return false; | 975 return false; |
| 959 | 976 |
| 960 bool ret = true; | 977 bool ret = true; |
| 961 if (shell_change & ShellUtil::CURRENT_USER) { | 978 if (shell_change & ShellUtil::CURRENT_USER) { |
| 962 FilePath shortcut_path; | 979 FilePath shortcut_path; |
| 963 if (ShellUtil::GetDesktopPath(false, &shortcut_path)) { | 980 if (ShellUtil::GetDesktopPath(false, &shortcut_path)) { |
| 964 FilePath shortcut = shortcut_path.Append(shortcut_name); | 981 FilePath shortcut = shortcut_path.Append(shortcut_name); |
| 965 ret = file_util::Delete(shortcut, false); | 982 ret = file_util::Delete(shortcut, false); |
| 966 } else { | 983 } else { |
| 967 ret = false; | 984 ret = false; |
| 968 } | 985 } |
| 969 } | 986 } |
| 970 | 987 |
| 971 if (shell_change & ShellUtil::SYSTEM_LEVEL) { | 988 if (shell_change & ShellUtil::SYSTEM_LEVEL) { |
| 972 FilePath shortcut_path; | 989 FilePath shortcut_path; |
| 973 if (ShellUtil::GetDesktopPath(true, &shortcut_path)) { | 990 if (ShellUtil::GetDesktopPath(true, &shortcut_path)) { |
| 974 FilePath shortcut = shortcut_path.Append(shortcut_name); | 991 FilePath shortcut = shortcut_path.Append(shortcut_name); |
| 975 ret = file_util::Delete(shortcut, false) && ret; | 992 ret = file_util::Delete(shortcut, false) && ret; |
| 976 } else { | 993 } else { |
| 977 ret = false; | 994 ret = false; |
| 978 } | 995 } |
| 979 } | 996 } |
| 980 return ret; | 997 return ret; |
| 981 } | 998 } |
| 982 | 999 |
| 1000 bool ShellUtil::RemoveChromeDesktopShortcutsWithAppendedNames( |
| 1001 std::vector<std::wstring> appended_names) { |
| 1002 FilePath shortcut_path; |
| 1003 bool ret = true; |
| 1004 if (ShellUtil::GetDesktopPath(false, &shortcut_path)) { |
| 1005 for (std::vector<std::wstring>::iterator it = appended_names.begin(); |
| 1006 it != appended_names.end(); |
| 1007 it++) { |
| 1008 FilePath delete_shortcut = shortcut_path.Append(*it); |
| 1009 ret = ret && file_util::Delete(delete_shortcut, false); |
| 1010 } |
| 1011 } else { |
| 1012 ret = false; |
| 1013 } |
| 1014 return ret; |
| 1015 } |
| 1016 |
| 983 bool ShellUtil::RemoveChromeQuickLaunchShortcut(BrowserDistribution* dist, | 1017 bool ShellUtil::RemoveChromeQuickLaunchShortcut(BrowserDistribution* dist, |
| 984 int shell_change) { | 1018 int shell_change) { |
| 985 std::wstring shortcut_name; | 1019 std::wstring shortcut_name; |
| 986 if (!ShellUtil::GetChromeShortcutName(dist, &shortcut_name, false)) | 1020 if (!ShellUtil::GetChromeShortcutName(dist, false, L"", &shortcut_name)) |
| 987 return false; | 1021 return false; |
| 988 | 1022 |
| 989 bool ret = true; | 1023 bool ret = true; |
| 990 // First remove shortcut for the current user. | 1024 // First remove shortcut for the current user. |
| 991 if (shell_change & ShellUtil::CURRENT_USER) { | 1025 if (shell_change & ShellUtil::CURRENT_USER) { |
| 992 std::wstring user_ql_path; | 1026 std::wstring user_ql_path; |
| 993 if (ShellUtil::GetQuickLaunchPath(false, &user_ql_path)) { | 1027 if (ShellUtil::GetQuickLaunchPath(false, &user_ql_path)) { |
| 994 file_util::AppendToPath(&user_ql_path, shortcut_name); | 1028 file_util::AppendToPath(&user_ql_path, shortcut_name); |
| 995 ret = file_util::Delete(user_ql_path, false); | 1029 ret = file_util::Delete(user_ql_path, false); |
| 996 } else { | 1030 } else { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1008 ret = false; | 1042 ret = false; |
| 1009 } | 1043 } |
| 1010 } | 1044 } |
| 1011 | 1045 |
| 1012 return ret; | 1046 return ret; |
| 1013 } | 1047 } |
| 1014 | 1048 |
| 1015 bool ShellUtil::UpdateChromeShortcut(BrowserDistribution* dist, | 1049 bool ShellUtil::UpdateChromeShortcut(BrowserDistribution* dist, |
| 1016 const std::wstring& chrome_exe, | 1050 const std::wstring& chrome_exe, |
| 1017 const std::wstring& shortcut, | 1051 const std::wstring& shortcut, |
| 1052 const std::wstring& arguments, |
| 1018 const std::wstring& description, | 1053 const std::wstring& description, |
| 1019 bool create_new) { | 1054 bool create_new) { |
| 1020 std::wstring chrome_path = FilePath(chrome_exe).DirName().value(); | 1055 std::wstring chrome_path = FilePath(chrome_exe).DirName().value(); |
| 1021 | 1056 |
| 1022 FilePath prefs_path(chrome_path); | 1057 FilePath prefs_path(chrome_path); |
| 1023 prefs_path = prefs_path.AppendASCII(installer::kDefaultMasterPrefs); | 1058 prefs_path = prefs_path.AppendASCII(installer::kDefaultMasterPrefs); |
| 1024 installer::MasterPreferences prefs(prefs_path); | 1059 installer::MasterPreferences prefs(prefs_path); |
| 1025 int icon_index = dist->GetIconIndex(); | 1060 int icon_index = dist->GetIconIndex(); |
| 1026 prefs.GetInt(installer::master_preferences::kChromeShortcutIconIndex, | 1061 prefs.GetInt(installer::master_preferences::kChromeShortcutIconIndex, |
| 1027 &icon_index); | 1062 &icon_index); |
| 1028 if (create_new) { | 1063 if (create_new) { |
| 1029 return file_util::CreateShortcutLink( | 1064 return file_util::CreateShortcutLink( |
| 1030 chrome_exe.c_str(), // target | 1065 chrome_exe.c_str(), // target |
| 1031 shortcut.c_str(), // shortcut | 1066 shortcut.c_str(), // shortcut |
| 1032 chrome_path.c_str(), // working dir | 1067 chrome_path.c_str(), // working dir |
| 1033 NULL, // arguments | 1068 arguments.c_str(), // arguments |
| 1034 description.c_str(), // description | 1069 description.c_str(), // description |
| 1035 chrome_exe.c_str(), // icon file | 1070 chrome_exe.c_str(), // icon file |
| 1036 icon_index, // icon index | 1071 icon_index, // icon index |
| 1037 dist->GetBrowserAppId().c_str()); // app id | 1072 dist->GetBrowserAppId().c_str()); // app id |
| 1038 } else { | 1073 } else { |
| 1039 return file_util::UpdateShortcutLink( | 1074 return file_util::UpdateShortcutLink( |
| 1040 chrome_exe.c_str(), // target | 1075 chrome_exe.c_str(), // target |
| 1041 shortcut.c_str(), // shortcut | 1076 shortcut.c_str(), // shortcut |
| 1042 chrome_path.c_str(), // working dir | 1077 chrome_path.c_str(), // working dir |
| 1043 NULL, // arguments | 1078 arguments.c_str(), // arguments |
| 1044 description.c_str(), // description | 1079 description.c_str(), // description |
| 1045 chrome_exe.c_str(), // icon file | 1080 chrome_exe.c_str(), // icon file |
| 1046 icon_index, // icon index | 1081 icon_index, // icon index |
| 1047 dist->GetBrowserAppId().c_str()); // app id | 1082 dist->GetBrowserAppId().c_str()); // app id |
| 1048 } | 1083 } |
| 1049 } | 1084 } |
| OLD | NEW |