15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/save_file_resource_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/save_file_manager.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "net/url_request/redirect_info.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)SaveFileResourceHandler::SaveFileResourceHandler(net::URLRequest* request, 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int render_process_host_id, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveFileManager* manager) 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : ResourceHandler(request), 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) save_id_(-1), 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id_(render_process_host_id), 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id_(render_view_id), 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_(url), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_length_(0), 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_manager_(manager) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SaveFileResourceHandler::~SaveFileResourceHandler() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool SaveFileResourceHandler::OnUploadProgress(uint64 position, uint64 size) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SaveFileResourceHandler::OnRequestRedirected( 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const net::RedirectInfo& redirect_info, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceResponse* response, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* defer) { 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) final_url_ = redirect_info.new_url; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool SaveFileResourceHandler::OnResponseStarted(ResourceResponse* response, 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool* defer) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_id_ = save_manager_->GetNextId(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |save_manager_| consumes (deletes): 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveFileCreateInfo* info = new SaveFileCreateInfo; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->url = url_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->final_url = final_url_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->total_bytes = content_length_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->save_id = save_id_; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->render_process_id = render_process_id_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->render_view_id = render_view_id_; 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) info->request_id = GetRequestID(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->content_disposition = content_disposition_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->save_source = SaveFileCreateInfo::SAVE_FILE_FROM_NET; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SaveFileManager::StartSave, save_manager_, info)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool SaveFileResourceHandler::OnWillStart(const GURL& url, bool* defer) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool SaveFileResourceHandler::OnBeforeNetworkStart(const GURL& url, 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool* defer) { 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool SaveFileResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int* buf_size, 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int min_size) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(buf && buf_size); 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!read_buffer_.get()) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *buf_size = min_size < 0 ? kReadBufSize : min_size; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buffer_ = new net::IOBuffer(*buf_size); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *buf = read_buffer_.get(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool SaveFileResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(read_buffer_.get()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We are passing ownership of this buffer to the save file manager. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buffer_.swap(buffer); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SaveFileManager::UpdateSaveProgress, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_manager_, save_id_, buffer, bytes_read)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SaveFileResourceHandler::OnResponseCompleted( 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLRequestStatus& status, 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& security_info, 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool* defer) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SaveFileManager::SaveFinished, save_manager_, save_id_, url_, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id_, status.is_success() && !status.is_io_pending())); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buffer_ = NULL; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SaveFileResourceHandler::OnDataDownloaded(int bytes_downloaded) { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SaveFileResourceHandler::set_content_length( 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& content_length) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringToInt64(content_length, &content_length_); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 122