download_handler.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1// Copyright (c) 2012 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_CHROMEOS_DRIVE_DOWNLOAD_HANDLER_H_
6#define CHROME_BROWSER_CHROMEOS_DRIVE_DOWNLOAD_HANDLER_H_
7
8#include "base/callback_forward.h"
9#include "base/memory/weak_ptr.h"
10#include "chrome/browser/chromeos/drive/file_errors.h"
11#include "chrome/browser/download/all_download_item_notifier.h"
12#include "content/public/browser/download_manager_delegate.h"
13
14class Profile;
15
16namespace content {
17class DownloadItem;
18class DownloadManager;
19}
20
21namespace drive {
22
23class FileSystemInterface;
24class ResourceEntry;
25
26// Observes downloads to temporary local drive folder. Schedules these
27// downloads for upload to drive service.
28class DownloadHandler : public AllDownloadItemNotifier::Observer {
29 public:
30  explicit DownloadHandler(FileSystemInterface* file_system);
31  virtual ~DownloadHandler();
32
33  // Utility method to get DownloadHandler with profile.
34  static DownloadHandler* GetForProfile(Profile* profile);
35
36  // Become an observer of DownloadManager.
37  void Initialize(content::DownloadManager* download_manager,
38                  const base::FilePath& drive_tmp_download_path);
39
40  // Callback used to return results from SubstituteDriveDownloadPath.
41  // TODO(hashimoto): Report error with a FileError. crbug.com/171345
42  typedef base::Callback<void(const base::FilePath&)>
43      SubstituteDriveDownloadPathCallback;
44
45  void SubstituteDriveDownloadPath(
46      const base::FilePath& drive_path,
47      content::DownloadItem* download,
48      const SubstituteDriveDownloadPathCallback& callback);
49
50  // Sets drive path, for example, '/special/drive/MyFolder/MyFile',
51  // to external data in |download|. Also sets display name and
52  // makes |download| a temporary.
53  void SetDownloadParams(const base::FilePath& drive_path,
54                         content::DownloadItem* download);
55
56  // Gets the target drive path from external data in |download|.
57  base::FilePath GetTargetPath(const content::DownloadItem* download);
58
59  // Gets the downloaded drive cache file path from external data in |download|.
60  base::FilePath GetCacheFilePath(const content::DownloadItem* download);
61
62  // Checks if there is a Drive upload associated with |download|
63  bool IsDriveDownload(const content::DownloadItem* download);
64
65  // Checks a file corresponding to the download item exists in Drive.
66  void CheckForFileExistence(
67      const content::DownloadItem* download,
68      const content::CheckForFileExistenceCallback& callback);
69
70 private:
71  // AllDownloadItemNotifier::Observer overrides:
72  virtual void OnDownloadCreated(content::DownloadManager* manager,
73                                 content::DownloadItem* download) OVERRIDE;
74  virtual void OnDownloadUpdated(content::DownloadManager* manager,
75                                 content::DownloadItem* download) OVERRIDE;
76
77  // Removes the download.
78  void RemoveDownload(int id);
79
80  // Callback for FileSystem::CreateDirectory().
81  // Used to implement SubstituteDriveDownloadPath().
82  void OnCreateDirectory(const SubstituteDriveDownloadPathCallback& callback,
83                         FileError error);
84
85  // Starts the upload of a downloaded/downloading file.
86  void UploadDownloadItem(content::DownloadItem* download);
87
88  // Sets |cache_file_path| as user data of the download item specified by |id|.
89  void SetCacheFilePath(int id,
90                        const base::FilePath* cache_file_path,
91                        FileError error);
92
93  FileSystemInterface* file_system_;  // Owned by DriveIntegrationService.
94  // Observe the DownloadManager for new downloads.
95  scoped_ptr<AllDownloadItemNotifier> notifier_;
96
97  // Temporary download location directory.
98  base::FilePath drive_tmp_download_path_;
99
100  // Note: This should remain the last member so it'll be destroyed and
101  // invalidate its weak pointers before any other members are destroyed.
102  base::WeakPtrFactory<DownloadHandler> weak_ptr_factory_;
103
104  DISALLOW_COPY_AND_ASSIGN(DownloadHandler);
105};
106
107}  // namespace drive
108
109#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_DOWNLOAD_HANDLER_H_
110