| 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 #include "chrome/browser/platform_util.h" | 5 #include "chrome/browser/platform_util.h" |
| 6 | 6 |
| 7 #include <commdlg.h> | 7 #include <commdlg.h> |
| 8 #include <dwmapi.h> | 8 #include <dwmapi.h> |
| 9 #include <shellapi.h> | 9 #include <shellapi.h> |
| 10 #include <shlobj.h> | 10 #include <shlobj.h> |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 static bool initialize_open_folder_proc = true; | 55 static bool initialize_open_folder_proc = true; |
| 56 if (initialize_open_folder_proc) { | 56 if (initialize_open_folder_proc) { |
| 57 initialize_open_folder_proc = false; | 57 initialize_open_folder_proc = false; |
| 58 // The SHOpenFolderAndSelectItems API is exposed by shell32 version 6 | 58 // The SHOpenFolderAndSelectItems API is exposed by shell32 version 6 |
| 59 // and does not exist in Win2K. We attempt to retrieve this function export | 59 // and does not exist in Win2K. We attempt to retrieve this function export |
| 60 // from shell32 and if it does not exist, we just invoke ShellExecute to | 60 // from shell32 and if it does not exist, we just invoke ShellExecute to |
| 61 // open the folder thus losing the functionality to select the item in | 61 // open the folder thus losing the functionality to select the item in |
| 62 // the process. | 62 // the process. |
| 63 HMODULE shell32_base = GetModuleHandle(L"shell32.dll"); | 63 HMODULE shell32_base = GetModuleHandle(L"shell32.dll"); |
| 64 if (!shell32_base) { | 64 if (!shell32_base) { |
| 65 NOTREACHED() << " " << __FUNCTION__ << "(): Can't open shell32.dll"; | 65 NOTREACHED() << " " << __func__ << "(): Can't open shell32.dll"; |
| 66 return; | 66 return; |
| 67 } | 67 } |
| 68 open_folder_and_select_itemsPtr = | 68 open_folder_and_select_itemsPtr = |
| 69 reinterpret_cast<SHOpenFolderAndSelectItemsFuncPtr> | 69 reinterpret_cast<SHOpenFolderAndSelectItemsFuncPtr> |
| 70 (GetProcAddress(shell32_base, "SHOpenFolderAndSelectItems")); | 70 (GetProcAddress(shell32_base, "SHOpenFolderAndSelectItems")); |
| 71 } | 71 } |
| 72 if (!open_folder_and_select_itemsPtr) { | 72 if (!open_folder_and_select_itemsPtr) { |
| 73 ShellExecute(NULL, L"open", dir.value().c_str(), NULL, NULL, SW_SHOW); | 73 ShellExecute(NULL, L"open", dir.value().c_str(), NULL, NULL, SW_SHOW); |
| 74 return; | 74 return; |
| 75 } | 75 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 98 hr = (*open_folder_and_select_itemsPtr)(dir_item, arraysize(highlight), | 98 hr = (*open_folder_and_select_itemsPtr)(dir_item, arraysize(highlight), |
| 99 highlight, NULL); | 99 highlight, NULL); |
| 100 | 100 |
| 101 if (FAILED(hr)) { | 101 if (FAILED(hr)) { |
| 102 // On some systems, the above call mysteriously fails with "file not | 102 // On some systems, the above call mysteriously fails with "file not |
| 103 // found" even though the file is there. In these cases, ShellExecute() | 103 // found" even though the file is there. In these cases, ShellExecute() |
| 104 // seems to work as a fallback (although it won't select the file). | 104 // seems to work as a fallback (although it won't select the file). |
| 105 if (hr == ERROR_FILE_NOT_FOUND) { | 105 if (hr == ERROR_FILE_NOT_FOUND) { |
| 106 ShellExecute(NULL, L"open", dir.value().c_str(), NULL, NULL, SW_SHOW); | 106 ShellExecute(NULL, L"open", dir.value().c_str(), NULL, NULL, SW_SHOW); |
| 107 } else { | 107 } else { |
| 108 LOG(WARNING) << " " << __FUNCTION__ << "(): Can't open full_path = \"" | 108 LOG(WARNING) << " " << __func__ << "(): Can't open full_path = \"" |
| 109 << full_path.value() << "\"" | 109 << full_path.value() << "\"" |
| 110 << " hr = " << logging::SystemErrorCodeToString(hr); | 110 << " hr = " << logging::SystemErrorCodeToString(hr); |
| 111 } | 111 } |
| 112 } | 112 } |
| 113 } | 113 } |
| 114 | 114 |
| 115 // Old ShellExecute crashes the process when the command for a given scheme | 115 // Old ShellExecute crashes the process when the command for a given scheme |
| 116 // is empty. This function tells if it is. | 116 // is empty. This function tells if it is. |
| 117 bool ValidateShellCommandForScheme(const std::string& scheme) { | 117 bool ValidateShellCommandForScheme(const std::string& scheme) { |
| 118 base::win::RegKey key; | 118 base::win::RegKey key; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 } // namespace internal | 185 } // namespace internal |
| 186 | 186 |
| 187 void OpenExternal(Profile* profile, const GURL& url) { | 187 void OpenExternal(Profile* profile, const GURL& url) { |
| 188 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 188 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 189 | 189 |
| 190 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 190 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
| 191 base::Bind(&OpenExternalOnFileThread, url)); | 191 base::Bind(&OpenExternalOnFileThread, url)); |
| 192 } | 192 } |
| 193 | 193 |
| 194 } // namespace platform_util | 194 } // namespace platform_util |
| OLD | NEW |