base_file.h revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
1// Copyright (c) 2010 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/linked_ptr.h"
13#include "base/scoped_ptr.h"
14#include "chrome/browser/power_save_blocker.h"
15#include "googleurl/src/gurl.h"
16
17namespace base {
18class SecureHash;
19}
20namespace net {
21class 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.
26class 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  // |path_renamed_| is set to true only if |is_final_rename| is true.
44  // Marked virtual for testing.
45  virtual bool Rename(const FilePath& full_path, bool is_final_rename);
46
47  // Abort the download and automatically close the file.
48  void Cancel();
49
50  // Indicate that the download has finished. No new data will be received.
51  void Finish();
52
53  // Informs the OS that this file came from the internet.
54  void AnnotateWithSourceInformation();
55
56  FilePath full_path() const { return full_path_; }
57  bool path_renamed() const { return path_renamed_; }
58  bool in_progress() const { return file_stream_ != NULL; }
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  // Whether the download is still using its initial temporary path.
75  bool path_renamed_;
76
77 private:
78  static const size_t kSha256HashLen = 32;
79
80  // Source URL for the file being downloaded.
81  GURL source_url_;
82
83  // The URL where the download was initiated.
84  GURL referrer_url_;
85
86  // OS file stream for writing
87  linked_ptr<net::FileStream> file_stream_;
88
89  // Amount of data received up so far, in bytes.
90  int64 bytes_so_far_;
91
92  // RAII handle to keep the system from sleeping while we're downloading.
93  PowerSaveBlocker power_save_blocker_;
94
95  // Indicates if sha256 hash should be calculated for the file.
96  bool calculate_hash_;
97
98  // Used to calculate sha256 hash for the file when calculate_hash_
99  // is set.
100  scoped_ptr<base::SecureHash> secure_hash_;
101
102  unsigned char sha256_hash_[kSha256HashLen];
103
104  DISALLOW_COPY_AND_ASSIGN(BaseFile);
105};
106
107#endif  // CHROME_BROWSER_DOWNLOAD_BASE_FILE_H_
108