Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1236)

Side by Side Diff: chrome/installer/util/shell_util.cc

Issue 22607006: Adding filter callback to BatchShortcutAction(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1179 ShellUtil::GetBrowserModelId(dist, level == ShellUtil::CURRENT_USER)); 1179 ShellUtil::GetBrowserModelId(dist, level == ShellUtil::CURRENT_USER));
1180 if (!base::DirectoryExists(folder)) { 1180 if (!base::DirectoryExists(folder)) {
1181 VLOG(1) << "No start screen shortcuts."; 1181 VLOG(1) << "No start screen shortcuts.";
1182 return false; 1182 return false;
1183 } 1183 }
1184 1184
1185 *path = folder; 1185 *path = folder;
1186 return true; 1186 return true;
1187 } 1187 }
1188 1188
1189 typedef base::Callback<bool(const base::FilePath&)> FileOperationCallback; 1189 // Shortcut filters for BatchShortcutAction().
1190
1191 typedef base::Callback<bool(const base::FilePath&, const string16&)>
1192 FileFilterCallback;
gab 2013/08/09 13:40:47 I don't think it makes sense to make these generic
huangs 2013/08/09 15:06:20 Done. Also added variable names in side /* comment
1193
1194 // FilterTargetEq is a shortcut filter that matches only shortcuts that have a
1195 // specific target.
1196 class FilterTargetEq {
1197 public:
1198 explicit FilterTargetEq(const base::FilePath& filt_target_exe);
gab 2013/08/09 13:40:47 Abbreviations are frowned upon in chrome. Use som
huangs 2013/08/09 15:06:20 Done.
1199
1200 // Returns true if |target_path| matches the arget stored.
gab 2013/08/09 13:40:47 s/arget/target
huangs 2013/08/09 15:06:20 Done; elaborated a bit more (this will be extended
1201 bool Match(const base::FilePath& target_path, const string16& args) const;
1202
1203 // A convenience routine that creates a callback to call Match().
1204 FileFilterCallback Bind();
gab 2013/08/09 13:40:47 Rename this method to AsShortcutFilterCallback(),
huangs 2013/08/09 15:06:20 Also copied comments regarding lifetime.
1205
1206 private:
1207 InstallUtil::ProgramCompare filt_target_compare_;
1208 };
1209
1210 FilterTargetEq::FilterTargetEq(const base::FilePath& filt_target_exe)
1211 : filt_target_compare_(filt_target_exe) {}
1212
1213 bool FilterTargetEq::Match(const base::FilePath& target_path,
1214 const string16& args) const {
1215 return filt_target_compare_.EvaluatePath(target_path);
1216 }
1217
1218 FileFilterCallback FilterTargetEq::Bind() {
1219 return base::Bind(&FilterTargetEq::Match, base::Unretained(this));
1220 }
1190 1221
1191 // Shortcut operations for BatchShortcutAction(). 1222 // Shortcut operations for BatchShortcutAction().
1192 1223
1224 typedef base::Callback<bool(const base::FilePath&)> FileOperationCallback;
gab 2013/08/09 13:40:47 This one is fine as a general "File operation" I g
huangs 2013/08/09 15:06:20 Done.
1225
1193 bool ShortcutOpUnpin(const base::FilePath& shortcut_path) { 1226 bool ShortcutOpUnpin(const base::FilePath& shortcut_path) {
1194 VLOG(1) << "Trying to unpin " << shortcut_path.value(); 1227 VLOG(1) << "Trying to unpin " << shortcut_path.value();
1195 if (!base::win::TaskbarUnpinShortcutLink(shortcut_path.value().c_str())) { 1228 if (!base::win::TaskbarUnpinShortcutLink(shortcut_path.value().c_str())) {
1196 VLOG(1) << shortcut_path.value() << " wasn't pinned (or the unpin failed)."; 1229 VLOG(1) << shortcut_path.value() << " wasn't pinned (or the unpin failed).";
1197 // No error, since shortcut might not be pinned. 1230 // No error, since shortcut might not be pinned.
1198 } 1231 }
1199 return true; 1232 return true;
1200 } 1233 }
1201 1234
1202 bool ShortcutOpDelete(const base::FilePath& shortcut_path) { 1235 bool ShortcutOpDelete(const base::FilePath& shortcut_path) {
1203 bool ret = base::DeleteFile(shortcut_path, false); 1236 bool ret = base::DeleteFile(shortcut_path, false);
1204 LOG_IF(ERROR, !ret) << "Failed to remove " << shortcut_path.value(); 1237 LOG_IF(ERROR, !ret) << "Failed to remove " << shortcut_path.value();
1205 return ret; 1238 return ret;
1206 } 1239 }
1207 1240
1208 bool ShortcutOpUpdate(const base::win::ShortcutProperties& shortcut_properties, 1241 bool ShortcutOpUpdate(const base::win::ShortcutProperties& shortcut_properties,
1209 const base::FilePath& shortcut_path) { 1242 const base::FilePath& shortcut_path) {
1210 bool ret = base::win::CreateOrUpdateShortcutLink( 1243 bool ret = base::win::CreateOrUpdateShortcutLink(
1211 shortcut_path, shortcut_properties, base::win::SHORTCUT_UPDATE_EXISTING); 1244 shortcut_path, shortcut_properties, base::win::SHORTCUT_UPDATE_EXISTING);
1212 LOG_IF(ERROR, !ret) << "Failed to update " << shortcut_path.value(); 1245 LOG_IF(ERROR, !ret) << "Failed to update " << shortcut_path.value();
1213 return ret; 1246 return ret;
1214 } 1247 }
1215 1248
1216 // {|location|, |dist|, |level|} determine |shortcut_folder|. 1249 // {|location|, |dist|, |level|} determine |shortcut_folder|.
1217 // Applies |shortcut_operation| to each shortcut in |shortcut_folder| that 1250 // For each shortcut in |shortcut_folder| that match |shortcut_filter|, apply
1218 // targets |target_exe|. 1251 // |shortcut_operation|. Returns true if all operations are successful.
1219 // Returns true if all operations are successful. All intended operations are 1252 // All intended operations are attempted, even if failures occur.
1220 // attempted even if failures occur. 1253 bool BatchShortcutAction(const FileFilterCallback& shortcut_filter,
1221 bool BatchShortcutAction(const FileOperationCallback& shortcut_operation, 1254 const FileOperationCallback& shortcut_operation,
1222 ShellUtil::ShortcutLocation location, 1255 ShellUtil::ShortcutLocation location,
1223 BrowserDistribution* dist, 1256 BrowserDistribution* dist,
1224 ShellUtil::ShellChange level, 1257 ShellUtil::ShellChange level) {
1225 const base::FilePath& target_exe) {
1226 DCHECK(!shortcut_operation.is_null()); 1258 DCHECK(!shortcut_operation.is_null());
1227 base::FilePath shortcut_folder; 1259 base::FilePath shortcut_folder;
1228 if (!ShellUtil::GetShortcutPath(location, dist, level, &shortcut_folder)) { 1260 if (!ShellUtil::GetShortcutPath(location, dist, level, &shortcut_folder)) {
1229 LOG(WARNING) << "Cannot find path at location " << location; 1261 LOG(WARNING) << "Cannot find path at location " << location;
1230 return false; 1262 return false;
1231 } 1263 }
1232 1264
1233 bool success = true; 1265 bool success = true;
1234 InstallUtil::ProgramCompare target_compare(target_exe);
1235 base::FileEnumerator enumerator( 1266 base::FileEnumerator enumerator(
1236 shortcut_folder, false, base::FileEnumerator::FILES, 1267 shortcut_folder, false, base::FileEnumerator::FILES,
1237 string16(L"*") + installer::kLnkExt); 1268 string16(L"*") + installer::kLnkExt);
1238 base::FilePath target_path; 1269 base::FilePath target_path;
1270 string16 args;
1239 for (base::FilePath shortcut_path = enumerator.Next(); 1271 for (base::FilePath shortcut_path = enumerator.Next();
1240 !shortcut_path.empty(); 1272 !shortcut_path.empty();
1241 shortcut_path = enumerator.Next()) { 1273 shortcut_path = enumerator.Next()) {
1242 if (base::win::ResolveShortcut(shortcut_path, &target_path, NULL)) { 1274 if (base::win::ResolveShortcut(shortcut_path, &target_path, &args)) {
1243 if (target_compare.EvaluatePath(target_path) && 1275 if (shortcut_filter.Run(target_path, args) &&
1244 !shortcut_operation.Run(shortcut_path)) { 1276 !shortcut_operation.Run(shortcut_path)) {
1245 success = false; 1277 success = false;
1246 } 1278 }
1247 } else { 1279 } else {
1248 LOG(ERROR) << "Cannot resolve shortcut at " << shortcut_path.value(); 1280 LOG(ERROR) << "Cannot resolve shortcut at " << shortcut_path.value();
1249 success = false; 1281 success = false;
1250 } 1282 }
1251 } 1283 }
1252 return success; 1284 return success;
1253 } 1285 }
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after
1989 const base::FilePath& target_exe) { 2021 const base::FilePath& target_exe) {
1990 if (!ShellUtil::ShortcutLocationIsSupported(location)) 2022 if (!ShellUtil::ShortcutLocationIsSupported(location))
1991 return true; // Vacuous success. 2023 return true; // Vacuous success.
1992 2024
1993 switch (location) { 2025 switch (location) {
1994 case SHORTCUT_LOCATION_START_MENU: // Falls through. 2026 case SHORTCUT_LOCATION_START_MENU: // Falls through.
1995 case SHORTCUT_LOCATION_APP_SHORTCUTS: 2027 case SHORTCUT_LOCATION_APP_SHORTCUTS:
1996 return RemoveShortcutFolder(location, dist, level); 2028 return RemoveShortcutFolder(location, dist, level);
1997 2029
1998 case SHORTCUT_LOCATION_TASKBAR_PINS: 2030 case SHORTCUT_LOCATION_TASKBAR_PINS:
1999 return BatchShortcutAction(base::Bind(&ShortcutOpUnpin), location, dist, 2031 return BatchShortcutAction(FilterTargetEq(target_exe).Bind(),
2000 level, target_exe); 2032 base::Bind(&ShortcutOpUnpin),
2033 location,
2034 dist,
2035 level);
2001 2036
2002 default: 2037 default:
2003 return BatchShortcutAction(base::Bind(&ShortcutOpDelete), location, dist, 2038 return BatchShortcutAction(FilterTargetEq(target_exe).Bind(),
2004 level, target_exe); 2039 base::Bind(&ShortcutOpDelete),
gab 2013/08/09 13:40:47 I overall like this refactoring very much since it
huangs 2013/08/09 15:06:20 Done. :)
2040 location,
2041 dist,
2042 level);
2005 } 2043 }
2006 } 2044 }
2007 2045
2008 // static 2046 // static
2009 bool ShellUtil::UpdateShortcuts( 2047 bool ShellUtil::UpdateShortcuts(
2010 ShellUtil::ShortcutLocation location, 2048 ShellUtil::ShortcutLocation location,
2011 BrowserDistribution* dist, 2049 BrowserDistribution* dist,
2012 ShellChange level, 2050 ShellChange level,
2013 const base::FilePath& target_exe, 2051 const base::FilePath& target_exe,
2014 const ShellUtil::ShortcutProperties& properties) { 2052 const ShellUtil::ShortcutProperties& properties) {
2015 if (!ShellUtil::ShortcutLocationIsSupported(location)) 2053 if (!ShellUtil::ShortcutLocationIsSupported(location))
2016 return true; // Vacuous success. 2054 return true; // Vacuous success.
2017 2055
2018 base::win::ShortcutProperties shortcut_properties( 2056 base::win::ShortcutProperties shortcut_properties(
2019 TranslateShortcutProperties(properties)); 2057 TranslateShortcutProperties(properties));
2020 return BatchShortcutAction(base::Bind(&ShortcutOpUpdate, shortcut_properties), 2058 return BatchShortcutAction(FilterTargetEq(target_exe).Bind(),
2021 location, dist, level, target_exe); 2059 base::Bind(&ShortcutOpUpdate, shortcut_properties),
2060 location,
2061 dist,
2062 level);
2022 } 2063 }
2023 2064
2024 bool ShellUtil::GetUserSpecificRegistrySuffix(string16* suffix) { 2065 bool ShellUtil::GetUserSpecificRegistrySuffix(string16* suffix) {
2025 // Use a thread-safe cache for the user's suffix. 2066 // Use a thread-safe cache for the user's suffix.
2026 static base::LazyInstance<UserSpecificRegistrySuffix>::Leaky suffix_instance = 2067 static base::LazyInstance<UserSpecificRegistrySuffix>::Leaky suffix_instance =
2027 LAZY_INSTANCE_INITIALIZER; 2068 LAZY_INSTANCE_INITIALIZER;
2028 return suffix_instance.Get().GetSuffix(suffix); 2069 return suffix_instance.Get().GetSuffix(suffix);
2029 } 2070 }
2030 2071
2031 bool ShellUtil::GetOldUserSpecificRegistrySuffix(string16* suffix) { 2072 bool ShellUtil::GetOldUserSpecificRegistrySuffix(string16* suffix) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2081 // are any left...). 2122 // are any left...).
2082 if (free_bits >= 8 && next_byte_index < size) { 2123 if (free_bits >= 8 && next_byte_index < size) {
2083 free_bits -= 8; 2124 free_bits -= 8;
2084 bit_stream += bytes[next_byte_index++] << free_bits; 2125 bit_stream += bytes[next_byte_index++] << free_bits;
2085 } 2126 }
2086 } 2127 }
2087 2128
2088 DCHECK_EQ(ret.length(), encoded_length); 2129 DCHECK_EQ(ret.length(), encoded_length);
2089 return ret; 2130 return ret;
2090 } 2131 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698