Home | History | Annotate | Download | only in drive
      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 
     14 class Profile;
     15 
     16 namespace content {
     17 class DownloadItem;
     18 class DownloadManager;
     19 }
     20 
     21 namespace drive {
     22 
     23 class FileSystemInterface;
     24 class ResourceEntry;
     25 
     26 // Observes downloads to temporary local drive folder. Schedules these
     27 // downloads for upload to drive service.
     28 class 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