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_DRIVE_DRIVE_UPLOADER_H_ 6 #define CHROME_BROWSER_DRIVE_DRIVE_UPLOADER_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/callback_forward.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/memory/weak_ptr.h" 14 #include "chrome/browser/drive/drive_service_interface.h" 15 #include "google_apis/drive/gdata_errorcode.h" 16 17 class GURL; 18 19 namespace base { 20 class FilePath; 21 class TaskRunner; 22 } 23 24 namespace google_apis { 25 struct UploadRangeResponse; 26 } 27 28 namespace drive { 29 class DriveServiceInterface; 30 31 // Callback to be invoked once the upload has completed. 32 // |upload_location| will be returned when the uploading process is started but 33 // terminated before the completion due to some errors. It can be used to 34 // resume it. 35 typedef base::Callback<void( 36 google_apis::GDataErrorCode error, 37 const GURL& upload_location, 38 scoped_ptr<google_apis::FileResource> resource_entry)> 39 UploadCompletionCallback; 40 41 class DriveUploaderInterface { 42 public: 43 typedef DriveServiceInterface::InitiateUploadNewFileOptions 44 UploadNewFileOptions; 45 typedef DriveServiceInterface::InitiateUploadExistingFileOptions 46 UploadExistingFileOptions; 47 ~DriveUploaderInterface()48 virtual ~DriveUploaderInterface() {} 49 50 // Uploads a new file to a directory specified by |upload_location|. 51 // Returns a callback for cancelling the uploading job. 52 // 53 // parent_resource_id: 54 // resource id of the destination directory. 55 // 56 // local_file_path: 57 // The path to the local file to be uploaded. 58 // 59 // title: 60 // The title (file name) of the file to be uploaded. 61 // 62 // content_type: 63 // The content type of the file to be uploaded. 64 // 65 // callback: 66 // Called when an upload is done regardless of it was successful or not. 67 // Must not be null. 68 // 69 // progress_callback: 70 // Periodically called back with the total number of bytes sent so far. 71 // May be null if the information is not needed. 72 virtual google_apis::CancelCallback UploadNewFile( 73 const std::string& parent_resource_id, 74 const base::FilePath& local_file_path, 75 const std::string& title, 76 const std::string& content_type, 77 const UploadNewFileOptions& options, 78 const UploadCompletionCallback& callback, 79 const google_apis::ProgressCallback& progress_callback) = 0; 80 81 // Uploads an existing file (a file that already exists on Drive). 82 // 83 // See comments at UploadNewFile about common parameters and the return value. 84 // 85 // resource_id: 86 // resource id of the existing file to be overwritten. 87 // 88 // etag: 89 // Expected ETag for the destination file. If it does not match, the upload 90 // fails with UPLOAD_ERROR_CONFLICT. 91 // If |etag| is empty, the test is skipped. 92 virtual google_apis::CancelCallback UploadExistingFile( 93 const std::string& resource_id, 94 const base::FilePath& local_file_path, 95 const std::string& content_type, 96 const UploadExistingFileOptions& options, 97 const UploadCompletionCallback& callback, 98 const google_apis::ProgressCallback& progress_callback) = 0; 99 100 // Resumes the uploading process terminated before the completion. 101 // |upload_location| should be the one returned via UploadCompletionCallback 102 // for previous invocation. |drive_file_path|, |local_file_path| and 103 // |content_type| must be set to the same ones for previous invocation. 104 // 105 // See comments at UploadNewFile about common parameters and the return value. 106 virtual google_apis::CancelCallback ResumeUploadFile( 107 const GURL& upload_location, 108 const base::FilePath& local_file_path, 109 const std::string& content_type, 110 const UploadCompletionCallback& callback, 111 const google_apis::ProgressCallback& progress_callback) = 0; 112 }; 113 114 class DriveUploader : public DriveUploaderInterface { 115 public: 116 DriveUploader(DriveServiceInterface* drive_service, 117 const scoped_refptr<base::TaskRunner>& blocking_task_runner); 118 virtual ~DriveUploader(); 119 120 // DriveUploaderInterface overrides. 121 virtual google_apis::CancelCallback UploadNewFile( 122 const std::string& parent_resource_id, 123 const base::FilePath& local_file_path, 124 const std::string& title, 125 const std::string& content_type, 126 const UploadNewFileOptions& options, 127 const UploadCompletionCallback& callback, 128 const google_apis::ProgressCallback& progress_callback) OVERRIDE; 129 virtual google_apis::CancelCallback UploadExistingFile( 130 const std::string& resource_id, 131 const base::FilePath& local_file_path, 132 const std::string& content_type, 133 const UploadExistingFileOptions& options, 134 const UploadCompletionCallback& callback, 135 const google_apis::ProgressCallback& progress_callback) OVERRIDE; 136 virtual google_apis::CancelCallback ResumeUploadFile( 137 const GURL& upload_location, 138 const base::FilePath& local_file_path, 139 const std::string& content_type, 140 const UploadCompletionCallback& callback, 141 const google_apis::ProgressCallback& progress_callback) OVERRIDE; 142 143 private: 144 struct UploadFileInfo; 145 typedef base::Callback<void(scoped_ptr<UploadFileInfo> upload_file_info)> 146 StartInitiateUploadCallback; 147 148 // Starts uploading a file with |upload_file_info|. 149 google_apis::CancelCallback StartUploadFile( 150 scoped_ptr<UploadFileInfo> upload_file_info, 151 const StartInitiateUploadCallback& start_initiate_upload_callback); 152 void StartUploadFileAfterGetFileSize( 153 scoped_ptr<UploadFileInfo> upload_file_info, 154 const StartInitiateUploadCallback& start_initiate_upload_callback, 155 bool get_file_size_result); 156 157 // Starts to initiate the new file uploading. 158 // Upon completion, OnUploadLocationReceived should be called. 159 void StartInitiateUploadNewFile( 160 const std::string& parent_resource_id, 161 const std::string& title, 162 const UploadNewFileOptions& options, 163 scoped_ptr<UploadFileInfo> upload_file_info); 164 165 // Starts to initiate the existing file uploading. 166 // Upon completion, OnUploadLocationReceived should be called. 167 void StartInitiateUploadExistingFile( 168 const std::string& resource_id, 169 const UploadExistingFileOptions& options, 170 scoped_ptr<UploadFileInfo> upload_file_info); 171 172 // DriveService callback for InitiateUpload. 173 void OnUploadLocationReceived(scoped_ptr<UploadFileInfo> upload_file_info, 174 google_apis::GDataErrorCode code, 175 const GURL& upload_location); 176 177 // Starts to get the current upload status for the file uploading. 178 // Upon completion, OnUploadRangeResponseReceived should be called. 179 void StartGetUploadStatus(scoped_ptr<UploadFileInfo> upload_file_info); 180 181 // Uploads the next chunk of data from the file. 182 void UploadNextChunk(scoped_ptr<UploadFileInfo> upload_file_info); 183 184 // DriveService callback for ResumeUpload. 185 void OnUploadRangeResponseReceived( 186 scoped_ptr<UploadFileInfo> upload_file_info, 187 const google_apis::UploadRangeResponse& response, 188 scoped_ptr<google_apis::FileResource> entry); 189 void OnUploadProgress(const google_apis::ProgressCallback& callback, 190 int64 start_position, 191 int64 total_size, 192 int64 progress_of_chunk, 193 int64 total_of_chunk); 194 195 // Handle failed uploads. 196 void UploadFailed(scoped_ptr<UploadFileInfo> upload_file_info, 197 google_apis::GDataErrorCode error); 198 199 // The lifetime of this object should be guaranteed to exceed that of the 200 // DriveUploader instance. 201 DriveServiceInterface* drive_service_; // Not owned by this class. 202 203 scoped_refptr<base::TaskRunner> blocking_task_runner_; 204 205 // Note: This should remain the last member so it'll be destroyed and 206 // invalidate its weak pointers before any other members are destroyed. 207 base::WeakPtrFactory<DriveUploader> weak_ptr_factory_; 208 DISALLOW_COPY_AND_ASSIGN(DriveUploader); 209 }; 210 211 } // namespace drive 212 213 #endif // CHROME_BROWSER_DRIVE_DRIVE_UPLOADER_H_ 214