OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef BASE_WIN_SHORTCUT_H_ | |
6 #define BASE_WIN_SHORTCUT_H_ | |
7 | |
8 #include <windows.h> | |
9 | |
10 #include "base/base_export.h" | |
11 #include "base/files/file_path.h" | |
12 #include "base/logging.h" | |
13 #include "base/strings/string16.h" | |
14 | |
15 namespace base { | |
16 namespace win { | |
17 | |
18 enum ShortcutOperation { | |
19 // Create a new shortcut (overwriting if necessary). | |
20 SHORTCUT_CREATE_ALWAYS = 0, | |
21 // Overwrite an existing shortcut (fails if the shortcut doesn't exist). | |
22 // If the arguments are not specified on the new shortcut, keep the old | |
23 // shortcut's arguments. | |
24 SHORTCUT_REPLACE_EXISTING, | |
25 // Update specified properties only on an existing shortcut. | |
26 SHORTCUT_UPDATE_EXISTING, | |
27 }; | |
28 | |
29 // Properties for shortcuts. Properties set will be applied to the shortcut on | |
30 // creation/update, others will be ignored. | |
31 // Callers are encouraged to use the setters provided which take care of | |
32 // setting |options| as desired. | |
33 struct BASE_EXPORT ShortcutProperties { | |
34 enum IndividualProperties { | |
35 PROPERTIES_TARGET = 1U << 0, | |
36 PROPERTIES_WORKING_DIR = 1U << 1, | |
37 PROPERTIES_ARGUMENTS = 1U << 2, | |
38 PROPERTIES_DESCRIPTION = 1U << 3, | |
39 PROPERTIES_ICON = 1U << 4, | |
40 PROPERTIES_APP_ID = 1U << 5, | |
41 PROPERTIES_DUAL_MODE = 1U << 6, | |
42 // Be sure to update the values below when adding a new property. | |
43 PROPERTIES_BASIC = PROPERTIES_TARGET | | |
44 PROPERTIES_WORKING_DIR | | |
45 PROPERTIES_ARGUMENTS | | |
46 PROPERTIES_DESCRIPTION | | |
47 PROPERTIES_ICON, | |
48 PROPERTIES_WIN7 = PROPERTIES_APP_ID | PROPERTIES_DUAL_MODE, | |
49 PROPERTIES_ALL = PROPERTIES_BASIC | PROPERTIES_WIN7 | |
50 }; | |
51 | |
52 ShortcutProperties(); | |
53 ~ShortcutProperties(); | |
54 | |
55 void set_target(const FilePath& target_in) { | |
56 target = target_in; | |
57 options |= PROPERTIES_TARGET; | |
58 } | |
59 | |
60 void set_working_dir(const FilePath& working_dir_in) { | |
61 working_dir = working_dir_in; | |
62 options |= PROPERTIES_WORKING_DIR; | |
63 } | |
64 | |
65 void set_arguments(const string16& arguments_in) { | |
66 // Size restriction as per MSDN at http://goo.gl/TJ7q5. | |
67 DCHECK(arguments_in.size() < MAX_PATH); | |
68 arguments = arguments_in; | |
69 options |= PROPERTIES_ARGUMENTS; | |
70 } | |
71 | |
72 void set_description(const string16& description_in) { | |
73 // Size restriction as per MSDN at http://goo.gl/OdNQq. | |
74 DCHECK(description_in.size() < MAX_PATH); | |
75 description = description_in; | |
76 options |= PROPERTIES_DESCRIPTION; | |
77 } | |
78 | |
79 void set_icon(const FilePath& icon_in, int icon_index_in) { | |
80 icon = icon_in; | |
81 icon_index = icon_index_in; | |
82 options |= PROPERTIES_ICON; | |
83 } | |
84 | |
85 void set_app_id(const string16& app_id_in) { | |
86 app_id = app_id_in; | |
87 options |= PROPERTIES_APP_ID; | |
88 } | |
89 | |
90 void set_dual_mode(bool dual_mode_in) { | |
91 dual_mode = dual_mode_in; | |
92 options |= PROPERTIES_DUAL_MODE; | |
93 } | |
94 | |
95 // The target to launch from this shortcut. This is mandatory when creating | |
96 // a shortcut. | |
97 FilePath target; | |
98 // The name of the working directory when launching the shortcut. | |
99 FilePath working_dir; | |
100 // The arguments to be applied to |target| when launching from this shortcut. | |
101 // The length of this string must be less than MAX_PATH. | |
102 string16 arguments; | |
103 // The localized description of the shortcut. | |
104 // The length of this string must be less than MAX_PATH. | |
105 string16 description; | |
106 // The path to the icon (can be a dll or exe, in which case |icon_index| is | |
107 // the resource id). | |
108 FilePath icon; | |
109 int icon_index; | |
110 // The app model id for the shortcut (Win7+). | |
111 string16 app_id; | |
112 // Whether this is a dual mode shortcut (Win8+). | |
113 bool dual_mode; | |
114 // Bitfield made of IndividualProperties. Properties set in |options| will be | |
115 // set on the shortcut, others will be ignored. | |
116 uint32 options; | |
117 }; | |
118 | |
119 // This method creates (or updates) a shortcut link at |shortcut_path| using the | |
120 // information given through |properties|. | |
121 // Ensure you have initialized COM before calling into this function. | |
122 // |operation|: a choice from the ShortcutOperation enum. | |
123 // If |operation| is SHORTCUT_REPLACE_EXISTING or SHORTCUT_UPDATE_EXISTING and | |
124 // |shortcut_path| does not exist, this method is a no-op and returns false. | |
125 BASE_EXPORT bool CreateOrUpdateShortcutLink( | |
126 const FilePath& shortcut_path, | |
127 const ShortcutProperties& properties, | |
128 ShortcutOperation operation); | |
129 | |
130 // Resolves Windows shortcut (.LNK file). | |
131 // This methods tries to resolve selected properties of a shortcut .LNK file. | |
132 // The path of the shortcut to resolve is in |shortcut_path|. |options| is a bit | |
133 // field composed of ShortcutProperties::IndividualProperties, to specify which | |
134 // properties to read. It should be non-0. The resulting data are read into | |
135 // |properties|, which must not be NULL. Note: PROPERTIES_TARGET will retrieve | |
136 // the target path as stored in the shortcut but won't attempt to resolve that | |
137 // path so it may not be valid. The function returns true if all requested | |
138 // properties are successfully read. Otherwise some reads have failed and | |
139 // intermediate values written to |properties| should be ignored. | |
140 BASE_EXPORT bool ResolveShortcutProperties(const FilePath& shortcut_path, | |
141 uint32 options, | |
142 ShortcutProperties* properties); | |
143 | |
144 // Resolves Windows shortcut (.LNK file). | |
145 // This is a wrapper to ResolveShortcutProperties() to handle the common use | |
146 // case of resolving target and arguments. |target_path| and |args| are | |
147 // optional output variables that are ignored if NULL (but at least one must be | |
148 // non-NULL). The function returns true if all requested fields are found | |
149 // successfully. Callers can safely use the same variable for both | |
150 // |shortcut_path| and |target_path|. | |
151 BASE_EXPORT bool ResolveShortcut(const FilePath& shortcut_path, | |
152 FilePath* target_path, | |
153 string16* args); | |
154 | |
155 // Pins a shortcut to the Windows 7 taskbar. The shortcut file must already | |
156 // exist and be a shortcut that points to an executable. The app id of the | |
157 // shortcut is used to group windows and must be set correctly. | |
158 BASE_EXPORT bool TaskbarPinShortcutLink(const wchar_t* shortcut); | |
159 | |
160 // Unpins a shortcut from the Windows 7 taskbar. The shortcut must exist and | |
161 // already be pinned to the taskbar. The app id of the shortcut is used as the | |
162 // identifier for the taskbar item to remove and must be set correctly. | |
163 BASE_EXPORT bool TaskbarUnpinShortcutLink(const wchar_t* shortcut); | |
164 | |
165 } // namespace win | |
166 } // namespace base | |
167 | |
168 #endif // BASE_WIN_SHORTCUT_H_ | |
OLD | NEW |