1// Copyright 2013 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#include "chrome/browser/chromeos/extensions/file_manager/private_api_dialog.h" 6 7#include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h" 8#include "chrome/browser/ui/views/select_file_dialog_extension.h" 9#include "chrome/common/extensions/api/file_manager_private.h" 10#include "content/public/browser/browser_thread.h" 11#include "ui/shell_dialogs/selected_file_info.h" 12 13using content::BrowserThread; 14 15namespace extensions { 16 17namespace { 18 19// Computes the routing ID for SelectFileDialogExtension from the |function|. 20SelectFileDialogExtension::RoutingID GetFileDialogRoutingID( 21 ChromeAsyncExtensionFunction* function) { 22 return SelectFileDialogExtension::GetRoutingIDFromWebContents( 23 function->GetAssociatedWebContents()); 24} 25 26} // namespace 27 28bool FileManagerPrivateCancelDialogFunction::RunAsync() { 29 SelectFileDialogExtension::OnFileSelectionCanceled( 30 GetFileDialogRoutingID(this)); 31 SendResponse(true); 32 return true; 33} 34 35bool FileManagerPrivateSelectFileFunction::RunAsync() { 36 using extensions::api::file_manager_private::SelectFile::Params; 37 const scoped_ptr<Params> params(Params::Create(*args_)); 38 EXTENSION_FUNCTION_VALIDATE(params); 39 40 std::vector<GURL> file_paths; 41 file_paths.push_back(GURL(params->selected_path)); 42 43 file_manager::util::GetSelectedFileInfoLocalPathOption option = 44 file_manager::util::NO_LOCAL_PATH_RESOLUTION; 45 if (params->should_return_local_path) { 46 option = params->for_opening ? 47 file_manager::util::NEED_LOCAL_PATH_FOR_OPENING : 48 file_manager::util::NEED_LOCAL_PATH_FOR_SAVING; 49 } 50 51 file_manager::util::GetSelectedFileInfo( 52 render_view_host(), 53 GetProfile(), 54 file_paths, 55 option, 56 base::Bind( 57 &FileManagerPrivateSelectFileFunction::GetSelectedFileInfoResponse, 58 this, 59 params->index)); 60 return true; 61} 62 63void FileManagerPrivateSelectFileFunction::GetSelectedFileInfoResponse( 64 int index, 65 const std::vector<ui::SelectedFileInfo>& files) { 66 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 67 if (files.size() != 1) { 68 SendResponse(false); 69 return; 70 } 71 SelectFileDialogExtension::OnFileSelected(GetFileDialogRoutingID(this), 72 files[0], index); 73 SendResponse(true); 74} 75 76bool FileManagerPrivateSelectFilesFunction::RunAsync() { 77 using extensions::api::file_manager_private::SelectFiles::Params; 78 const scoped_ptr<Params> params(Params::Create(*args_)); 79 EXTENSION_FUNCTION_VALIDATE(params); 80 81 std::vector<GURL> file_urls; 82 for (size_t i = 0; i < params->selected_paths.size(); ++i) 83 file_urls.push_back(GURL(params->selected_paths[i])); 84 85 file_manager::util::GetSelectedFileInfo( 86 render_view_host(), 87 GetProfile(), 88 file_urls, 89 params->should_return_local_path ? 90 file_manager::util::NEED_LOCAL_PATH_FOR_OPENING : 91 file_manager::util::NO_LOCAL_PATH_RESOLUTION, 92 base::Bind( 93 &FileManagerPrivateSelectFilesFunction::GetSelectedFileInfoResponse, 94 this)); 95 return true; 96} 97 98void FileManagerPrivateSelectFilesFunction::GetSelectedFileInfoResponse( 99 const std::vector<ui::SelectedFileInfo>& files) { 100 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 101 if (files.empty()) { 102 SendResponse(false); 103 return; 104 } 105 106 SelectFileDialogExtension::OnMultiFilesSelected(GetFileDialogRoutingID(this), 107 files); 108 SendResponse(true); 109} 110 111} // namespace extensions 112