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 // 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 1245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1256 } | 1256 } |
1257 return true; | 1257 return true; |
1258 } | 1258 } |
1259 | 1259 |
1260 bool ShortcutOpDelete(const base::FilePath& shortcut_path) { | 1260 bool ShortcutOpDelete(const base::FilePath& shortcut_path) { |
1261 bool ret = base::DeleteFile(shortcut_path, false); | 1261 bool ret = base::DeleteFile(shortcut_path, false); |
1262 LOG_IF(ERROR, !ret) << "Failed to remove " << shortcut_path.value(); | 1262 LOG_IF(ERROR, !ret) << "Failed to remove " << shortcut_path.value(); |
1263 return ret; | 1263 return ret; |
1264 } | 1264 } |
1265 | 1265 |
1266 bool ShortcutOpUpdate(const base::win::ShortcutProperties& shortcut_properties, | 1266 bool ShortcutOpRetarget(const base::FilePath& old_target, |
1267 const base::FilePath& shortcut_path) { | 1267 const base::FilePath& new_target, |
1268 bool ret = base::win::CreateOrUpdateShortcutLink( | 1268 const base::FilePath& shortcut_path) { |
1269 shortcut_path, shortcut_properties, base::win::SHORTCUT_UPDATE_EXISTING); | 1269 base::win::ShortcutProperties new_prop; |
1270 LOG_IF(ERROR, !ret) << "Failed to update " << shortcut_path.value(); | 1270 new_prop.set_target(new_target); |
1271 return ret; | 1271 |
| 1272 // If the old icon matches old target, then update icon while keeping the old |
| 1273 // icon index. Non-fatal if we fail to get the old icon. |
| 1274 base::win::ShortcutProperties old_prop; |
| 1275 if (base::win::ResolveShortcutProperties( |
| 1276 shortcut_path, |
| 1277 base::win::ShortcutProperties::PROPERTIES_ICON, |
| 1278 &old_prop)) { |
| 1279 if (InstallUtil::ProgramCompare(old_target).EvaluatePath(old_prop.icon)) |
| 1280 new_prop.set_icon(new_target, old_prop.icon_index); |
| 1281 } else { |
| 1282 LOG(ERROR) << "Failed to resolve " << shortcut_path.value(); |
| 1283 } |
| 1284 |
| 1285 bool result = base::win::CreateOrUpdateShortcutLink( |
| 1286 shortcut_path, new_prop, base::win::SHORTCUT_UPDATE_EXISTING); |
| 1287 LOG_IF(ERROR, !result) << "Failed to retarget " << shortcut_path.value(); |
| 1288 return result; |
1272 } | 1289 } |
1273 | 1290 |
1274 // {|location|, |dist|, |level|} determine |shortcut_folder|. | 1291 // {|location|, |dist|, |level|} determine |shortcut_folder|. |
1275 // For each shortcut in |shortcut_folder| that match |shortcut_filter|, apply | 1292 // For each shortcut in |shortcut_folder| that match |shortcut_filter|, apply |
1276 // |shortcut_operation|. Returns true if all operations are successful. | 1293 // |shortcut_operation|. Returns true if all operations are successful. |
1277 // All intended operations are attempted, even if failures occur. | 1294 // All intended operations are attempted, even if failures occur. |
1278 bool BatchShortcutAction(const ShortcutFilterCallback& shortcut_filter, | 1295 bool BatchShortcutAction(const ShortcutFilterCallback& shortcut_filter, |
1279 const ShortcutOperationCallback& shortcut_operation, | 1296 const ShortcutOperationCallback& shortcut_operation, |
1280 ShellUtil::ShortcutLocation location, | 1297 ShellUtil::ShortcutLocation location, |
1281 BrowserDistribution* dist, | 1298 BrowserDistribution* dist, |
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2084 if (success && | 2101 if (success && |
2085 (location == SHORTCUT_LOCATION_START_MENU_CHROME_DIR || | 2102 (location == SHORTCUT_LOCATION_START_MENU_CHROME_DIR || |
2086 location == SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR || | 2103 location == SHORTCUT_LOCATION_START_MENU_CHROME_APPS_DIR || |
2087 location == SHORTCUT_LOCATION_APP_SHORTCUTS)) { | 2104 location == SHORTCUT_LOCATION_APP_SHORTCUTS)) { |
2088 success = RemoveShortcutFolderIfEmpty(location, dist, level); | 2105 success = RemoveShortcutFolderIfEmpty(location, dist, level); |
2089 } | 2106 } |
2090 return success; | 2107 return success; |
2091 } | 2108 } |
2092 | 2109 |
2093 // static | 2110 // static |
2094 bool ShellUtil::UpdateShortcutsWithArgs( | 2111 bool ShellUtil::RetargetShortcutsWithArgs( |
2095 ShellUtil::ShortcutLocation location, | 2112 ShellUtil::ShortcutLocation location, |
2096 BrowserDistribution* dist, | 2113 BrowserDistribution* dist, |
2097 ShellChange level, | 2114 ShellChange level, |
2098 const base::FilePath& target_exe, | 2115 const base::FilePath& old_target_exe, |
2099 const ShellUtil::ShortcutProperties& properties) { | 2116 const base::FilePath& new_target_exe) { |
2100 if (!ShellUtil::ShortcutLocationIsSupported(location)) | 2117 if (!ShellUtil::ShortcutLocationIsSupported(location)) |
2101 return true; // Vacuous success. | 2118 return true; // Vacuous success. |
2102 | 2119 |
2103 FilterTargetEq shortcut_filter(target_exe, true); | 2120 FilterTargetEq shortcut_filter(old_target_exe, true); |
2104 ShortcutOperationCallback shortcut_operation( | 2121 ShortcutOperationCallback shortcut_operation( |
2105 base::Bind(&ShortcutOpUpdate, TranslateShortcutProperties(properties))); | 2122 base::Bind(&ShortcutOpRetarget, old_target_exe, new_target_exe)); |
2106 return BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), | 2123 return BatchShortcutAction(shortcut_filter.AsShortcutFilterCallback(), |
2107 shortcut_operation, location, dist, level); | 2124 shortcut_operation, location, dist, level); |
2108 } | 2125 } |
2109 | 2126 |
2110 bool ShellUtil::GetUserSpecificRegistrySuffix(string16* suffix) { | 2127 bool ShellUtil::GetUserSpecificRegistrySuffix(string16* suffix) { |
2111 // Use a thread-safe cache for the user's suffix. | 2128 // Use a thread-safe cache for the user's suffix. |
2112 static base::LazyInstance<UserSpecificRegistrySuffix>::Leaky suffix_instance = | 2129 static base::LazyInstance<UserSpecificRegistrySuffix>::Leaky suffix_instance = |
2113 LAZY_INSTANCE_INITIALIZER; | 2130 LAZY_INSTANCE_INITIALIZER; |
2114 return suffix_instance.Get().GetSuffix(suffix); | 2131 return suffix_instance.Get().GetSuffix(suffix); |
2115 } | 2132 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2167 // are any left...). | 2184 // are any left...). |
2168 if (free_bits >= 8 && next_byte_index < size) { | 2185 if (free_bits >= 8 && next_byte_index < size) { |
2169 free_bits -= 8; | 2186 free_bits -= 8; |
2170 bit_stream += bytes[next_byte_index++] << free_bits; | 2187 bit_stream += bytes[next_byte_index++] << free_bits; |
2171 } | 2188 } |
2172 } | 2189 } |
2173 | 2190 |
2174 DCHECK_EQ(ret.length(), encoded_length); | 2191 DCHECK_EQ(ret.length(), encoded_length); |
2175 return ret; | 2192 return ret; |
2176 } | 2193 } |
OLD | NEW |