1 // Copyright (c) 2011 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 #ifndef CHROME_BROWSER_DOWNLOAD_BASE_FILE_H_ 6 #define CHROME_BROWSER_DOWNLOAD_BASE_FILE_H_ 7 #pragma once 8 9 #include <string> 10 11 #include "base/file_path.h" 12 #include "base/memory/linked_ptr.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "chrome/browser/power_save_blocker.h" 15 #include "googleurl/src/gurl.h" 16 17 namespace crypto { 18 class SecureHash; 19 } 20 namespace net { 21 class FileStream; 22 } 23 24 // File being downloaded and saved to disk. This is a base class 25 // for DownloadFile and SaveFile, which keep more state information. 26 class BaseFile { 27 public: 28 BaseFile(const FilePath& full_path, 29 const GURL& source_url, 30 const GURL& referrer_url, 31 int64 received_bytes, 32 const linked_ptr<net::FileStream>& file_stream); 33 ~BaseFile(); 34 35 // If calculate_hash is true, sha256 hash will be calculated. 36 bool Initialize(bool calculate_hash); 37 38 // Write a new chunk of data to the file. Returns true on success (all bytes 39 // written to the file). 40 bool AppendDataToFile(const char* data, size_t data_len); 41 42 // Rename the download file. Returns true on success. 43 virtual bool Rename(const FilePath& full_path); 44 45 // Detach the file so it is not deleted on destruction. 46 virtual void Detach(); 47 48 // Abort the download and automatically close the file. 49 void Cancel(); 50 51 // Indicate that the download has finished. No new data will be received. 52 void Finish(); 53 54 // Informs the OS that this file came from the internet. 55 void AnnotateWithSourceInformation(); 56 full_path()57 FilePath full_path() const { return full_path_; } in_progress()58 bool in_progress() const { return file_stream_ != NULL; } bytes_so_far()59 int64 bytes_so_far() const { return bytes_so_far_; } 60 61 // Set |hash| with sha256 digest for the file. 62 // Returns true if digest is successfully calculated. 63 virtual bool GetSha256Hash(std::string* hash); 64 65 virtual std::string DebugString() const; 66 67 protected: 68 bool Open(); 69 void Close(); 70 71 // Full path to the file including the file name. 72 FilePath full_path_; 73 74 private: 75 static const size_t kSha256HashLen = 32; 76 77 // Source URL for the file being downloaded. 78 GURL source_url_; 79 80 // The URL where the download was initiated. 81 GURL referrer_url_; 82 83 // OS file stream for writing 84 linked_ptr<net::FileStream> file_stream_; 85 86 // Amount of data received up so far, in bytes. 87 int64 bytes_so_far_; 88 89 // RAII handle to keep the system from sleeping while we're downloading. 90 PowerSaveBlocker power_save_blocker_; 91 92 // Indicates if sha256 hash should be calculated for the file. 93 bool calculate_hash_; 94 95 // Used to calculate sha256 hash for the file when calculate_hash_ 96 // is set. 97 scoped_ptr<crypto::SecureHash> secure_hash_; 98 99 unsigned char sha256_hash_[kSha256HashLen]; 100 101 // Indicates that this class no longer owns the associated file, and so 102 // won't delete it on destruction. 103 bool detached_; 104 105 DISALLOW_COPY_AND_ASSIGN(BaseFile); 106 }; 107 108 #endif // CHROME_BROWSER_DOWNLOAD_BASE_FILE_H_ 109