| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/download/download_file_picker_chromeos.h" |
| |
| #include "base/bind.h" |
| #include "base/i18n/file_util_icu.h" |
| #include "chrome/browser/chromeos/drive/drive_download_handler.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "content/public/browser/download_item.h" |
| #include "content/public/browser/download_manager.h" |
| #include "ui/shell_dialogs/selected_file_info.h" |
| |
| using content::DownloadItem; |
| using content::DownloadManager; |
| |
| DownloadFilePickerChromeOS::DownloadFilePickerChromeOS() { |
| } |
| |
| DownloadFilePickerChromeOS::~DownloadFilePickerChromeOS() { |
| } |
| |
| void DownloadFilePickerChromeOS::InitSuggestedPath(DownloadItem* item, |
| const base::FilePath& path) { |
| // For Drive downloads, we should pass the drive path instead of the temporary |
| // file path. |
| Profile* profile = |
| Profile::FromBrowserContext(download_manager_->GetBrowserContext()); |
| drive::DriveDownloadHandler* drive_download_handler = |
| drive::DriveDownloadHandler::GetForProfile(profile); |
| base::FilePath suggested_path = path; |
| if (drive_download_handler && drive_download_handler->IsDriveDownload(item)) |
| suggested_path = drive_download_handler->GetTargetPath(item); |
| |
| DownloadFilePicker::InitSuggestedPath(item, suggested_path); |
| } |
| |
| void DownloadFilePickerChromeOS::FileSelected( |
| const base::FilePath& selected_path, |
| int index, |
| void* params) { |
| FileSelectedWithExtraInfo( |
| ui::SelectedFileInfo(selected_path, selected_path), |
| index, |
| params); |
| } |
| |
| void DownloadFilePickerChromeOS::FileSelectedWithExtraInfo( |
| const ui::SelectedFileInfo& file_info, |
| int index, |
| void* params) { |
| base::FilePath path = file_info.file_path; |
| file_util::NormalizeFileNameEncoding(&path); |
| |
| // Need to do this before we substitute with a temporary path. Otherwise we |
| // won't be able to detect path changes. |
| RecordFileSelected(path); |
| |
| if (download_manager_) { |
| Profile* profile = |
| Profile::FromBrowserContext(download_manager_->GetBrowserContext()); |
| drive::DriveDownloadHandler* drive_download_handler = |
| drive::DriveDownloadHandler::GetForProfile(profile); |
| if (drive_download_handler) { |
| DownloadItem* download = download_manager_->GetDownload(download_id_); |
| drive_download_handler->SubstituteDriveDownloadPath( |
| path, download, |
| base::Bind(&DownloadFilePickerChromeOS::OnFileSelected, |
| base::Unretained(this))); |
| } else { |
| OnFileSelected(path); |
| } |
| } else { |
| OnFileSelected(base::FilePath()); |
| } |
| // The OnFileSelected() call deletes |this| |
| } |