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