Chromium Code Reviews| Index: chrome/browser/chromeos/dom_ui/imageburner_ui.cc |
| =================================================================== |
| --- chrome/browser/chromeos/dom_ui/imageburner_ui.cc (revision 0) |
| +++ chrome/browser/chromeos/dom_ui/imageburner_ui.cc (revision 0) |
| @@ -0,0 +1,614 @@ |
| +// Copyright (c) 2010 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/chromeos/dom_ui/imageburner_ui.h" |
| + |
| +#include "base/i18n/rtl.h" |
| +#include "app/l10n_util.h" |
| +#include "app/resource_bundle.h" |
| +#include "base/message_loop.h" |
| +#include "base/path_service.h" |
| +#include "base/singleton.h" |
| +#include "base/string_util.h" |
| +#include "base/task.h" |
| +#include "base/utf_string_conversions.h" |
| +#include "base/values.h" |
| + |
| +#include "chrome/browser/chrome_thread.h" |
| +#include "chrome/browser/download/download_types.h" |
| +#include "chrome/browser/download/download_util.h" |
| +#include "chrome/browser/profile.h" |
| +#include "chrome/common/chrome_paths.h" |
| +#include "chrome/common/jstemplate_builder.h" |
| +#include "chrome/common/url_constants.h" |
| +#include "grit/browser_resources.h" |
| +#include "grit/generated_resources.h" |
| +#include "grit/locale_settings.h" |
| + |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// |
| +// ImageBurnUIHTMLSource |
| +// |
| +//////////////////////////////////////////////////////////////////////////////// |
| + |
| +ImageBurnUIHTMLSource::ImageBurnUIHTMLSource() |
| + : DataSource(chrome::kChromeUIImageBurnerHost, MessageLoop::current()) { |
| +} |
| + |
| +void ImageBurnUIHTMLSource::StartDataRequest(const std::string& path, |
| + bool is_off_the_record, |
| + int request_id) { |
| + DictionaryValue localized_strings; |
| + localized_strings.SetString("burnConfirmText1", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_CONFIM_BURN1)); |
| + localized_strings.SetString("burnConfirmText2", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_CONFIM_BURN2)); |
|
tony
2011/08/04 17:18:45
This is the wrong way to localize a sentence with
|
| + localized_strings.SetString("burnUnsuccessfulMessage", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_BURN_UNSUCCESSFUL)); |
| + localized_strings.SetString("burnSuccessfulMessage", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_BURN_SUCCESSFUL)); |
| + localized_strings.SetString("downloadAbortedMessage", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_DOWNLOAD_UNSUCCESSFUL)); |
| + localized_strings.SetString("title", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_TITLE)); |
| + localized_strings.SetString("listTitle", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_ROOT_LIST_TITLE)); |
| + localized_strings.SetString("downloadStatusStart", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_DOWNLOAD_STARTING_STATUS)); |
| + localized_strings.SetString("downloadStatusInProgress", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_DOWNLOAD_IN_PROGRESS_STATUS)); |
| + localized_strings.SetString("downloadStatusComplete", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_DOWNLOAD_COMPLETE_STATUS)); |
| + localized_strings.SetString("downloadStatusCanceled", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_DOWNLOAD_CANCELED_STATUS)); |
| + localized_strings.SetString("burnStatusStart", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_BURN_STARTING_STATUS)); |
| + localized_strings.SetString("burnStatusInProgress", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_BURN_IN_PROGRESS_STATUS)); |
| + localized_strings.SetString("burnStatusComplete", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_BURN_COMPLETE_STATUS)); |
| + localized_strings.SetString("burnStatusCanceled", |
| + l10n_util::GetStringUTF16(IDS_IMAGEBURN_BURN_CANCELED_STATUS)); |
| + |
| + SetFontAndTextDirection(&localized_strings); |
| + |
| + static const base::StringPiece imageburn_html( |
| + ResourceBundle::GetSharedInstance().GetRawDataResource( |
| + IDR_IMAGEBURNER_HTML)); |
| + const std::string full_html = jstemplate_builder::GetI18nTemplateHtml( |
| + imageburn_html, &localized_strings); |
| + |
| + scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes); |
| + html_bytes->data.resize(full_html.size()); |
| + std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin()); |
| + |
| + SendResponse(request_id, html_bytes); |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// |
| +// ImageBurnHandler |
| +// |
| +//////////////////////////////////////////////////////////////////////////////// |
| + |
| +ImageBurnHandler::ImageBurnHandler(TabContents* contents) |
| + :tab_contents_(contents), |
| + download_manager_(NULL), |
| + download_item_observer_added_(false), |
| + active_download_item_(NULL), |
| + burn_resource_manager_(NULL) { |
| + chromeos::MountLibrary* mount_lib = |
| + chromeos::CrosLibrary::Get()->GetMountLibrary(); |
| + mount_lib->AddObserver(this); |
| + chromeos::BurnLibrary* burn_lib = |
| + chromeos::CrosLibrary::Get()->GetBurnLibrary(); |
| + burn_lib->AddObserver(this); |
| + local_image_file_path_.clear(); |
| + burn_resource_manager_ = Singleton<ImageBurnResourceManager>::get(); |
| +} |
| + |
| +ImageBurnHandler::~ImageBurnHandler() { |
| + chromeos::MountLibrary* mount_lib = |
| + chromeos::CrosLibrary::Get()->GetMountLibrary(); |
| + mount_lib->RemoveObserver(this); |
| + chromeos::BurnLibrary* burn_lib = |
| + chromeos::CrosLibrary::Get()->GetBurnLibrary(); |
| + burn_lib->RemoveObserver(this); |
| + if (active_download_item_) { |
| + active_download_item_->RemoveObserver(this); |
| + } |
| + if (download_manager_) |
| + download_manager_->RemoveObserver(this); |
| +} |
| + |
| +DOMMessageHandler* ImageBurnHandler::Attach(DOMUI* dom_ui) { |
| + return DOMMessageHandler::Attach(dom_ui); |
| +} |
| + |
| +void ImageBurnHandler::RegisterMessages() { |
| + dom_ui_->RegisterMessageCallback("getRoots", |
| + NewCallback(this, &ImageBurnHandler::HandleGetRoots)); |
| + dom_ui_->RegisterMessageCallback("downloadImage", |
| + NewCallback(this, &ImageBurnHandler::HandleDownloadImage)); |
| + dom_ui_->RegisterMessageCallback("burnImage", |
| + NewCallback(this, &ImageBurnHandler::HandleBurnImage)); |
| + dom_ui_->RegisterMessageCallback("cancelBurnImage", |
| + NewCallback(this, &ImageBurnHandler::HandleCancelBurnImage)); |
| +} |
| + |
| +void ImageBurnHandler::MountChanged(chromeos::MountLibrary* obj, |
| + chromeos::MountEventType evt, |
| + const std::string& path) { |
| + if ((evt == chromeos::DISK_REMOVED || |
| + evt == chromeos::DISK_CHANGED || |
| + evt == chromeos::DEVICE_REMOVED)) { |
| + dom_ui_->CallJavascriptFunction(L"rootsChanged"); |
| + } |
| +} |
| + |
| +void ImageBurnHandler::ProgressUpdated(chromeos::BurnLibrary* object, |
| + chromeos::BurnEventType evt, |
| + const ImageBurnStatus& status) { |
| + UpdateBurnProgress(status.amount_burnt, status.total_size, |
| + status.target_path, evt); |
| +} |
| + |
| +void ImageBurnHandler::OnDownloadUpdated(DownloadItem* download) { |
| + if (download->state() != DownloadItem::CANCELLED |
| + && download->state() != DownloadItem::COMPLETE) { |
| + scoped_ptr<DictionaryValue> result_value( |
| + download_util::CreateDownloadItemValue(download, 0)); |
| + dom_ui_->CallJavascriptFunction(L"downloadUpdated", *result_value); |
| + } |
| + if (download->state() == DownloadItem::CANCELLED) |
| + DownloadCompleted(false); |
| +} |
| + |
| +void ImageBurnHandler::OnDownloadFileCompleted(DownloadItem* download) { |
| + DCHECK(download->state() == DownloadItem::COMPLETE); |
| + local_image_file_path_ = download->full_path(); |
| + DownloadCompleted(true); |
| +} |
| + |
| +void ImageBurnHandler::OnDownloadOpened(DownloadItem* download) { |
| + if (download->safety_state() == DownloadItem::DANGEROUS) |
| + download->DangerousDownloadValidated(); |
| +} |
| + |
| +void ImageBurnHandler::ModelChanged() { |
| + std::vector<DownloadItem*> downloads; |
| + download_manager_->GetTemporaryDownloads( |
| + burn_resource_manager_->GetLocalImageDirPath(), &downloads); |
| + if (download_item_observer_added_) |
| + return; |
| + std::vector<DownloadItem*>::const_iterator it = downloads.begin(); |
| + for (; it != downloads.end(); ++it) { |
| + if ((*it)->url() == *image_download_url_) { |
| + download_item_observer_added_ = true; |
| + (*it)->AddObserver(this); |
| + active_download_item_ = *it; |
| + break; |
| + } |
| + } |
| +} |
| + |
| +void ImageBurnHandler::HandleGetRoots(const ListValue* args) { |
| + ListValue results_value; |
| + DictionaryValue info_value; |
| + chromeos::MountLibrary* mount_lib = |
| + chromeos::CrosLibrary::Get()->GetMountLibrary(); |
| + const chromeos::MountLibrary::DiskVector& disks = mount_lib->disks(); |
| + if (!burn_resource_manager_->CheckBurnInProgress()) { |
| + for (size_t i = 0; i < disks.size(); ++i) { |
| + if (!disks[i].mount_path.empty()) { |
| + DictionaryValue* page_value = new DictionaryValue(); |
| + FilePath disk_path = FilePath(disks[i].system_path).DirName(); |
| + std::string title = "/dev/" + disk_path.BaseName().value(); |
| + page_value->SetString(kPropertyTitle, title); |
| + page_value->SetString(kPropertyPath, title); |
| + page_value->SetBoolean(kPropertyDirectory, true); |
| + results_value.Append(page_value); |
| + } |
| + } |
| + } |
| + info_value.SetString("functionCall", "getRoots"); |
| + info_value.SetString(kPropertyPath, ""); |
| + dom_ui_->CallJavascriptFunction(L"browseFileResult", |
| + info_value, results_value); |
| +} |
| + |
| +void ImageBurnHandler::HandleDownloadImage(const ListValue* args) { |
| + ExtractTargetedDeviceSystemPath(args); |
| + CreateLocalImagePath(); |
| + CreateImageUrl(); |
| +} |
| + |
| +void ImageBurnHandler::HandleBurnImage(const ListValue* args) { |
| + ImageBurnTaskProxy* task = new ImageBurnTaskProxy(AsWeakPtr()); |
| + task->AddRef(); |
| + ChromeThread::PostTask( |
| + ChromeThread::UI, FROM_HERE, |
| + NewRunnableMethod(task, &ImageBurnTaskProxy::BurnImage)); |
| +} |
| + |
| +void ImageBurnHandler::HandleCancelBurnImage(const ListValue* args) { |
| + image_target_.clear(); |
| +} |
| + |
| +void ImageBurnHandler::DownloadCompleted(bool is_successful) { |
| + burn_resource_manager_-> ReportDownloadFinished(is_successful); |
| + if (active_download_item_) { |
| + active_download_item_->RemoveObserver(this); |
| + active_download_item_ = NULL; |
| + } |
| + download_item_observer_added_ = false; |
| + |
| + DictionaryValue signal_value; |
| + if (is_successful) { |
| + signal_value.SetString("state", "COMPLETE"); |
| + dom_ui_->CallJavascriptFunction(L"downloadUpdated", signal_value); |
| + dom_ui_->CallJavascriptFunction(L"promtUserDownloadFinished"); |
| + } else { |
| + signal_value.SetString("state", "CANCELLED"); |
| + dom_ui_->CallJavascriptFunction(L"downloadUpdated", signal_value); |
| + dom_ui_->CallJavascriptFunction(L"alertUserDownloadAborted"); |
| + } |
| +} |
| + |
| +void ImageBurnHandler::BurnImage() { |
| + chromeos::BurnLibrary* burn_lib = |
| + chromeos::CrosLibrary::Get()->GetBurnLibrary(); |
| + if (burn_lib->DoBurn(local_image_file_path_, image_target_)) { |
| + DictionaryValue signal_value; |
| + signal_value.SetString("state", "IN_PROGRESS"); |
| + signal_value.SetInteger("amount_burnt", 0); |
| + signal_value.SetString("progress_status_text", ""); |
| + dom_ui_->CallJavascriptFunction(L"burnUpdated", signal_value); |
| + } |
| +} |
| + |
| +void ImageBurnHandler::FinalizeBurn(bool successful) { |
| + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
| + if (successful) |
| + dom_ui_->CallJavascriptFunction(L"burnSuccessful"); |
| + else |
| + dom_ui_->CallJavascriptFunction(L"burnUnsuccessful"); |
| +} |
| + |
| +void ImageBurnHandler::UpdateBurnProgress(int64 total_burnt, |
| + int64 image_size, |
| + const std::string& path, |
| + chromeos::BurnEventType event) { |
| + DictionaryValue progress_value; |
| + progress_value.SetString("progress_status_text", |
| + WideToUTF16Hack(GetBurnProgressText(total_burnt, image_size))); |
| + if (event == chromeos::BURN_UPDATED) |
| + progress_value.SetString("state", "IN_PROGRESS"); |
| + else if (event == chromeos::BURN_CANCELED) |
| + progress_value.SetString("state", "CANCELLED"); |
| + else if (event == chromeos::BURN_COMPLETE) |
| + progress_value.SetString("state", "COMPLETE"); |
| + progress_value.SetInteger("received", total_burnt); |
| + progress_value.SetInteger("total", image_size); |
| + progress_value.SetString("path", path); |
| + |
| + dom_ui_->CallJavascriptFunction(L"burnProgressUpdated", progress_value); |
| +} |
| + |
| +std::wstring ImageBurnHandler::GetBurnProgressText(int64 total_burnt, |
| + int64 image_size) { |
| + DataUnits amount_units = GetByteDisplayUnits(total_burnt); |
| + std::wstring burnt_size = |
| + UTF16ToWideHack(FormatBytes(total_burnt, amount_units, true)); |
| + |
| + std::wstring burnt_size_localized; |
| + if (base::i18n::AdjustStringForLocaleDirection(burnt_size, |
| + &burnt_size_localized)) { |
| + burnt_size.assign(burnt_size_localized); |
| + } |
| + |
| + if (image_size) { |
| + amount_units = GetByteDisplayUnits(image_size); |
| + std::wstring total_text = |
| + UTF16ToWideHack(FormatBytes(image_size, amount_units, true)); |
| + std::wstring total_text_localized; |
| + if (base::i18n::AdjustStringForLocaleDirection(total_text, |
| + &total_text_localized)) |
| + total_text.assign(total_text_localized); |
| + |
| + return l10n_util::GetStringF(IDS_IMAGEBURN_BURN_PROGRESS, |
| + burnt_size, |
| + total_text); |
| + } else { |
| + return l10n_util::GetStringF(IDS_IMAGEBURN_BURN_PROGRESS_SIZE_UNKNOWN, |
| + burnt_size); |
| + } |
| +} |
| + |
| +void ImageBurnHandler::CreateImageUrl() { |
| + ImageBurnTaskProxy* task = new ImageBurnTaskProxy(AsWeakPtr()); |
| + task->AddRef(); |
| + task->CreateImageUrl(tab_contents_, this); |
| +} |
| + |
| +void ImageBurnHandler::CreateImageUrlCallback(GURL* image_url) { |
| + if (!image_url) { |
| + DownloadCompleted(false); |
| + return; |
| + } |
| + image_download_url_ = image_url; |
| + |
| + download_manager_ = tab_contents_->profile()->GetDownloadManager(); |
| + download_manager_->AddObserver(this); |
| + |
| + ImageBurnTaskProxy* task = new ImageBurnTaskProxy(AsWeakPtr()); |
| + task->AddRef(); |
| + |
| + if (!task->ReportDownloadInitialized()) { |
| + DownloadSaveInfo save_info; |
| + save_info.file_path = local_image_file_path_; |
| + net::FileStream* file_stream = |
| + burn_resource_manager_->CreateFileStream(&local_image_file_path_); |
| + if (!file_stream) { |
| + DownloadCompleted(false); |
| + return; |
| + } |
| + save_info.file_stream = linked_ptr<net::FileStream>(file_stream); |
| + |
| + download_manager_->DownloadUrlToFile(*image_download_url_, |
| + tab_contents_->GetURL(), |
| + tab_contents_->encoding(), |
| + save_info, |
| + tab_contents_); |
| + } else if (task->CheckDownloadFinished()) { |
| + DownloadCompleted(true); |
| + } |
| +} |
| + |
| +void ImageBurnHandler::ExtractTargetedDeviceSystemPath( |
| + const ListValue* list_value) { |
| + Value* list_member; |
| + std::string image_dest; |
| + if (list_value->Get(0, &list_member) && |
| + list_member->GetType() == Value::TYPE_STRING) { |
| + const StringValue* string_value = |
| + static_cast<const StringValue*>(list_member); |
| + string_value->GetAsString(&image_dest); |
| + } else { |
| + LOG(ERROR) << "Unable to get path string"; |
| + return; |
| + } |
| + image_target_ = FilePath(image_dest); |
| +} |
| + |
| +void ImageBurnHandler::CreateLocalImagePath() { |
| + local_image_file_path_ = |
| + burn_resource_manager_->GetLocalImageDirPath().Append(kImageFileName); |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// |
| +// ImageBurnTaskProxy |
| +// |
| +//////////////////////////////////////////////////////////////////////////////// |
| +ImageBurnTaskProxy::ImageBurnTaskProxy( |
| + const base::WeakPtr<ImageBurnHandler>& handler) |
| + : handler_(handler) { |
| + resource_manager_ = Singleton<ImageBurnResourceManager>::get(); |
| +} |
| + |
| +bool ImageBurnTaskProxy::ReportDownloadInitialized() { |
| + bool initialized = resource_manager_-> CheckImageDownloadStarted(); |
| + if (!initialized) |
| + resource_manager_-> ReportImageDownloadStarted(); |
| + return initialized; |
| +} |
| + |
| +bool ImageBurnTaskProxy::CheckDownloadFinished() { |
| + return resource_manager_->CheckDownloadFinished(); |
| +} |
| + |
| +void ImageBurnTaskProxy:: BurnImage() { |
| + if (!resource_manager_->CheckBurnInProgress() && handler_) { |
| + resource_manager_->SetBurnInProgress(true); |
| + handler_->BurnImage(); |
| + } |
| +} |
| + |
| +void ImageBurnTaskProxy::FinalizeBurn(bool success) { |
| + if (handler_) { |
| + handler_->FinalizeBurn(success); |
| + resource_manager_->SetBurnInProgress(false); |
| + } |
| +} |
| + |
| +void ImageBurnTaskProxy::CreateImageUrl(TabContents* tab_contents, |
| + ImageBurnHandler* downloader) { |
| + resource_manager_->CreateImageUrl(tab_contents, downloader); |
| +} |
| + |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// |
| +// ImageBurnResourceManager |
| +// |
| +//////////////////////////////////////////////////////////////////////////////// |
| + |
| +ImageBurnResourceManager::ImageBurnResourceManager() |
| + : image_download_started_(false), |
| + image_download_finished_(false), |
| + burn_in_progress_(false), |
| + download_manager_(NULL), |
| + download_item_observer_added_(false), |
| + active_download_item_(NULL), |
| + image_url_(NULL), |
| + image_fetcher_url_(kImageBaseURL + kImageFetcherName), |
| + image_url_fetching_requested_(false), |
| + image_url_fetched_(false) { |
| + local_image_dir_file_path_.clear(); |
| + image_fecher_local_path_ = GetLocalImageDirPath().Append(kImageFetcherName); |
| +} |
| + |
| +ImageBurnResourceManager::~ImageBurnResourceManager() { |
| + if (!local_image_dir_file_path_.empty()) { |
| + file_util::Delete(local_image_dir_file_path_, true); |
| + } |
| + if (active_download_item_) { |
| + active_download_item_->RemoveObserver(this); |
| + } |
| + if (download_manager_) |
| + download_manager_->RemoveObserver(this); |
| +} |
| + |
| +void ImageBurnResourceManager::OnDownloadUpdated(DownloadItem* download) { |
| + if (download->state() == DownloadItem::CANCELLED) { |
| + image_url_.reset(); |
| + ImageUrlFetched(false); |
| + } |
| +} |
| + |
| +void ImageBurnResourceManager::OnDownloadFileCompleted(DownloadItem* download) { |
| + DCHECK(download->state() == DownloadItem::COMPLETE); |
| + std::string image_url; |
| + if (file_util::ReadFileToString(image_fecher_local_path_, &image_url)) { |
| + image_url_.reset(new GURL(kImageBaseURL + image_url)); |
| + ImageUrlFetched(true); |
| + } else { |
| + image_url_.reset(); |
| + ImageUrlFetched(false); |
| + } |
| +} |
| + |
| +void ImageBurnResourceManager::OnDownloadOpened(DownloadItem* download) { } |
| + |
| +void ImageBurnResourceManager::ModelChanged() { |
| + std::vector<DownloadItem*> downloads; |
| + download_manager_->GetTemporaryDownloads(GetLocalImageDirPath(), &downloads); |
| + |
| + if (download_item_observer_added_) |
| + return; |
| + std::vector<DownloadItem*>::const_iterator it = downloads.begin(); |
| + for (; it != downloads.end(); ++it) { |
| + if ((*it)->url() == image_fetcher_url_) { |
| + download_item_observer_added_ = true; |
| + (*it)->AddObserver(this); |
| + active_download_item_ = *it; |
| + } |
| + } |
| +} |
| + |
| +FilePath ImageBurnResourceManager::GetLocalImageDirPath() { |
| + if (local_image_dir_file_path_.empty()) { |
| + CHECK(PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, |
| + &local_image_dir_file_path_)); |
| + local_image_dir_file_path_ = |
| + local_image_dir_file_path_.Append(kTempImageFolderName); |
| + file_util::CreateDirectory(local_image_dir_file_path_); |
| + } |
| + return local_image_dir_file_path_; |
| +} |
| + |
| +bool ImageBurnResourceManager::CheckImageDownloadStarted() { |
| + return image_download_started_; |
| +} |
| + |
| +void ImageBurnResourceManager::ReportImageDownloadStarted() { |
| + image_download_started_ = true; |
| +} |
| + |
| +bool ImageBurnResourceManager::CheckDownloadFinished() { |
| + return image_download_finished_; |
| +} |
| + |
| +bool ImageBurnResourceManager::CheckBurnInProgress() { |
| + return burn_in_progress_; |
| +} |
| + |
| +void ImageBurnResourceManager::SetBurnInProgress(bool value) { |
| + burn_in_progress_ = value; |
| +} |
| + |
| +void ImageBurnResourceManager::ReportDownloadFinished(bool success) { |
| + if (!image_download_started_) |
| + return; |
| + if (!success) |
| + image_download_started_ = false; |
| + image_download_finished_ = success; |
| +} |
| + |
| +void ImageBurnResourceManager::CreateImageUrl(TabContents* tab_contents, |
| + ImageBurnHandler* downloader) { |
| + if (image_url_fetched_) { |
| + downloader->CreateImageUrlCallback(image_url_.get()); |
| + return; |
| + } |
| + downloaders_.push_back(downloader); |
| + |
| + if (image_url_fetching_requested_) { |
| + return; |
| + } |
| + image_url_fetching_requested_ = true; |
| + |
| + download_manager_ = tab_contents->profile()->GetDownloadManager(); |
| + download_manager_->AddObserver(this); |
| + |
| + DownloadSaveInfo save_info; |
| + save_info.file_path = image_fecher_local_path_; |
| + net::FileStream* file_stream = CreateFileStream(&image_fecher_local_path_); |
| + if (!file_stream) { |
| + ImageUrlFetched(false); |
| + return; |
| + } |
| + save_info.file_stream = linked_ptr<net::FileStream>(file_stream); |
| + download_manager_->DownloadUrlToFile(image_fetcher_url_, |
| + tab_contents->GetURL(), |
| + tab_contents->encoding(), |
| + save_info, |
| + tab_contents); |
| +} |
| + |
| +void ImageBurnResourceManager::ImageUrlFetched(bool success) { |
| + if (active_download_item_) { |
| + active_download_item_->RemoveObserver(this); |
| + active_download_item_ = NULL; |
| + } |
| + download_item_observer_added_ = false; |
| + if (download_manager_) |
| + download_manager_->RemoveObserver(this); |
| + if (!success) |
| + image_url_fetching_requested_ = false; |
| + image_url_fetched_ = success; |
| + for (size_t i = 0; i < downloaders_.size(); ++i) |
| + downloaders_[i]->CreateImageUrlCallback(image_url_.get()); |
| + downloaders_.clear(); |
| +} |
| + |
| +net::FileStream* ImageBurnResourceManager::CreateFileStream( |
| + FilePath* file_path) { |
| + DCHECK(file_path && !file_path->empty()); |
| + scoped_ptr<net::FileStream> file_stream(new net::FileStream); |
| + if (file_stream->Open(*file_path, base::PLATFORM_FILE_CREATE_ALWAYS | |
| + base::PLATFORM_FILE_WRITE)) { |
| + return NULL; |
| + } |
| + return file_stream.release(); |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// |
| +// ImageBurnUI |
| +// |
| +//////////////////////////////////////////////////////////////////////////////// |
| +ImageBurnUI::ImageBurnUI(TabContents* contents) : DOMUI(contents) { |
| + ImageBurnHandler* handler = new ImageBurnHandler(contents); |
| + AddMessageHandler((handler)->Attach(this)); |
| + ImageBurnUIHTMLSource* html_source = new ImageBurnUIHTMLSource(); |
| + ChromeThread::PostTask( |
| + ChromeThread::IO, FROM_HERE, |
| + NewRunnableMethod( |
| + Singleton<ChromeURLDataManager>::get(), |
| + &ChromeURLDataManager::AddDataSource, |
| + make_scoped_refptr(html_source))); |
| +} |