From 72558654ef72d34434a22b3004b9313ceee40cf3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 12 Sep 2016 14:22:29 -0700 Subject: [PATCH] Return boolean from shell.showItemInFolder --- atom/common/platform_util.h | 2 +- atom/common/platform_util_linux.cc | 6 ++-- atom/common/platform_util_mac.mm | 7 ++-- atom/common/platform_util_win.cc | 57 ++++++++++++++---------------- docs/api/shell.md | 3 +- 5 files changed, 38 insertions(+), 37 deletions(-) diff --git a/atom/common/platform_util.h b/atom/common/platform_util.h index 262f0a2e6e49..806af0ad497e 100644 --- a/atom/common/platform_util.h +++ b/atom/common/platform_util.h @@ -21,7 +21,7 @@ namespace platform_util { // Show the given file in a file manager. If possible, select the file. // Must be called from the UI thread. -void ShowItemInFolder(const base::FilePath& full_path); +bool ShowItemInFolder(const base::FilePath& full_path); // Open the given file in the desktop's default manner. // Must be called from the UI thread. diff --git a/atom/common/platform_util_linux.cc b/atom/common/platform_util_linux.cc index 9811c8760d06..0773a4c2e39e 100644 --- a/atom/common/platform_util_linux.cc +++ b/atom/common/platform_util_linux.cc @@ -59,12 +59,12 @@ namespace platform_util { // TODO(estade): It would be nice to be able to select the file in the file // manager, but that probably requires extending xdg-open. For now just // show the folder. -void ShowItemInFolder(const base::FilePath& full_path) { +bool ShowItemInFolder(const base::FilePath& full_path) { base::FilePath dir = full_path.DirName(); if (!base::DirectoryExists(dir)) - return; + return false; - XDGOpen(dir.value(), true); + return XDGOpen(dir.value(), true); } void OpenItem(const base::FilePath& full_path) { diff --git a/atom/common/platform_util_mac.mm b/atom/common/platform_util_mac.mm index d0146b11e085..0f20582d189c 100644 --- a/atom/common/platform_util_mac.mm +++ b/atom/common/platform_util_mac.mm @@ -18,7 +18,7 @@ namespace platform_util { -void ShowItemInFolder(const base::FilePath& path) { +bool ShowItemInFolder(const base::FilePath& path) { // The API only takes absolute path. base::FilePath full_path = path.IsAbsolute() ? path : base::MakeAbsoluteFilePath(path); @@ -26,8 +26,11 @@ void ShowItemInFolder(const base::FilePath& path) { DCHECK([NSThread isMainThread]); NSString* path_string = base::SysUTF8ToNSString(full_path.value()); if (!path_string || ![[NSWorkspace sharedWorkspace] selectFile:path_string - inFileViewerRootedAtPath:@""]) + inFileViewerRootedAtPath:@""]) { LOG(WARNING) << "NSWorkspace failed to select file " << full_path.value(); + return false; + } + return true; } // This function opens a file. This doesn't use LaunchServices or NSWorkspace diff --git a/atom/common/platform_util_win.cc b/atom/common/platform_util_win.cc index 6bb3bf5395eb..906a092ecc60 100644 --- a/atom/common/platform_util_win.cc +++ b/atom/common/platform_util_win.cc @@ -203,7 +203,7 @@ HRESULT DeleteFileProgressSink::ResumeTimer() { namespace platform_util { -void ShowItemInFolder(const base::FilePath& full_path) { +bool ShowItemInFolder(const base::FilePath& full_path) { base::win::ScopedCOMInitializer com_initializer; if (!com_initializer.succeeded()) return; @@ -211,7 +211,7 @@ void ShowItemInFolder(const base::FilePath& full_path) { base::FilePath dir = full_path.DirName().AsEndingWithSeparator(); // ParseDisplayName will fail if the directory is "C:", it must be "C:\\". if (dir.empty()) - return; + return false; typedef HRESULT (WINAPI *SHOpenFolderAndSelectItemsFuncPtr)( PCIDLIST_ABSOLUTE pidl_Folder, @@ -232,29 +232,27 @@ void ShowItemInFolder(const base::FilePath& full_path) { HMODULE shell32_base = GetModuleHandle(L"shell32.dll"); if (!shell32_base) { NOTREACHED() << " " << __FUNCTION__ << "(): Can't open shell32.dll"; - return; + return false; } open_folder_and_select_itemsPtr = reinterpret_cast (GetProcAddress(shell32_base, "SHOpenFolderAndSelectItems")); } if (!open_folder_and_select_itemsPtr) { - ui::win::OpenFolderViaShell(dir); - return; + return ui::win::OpenFolderViaShell(dir); } base::win::ScopedComPtr desktop; HRESULT hr = SHGetDesktopFolder(desktop.Receive()); if (FAILED(hr)) - return; + return false; base::win::ScopedCoMem dir_item; hr = desktop->ParseDisplayName(NULL, NULL, const_cast(dir.value().c_str()), NULL, &dir_item, NULL); if (FAILED(hr)) { - ui::win::OpenFolderViaShell(dir); - return; + return ui::win::OpenFolderViaShell(dir); } base::win::ScopedCoMem file_item; @@ -262,36 +260,35 @@ void ShowItemInFolder(const base::FilePath& full_path) { const_cast(full_path.value().c_str()), NULL, &file_item, NULL); if (FAILED(hr)) { - ui::win::OpenFolderViaShell(dir); - return; + return ui::win::OpenFolderViaShell(dir); } const ITEMIDLIST* highlight[] = { file_item }; hr = (*open_folder_and_select_itemsPtr)(dir_item, arraysize(highlight), highlight, NULL); + if (!FAILED(hr)) + return true; - if (FAILED(hr)) { - // On some systems, the above call mysteriously fails with "file not - // found" even though the file is there. In these cases, ShellExecute() - // seems to work as a fallback (although it won't select the file). - if (hr == ERROR_FILE_NOT_FOUND) { - ui::win::OpenFolderViaShell(dir); - } else { - LPTSTR message = NULL; - DWORD message_length = FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - 0, hr, 0, reinterpret_cast(&message), 0, NULL); - LOG(WARNING) << " " << __FUNCTION__ - << "(): Can't open full_path = \"" - << full_path.value() << "\"" - << " hr = " << hr - << " " << reinterpret_cast(&message); - if (message) - LocalFree(message); + // On some systems, the above call mysteriously fails with "file not + // found" even though the file is there. In these cases, ShellExecute() + // seems to work as a fallback (although it won't select the file). + if (hr == ERROR_FILE_NOT_FOUND) { + return ui::win::OpenFolderViaShell(dir); + } else { + LPTSTR message = NULL; + DWORD message_length = FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + 0, hr, 0, reinterpret_cast(&message), 0, NULL); + LOG(WARNING) << " " << __FUNCTION__ + << "(): Can't open full_path = \"" + << full_path.value() << "\"" + << " hr = " << hr + << " " << reinterpret_cast(&message); + if (message) + LocalFree(message); - ui::win::OpenFolderViaShell(dir); - } + return ui::win::OpenFolderViaShell(dir); } } diff --git a/docs/api/shell.md b/docs/api/shell.md index 2286a3a1dd71..e945a7fe487f 100644 --- a/docs/api/shell.md +++ b/docs/api/shell.md @@ -20,7 +20,8 @@ The `shell` module has the following methods: * `fullPath` String -Show the given file in a file manager. If possible, select the file. +Show the given file in a file manager. If possible, select the file. Returns +true if the item was successfully shown, false otherwse. ### `shell.openItem(fullPath)`