Home | History | Annotate | Download | only in file_system
      1 // Copyright 2013 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_FILE_SYSTEM_DOWNLOAD_OPERATION_H_
      6 #define CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_DOWNLOAD_OPERATION_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "chrome/browser/chromeos/drive/file_errors.h"
     11 #include "chrome/browser/chromeos/drive/file_system_interface.h"
     12 #include "chrome/browser/chromeos/drive/job_list.h"
     13 #include "chrome/browser/google_apis/gdata_errorcode.h"
     14 
     15 namespace base {
     16 class FilePath;
     17 class SequencedTaskRunner;
     18 }  // namespace base
     19 
     20 namespace google_apis {
     21 class ResourceEntry;
     22 }  // namespace google_apis
     23 
     24 namespace drive {
     25 
     26 class JobScheduler;
     27 class ResourceEntry;
     28 
     29 namespace internal {
     30 class FileCache;
     31 class ResourceMetadata;
     32 }  // namespace internal
     33 
     34 namespace file_system {
     35 
     36 class OperationObserver;
     37 
     38 class DownloadOperation {
     39  public:
     40   DownloadOperation(base::SequencedTaskRunner* blocking_task_runner,
     41                     OperationObserver* observer,
     42                     JobScheduler* scheduler,
     43                     internal::ResourceMetadata* metadata,
     44                     internal::FileCache* cache,
     45                     const base::FilePath& temporary_file_directory);
     46   ~DownloadOperation();
     47 
     48   // Ensures that the file content specified by |resource_id| is locally
     49   // downloaded.
     50   // For hosted documents, this method may create a JSON file representing the
     51   // file.
     52   // For regular files, if the locally cached file is found, returns it.
     53   // If not found, start to download the file from the server.
     54   // When a JSON file is created, the cache file is found or downloading is
     55   // being started, |initialized_callback| is called with |local_file|
     56   // for JSON file or the cache file, or with |cancel_download_closure| for
     57   // downloading.
     58   // During the downloading |get_content_callback| will be called periodically
     59   // with the downloaded content.
     60   // Upon completion or an error is found, |completion_callback| will be called.
     61   // |initialized_callback| and |get_content_callback| can be null if not
     62   // needed.
     63   // |completion_callback| must not be null.
     64   void EnsureFileDownloadedByResourceId(
     65       const std::string& resource_id,
     66       const ClientContext& context,
     67       const GetFileContentInitializedCallback& initialized_callback,
     68       const google_apis::GetContentCallback& get_content_callback,
     69       const GetFileCallback& completion_callback);
     70 
     71   // Does the same thing as EnsureFileDownloadedByResourceId for the file
     72   // specified by |file_path|.
     73   void EnsureFileDownloadedByPath(
     74       const base::FilePath& file_path,
     75       const ClientContext& context,
     76       const GetFileContentInitializedCallback& initialized_callback,
     77       const google_apis::GetContentCallback& get_content_callback,
     78       const GetFileCallback& completion_callback);
     79 
     80  private:
     81   // Thin wrapper of Callbacks for EnsureFileDownloaded.
     82   class DownloadCallback;
     83 
     84   // Part of EnsureFileDownloaded(). Called upon the completion of precondition
     85   // check.
     86   void EnsureFileDownloadedAfterCheckPreCondition(
     87       const DownloadCallback& callback,
     88       const ClientContext& context,
     89       scoped_ptr<ResourceEntry> entry,
     90       base::FilePath* drive_file_path,
     91       base::FilePath* cache_file_path,
     92       FileError error);
     93 
     94   // Part of EnsureFileDownloaded(). Called when it is ready to start
     95   // downloading the file.
     96   void EnsureFileDownloadedAfterPrepareForDownloadFile(
     97       const DownloadCallback& callback,
     98       const ClientContext& context,
     99       scoped_ptr<ResourceEntry> entry,
    100       const base::FilePath& drive_file_path,
    101       base::FilePath* temp_download_file_path,
    102       FileError error);
    103 
    104   // Part of EnsureFileDownloaded(). Called after the actual downloading.
    105   void EnsureFileDownloadedAfterDownloadFile(
    106       const base::FilePath& drive_file_path,
    107       scoped_ptr<ResourceEntry> entry,
    108       const DownloadCallback& callback,
    109       google_apis::GDataErrorCode gdata_error,
    110       const base::FilePath& downloaded_file_path);
    111 
    112   // Part of EnsureFileDownloaded(). Called after updating local state is
    113   // completed.
    114   void EnsureFileDownloadedAfterUpdateLocalState(
    115       const base::FilePath& file_path,
    116       const DownloadCallback& callback,
    117       scoped_ptr<ResourceEntry> entry,
    118       base::FilePath* cache_file_path,
    119       FileError error);
    120 
    121   // Cancels the job with |job_id| in the scheduler.
    122   void CancelJob(JobID job_id);
    123 
    124   scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
    125   OperationObserver* observer_;
    126   JobScheduler* scheduler_;
    127   internal::ResourceMetadata* metadata_;
    128   internal::FileCache* cache_;
    129   const base::FilePath temporary_file_directory_;
    130 
    131   // Note: This should remain the last member so it'll be destroyed and
    132   // invalidate its weak pointers before any other members are destroyed.
    133   base::WeakPtrFactory<DownloadOperation> weak_ptr_factory_;
    134   DISALLOW_COPY_AND_ASSIGN(DownloadOperation);
    135 };
    136 
    137 }  // namespace file_system
    138 }  // namespace drive
    139 
    140 #endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_DOWNLOAD_OPERATION_H_
    141