Index: base/base_paths_win.cc |
diff --git a/base/base_paths_win.cc b/base/base_paths_win.cc |
index 48238a4ffc2aff1c3554953d494568d7b1010b50..58c3ea549287b2266dac49814f5325b58fa539e9 100644 |
--- a/base/base_paths_win.cc |
+++ b/base/base_paths_win.cc |
@@ -2,11 +2,11 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "base/base_paths_win.h" |
#include <windows.h> |
#include <shlobj.h> |
+#include "base/base_paths.h" |
#include "base/file_path.h" |
#include "base/file_util.h" |
#include "base/path_service.h" |
@@ -16,6 +16,38 @@ |
// http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx |
extern "C" IMAGE_DOS_HEADER __ImageBase; |
+namespace { |
+ |
+bool GetQuickLaunchPath(bool default_user, FilePath* result) { |
+ if (default_user) { |
+ wchar_t system_buffer[MAX_PATH]; |
+ system_buffer[0] = 0; |
+ // As per MSDN, passing -1 for |hToken| indicates the Default user: |
+ // http://msdn.microsoft.com/library/windows/desktop/bb762181.aspx |
+ if (FAILED(SHGetFolderPath(NULL, CSIDL_APPDATA, |
+ reinterpret_cast<HANDLE>(-1), SHGFP_TYPE_CURRENT, |
+ system_buffer))) { |
+ return false; |
+ } |
+ *result = FilePath(system_buffer); |
+ } else if (!PathService::Get(base::DIR_APP_DATA, result)) { |
+ // For the current user, grab the APPDATA directory directly from the |
+ // PathService cache. |
+ return false; |
+ } |
+ // According to various sources, appending |
+ // "Microsoft\Internet Explorer\Quick Launch" to %appdata% is the only |
+ // reliable way to get the quick launch folder across all versions of Windows. |
+ // http://stackoverflow.com/questions/76080/how-do-you-reliably-get-the-quick- |
+ // http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept05/hey0901.mspx |
+ *result = result->AppendASCII("Microsoft"); |
+ *result = result->AppendASCII("Internet Explorer"); |
+ *result = result->AppendASCII("Quick Launch"); |
+ return true; |
+} |
+ |
+} // namespace |
+ |
namespace base { |
bool PathProviderWin(int key, FilePath* result) { |
@@ -103,9 +135,9 @@ bool PathProviderWin(int key, FilePath* result) { |
cur = FilePath(system_buffer); |
break; |
case base::DIR_LOCAL_APP_DATA_LOW: |
- if (win::GetVersion() < win::VERSION_VISTA) { |
+ if (win::GetVersion() < win::VERSION_VISTA) |
return false; |
- } |
+ |
// TODO(nsylvain): We should use SHGetKnownFolderPath instead. Bug 1281128 |
if (FAILED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, |
system_buffer))) |
@@ -138,6 +170,28 @@ bool PathProviderWin(int key, FilePath* result) { |
cur = FilePath(string16(path_buf)); |
break; |
} |
+ case base::DIR_USER_DESKTOP: |
+ if (FAILED(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL, |
+ SHGFP_TYPE_CURRENT, system_buffer))) { |
+ return false; |
+ } |
+ cur = FilePath(system_buffer); |
+ break; |
+ case base::DIR_COMMON_DESKTOP: |
+ if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, |
+ SHGFP_TYPE_CURRENT, system_buffer))) { |
+ return false; |
+ } |
+ cur = FilePath(system_buffer); |
+ break; |
+ case base::DIR_USER_QUICK_LAUNCH: |
+ if (!GetQuickLaunchPath(false, &cur)) |
+ return false; |
+ break; |
+ case base::DIR_DEFAULT_USER_QUICK_LAUNCH: |
+ if (!GetQuickLaunchPath(true, &cur)) |
+ return false; |
+ break; |
default: |
return false; |
} |