1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#ifndef CHROME_BROWSER_DOWNLOAD_BASE_FILE_H_ 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define CHROME_BROWSER_DOWNLOAD_BASE_FILE_H_ 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#pragma once 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 9201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include <string> 10201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/file_path.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/linked_ptr.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/power_save_blocker.h" 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "googleurl/src/gurl.h" 16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace crypto { 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass SecureHash; 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace net { 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass FileStream; 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// File being downloaded and saved to disk. This is a base class 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// for DownloadFile and SaveFile, which keep more state information. 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass BaseFile { 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public: 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BaseFile(const FilePath& full_path, 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const GURL& source_url, 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const GURL& referrer_url, 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int64 received_bytes, 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const linked_ptr<net::FileStream>& file_stream); 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~BaseFile(); 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // If calculate_hash is true, sha256 hash will be calculated. 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool Initialize(bool calculate_hash); 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Write a new chunk of data to the file. Returns true on success (all bytes 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // written to the file). 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool AppendDataToFile(const char* data, size_t data_len); 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Rename the download file. Returns true on success. 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool Rename(const FilePath& full_path); 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Detach the file so it is not deleted on destruction. 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void Detach(); 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Abort the download and automatically close the file. 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void Cancel(); 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Indicate that the download has finished. No new data will be received. 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void Finish(); 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Informs the OS that this file came from the internet. 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void AnnotateWithSourceInformation(); 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePath full_path() const { return full_path_; } 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool in_progress() const { return file_stream_ != NULL; } 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int64 bytes_so_far() const { return bytes_so_far_; } 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Set |hash| with sha256 digest for the file. 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Returns true if digest is successfully calculated. 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual bool GetSha256Hash(std::string* hash); 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual std::string DebugString() const; 66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen protected: 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool Open(); 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void Close(); 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Full path to the file including the file name. 72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePath full_path_; 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private: 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static const size_t kSha256HashLen = 32; 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Source URL for the file being downloaded. 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GURL source_url_; 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The URL where the download was initiated. 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GURL referrer_url_; 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // OS file stream for writing 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen linked_ptr<net::FileStream> file_stream_; 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Amount of data received up so far, in bytes. 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int64 bytes_so_far_; 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // RAII handle to keep the system from sleeping while we're downloading. 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PowerSaveBlocker power_save_blocker_; 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Indicates if sha256 hash should be calculated for the file. 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool calculate_hash_; 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Used to calculate sha256 hash for the file when calculate_hash_ 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // is set. 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<crypto::SecureHash> secure_hash_; 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen unsigned char sha256_hash_[kSha256HashLen]; 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Indicates that this class no longer owns the associated file, and so 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // won't delete it on destruction. 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool detached_; 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DISALLOW_COPY_AND_ASSIGN(BaseFile); 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif // CHROME_BROWSER_DOWNLOAD_BASE_FILE_H_ 109